From 90e7e508104a27cd5944b4a96768007be2f01200 Mon Sep 17 00:00:00 2001 From: Robert Allen Date: Mon, 16 Feb 2026 19:18:59 -0500 Subject: [PATCH] =?UTF-8?q?refactor:=20aggressive=20simplification=20?= =?UTF-8?q?=E2=80=94=20remove=20bloat,=20consolidate=20skills/commands,=20?= =?UTF-8?q?normalize=20naming?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Delete 73 files: dead docs (archive/, enterprise/, reports/), deprecated ontologies, duplicate images, one-shot migration scripts, over-engineered agentic workflows - Consolidate skills 14→10: merge search-enhanced/progressive-disclosure into search, agent-coordination into blackboard, delete organization (all duplicated content) - Consolidate commands 15→11: delete init (subset of setup), discover (ontology handles), search-enhanced (redundant), team-audit (custodian covers) - Rewrite skills: search 494→167 lines, format 745→197 lines, blackboard absorbs coordination - Strip lib/__init__.py from 139-line kitchen-sink re-exports to 1-line docstring - Normalize skill naming: drop redundant mnemonic- prefix (core, search, format, setup, blackboard) - Delete 8 GitHub workflow files (agentic lock.yml + .md pairs) - Fix all cross-references in docs, ADRs, tools, README - 397/397 tests passing throughout --- .claude-plugin/plugin.json | 40 +- .github/readme-infographic-g.jpeg | Bin 649779 -> 0 bytes .github/readme-infographic.svg | 165 --- .github/social-preview-g.jpeg | Bin 572636 -> 0 bytes .github/social-preview.svg | 101 -- .github/workflows/ci-doctor.lock.yml | 1173 --------------- .github/workflows/ci-doctor.md | 196 --- .github/workflows/issue-triage.lock.yml | 1062 -------------- .github/workflows/issue-triage.md | 90 -- .github/workflows/plan.lock.yml | 1170 --------------- .github/workflows/plan.md | 155 -- .github/workflows/update-docs.lock.yml | 1091 -------------- .github/workflows/update-docs.md | 124 -- .gitignore | 1 + README.md | 55 +- commands/capture.md | 2 +- commands/discover.md | 94 -- commands/init.md | 133 -- commands/search-enhanced.md | 170 --- commands/team-audit.md | 111 -- docs/adrs/adr-001-filesystem-based-storage.md | 4 +- docs/adrs/adr-002-mif-level-3-format.md | 6 +- docs/adrs/adr-004-mif-schema-validation.md | 10 +- docs/adrs/adr-008-custom-ontologies.md | 2 +- docs/adrs/adr-009-unified-path-resolution.md | 1 - docs/agent-coordination.md | 76 - docs/api-reference.md | 488 ------ docs/architecture.md | 39 +- .../CLEAN-ARCHITECTURE-BLUEPRINT.md | 752 ---------- .../path-resolution-integration.md | 465 ------ .../community/CONTRIBUTING-COMMUNITY.md | 229 --- docs/archive/community/README.md | 73 - docs/archive/community/adoption-stories.md | 119 -- .../community/migration-from-memory-bank.md | 365 ----- .../community/mnemonic-vs-memory-bank.md | 428 ------ .../community/quickstart-memory-bank.md | 237 --- docs/archive/integrations/README.md | 122 -- docs/archive/integrations/aider.md | 119 -- docs/archive/integrations/codex-cli.md | 83 -- docs/archive/integrations/continue.md | 120 -- docs/archive/integrations/cursor.md | 295 ---- docs/archive/integrations/gemini-cli.md | 102 -- docs/archive/integrations/github-copilot.md | 306 ---- docs/archive/integrations/opencode.md | 82 -- docs/archive/integrations/windsurf.md | 311 ---- docs/archive/templates/AGENTS.md | 126 -- docs/archive/templates/CONVENTIONS.md | 126 -- docs/archive/templates/codex-skill/SKILL.md | 116 -- .../archive/templates/copilot-instructions.md | 86 -- docs/archive/templates/cursor-rule.mdc | 112 -- docs/archive/templates/mnemonic-protocol.md | 10 - docs/archive/templates/plugin-hooks/README.md | 67 - .../plugin-hooks/hooks.json.template | 15 - .../plugin-hooks/mnemonic-suggest.py | 160 -- docs/enterprise/README.md | 136 -- docs/enterprise/compliance-governance.md | 378 ----- docs/enterprise/deployment-guide.md | 576 -------- docs/enterprise/developer-experience.md | 405 ----- docs/enterprise/productivity-roi.md | 339 ----- docs/enterprise/research-validation.md | 348 ----- docs/library-reference.md | 4 +- docs/ontologies.md | 1 - docs/ontology-implementation-plan.md | 1008 ------------- docs/semantic-search.md | 9 +- docs/tutorials/README.md | 77 - docs/validation.md | 2 +- lib/README.md | 572 -------- lib/__init__.py | 139 +- reports/README.md | 17 - .../2026-01-24-executive-summary.md | 102 -- .../2026-01-24-report-metadata.json | 87 -- .../2026-01-24-report.html | 1303 ----------------- .../2026-01-24-report.md | 678 --------- .../2026-01-24-research.md | 346 ----- .../ai-memory-filesystem-research/README.md | 86 -- .../ai-memory-filesystem-research/state.json | 310 ---- scripts/cleanup_memory_paths.py | 244 --- scripts/fix_malformed_memories.py | 340 ----- scripts/migrate_namespaces.py | 277 ---- scripts/migrate_scope_paths.py | 109 -- scripts/migrate_to_v2_paths.py | 526 ------- skills/blackboard/SKILL.md | 137 ++ skills/{mnemonic-core => core}/SKILL.md | 2 +- .../references/capture.md | 0 .../references/examples.md | 0 .../references/recall.md | 0 .../references/schema.md | 0 skills/format/SKILL.md | 191 +++ skills/integrate/SKILL.md | 2 +- skills/mnemonic-agent-coordination/SKILL.md | 108 -- skills/mnemonic-blackboard/SKILL.md | 155 -- skills/mnemonic-format/SKILL.md | 745 ---------- skills/mnemonic-organization/SKILL.md | 513 ------- .../mnemonic-progressive-disclosure/SKILL.md | 234 --- skills/mnemonic-search-enhanced/SKILL.md | 453 ------ skills/mnemonic-search/SKILL.md | 494 ------- .../ontologies.deprecated/base.ontology.yaml | 72 - .../software-engineering.ontology.yaml | 531 ------- .../schemas/ontology-meta-schema.json | 258 ---- skills/qmd-reindex/SKILL.md | 4 +- skills/qmd-setup/SKILL.md | 4 +- skills/search/SKILL.md | 167 +++ skills/{mnemonic-setup => setup}/SKILL.md | 2 +- tools/mnemonic-validate | 6 +- 104 files changed, 561 insertions(+), 23521 deletions(-) delete mode 100644 .github/readme-infographic-g.jpeg delete mode 100644 .github/readme-infographic.svg delete mode 100644 .github/social-preview-g.jpeg delete mode 100644 .github/social-preview.svg delete mode 100644 .github/workflows/ci-doctor.lock.yml delete mode 100644 .github/workflows/ci-doctor.md delete mode 100644 .github/workflows/issue-triage.lock.yml delete mode 100644 .github/workflows/issue-triage.md delete mode 100644 .github/workflows/plan.lock.yml delete mode 100644 .github/workflows/plan.md delete mode 100644 .github/workflows/update-docs.lock.yml delete mode 100644 .github/workflows/update-docs.md delete mode 100644 commands/discover.md delete mode 100644 commands/init.md delete mode 100644 commands/search-enhanced.md delete mode 100644 commands/team-audit.md delete mode 100644 docs/agent-coordination.md delete mode 100644 docs/api-reference.md delete mode 100644 docs/architecture/CLEAN-ARCHITECTURE-BLUEPRINT.md delete mode 100644 docs/architecture/path-resolution-integration.md delete mode 100644 docs/archive/community/CONTRIBUTING-COMMUNITY.md delete mode 100644 docs/archive/community/README.md delete mode 100644 docs/archive/community/adoption-stories.md delete mode 100644 docs/archive/community/migration-from-memory-bank.md delete mode 100644 docs/archive/community/mnemonic-vs-memory-bank.md delete mode 100644 docs/archive/community/quickstart-memory-bank.md delete mode 100644 docs/archive/integrations/README.md delete mode 100644 docs/archive/integrations/aider.md delete mode 100644 docs/archive/integrations/codex-cli.md delete mode 100644 docs/archive/integrations/continue.md delete mode 100644 docs/archive/integrations/cursor.md delete mode 100644 docs/archive/integrations/gemini-cli.md delete mode 100644 docs/archive/integrations/github-copilot.md delete mode 100644 docs/archive/integrations/opencode.md delete mode 100644 docs/archive/integrations/windsurf.md delete mode 100644 docs/archive/templates/AGENTS.md delete mode 100644 docs/archive/templates/CONVENTIONS.md delete mode 100644 docs/archive/templates/codex-skill/SKILL.md delete mode 100644 docs/archive/templates/copilot-instructions.md delete mode 100644 docs/archive/templates/cursor-rule.mdc delete mode 100644 docs/archive/templates/mnemonic-protocol.md delete mode 100644 docs/archive/templates/plugin-hooks/README.md delete mode 100644 docs/archive/templates/plugin-hooks/hooks.json.template delete mode 100644 docs/archive/templates/plugin-hooks/mnemonic-suggest.py delete mode 100644 docs/enterprise/README.md delete mode 100644 docs/enterprise/compliance-governance.md delete mode 100644 docs/enterprise/deployment-guide.md delete mode 100644 docs/enterprise/developer-experience.md delete mode 100644 docs/enterprise/productivity-roi.md delete mode 100644 docs/enterprise/research-validation.md delete mode 100644 docs/ontology-implementation-plan.md delete mode 100644 docs/tutorials/README.md delete mode 100644 lib/README.md delete mode 100644 reports/README.md delete mode 100644 reports/ai-memory-filesystem-research/2026-01-24-executive-summary.md delete mode 100644 reports/ai-memory-filesystem-research/2026-01-24-report-metadata.json delete mode 100644 reports/ai-memory-filesystem-research/2026-01-24-report.html delete mode 100644 reports/ai-memory-filesystem-research/2026-01-24-report.md delete mode 100644 reports/ai-memory-filesystem-research/2026-01-24-research.md delete mode 100644 reports/ai-memory-filesystem-research/README.md delete mode 100644 reports/ai-memory-filesystem-research/state.json delete mode 100644 scripts/cleanup_memory_paths.py delete mode 100755 scripts/fix_malformed_memories.py delete mode 100755 scripts/migrate_namespaces.py delete mode 100755 scripts/migrate_scope_paths.py delete mode 100644 scripts/migrate_to_v2_paths.py create mode 100644 skills/blackboard/SKILL.md rename skills/{mnemonic-core => core}/SKILL.md (99%) rename skills/{mnemonic-core => core}/references/capture.md (100%) rename skills/{mnemonic-core => core}/references/examples.md (100%) rename skills/{mnemonic-core => core}/references/recall.md (100%) rename skills/{mnemonic-core => core}/references/schema.md (100%) create mode 100644 skills/format/SKILL.md delete mode 100644 skills/mnemonic-agent-coordination/SKILL.md delete mode 100644 skills/mnemonic-blackboard/SKILL.md delete mode 100644 skills/mnemonic-format/SKILL.md delete mode 100644 skills/mnemonic-organization/SKILL.md delete mode 100644 skills/mnemonic-progressive-disclosure/SKILL.md delete mode 100644 skills/mnemonic-search-enhanced/SKILL.md delete mode 100644 skills/mnemonic-search/SKILL.md delete mode 100644 skills/ontology/ontologies.deprecated/base.ontology.yaml delete mode 100644 skills/ontology/ontologies.deprecated/examples/software-engineering.ontology.yaml delete mode 100644 skills/ontology/ontologies.deprecated/schemas/ontology-meta-schema.json create mode 100644 skills/search/SKILL.md rename skills/{mnemonic-setup => setup}/SKILL.md (99%) diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index a6e442c..9ab0945 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -14,43 +14,5 @@ "knowledge-management", "persistent-memory", "ontology" - ], - "commands": [ - "./commands/capture.md", - "./commands/discover.md", - "./commands/gc.md", - "./commands/init.md", - "./commands/integrate.md", - "./commands/list.md", - "./commands/query.md", - "./commands/recall.md", - "./commands/search.md", - "./commands/search-enhanced.md", - "./commands/setup.md", - "./commands/status.md", - "./commands/validate.md", - "./commands/custodian.md" - ], - "skills": [ - "./skills/mnemonic-agent-coordination/SKILL.md", - "./skills/mnemonic-blackboard/SKILL.md", - "./skills/mnemonic-core/SKILL.md", - "./skills/mnemonic-format/SKILL.md", - "./skills/mnemonic-organization/SKILL.md", - "./skills/mnemonic-progressive-disclosure/SKILL.md", - "./skills/mnemonic-search/SKILL.md", - "./skills/mnemonic-search-enhanced/SKILL.md", - "./skills/mnemonic-setup/SKILL.md", - "./skills/integrate/SKILL.md", - "./skills/ontology/SKILL.md", - "./skills/custodian/SKILL.md", - "./skills/qmd-setup/SKILL.md", - "./skills/qmd-reindex/SKILL.md" - ], - "agents": [ - "./agents/memory-curator.md", - "./agents/mnemonic-search-subcall.md", - "./agents/compression-worker.md", - "./agents/ontology-discovery.md" ] -} +} \ No newline at end of file diff --git a/.github/readme-infographic-g.jpeg b/.github/readme-infographic-g.jpeg deleted file mode 100644 index 2926f703b25591a4016e43a6fcedc2aad7f398bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 649779 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

m=Ls$$VS(P&liM` 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

5c!n%kLV5J;Z1YG@6e8;jx{f9}N~>{S2K= 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

RG>sDIu?! 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

lyI6v^oD35~1JXo6v%mn5*-s^OPX%`1rA(D( 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

143jsfWm+b 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 >9)HAAZA*k1fup_SEAWZ|D&I$oV~*`m+! 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

3U0v$xe5+|-jFs=i*wOjcS$3+(YdB0 zi-SY=pdhShtYn=~Tib7~E`=}Eo`05(V(`v=uv^!vE>m0XjBhMZPQ;yt%2%%|(J4GW=jM5R-w-$yCu-m>@L!)E>hAKX) zf+BRq-b$H%t{lvaepvl$s9FpwJj6AWYG>8?Ou3b?MI|-$y-&`MZWMYhvk>d@jQ9?@z{u+ zZ!5YV$L9oDBj*u4LjnC%pn43aEaPw|Lk6PfNFY(Tbr>kPpm$B~OvZSp+A{fh3qbqz zxqBVx>)Ld8cO_f4wigVqDpILcPuF(#Oa9IRV4fjQh$n=(LEf7Lp0nYUDAqYEf=0sb z+~)Ya0Dd>R8hU*`Fc4rVWxJn63ooTEu?(@Q-RaN@Y<(Oo+e7i0(8ZtOBsEcmm91{1 z`-R2VvE9LmEKW*WIm4K^-#UoMCYHC2J-t_4F{~>NQTBn#RO9m?Id3MU3N;^2x?b8U zh$t!RQyFI3MGRlkh<%aCb2I%QQlVMkQ*q?{sFgXRN5fsk(5tW;(7nhe;_21f_9-8G z8y~(lZThsEG(=d&2L|#`zjjs|1(k579LZh^x^JxR`}~ zAbCO2L@9^4M8#y+r_6-S^krr$yyUE1AvF6ZbCnT8x?{txUWUl2V_Zc{dA;1eup#fX zRq&aa>uBZze16Bc6V*|5M4&V9)b}U1x5q~;?IZ(Rg_IWE9CqW&yg{2>*t6POjkfn9g{4?Vq^AK2nwC@HA%d0Xp(PM#8np9ACJ?^rb(g7`KfH7NS!e9 z%4G}x_h|;lt9?glrKp&}Z|7;{(4c}D8|$x$k86MUq>iQ zQD?f_d}O?ViX43ZJ)bdAht(?Jz9lZLg|YVtBJU8J@#n&Fo9|SF`sw}PwAd`3( z$Cf$DK0oR9E<8K(gd9S}ExCwEE{vQM9d9s+%E+q%cIFi(5D9TAfd3Qa@{j72NP_TEHtu%zl)0=&1dKsmxss;%!h%~rlrUD zIk;jd+qQTY6koq4XZ zUTy^*u6g4lUBVgz2PHX(gCig+Fn`^FFR@?Vnk4P%(lP;8T_wI+Jm%s6>(s!s0)5Mg z(c2SXIJ5C6bIJCbb7zdxTUz9G0X%0*W}jQVp(DH6z}0G{a^5#~q?E3dGYTwr(2*Wd zx?@K;qtE+f#LdEUle?3MRq5Cd%i*MzU#UxAgG>kRn#SjZ|w&L z8&{=0oFtX+HC1ua|IJ91>MS-WYs?UovAZb-@||Mo50ln{`hs}TlRM9iPjNxF zn;7gu(T-^zm3+0Z)W0ft{?Vyg)a@L8 ztIF%&@IGX+Ra_~=q*d|eBPNEws9ICZPkkMRp*HZP;=pW0#_Rb%G_*Em^>alg(ZV|m zUp^K)>C+0Susm|)N2)!m@-?#rVBB4Y6Ul${nh=3(X--Nx-zFQax1>MpoA(VggSEL1 zn(Bkx%%!Dw>I{1r4J;D76A}e7bcD6^32*ld^80n3_%L^ky8t_yKE`hf(jU0V28I;cA>LdI zWxdFK{w0i&T20-G)OT{bVb$iZ{X|<6!-*I<`5!BfThVGe3sN7G8CyW|Sdl!9h?>I# z({7tElMmh|k$VH)g(gblhQgz(*1CF}w&w)yH+WB}l7zljE=v1oU=gJ9i zOwl9r4}vy~0|vSkD(-DG$$y?X+w0`HQZ;&BUw8PU5c!N?lp?3bG{VNqJ>R8S z{tHGArYu~ydYF5akGXmOxMvDFV99a|emN$#cXOpOw$}~I^iVoEhMF&hO%m*0ZBk6fZY{Z^#zJt6G;5-_# zJG*L>M*e#vB8_W|x$gu+18)xYm`SR~1d{Q}=HX6v0SE>)W|NI*iDNtB2*rEguv%F$ zNE10wG>lwMap8CE`5y@-SUE=y zm<^56n^?KB=gjXKYjb}u-8VIvW55Pj1KaL^5xw=?0M-k^9dQ4Z6dY4;)myci=QTTY z<;--Ko=H!BAG0@o4|yz;6Qu(h3CRs4J2sI{q+v+Jac?V-DNWPqyi}@=^C_dOd&=yk zu;t7laJdyQ<#%yh?4i}?r@i_dB>Kqn@pBGxaEfWt@{WhPh4LsRWiM2EB#7_EeCnux zC5E^vlDNYofKez|a`&l8UtC%VFseye!ka695DXDXHSi07yS=Fi^!ris*|Mhy2c!$# zROTz_HoTdd8gcYa7wlc*PN|tklQa}D#_fMONp?oglOnJvAftdsy}cjU!4+By%7F1qmOmOXobMdL=twJX<$!cFW4` zv?)Plg{5yC9|fq>;ghRyVa!Cg{*K!f9ZN{-+C5(G?_1>R0Y%lDPs&#R=99$aUy^uF zlQ$n;%~i#vl>epx)bO=&eO-zk_5?MsYKX?Dd17OZ#A_j1>M=l5OMSt=n?ZtEzWHKk zhUJO+`>iA}D;Lx$C#3To+eNCOyAYYvow2I~((O+qo2!!3ZdI&dDjX-u@%ynKKHEDiP7S#|p!4_RKfrL6i z^Q6;Cf^0+(wmd3yRO8Y;iW`m5XttXF914`csRxl;`CT*xcer0~|9OWiD<>BP##fJ( zZ|KZ4CH|R~?c1l5{kK3@g?}Tt(yDz`R@?i=Gx7*4ThnS!zpo z8*BD_TzzM14lG)PecjxBD{O5)ufMoROw&%a8Q#m$I9$L-^==hHd5NKH?@vwfe};jX zvuBsDQ1}VP?TAu;zFC7}zZN^Py0;_h?pA42TIJ}$^SQpwJu`LKlSW!{w(hofGZe=C z&_5HqsKJyzYsg&x;m2K$wILm<`0^^uUTOXdUO}@GD!pQ6IM637o9Shf@<2s#Ct{~g+o6R z8%-&q4)GWgP&IjhxmJ(Y6FY38UF*Ofa}QAd~|?5j1sdI##C+33%_c-ZIW*bcAJk9 zlh?AyEi^2ytP7CdZG!m{RH>tia?Gb>4m}{25`~#q3(n>j;9Y34yEWzuUA`V7=4oCf z7T#gbZ&7?->vArq>;zPxTgJ+Fdz$Xa*IUlyU-)qUsgOM(!v=WC^DrorRBC$8E=tDEDDB>mk3vk6fHc03OO7Y=M=uH zi5;CA`QC4IJ7(BkRCK8iD}7p}!$xB|FrHo%S;g92*A%7aAwjKw4FiUY>e7jS)+@mF z_Q4T<=)9&z=#1nyji{!-QIK)(W+Ff;wiB%Mo(>*)?ye;C!T z?<5|gLlsFAzdMv&D-W58B_E0~nv-8H>|T(lEipQ@5}Z#Pn9zG~u^_i*nY^!B;j!w{ z<*1Es9YC+FoqG|D36{f~RKVyr47)U{S`%oBKZ_Znn3q7ZZEaHi$`XZhkLonGwIrDJ z_E?J@`$}7XJfleRz(g4R_6!&%YFbiTG*;y~P27kmOsYzmR4b5Nc5roC{uksSL|1VI zSz9P4_zTZ{#u%FI`}+C{?~B&hzipGR@($$vU;fpiq13hw0U>uI3^rR@T$m)`w=={#}my&0iF=>WQfF>(x~pY)RsHH{{9{Yl2@JWM;+7oKVIQ&Cd|P?Qs$(F|gD2 zg4OP$=_HSslOCd)*V#f&>g zRhNf`L;>tb>cej2u+w~KH^Q>Ul8Ia6!RHJs!+hP4=i}hk4`~{YdK;(dMGS%D>paOa z{s?sLty7_J(O)MKu-hnBC$t@k zEuLR59&h&)I+X2!oM+wZJg`|-@#juf;wutru=8)gP6(p z6{xl0qe_M@Yyu)`lp~J*gC}|Y)@7+04t4qb!_L8aE63$?YqIy<;EMq@w=MK2eKzo3ZY5DAr;_>Uyk*JZNc~5LT(Dez9k zd~&5Y%Bs7R`8CpFqg=ry61k=GGbmmOd0>3%DGRgzkGD_FU}&QxjSO&d)X8R0~1U~y!S$wDd7CsGs$ z|BfuOG5htsOvIxmI5SbLM83*nW5a30bfSL#ch^J9jTy{M)t2yn@`b4420aRz#)wrNM1m;-y3<4q(T6NH#s`t>}=FDo;6)>w5vdK-+Yzy zYYDjudOh#%aRxh5^V1Arg0eHH2Yu`bh@sySikzxin(}H3UUB`5Uxte`7B~wpB?(u{ zea?GOF?{JZA3U&LaXA%|;alw|9i&C0ZkbT0DdW$|&lKz(ZBwXa5izW7l5n-1)fit| za)Pw50dbWUIQEm>^i9Nl-tv-e%Gzz7@QEirW!imJc<$ z6i4j#=SZfU&fFyqZneHcN$3!$ht==mr}9UWMk=Q;T0KjzzI3+F-v81TF1*v7@G|Kq zg>N@4c8e2CJV^bQ#(^@f>DBG(-Hl^Mb2Ut z%k@Xh<}H^1R!iE_J4(uR+2gVugyX)N)!1lW|vgxe? z_ME}ijfv%}YO$ce9!QIf633hA^~CrqWg_jRs*MY%@l*pONEGzGe1^acUjw*s&`ly8 zcFnj4-xE>f;wB&T2SNP4lW%%ohm>9gLPW!nT@a67-_ zt^s0h@La?6`o8wt2E-em{6`B_8TzVa5&udRW+(V5VXI)zh3g{DKZ9CWhnUR!2D3Yc z3r?J#Q-Iq$_d}RlSIa$gLs^cdK!G^+i{46N zhUOo6xuvZy9y;Tbk8dUNl%$xGvvc1l=zCMF;_y|#V^^7yzgC89>?k=1%O&mGw0M2RE)8t0L^CH(}-qbw8+J}}Z{c zDTqTzG0;-a1KZLVzlz)aA6b&dJ#|{7Rx>`j9e;pfAZp@_8uk_bM|STtiOqx!Mt8 z8-roA<6Rc7y`^(%YLV-KZjm#W%GM}F54eGnq>dzx#?U#*d*Jm-)Qg%|gzQIe_G`KJ z=jz^N*!b@p^4@<{^klKnBuXVY!L+={uTYSGC$nLtZ(4_4h*Fv6v8ol#g@&yoOEV@{ z{N~9}Fl|`^fZch9FBz$Epo~4se>kEBv6yXAF4LN?JN=tj_P23}=r>cDOnoqNyc8C!x!+yvgffZ}~6O{V%QV zl6voJ4d&pl79nfTO~=ez=Ek#^e$K2(ZnZ{TQI;M5pT(kT8h zBR=_0tuFR$CKmTxc1ECaj1FC)8S44gIR`%b{eHA{31ZdxOjd(V^!17XFJDRG;2SFy z_AcOXC=@x0siLtTo<#rie zK1T8os|eI1#t6sJV9@(ozdClJh8}+1=f}RM{e?_axV6XE=n1oi0xIUCG#wWkIhP+X z<1ku3qv)KO_!@VV2%ttr(cyhpHuVE*5k`+AhH@s^zCQ*TwkGHmgt(MM?|V76Wt3RF zzw;j@Il2caSfT~^4M4bOm7UM8J|iV8Yk#h|Z)J~h9Nx-S5(1Owx7AHmh(jf0D3wNJ zRBzI$6a@d{)xJ@bD0A2=G3-_A5Ht3hq$cJ`Z{H~9ag&-!jK%gDA-lu(XCgs%NW?cv z#Os4&tdY(*_FPGyD|u3C-RRxWo8|pxDeGe)$pKttm&l02FP+=rADFqNCg^tWW|Tb| zH{&*i>#E9y>RjrfreQR|xks2NPVmJz4@t5i4hCWDbzsQtYyvF03D8IUSnkIJMlY1I zwgj>s zyK;gtv8g0Wjjml?Cis73RDAaKfpyc=RX(y2sY^WVd|US6!RdK~>BsEye|Y(wvc>4U zpKM8)`5dYX34HZFp?zxZq@9lpFbyAm#Utr%QKQ9XQ@xs4sXL;u_a=mNJKIs(+Q2Cr zC+c{B`IC2Yt6mJNK2>GRj{&pVQF0P>&%!Ny$#=VaCeD^J*$~a9Bv&!CV

_`i-%*b$UaJU?97tTb1CtqabTf``6dYc6w*fisj`wvAYjBdk9#}t z)}>?Og%Cf>-xqb$xT~L8`WrK-e|vR0l^S}Hbq0EC#aa50jJL;gEu9A*nH}F-pFY1Y zbp!X`6K=2PJaHqBsSA|V6x}}!WZE;|o<3Sns+67J-E#iazxC%o-)bC)5Afx)f1M%k z{RXt09F>)J_as+}Fmjt**NR95;#)S(fL^R91kGslUxhP+V(W9DYK!4+h}U#ceuCN{0-r{& z-fz;RJ^DatoTfB#t0OX!rp4`a6zFNt|Bvj=-yW6gIZ$IYx)J?eZVH4c8*qnV3zBe> zbkKuf%f!sf$G`xT1oY%OE|LHIOH;i(hU2y1&P-gd+e7LD#sA2G+UM|_l33dbrA*`G zKBpiLNK)VHY(*%0+*KG84XdD-sh{xDcBbT|EJJ*iaN7V=brEZtE=tWZh0vw^ZX5^9 z%KjE;NcTH7cGz&EkwyB~u0kz<85JTJ7ylUH7i&sgg7d36-=>uPu=_DCadYiOyn0hp6!q6)HN|^ z|K&4c>$&Gu4v?om<%@wPT|Oj969TdVgE0DNrcGk$AF~dHOy2vmr>)nM_=nk44fuiO zHQR);&Z(V+^9uQ)M)18mCh9>%V|{vVLw=?q4ireT2%IBFNFT%r)ElYx&kt`csL0_L zM71jYN;p%i?mTKny{RtwZZx!?;S@E9@u3-HNU7uAFqiV%-};O{5FB|q;K+SoHZ+h} zG-DxCyr*Y7zG&0Z%eH3t$Z&_}-KeS$JvYriTprW=h@9BfAzc`DUx&YzUQipsjqmdv z?FE#hDJzx(fnlxLS9xHN+RvD+P&bR&v%Vv*3(Hl?C<&5GkN9Hs+v8*8-`63kZXs(t z58Zm3rr1Md{Vr&k>x7!Dh<67ru!+ z3qiAVCEDI-w9NS-!T+pLQ0vDxYUVZvF#lxL;^=G@urEb3Db=M8RC{F~+KFj9#B86( z6TuSv%MPE*^i1mPOcTwm;E4I1O*U+Sr6&FR8oel+8MY4&f5tzQ#rHV~#Y`OZ{%EPs zuH;?q%utD!d!&-o;c*1z-b~zl{fs(|Oo&{WT;NoQ>|Kzu(kPFvYD(k%yHa;<*#odL zvWO)$9|Zd$SI(6zUa}t+6GmIx>ybdui_kD47P;XW=LYME9^%mb-4`9%AeJ8no{tvf z7WDIF+>H#vN9G`D{SG-0%`hi&NcExRFE*f1I}3wDF8Ph<59{%h)~F>;ia5$RxpqnL z(?xZvXglcU^R(T5h5z;g7F#$6uiA^d7D}V_J0qK#8Mxe{+uIB9J&doa92_7_xjWf3 znt4TF9xF!?ix>%SaJ-CRG-C;eujAftYqNle-HalxE^l=ajIgEmzz#>I!;|t5Fq9V| z;^zv~4YV9CcKCY@oo$Cl*Z_P!r7>z(AZ2KKZYcY1;kyxfTfnQpr^2&Nrs`{v_57=l z3-z-71)m@J9Qhi)|4NeRjiIuKcI;=hk^GaVeM-rCm_IlgP`v&Mi$ zG3M6UB-^D7IUz){MXZyZD4!Vj8*%AV+uSuPgR<;b%6a>Vyb{#Q%TSs=_&5SbndS5C z-oEpS(sq|enVU=pH!4(E`5Rsv;ho6ss3E2PahrUuRY?i=pw~p51`)P({{E5^F^UUI zzGiaKU?k~a&`ANDk}*eT`fEoIMa$;Fs+jGDxwEw^X>3n7emGv7#-z87 zSn9~|9!lUB>@G?H^>uaTh#J!yxxqqw0*uX~(Tq*7o5c9RK0uv=uZwGP_u*pl^jkHX z{=T{i(Jx<<$_TU-h5Qg`wUo9UhTH=|CAlj7akR(<^G*Tzc3YA%JR)R1M$u8L3#DlVHH#V zil?S#-1n77KW9nq?)IZ85TKDwCZs4vBlcR-C}x9hp;ppy5oss7GR&LK&1t@~^C_rV z@{|kK3hVbQBL(VM>G9=CXlIJm(ru^(qS3XBa4K7 z_j6ZYGnn;*#T6*c$>l3dYdl<>Fq$LjR6tg&R-YEf9vyv3ROL{F;xhxTkG=JR<2>5?rT zI~hRDK!c*otbvq3O~Uc5a|P)$)9p+KNb`Fk;`Y^7}W})_MZQdMS8rx1ZR5f zYm3J2z*`_|kgk_PNkiORMh{9%GTv@V*5qIcxDHkf9=%#X%GJvinVTlLe&CO;Q=!ge zkDaSrQ0^2`)vbf@VcU283&9GO$t9Vu)VjU|l~_AKK@2qDd9~t-r(N~T4t8Z?;7Su) zf@N9~ZVEI0K9=KUKvGfSzisb4Tp^I-^;@}`iO;8|aCZ2H>xY7U0T%s;cQX8r8=W_e^x`QT@Ey>-f zxM5{K%)`ISPrJ<;Fs`k1_FYpDmPR$AHmHb675^i9jgTBFkeEB&WPpa&`~5yo;-2j< zOL`KY1a?!bx7h=^Z=~5=bxtR1`6Z>N(+@OBTXiMe4xhv$D*w)Vea{R1CpAH^%F|g` z;5OSI)(TO;nfTvFly~zqtB88DASIZ}SKD{b?dCb8!43BNqa{qpyP^ z9`w4ZOIguJL-`1nF<@)JzOaF>M&D|JpXpQ6vmlHN7C#frI>hdN-|G-x&(z_G!>PNQF;s&!j&dhs~&e@^qRvj1b%}@HAd{+9K4i7 zl!CwINw0WFW1SN6;KqZ)TZ9Zp{d@Z=emi%MKL~f!qrR62fo5b&|GRs}4o>tgKsiPv zcj1%-+z(wP8*gNQohgNs4ynd&N#EMayYzq1>xERr8-%$q;OJwnHLl_hd!4z8@rzYe zBn4vDRyUK)EdTfBd@13%Q%QCsaG4>2+a~9Ou2bft5^tWb(W{F=uew`FmsjW$B&gJt zSE`}&s-T&El?fY^VgS_Xpc;PzNdG^%fOM!1R`i6?MMcW(>iO9HFLr9%N!1Ila`@$| zvqZhR{-UEY8rD5bpVm4)We2a|_%*p8w?CTXiEJ?o#ukBT@CjTZ4W=cBEGmpqo^H1} zB*W5e8;8~voFk`PzxORxB#z$?&qoT1dDz)77NwvC?|vUO9qD3*YYo)3oM*>Q=aeXH zEeUCSg}tHvL!RL{%FmGtq=YRXqu{-kf)Dy!P)CbwG^ob|Gqfc4QsK~H=q7M3X1Lq$B;@*IRQ2d(NPfpvWe^wtSBxx=+B3g6e4_hQE8 z9p_#(Ho#exO2QXaOP;>|WAluw9?FKjKh*9_w>bGFJ80MHt%8vFFxIPWU#gB<%UL^L zWnL)8Do^gJSVTC)Mo-FYy*-aJwF{{;FppWEh<#-5trQ=mAko7nGk_r|iOdz_=N)3J zOfnF!P&KhJ4Hde>CY8HF##;TldZK?aMUC&1yLd!!K#dHucYkTqzofM>kW{|^eA;XM zo|g{a>2Yv4>cT`8W`%r49K8HLiq1Qp>hF)^`YMuflk9OT>SpgfZt{%~%HA?cm+WwH zQDkJ@GRwFspsZno=^&AsNub-%yQ@1N`O@E6y0KIgp8>-Bu9O#_K*2j(y~ z>gbGFzTe2PJ~)0s4!A04Bwgac7)J-m+i46xc>U&mQ^fT4&f&Q`>2iRDdJ2s|KN2a$lAeYCsAXXSg(2T8vcdnflSc@181-1G4=$5?;KI zLKs-5+1k45C4a?_NWxy#o%Hy$Nu)8gQJ|UF{=eknvBCZ6$&NDfJ85Dfy%W7=$$fg! z0%XuKZNP(n%119m0)kaKDbcUS|?B&HLTwgAC>e`}IZ>S#}=Ut%6 z!(AQXaA4-w6kTZi_sDLP01ju>h`lqm`Vw~wW#TsFZSTe!RWJ2V^65&`uS}#9pjT{rA63d)PiS(aUpw)i+*t0v%(}iB~tV=hr25Ih?X8M z4_{LVem*{DwCA3b=Rh2D=r}QX)|Si&#Ps3>ZZ#3Z->#78>Ipe|e~*8WJ?%7nIO6g1 z3?BAa-HAL+v1Ir0fk3tD$AbEBr}r6WVx@1Dyf{CStum005RUZ9D z`cPIR4Om=$=k1`4%hrDY3Ky zVYdfmD2vxh9!9Hz^jQtrQ=N@jGZP97-PFcRV!9!mci+tX)zQ#qVW3&dUB=k^{Z8Kv znvbAY2cIPM01-)_65eR!J8R@rWj-39N9jBbT47r}+Dizm zjD{7vhvJgwt*HS`^{IA8u+RvyY0BiZx_n^0heum|ZDm1axVF!KG#semgdN}+6@$=G zT7m~-uv-bpJ*JgQ_5o0!P8nu&uy<6cr= zrL5*FE)UA z{V+6@HYF)_9e8^(t3C8ki_3*A=iw>Waxa&Apf)!`&nx>Mko*6mxvSa-KE7Vh_aDt4 znI4NT=ZBbj$RA)XUv8g4Nad$=zpkuW3i==SQP?%pe>hczK28LH`h{g$6Ee z8&%=m+Qi4?T+}C<)6M6T>s;3~%Um{SO6nBIq1ReWicvaT`53CkRIUVZe?_5UTnlPz zaU%D?ihCi&KuW>r*fp2FG_pBko<%m2{nw5zusVA%o08Q`j?sDh45 zjx?ZSn#RDuv!@$xp|sVZw1!P^Y6riu;MUAO+|&`H!GJHkAFoSiQ#%l>-iyR1UNcp? zO9;&|WhF7iO)w*ihV7X|kYG|_yD#yt?$oGB3NBi9GIZfHx2pB|Y{A)CZg{uhLBI70 zbznH9{n3$Yh)qR2;4^@Ve@*cF3%)pXV#uC>>03Eu7)QE*L>jQqW59O(71x({%hE;^!1)a9eggX ze182W&47L*MylJQA_6K z+vd-#ZlF18J?dR1YnyeO59``h<@2WV1-6y=rNU?WpL;8~2u%O_n`sDA|H*Rm2pm%( zBb_a^lW9J%d-E;5+R6$kS@UuVPF*EgS~oixP{(X_ED<0i3c0{5BV&FeZ{tE%wEuf3 zufah1jT-;(wu5jIjLl_`YN$$6;H)OlhOXoWYWYxsn%uSaw(!ac!b~c%a-VAIj6E9Ip!)5Q zpWYojwK+*k2@LpI6RdmJ-_!15eW>Z-x&H}2knAE+dbwyX^JV)bePyMzh6V?ZC0$e} zoCPO@wS;BI=`rmtl%HCktk=vIPMudoacv}Pd?lbKPQbr1r5HASDF4x<)7LKjI+zcNjfFi-hT6gvKhg2{ob)Y#T`h3snJAS`T>)+K=UC zY&Jh$WSP|Cyo5g09QwG^4)1}7n;CYY7Y-L*xOaMN^f>HS{!2${M}YO7`C6hXMKNr0 z5`eefuxJk63TYL{T#qv?R=$_zYrHmFRvwUc5(t|$ovra`-vo|`5s3%^atVrqq_Y!q zehndYQJ|qn)_OGl=5d>hBogQhU`%ms8UH^y3h`kK-G) z)%eFh;{u}_jV_0GY6H+G>VgL6MFYivSlWTZ39yVGftcaWzz!!ut&#=~)g;El6>W$C zQTPi5Dn@4#J&L4j^eML8v}p2}pDGRg8?BH&a-|jhcilE{ls-&Kz5T+4v@N^|NN?0b z&aw&oDknu}wY*A7_1up-D`0ZpBrFGo{X&XMMf=ldL<{olyOINb!aDnK=^u*bA^tBy zLnlxl)VD(`&v~f059fl^-wU_MC*bbcaDjmexIU1Tne93t$2qW+*Hgqk*Xf33HoZC< z@XP<$^We?O`75E*^fLBn*KNmhGw5~*5axoic~F?$34cjCUEmL3hLtf-`2mDN-A9Dh zkJ_pfYrBX1q82b0EXSYJpXWjk_ePYOYVVgV@~xV$5kD8DFpwazuMuV>UVW^ZSvleX>7-gvVjk zmElDBs5s__s$BV1DFZttwkdRcvnhx`%e z&Xsf15fWwzy`4gYwJ?ICIghQ#q02`9NXBA&K&9bbo^7|=$0d`B&TKXmXuJPTz(jIg zIA{_M2;*d|chy+Fn9%NP0=J|0A*@1M@ZO=R;=WDNOtYrbOV*ZGw@TN2vAm78$Irb;Z6iYr96_+YV-Q~ zO!k2m40aO}J<}!ux z*~89UBh;jer{8fS4JRpz->msPN3IKJnNQx7aJkny2qxe6j4BN8e2BPm9!LgIpG2>> zVia!nQd^)0Y}oGlb)9GQyBfHXtp9Y1*KWLp+tJlIw3s=_>%}X?-P??XR@QU8#nvGw zlv&FMm?xxljrI(!tzQDsW=O6LTVA#FT=!+tL#*|vDSX-0Sf zw}5fH-`OXXYLZ|f(j2hjCVW;ZF4sJH@5?dgHuBubE^G)~t6gwzphMgR@eUPtlB~gG zEeJ^t1&*U5=W={wd@R3yXlIwNa;x3<>xTQqSHaP9na=mns*D{Q=ynY0=Q%;X{hbFQ z^zO-9V0Ozz4%l+Y=q}~~RziIhm(1kNj~mw2U*7yWQL%}?%lYqHPw`(Cl^=)Q*BJ=e zwEh2wo3MQLescW*6N_p>5}|z}8(b*$$fUra50-z5=P@xn@s3dxX+6|6*ep9|dO2UozT8F0})xKspUMgzN-@oh}y*Uj$n0iQ)*Gvc;K!VuU8CKT$rB zBh;iHtCctVAC2QH4gO>U0gPt7xSY!SzQ3DvlnB*EnvY6cO9_{DBItD2!~5PE(g?i; z^p+i?Vee64sEGpY_p8EsnFgb5Fg-V!>>v+iO$`fC@snV;ox+sv-{kzP>V!<=@S8l< zK1S(=l;%QQXre;u4X%%LASDR>tt0Sm(!A1+gAK*%qRe3#y`6h56*iPYzBZ(TJbpD5 z2H8xvSBY^z9TWPb5&Bc3wesb-nALHQys_NJSuPAd9OXrf4JqPYuV+7yXZ@Z#Lw>so zWcy*TaT=|S0POTXn%utnY(Ygs-?)_bso!4if&K5D*zt~`!*Kr&^ckuRN~V>nduAnO zwU+w_WK~bDXU^_``NO80knvQ$upTf7ig&Qu_z~87!c#C(Sctld!czqmiU~Wk{VeqX zt~&4Gw*SuDfW4iacMqA`sPK+ve^;lb1I+Xp$d%xo#pT@DetcL=Aw`XZj+4)CZzGCR z^Zb@E0HEp$F6vD#139L%?M~CVWX!I7D}7G@k3*LK>g)zCfYaA{e&e7s5N&NI*_BV5 zu-187vh(n|IjXf0(T(w5qnwvBJfwr-x1cPUUshZG*|jcG(CiWsVt z6Xd;uN)2sCd|TyVHM>nVKQG+sfM;+9;s!Z9WO?sHcy$bg?HqV4cN)!z_RVOQ=VM3@ z!@0J?REYJFF1VcqelH7hD6!pqtPJ2~Ug)hf>${0_jE)PQXPt+d58A}5BAG7Ip|6qj z6dtk}!RRfRANo=CL~HNv^ntLb=rknMqe}Xl!M$=wAn(ASEheL;ayWf+Aivor{5NPOMuzG%l%7->GqB`(Pq*iz#ovWbX$-m(F0IAe;|8_L#ME-Q4Cr-7Q=tS`dp~VU`W7qd8jpeX#9=lGa5Ye1v{E zp@d&s$WbzmOJL6nds#8pn3I*7eVUE>pjvl0mY=qpCa)`hvuw6?*3(G8{vKfT4z72< z-R*gGDTDy2-T3PN0(QxJ zk+!ubfuy7c%cDlBOiilA0HH2aW>xIIUJHG}a zaTE|DEc8CLnd&mAdtY_ST~`6u?QSP3m!2`b_?rfTUJnhG#qF<+M+vm}t7`%f9@)cf zr7c66=lkkshkfCnl{LEgy{-EE&Iq_d(Aopdp}_Bd;|%Hx8a>_|okFICD)W*SrYSx< zltzk=?pq~VFkuTgzmD8{AgDg7N+9*0ZW#)4?R_GLh8JOsFt-|oG6N@zT5Z<9*PfOm zb|v6z5G*R2@O1;1fc%YpuvWZQwT49-s<-8+7Aj*7*V@B@fkUOf(b?=7wbiaNSpin@ zLH$kBs)ydW*?4mVIeNt1sw6 zNz2IaUnhjt5r0i6`+*^&zq zEx3rB6y-ybg$hf0By0$gmpX4D$@;IQlnAu2qhB5Um%)SEZ?=BtuI!?_Kk=|9Ke&y?#U3rF)x=|5+&wowQ z;gt0+ zyr5zZv3kBD=UY4B z0nq*o&_9`;(inO#`&P^?+^{Lx<%s;f+_kQ59u}f_unAA&FR_BS-ki0ly%^EBu%>`C z`Y*4&rMGo)Zc|-40X{<$b&JB6`QAVT(EP1*EJ5_&xVVb~y?vz~+;XNtweo&D6iQM( z`*7P^I?0gcmTQ7Q&Ory^Ph?I@0?Y=bxK}!UAwK5*-TLIG#Uf8t%WIrsvh|yzEqC{g zz;+At?A+YEjg@7m_~gY-Z)-tXnTWl6Y4aE7xbcPi6P`h?IfNv6+w_-aG${8&!Q-Kc z6nsD~5qfMs{#T2$6MAW8D@=KxOD?dTJ?yr2=3Z=tghJYZK;O9KooW~Z{Og2JeAIHg zMvL^aol#fj@rUKmYa6fqD_J({RQ@6ZrjAb@Vok>@oLZ`y6zaX_Yz#eio#M=rmKhxV zcuqh4X0JznyVWh0Javh4BDz`}M)qDNo-XuBl##jB;q9{41sWF^Pw ztKTCQt`g$7#_x~0AF8FqN;MjRT)CK3DynV&RxmP~Tu(LQ2{OBeWQ+Yag4yBMBR9bn z@9!6tyb&r89qsRadCHC$QXP~|E6}s@G}C8~jpEjAI+9iS5zUimM%QSj!e#xr0X@31 zW-oqsXgIX$To5>WhDT6T&rPk!%{|s$F}n!&b5(Liw*W_saqeKKUr(ULHF3ERno`J@ zAQipcPjz&YPIeF64i$jNI5(9uyi-F>qfKI*u9R50{IVW6#8kryZjhmd&17W0TR?qg zH5cNu$D)3O%{*zqyNheCsT6PY*VxXP=6M2Z-=+Sc$UdJWU)hP2w+-^o9X@^JaybG+ zo?Yzbz14VouuhL%4HJ6F9bgqRp`t(|{*ItR&el>MMP6Y$rJ__1)ie0x<~ zIWzfmyZfy#CCu4ED#!MT$V9IW`~6PMPSYf_*g<21E`$C*%dXELqUVph7koUxKQcM{ z!O_>l#sHuzlnq0o?;^ee-)Q57ck2@cs_v5QpuNF4tEp0drq{7I9YfT+OUvBe1^y7? za}69?tg`3*rIzvV>9uH%Kf7rAOdcsl`tS*AX`vPH8*BKMeCVy@&#-|o^Q z$>gY;3d5qV*TVSEVO*A{sJJT@)j8JWH~J%g9JOXZ(f1@a8m)t{>4^!01Wo6>Vl3gi-x+|#)!>* z<%;cH@$F2v+?y?mOAay6Yc0Bko8h&%*f0f(F0KH((;|-diqR0o9fAMZXmXpoKUslr z^b0B446yiZ2U~dkbb~Z!ZO2$x`>3`ls^VqL!GJ{c1B}V9xi8!=Yz0uQ{d}K3nLAJX z>q4Ws^pA$g#rWe}hn-8Vv|oQ+o=QdNl~GTxnf&?<+EuI!O;eYcnJ?p z4>9Vq8C|ii;GZl$3O;(J_w>Z{^z_b{#oOX=*knK6kI9fHT9Q{ss_(g@))f(W!i&4w z68dZ=jA~{g{*yf6mIa12rbo}bjWZNCk79a_qVkrZ6t)<14b|UMKvp|KE>U#ZU?q9( z5h&8jqcE{T+`m|W=0}Y)<^l2I+tpZ&orL^lNKbCGJF%O3js83E(D=@;znt5X$Z0`j z{yzLSoC8)z)tK^!dC5gtW{pP4ZN<92{Pb;>w~|{d?|}Z?whoA$CEa{CYINCEUFVul zQogGk+FYG`U+1}B=Ti{3a;I{K(h^E%e%D^unNuZ+@d~FgSBb|$Uj5Y1Yqsk5+Tq)T zn8MP23pY#|&xbWAvv;yjn=I$hwFc{{R(THMG=&@??O|+f#A~^?*OQ6v2VDkwQ?*OrE3kG@i_dq8j?I=GXAe(6^sd|(#RdWGARZh}0s`PQ;c`rrj7oKgLE)1SY3X;s0?@P4G)+P93PG^cQ*P@wEN zUS$89wpoc|kv^-6-1p5vh8YoK<1$F}gm*&=ztIkphb^7ehhC@smY+UffBX^C7Rj;p z&8>;z!j%RtV~rKK3u2m$gNubFU9p@G^Ve?tkvn(9mZl&hWfI z`C%F~RQI7*QwxM1Jd;q|tyN78 z`mq6c;h-2OrOn@9@jFh6_Uq!WiQ zSZcQUwc{x#$+3|FI~!IA2&{krN!bTq%DqxHeM2QvyXA_v4RD>NUImQ2I+nb(WrJcqFtUopv%Veh-L3|A|LhiP=G15VJeB>* zk>p<$4>IST%^RyW@*F8sZPkeS&O4w{({elY96pN71K48xPI4 z9KHWYdKp^U^7GWJUgLVDEetfL8wVu}a=$SX>5nyk*IoqnwTWJosX>8@>aj$9V4@yD zx#C=;ONzI3kIM8=><;9>nafVE2P*8#*o>4c{t++RW7+yF=by8%c(5T9vr|I<#<1A zW3jiEE8f@6%+6?8SqarJ_~b0JZedxr2+q_i5Rnts=VX$2&%DO zpOI5I;S8Y1w2ln}fMmt1x6^kL+N^`yw|7Xgc%%4m*TvZIpY^?!oc+WZ=yiBg|1zk% zGBz_R^<;q`i_pESg5XqfjWwRguS>5^RFKM$;o4cLn~-M@8L}yLH-a7*cn)Uoc8mrW z34Y_^TA|VHC$SA(DTNiOe2VFlo=ja!Qo%pi`$QQvs?P9P@tr$i%XXA$X^ZCMeP5p8 zECUw-ELY_bJ@~xnp5G^K{j4Au?}VA~RKhoNY+~8>Aov2~*{=Tk!K$D_DBFk5Wtg*f zW4VPU0p@()i30+%LhJm&Ot;V9H%uj{1SVjcKb_R~>_tJV>$?`CP2!D^!GM=6NhQ4z z%`9p_wqr`Br~nE0yZ{e#LXXO5o)f0TEzmnk|K^XjYShB&M*RSTmII{$oan=+ zLza-;mC@lfIx+38c3$}Y<7R{@vHgQT@;Y2wl4J8^zgL;`o(CD@vC=?N8}efx*{Mxt z+Z#3keK{{4{e7IoB+)NL9L!JC#o#wf<)?cO9{A%_=$jbPRzsAGG1X1IzQI>q-ewSXtkL2!9t1;6O18f``bFFgb z;K2Sr8Z@*vJg$wK^7JC7?Vs>2SyH7T3HhOoV}_j4jS?DD(`9L?-*Y z!H9o)VV3M{L(JZhWt>-ac$Yqiv%^;Qp5=&8EuALBA@#|;L$F(^P=NV%T=d*5JLlI^ zwoY!loQEsKd0HCjk1W#mC+AvWV}Vd`1(kPx0q%+EhTzw_JwW)mXVaS&Jeixo&tyAv zQ7&scGYf>X?k(-sYRdEj)tr1iL!F84UbQ@#4j*;ImT-rYPa}#q+PmiGw2@RIpNov; zIlaZ~c#lYph{?BWGRDW0>Qo0gH(@==ziaqW_jkR-1@Qf0QjOFXPe?4u%AWaS>IrN~U8XUluTNt$4jCs9Rv3T`Hp!K7~VdI~P29sl}Y+B;gWn=j!TB>2M z<(H4>KaGN(2+U;*cM@(l?)BY2_hpJ~eAglPuCr6Uf%a|V0HoQeO`$z@Qkr`Kmbv`1 zrLLR_Cy7qA7{vCBb&U=E80*A#ITjfv-N}K6+M^hm*-d5|bsric=61j~F-tt~*SX?D z-qYzCX$W8s>~19O4zgggkg62>mt;&_@N!|xE_8J!HO3*A3ZQ7wZAKu=fox!wtriMS*O@c+kLkm@xh-=3@yxdKtj@L z{c8?f{Nvh6$RT*-bT=Ndqn?j|w_TvA{99CpM$#zIeP-BDxtWn+4~aA;`Ap%>b+cu!g)-gY;es4H%9v{*Z}UqIX_FU?0lBlX?KNk+dxno` zvMYY8qVgqamDF_v>A&6FcVNB0@;gy!h5MyMG)RRyKL~RYA(W>R?($rBlPQRQPm*)K zcGEg4Xd-Mp)m2ze!p%rwN$*R|yw#d=l0cm#Bw8oaJWrn<(M`{3tY>(m+c4+a&-6P# zeY^WIS4!`4_3rCI?I1BNjHDQVz}D21+h_C-MT*#a5>E+PPUP&PirZ;#b!Tpyz$;*4 zugli3c|k4n+JmH8Ui}Y((?T5M_brnDrQN~ItUV?(l4ko#N#Jg1ZDnVox*C)?q)ViP zfm?vwZ}gVMlz%vrjawiyf5!Bi)w($Km%FRt+gjWO(H16h5_v%snEon_fN46Uga{vf zJdbKgSW3Z0zz9!;Bb)iFa$h*2(2*%SeY$GbI?0I-qwTU^G$bHt$ zFoVgiiDKa?OE(M8z{J&o!2;()?6EbupGctyk#oZ7n|%dGK$KHP$3&E&q`jW z;#4qwd$B4l=ErT9h=A&lb1Q>-150b$e>`v0doaJ~HYNL~HTQF6;ebYt@8byGS6(d} zkXj0!I^j>133l-YDpo3_B>Jz)Mj{m(ayy9VV+re<6R+5iTHbko^d&XMnlu%Sr4$?8f=MP^1u^wXzIm$~`h za&09kajjO3s=TxHAEX<2D#iVP?;k^7<&6Y?T0o`hZoIpmy*j!~PiRPRrCs%e^YJ~8 zkP>B`OG$Iy3<8p-zB)?k9b&%TG+Y!NUUT^Z;d>RUA?~gv>&>;H5_=UHP>W8icY^cy zfM4Lxq@<~O?b_hBjNfrGSJiw&0rN}$1nWk}D4kC!{Xm8<%~RXte`siKEoCRX>FAS2 z>ChEv-MYo@B#klog!Q2pRD0{Qi0X+%Umm9zf2~@>REG3kjNHb`!iN{|K0D}&*CYLpt>b5*Wj)S}b#`Em%B{4&b?c2bS=PDd@ z95qJKB_OYFgmM19O@#Jjamy#Z-0%={YMW@`F0q8wl`ET1i?6PbY&yP%?OSoEt(LAp zW1#@v7FdO^lk=82V?EXMD?0OG!B<+3fQ@nc%dwhQ*37C#^|jcYvhAhl83kXptQSEq z)2#|&kaS&MWYWpdt+hZQ0cqS@PMX~2gq%5nY+8p39O2iqWm~kuU{QSr@q(|CITh~% zdvwn9Gv_AS$~ZgK&8g~Ig-Fx;?M?Hn_>kPsCQFUxcnVf@xC9-K5qZg#fMJjJbf5Wq zBUvw@1R>nQ;>Bn%44E_SO=CO1FQildceyTl}B0aDT)pD*m^3|jM6jKUcV3d`o0#}0(XF|*rKD*1;9y3p!O=4l6Gl`sv>(U%IG;b*wp82Uk zy@(GJf-3?Yf*nmfl8Zdl6Aa*xWSQ($Y(~7y8urDWdl)^MbgH(3%=8*ePWFEjgX1@L61Ge5ccTBetluOmxy@HQUvo z$=i@w8FHq&yhlqB1UM^DUVAe7_zzA4kO6EcrspzKt`MtjNld@(wm7c}{+wuW4k~g} z>C1VM2N}4BF8Csb&g5E&W6b)Jsp^MuU%b)69C$8F9ay+rL()#j8+b>CcrDNI7K?{n$l~Eylq#4zw zS68~3ShW8@MAhS0M@OgFB`10T^xGh4w|~pO7dx=$zQgzEqF#e0_^&QYH#FW?3t$7Q zRI(=YT2!heRdD3oUvSHYX;@;7C+>SgcGq=yzc^J*77^N7c}Al_%-p)qeYmb-O}#%` z%Mq>^u_?C)&KQ=q6cWCj^F#ZL-W!LFL+ha*W|tvR8QtyI+Zfyg_=(ze@;7F}Kh&a$ zQ<2VeIr(#9Iy)H#K3+a7za|jGAChmmPWwI){$E+Dso!2D0-)*-VGy$O(jL&UeY@|T z31H($m*-$qMp9*D?a=4lPl8ie8$NEO<$a$7hHo- zPX$_@^P#>q9pp@JJ@)!Ye0-~ZBpF>yudc1Ekq;Cdm~-{e@$jboawGQiC21u-=MiUQ z=cpN;$yD}99}0GNM|d((&!pR_7@Nb;WueDWgys~YY-(^Wt($xkQ*cb|CV1ygCwCA8 zugRh~Dy%Z}#pB;>K1);i)Z>U&vPf7y%6fBp_htJdstQ7j>_EgGhm3{41V;;~{2&*X zxoN0EZ?xTqZ#|5DK}@wSXpI1J6ESM4KEjSgLX7NXKj&tL)NWaRaX~2`(N$IdZFk4S z3b2qCBG1LG;3hpyMzQyZUfbvRMP@ikUB+2?458(<65o37!n^I!${jwrM_=APnCI3< z@E@<3(-1Bno%+i5D?w_mT_If0fvv zrUBx9Ke$iP;D{{QcrImS2FHEVOW2$&Rvz?g*)lB`9`(yE*j*TEzl5i)iPH!0xKmLqUA?{A&4om-H%Iy98Xf#-bd z0QAE!zHHN;nau5sujJ}>RBi}obdMnD#@Rv56aT5Yl@Si0 zc2}?WR1oLcvS8SpN~7-kFT(wt*5*{IPz?+(_{P*~Wl)I8`a?AU`oa zW9`OfrRPC-HJr{_2ub%E3T!r4URhzyO=Y1`a}HqO53~16=`%1+ez8mEdr63CDZ%B2 zGWWX8WdUFB$+c$$iae8ophRi+slB2Ibu6fY_L6m-x{hR@VfKApY_SnL&*Zv!l!{v| z-@luFAxavrYNn?x-jz=E;18}T@4k3HBAC%F)<@WQ)}iuwTS!Eu=AuC5v(>Xa`_xU- zHzmKL?t)7R;_jqi7;7iWtyjGjeB}+SMq8#Q-`q- zS5z17NmT=JemJ2hu7WbV5t$jPS zWuL~>M!d-{(bnx6kPpb6uo&<$lU7y_=0+(p8;SbAuwmvjG(9kaY5nO_8qkw4KK8xX zwtd05BQdjcth1fFlp7O_Mjj%05Srx0C9n4ii!5q(OOff+>dP=S&C>SRH_#Ys zqNtY0&QXxsIm&&Vh;YwvBm;iVUqrKSDtnw_E+nOOT)K>0$=J78 zZ}f*K-rs1eKDh~guB)e40!bu9h=wXidkw_vo08A(kH~9J6&T3k+Xi zb8;lLF&H*E5s{i__{ z(u9GH)rPrt#@Igm{$vXNKnK7Jmg-AJeKQ1`qCX^E^M@I?@>qWOotkHqrl0vNA<3HW ziatY@kyIyv#PwSIb?4uPggP$7&0^EOQ9XaiQRZhWr;V|4vk>dlJbMu{iHST0rFJa8 z;8U{J`4h?|vJr8p&w-tyPPAFx>*$?06sI>M4O@sVwe!Gbjnf&v#h)AgDGLrLMt8e9 zdpb6F&u-i1b9!&u2jncZ3m`y5TKot)LQN64%9P*h194gN4gto2d)V&^VKf;&wH(%x zQO>A2JAIk$W}DLWBWA;2v$f4Zq&cfM4to{dPG>H8*;Us-Cp;^ z_*x`o)BfVRyf4G};vF|ZEFf9BkF>xk-KmX&2o1SriwV%vitQWsw3rg7-@G#Eme)30 z;E=zFx@H+%JIO9QW?nCcR(|umL6P-spP%DFg1=h%GO1xQrB9B7+ev!2jKo=1bn#;B zxONj4#c7hx{(>Vb!THKLgcRP7`iI=SymyHLOc8hD^MT!(KE9n99yUjjsG2}%<&g=U zCp=O&>|p|6;>-7AIz?`rVYUHJ=RYT0R}0u;blCXVCE6SQx}67ck33Jxz%TYV&{1H- zk+qn%JFqZb;zFfI@kVe#9h#Wlt?zCV$pl8L_8Iv0i<(5k9K__oc)oe?<^|%dHuOPo= z5<)9%qWYGko}Se?aOp54uI4Jrhcr%XoLdlv(Iu9K-sO z9pz!d8dp;4=sUSxMUJy{lkPJVBt!Ln+W5Qaam* z^cw|gDOb{Q-HtyR6djlyc%MynJ@>AWg6kP4L0HW*O^e22+OG-^%ul3dsgJVapE$7S zuwHBIla$GGV2$ey5i{fCS7b7jWi#QlFMARFP20A**g7CS_1o1MsW`pC#IYf1`pR1_ z*Xd|(y-T>RwBk1k;+uR>ri*{jxf_D~4N!1HZYJxZ7FvI8&AB9@VaiLi*(*+YNUo=T zpZptyZa%k=2gXTIkw{|>ts4Jy}78YeQXMEiPezOZk)I#2o6tGL%Qmp}M^*h-D?)o}6~OowQs3 z+=e*^`fubw^d{@Rk*gow(cRJmU`k6PNpmKlact2>%O|i#OE1XpK2d8Fx1ffjFyKMa zD)q5<8;OeVB>fHayQl*CHjM5b3MW=+s}q$j4K=mV2Tz;6tY)#fadOH$gnYU6YTUx) zjQ+|RS%SZpAPdm>P56z(`koH*OXxmKa*i+j@w;atwXgtO^1IZ&m0MdjxyK~$h5G=) zmEENw`-JiR(8g%0l*zDEt=}WF0mBMJC&dgv)p; z!vWSOG51jaMl9g$#vmwHAt8n1v$Xu=;WY?rFOOW(gYzO^7Uc^Q5~#m2Dr2!OaL0#G zq;ZREN!IUMtVSnLgz*ln72jiYf!Kl<07*4a7}CXhPI5~~dP;goiW6e5Fw56et*z2f zWeU1IHW{T=lQc)YS-hpONz+h8q2&Ubf^}`bS>JabO?_EFs-Lrofvgz$Ln}}$*EW*b zg85l zceN@}o+C}nTu`#dFd)_DZ^92b0)LQoc12cg+xBD|1g;%EEqm-p6cV_Hbs+^tP!-_K zJt)E7T6&Ul1~>krF;(QSPTQAzC{)*wP+H31;*_7B81SPMT!-uNVnFC!l&jegysnT_ z^hl5>&lMu)pQCx1CEE=k!us-+%H7%n9iR7e;-2DbNycBJUggpjYA`Fp-U5ik{Dgme zHbX(q{X!8zvf?x7d7&GIs(}Oa+z?3R@FnGSmA!Zp2%OZRcEyd$5__Bt)p(_cnEEAU z=KTh!w%XUK?5Ej*+u4T(D^Og9be+#hL;QMmcgzHtcGZ491^QM|!!NmX?*#Q`XolUSa5s}`F-QPE5E0XhrtmdQO33$*i6e{%rsQgm zLfa=NuHES~w_B14=f?Nv%Lo%LSl!DysvECY^BjJyA4#FFyj|n^b;8Fa5cN*5U1^{= zyw)N@NEsuv^qi=>;{R)4oqmCv&*HaEuhnEJG94;b$FMv{_C>vmZg)oPwpXmI(HsOC73}wmY-SV)5|;baSc(V<*DWrJ58Rp0w}+4a<*od{!x8CD96`WBB4zj=Qn*FiUEaFTC@r-PV5(nN3ce_V~oU5HgbS=D!o5&SE}hmuD5Olk^3 zD(LBj&XyG?ljb;&HsRcxK8I^+*WoJ`;vhDXsW&;8kv`Jxy)f4JZ?0UL+RoY#)!r(+ zW&{hA|DyW316DN#k9_wDOPPd-x5###AKv~E8gm$)bAQ;iqPJp+`ZBI^lQVW#j+oZ{= z4r2&$(SeI%pzeVP>BQn~TQd;AUDx1G6n2xv^3Rr35!3l*xg z3w1KE+gHfjomu-zQ5(vvXsx>^Qhx*Akglgz2Ym3=#5R6AG}l+9boHtSW%|15tzX={ z_}Bs_qIH0?J}7ZP=As~soy@V;WiJ^DTo2=?+Px~!arU?;nak5R?RsC&*gDLlZ%gb5 zN#4=nMQ1jrB{x>igyX%sS<8Sf$#OlACV@et7FoSooJkU{4<+O>ZFKLx_=`TZrPc0F9sOy^{wh1(`!WD!{*`=mu@vT1Ki5bxEGhX(OxRd= zh25OJfpB!};P9T}XBKreve-+5h_EaU@XmA0Hy)(H$zj2|y%hLR2PTmkT(L!!xZ~3Wr*4tg3`0%y8qMF&;mybUz z=>4a@$53pJI2QiNZohmXQSe2!b3l5$*8)GyPAtY1F%^e>(m5Z{E{hcx%g#rL62-O51^ZSg4+H`QBz=wr*RaB{#D{`W2hj zwWmC8(OWN^8x*mcA=jok9mXz+I*xd=*=z;ndc|?WQ*zv*{v%lK_@AsJ(KZW~jrR2%z>JRElNrZ`R?XWkReb@F8T6+u z)JG!EN=dB6?)zT~#VF4UJ+X#_pxUcWXM+{81B!+&e-EELytCCWaOQ$$py73=mG11# zX^z8YA6gZRVxZDt?w(W+@jruwbj}A9QL$A{knG)=X148fMqD5DaZPFkotMp-i^eNc zc0Fvp@Jcw}|IOp_z*fNPMXb-oUMhBKVQkrDbL_yyJdL97ezjRSlGV7K6Q$%pXoShG zmqKd`*y8tJAc$Dys+onmu>qlv8bC$=kFNOqhN(h35HYkWk~hw z04=pCNJtnXQr1(7;EA!2xySDFhsgi1j{9+Zx;yGnzu%Pjxf(wD?roNQBJrmt_&rwmWGn1uQ?tyZ=|RD_SbidgoH1Bl@UfiN8OsX^94&K z8Yc}a-)f%yy5~(FImV~%4+xXkbkuo5!SsU@P2OuhnF}F~!$PgTxjHQ5!k}_Q<9LYt zPK#}n^PRkzN8eK)67TumZN0V-s{q?_QYrN_W;4|J`h`6I=%>dW)Q_i7lZ%t{E*M38 z>9~vYPx*8f8FndHWhdP5t5+Ga)qLAS>f`qLv~LbdS>1Pc*96{l{&LD|l2dfez=_0- z{a-*=;nc`j>LDb-^Czo?-gNyB2%sQU7Oh>0^8HHK%9}rNKQ=g$i%~}>AFi;Ea|Lhct?mIRV5>S}7A2 z=B;KtvTEsQKa`kTmI#o@2MY47LE0QBmZYq#!YwtSopFhjp3*;pq=yyxM8{CmM&I0R z?#|LRdW!aSP(Ng&cImp)9{mda&L_X$PMAA8Wq*47DX>*)@`C(@p0BTzQ|V156I9 z#a;EHq-yj?Qj=!f=BVrSkir4!sVsN%&oaZgp3Qz+?iCaW_V($K4PrJ&k5>&DejWn+ zJ$~N&VCNf!Hub!4%vmZv)UK)Ln|E?ALeypZI z)t3%epL{nLXP|z!eaEfYJ?q7pWBOx8NXCa2efp(5{T&A`eR+Q@q~gH$yS8Vk-kNJ4 za&kyPc-?ubwZw$8h0qeGEpeDv0dnhYS+2J-Wt;SB`XTKtnO{AF?|cj9j4s_Q-S^>B z1u?k7k>#5E>Fz62*23w`*EnC{JV4eSQ6t<8wEYUGq3ur}Yf!*!i2CQVp_@%^@FCYl z$L@)HOFfRS77ROVoYblP2NbCtbR?x119{g40wzUd|~*PpT*)H$mjLeStk2Yt*BDt?57`zd04y zG@5+`yolj&$D`O}*Q6(Jg|8cihK5rpC%;7RP=S5_fVA0tTmM4Kg^SnBNc9VDi+0xg z2r+JYnf#(l~zZCeyUj$%CsoC2-zzFe1J$63smdEdU0?EDvvkMV}y#KHiRadcwm`m|IXTVU|nuVA`LWuWo&i1IFPS29@%1>dN46UXt_quz@(JZx- z&_pX5LMmW z+iKxdgN(l!moZ5^sF(KXDQxQ3$VnByi)kB3>s@qRlxkeGoGp?EM{QBIfdqxMXjzLH z7nHPAFPOB^SJ@c%IKtdFS@4^<$E#Iiv;{MD0ojCAbxqi6nHx|qxvUXuGZz86H8oHD zf#whJ&{3la@*!Ae7JNqw1@NUdTemG(n8q9*mKq=>shm-MF%?p?lZ9vj#~TxK*SvQe zn-yNm@6{O==0)8Wlw_ZGxZLo54RDE#72Wb}J-Ta*ki1I+HgHa^1Ls%i9wX+HeA#)? zA6j&v95TicRW`yL44dVnH9$vAof!{@Cge=LSG)?%0LQ&7 zYTaISiU*wwBS(!J))sNo`PJa$1xS#}@a1i7GX@3ap&%XQ@FmVNSGNhNRmR*gdCj-| zzz{!QaO!nKMIE1tH#d3rc*2fdQd(iRR?EH~*)-C?INQDN(!oWaaX^VBT5&k701`{ zqBstUJCM`?bicXtaV+%5zQ@N@xhemSoSiSY7f#FZmcT>Pz$Lo@uvAJ^@QOOY}b4Ncs5$@8jepGYY*Z#>)Df5Zz zd6&RXnSp|3k^!RUo6F16sj;Jj_)X_)>)-W!ZqM3`!Ci>icY|H!y)ggq5YC%4KHmZc zwu=_Y2u)t1{-Je_(u(yYjvTWpmrjCtNDT+vU5AFQ46`xbF}`8gfSBu%%2~@1*%8e8 zU8Ys%&Q7!kh6P##Z~3bJ&spWR`L;(>^mD~KKc^wv=!~D81jZRJ-Y<+MT?1_~lXt+; z^oiSrVi*=^9;mp!#Za$@nX2#C5Lhx?m4Wp;oU&rrIqt13 zWF;gFsz4keu@_@wR6Q4EIHv~?R+FYyc~~wDT*L5?{M-*hpq-c~N0a1LRf6M_WY-sU zeodzW-1n82*OgD!E=6D#Wdwl23RLu#(r)RSQv8EvKE)#`K`=O@DO4#YGan1 zN(yhI_4t--_!zTahG~~}cAAG0oKBf*sh%N$Tk%Fl{ZkM}Oiim3_+wlEpoXbBCq=%V zS}QSJZlv^$`uSZXzjBwG6WQ=&G-#ZYS(V ze9XLn$YX9-I<*u$-nWFmUA1y0@R})E6;Nt|aaWW2Rcfr6WYq#s>I&@`m#o0CwZM7L zYt_cAE~Ai8&N`AtC_T-W{FhqS&RkvJl12B=aUNKWp*r`?G74g@K*=T|Q8Q1F941jg zZB;2Cqg2ef6dDOez2>L`^`gF7T3ucBZQ9;_IYbpxNUNg0w#oL! zSOy=gVwKx|w`um48`wF%m2VY3n*RLsl4I1baO ze?Xp)?Eu+TFn2T=kS}YPwOpQXiy6ol<}rIKZX0Oleq^u4iOgkiX=?`kL-GdQNn<`qj9f68H{H144|Bym$aYU-<;keMa~NP*PyH6z8Xe|7%hG75&jvK;rrC)RW|txa zL8mWkSbnMElD`y9y?+ZOKG){E8gxhzIT z2FGRL8mPtM0EfH#Arr|2N-)6#l`A9c6#?>N={fdP3GBD`_ce4KJ$j|7uA%$XB}keg z7s;@eh@neM8?ygf2nDUG;c+T&bX1a>N)N{6;y*GQW5WM{z>h8{997gE4C_%|6-ygd ze%Kqtu**l>k1S4q`W0~_t())Z?vZlqwG;p*_SYIelP4(?$BAa#9$piw7XNPz9pQN< z6kju?s>RSPD2xM5MbYx3MbhXQG&tQ#n~SpMm2su%{Hc&9PJ*AlBjN=&x2~#cdzrAp zzYFJnZ1Ca>XDrL5e5f&dH^kn*!uK^)V1VJL$C0)80mmUN)IRt7El8svlDrTwtv#n-E0=6!UJCe@U{uH5QE)p>`rL+a1T>v%j52yszUUl;3 zt*qL}VVPiMsLsvp*T|`e=av#c>&A0217G%i9EV##mqxE+*UzjjGD``s{(!`?a8jJ- zI)VT9E7-GKODX2R_KRnOkM{=WMapWaO{;it@?6-;I^heS{pi47NjttnCe4W<31E^t4!tWqn}STQgw1 zrWI-3ro(la2MPk00%pq>d-Y1#F29K5q1L=)B4Qa*^|G1I)O>4!jgRiYvXHdVY4oZn zG}?mryoLLUr+tSMcR4>Ux|y*|P+m}!rY@r2D(!pMSmYimc071fwxiC!Ju=|RW+2b3 z$nI=EFHv71xNa5!Piyo&G-fRiInC`XR`_fDNl2 zDYNyoMVNqjcRf<{2Xy2g!`a0XF@~0tle6I>+|80;IQE{EE?8%kXv?KctUg+I_*Y$~ z1bb(>fycckxA(*8d3-|Kgw~G%(d{brcs1<4Ok^6@UVTJshkj932tr2#K(&Dx3v!ANx z8d9c1U&i1u7qa?J^4#nnFAr+|Jh`z|gFmd{fA!$A(V-h98$EX&LLEZwgU{6TX8Lb) z$+Y`aRn_fd$b6GKrk9haoW0`|$^Ocr zJl#}BYa}GuYt?6~je?mk?Ea0X(Ycwd=am(b@L*3%0sh!j<7Rc!L26(7%*V($%vo)L z+aQmsvC&Hvq-H{VHcsZshxObBWj>mb8JNy$1*j%14%`efA*R0aOExm0ZJ}uyvvU>& zDU52hH^_6LxU`p0?G1$}6TYyn+X7J7HuZqcH@sYYFHYIz*d@M@g!Y=>c{fm-f(<}> z9-I;Gt*omYO3=?%jC1lto38Bhd9mzX(FOO7D>0Z|#E+yR;}#CH`H{b0_jUaI<@s)a z_B_!h)X^BYM$Oz6a^uQ3eV-s2N;NDscmcQA{4!pV-fRI)CU9xhddeUbxi*m>$XC;X zJbjye@ec?l_}$>(aA4?Zi)Ke$a6u?U2kHv}aX@F! zRO#nJEaq@qt)}E?S~!3~^f{+P7d;M4hhoD9l2=toA<>ga%9Q0hdZv!>U1D zV{O0v6oJEpzBS>;?ccb+-w+E<$|7Rz*PQ#z!SoP9BO|Xn@F_I#{RYt>>M86kSI< zne4^YSoKjg@Z1UaLfC-)eQMi8aR<)5&2JQu#-FfxM&13k8_V6icw^{bh$1u1CL{vnBJVk z`6tlDl~q6$x5XmE_6+yY%?9lEB;rvOf-aB&$vCc#a`J1pkAa{K(Hb0;`aCUBo4qHju4Gfg**&;{_3(k!f`vuZ;+C5Ot~cM;R}HjR#YFoR9=QxX zY=vx=k4F){$a7Tg-~0w2=;vj&8in?2A>jL}4agKnE8RmgGlSZ=WS%B8vs#P*dG~i( zBjpunsB=6G%_-G5ThMv&qlVs3?m@GQD}KvUM~Z3hKUFUGmYir@&0}2@JFZTxmo4V@ zBU-J|Juxc%LL%~HM4O$ndAuOAt-}#v0ZvoY!q;B+B0lby`z}J6QDSjH9JQMl;iX|c z3I^%%N5e8+mWJB#+jL8`hYJW2z-fUhFFQP7eoI&@2s|NZtj+NZKlqM<73vlziNL~F-sSYkZpe`+&F54(;hid0sG~MWs2pjDOEy!@PSUAC zXxxI%CsD5YkhrBr3L&VF0CS40X$8%L^})sbK%5}I&X7Ijzq!Vm@gu|*R0#D(@ZbrVY%RQgc)c!3d+4(E_?&_bL~op= z0@88TL1;3x=E;tB@Ki$k3hHtp+L+!EC0?eBG_{bN-PNqZtTk75L4HnS-Cu>C&Yz>N zg@HS>DjydF9+#?5PX`+=U6u}+B`+umI=4ESF!zRl22~FJ7Uj~Sz?6R#r%gK36G75@ zVVAW-K;vB4=Xzce&BG+sqh3nekb0s&opDl<8hlcA%1`_*%eg^V!d`K!qCAIPvLEm( z2o$-TtqK?ziW7%#8HF*tiCA(&1EA|un%$@G%32W+eo%{Pbpvd}CimK$#6_yb0urvp{=gyf z$ci*A_oYg%JQ?3YE6~Epv5G|W_atR+O>K(o<4TwnBOe8+3JzX4u=?%n@viWythM41 z>i1<;ucqhg?c)t6j-TyfKz;{3H)J?gGj0K>CaSH_gO{9{#L$ES{G;;;$;t;nT#(nC ze!?tMOO=2rK$S6E<)8~FN2Kh^x}TYNxBr^BPxfM9Wbbi#6Ej6KI$+hk-nWt`LxOrcc z5%nZ;&J@t;wRIaOyVRBpuZc!H`UC}mhmdYJqS{c_vozpa-GU~}Y{|JN{ra~5#Y1|RrVBblbnVHR^&~@UQj`q>hW8}mAAj~MSep?c)RK*%)W2SzE1}|2N zNIbDEiRh@h2Xj7sWUbk&&QG?2Y?%a_oDWmT=E-QdLND%-=|}({9}WN;@vHFbuZ=Hy zWkk9P0)orSyIuK#kyZFD+v~5x<SCT!^g}0rtd4In5TD z`s~KX4<~KR& z4mtp-rzSTA5JjRs6Jwy`+DYK;`1f;B@;=FGVdQ9(O4N*%@X8Cf%F}Qp7o}k2s0#I2 zRc$_@&CSQ9UL{AZG&wN`fKv_#O|1u3j`YeFdKFRIUsMi+cMYu!kM#a@iYDI&iCS&F zTai#$SnA7f2oFFX8y1t0QXryf3a7(}0O-NFtzC~L=eEX#&Dx@;mjtQIs;jYWHWq2^MkZwul=I)%-8nQRjAtoCre zFn{&tk~7O?NJNN;FLat+4rnMT_RO4pQ+M35{}(sju5GA4vTYnppR#<$-{VdS#ddTn zapp-zS{N-nwr*VEBev=ljZkmCfX$@oji(ZD0V>h*>!*WO+N78dEf!w8Q59#8mrrL7 z5!ftY-+Iv15RvH9r>?2&jKyFFcfpb7M&?AhW@t2gMi#$>u*iVu;C3FTS!`83*~8=0 z)@X(m0)*}K*2~PKX_;VUQA?;g9@$*B zUG;a&5`&3C@AiM+*Bw`~8c{wJmpgm-4(#@_C3~5@Fzs*nix-3$KZ;UZmf_>BKJu(c z&l*=7Lg>WSbR5Nw)M&QAHnwD5S~`luGSxKShAO8 z^#Ox{iiRp13R?-O!GXp{(T3Z`=ae)cI)O5wxzHEIh)p{U=}aQ2UWJ-QkPVJ#8M$b4 zrMAp60Y4{VsKD}>E?7HP6$Mm?+P^efPkH3$lw9gdiRd-pzgv@jojh6Kun!+&=!uV; zeO|QmSyhh|IWDsBI*bCX`c@unUFi+AKD3Kuiqx5NLGqYLFe(*^K0$S2SOHE3dWl9V zxUH&=?>9TnxJ6iMy;K|DKEhr%V`P}xayFr%+voaL*BIx?ITFppQ7|Gd@J4G;&9SbEq ztc#>CHH&A(oK>ewQ+_4F8?%*y+XKr2c4#9N#y@i8h^HVB9Qw1vuDPYvcHWn?H44#+ zi@EVKT5hVJK6BceY^%fj(8hQjes%YK^9O@pige+>qTm+TW1`v((Wu|ojoLC#dxfV_yep>MvpN(c0tTr>h;PJ>4}K{{fGqj9N-Xt^n(_n z;o$sDg@;fk+7n=12$-p-vp1SiO{XCcP~{IHF7j#S8=4Qafi>inLuyt7HJXb|iMz-) z3QDUKM+pa9*Qj7kA3622;Au%-E$Y(J*?{7PpQa9x`2&VEw?FnaXg@sht3NhadZpF) zDGJ*o;u0a}nTgRweI8NGEu&HAJHb-75ZnLI%D%_{4Mhr)XrPE@F!?!$ln8>VJAAz9 zJ!M=SG##oEf~9*8s@%14JeFeDvQN`5VkJ)KR69$}%1yqmXg6e<3&^il3=LE8)WC38 zcei+jqgF_r4OTSkW+?y)4aG;*f|Pv)q(F}HwUZ$0@daB8mC&%}|1dugf>sq1=@rmg zLKPK(0*CPQ%(m{z#}1NlhqtT6;M7j;roO-E-0LogL1||T``RxxetmZiw-}J$Aa;%f zuEF6Yo9DH9S(+V|^Lk`s`Yf%z2Uc>R)+^*~ytxln4E0hCBXTw0|1joaTlA6=QtMTr zyp*pQW*pojT)xsFYorDPGC}8OR3m4Os=mrE+i{_b3U3Oyy&x5cs-Kt{r3QOdIoP)Z}XP|4T zarIov1?0?4q?V%0N2Y_fA!xnz>Jm=5#|+Gd3qQIAi3JO~{r?IGaQp?P&Ft)z;bqJz zR_SAp%IR@VmPKX?4IW?bg-we_eK37wIXLui#ulm^-V9--XBemcYhZMEGn9)$@H=b< z$Gxk-+676c+0pQbU9WU}lhWzXupumq`AQ6gdNyt)4n47O@cexTk(>rg|hj9VZXx*UIp$=l*xXS@}7U)Vn@3tzH2%u=2B%Q0LHI{4VDs17@Z#RoBJ zS0b9;3RHoZ->?sND>BRDoSprsHF?W!4!d7Z1EbktNO~fUrzsi;#S~6kVJb}(H(Aro zLlsO&oKQuL4i&35hW~dyf0kXfB0cc8X^<`nZT}{2BfN+CqUmzOQyB&$C@KsNRrLrx zYWJOT#yc2++(-nvxVJa>f%SV@CeBwCp5mpp4+tV+XTzdBV-PgkoNO2T&dR_m$9WB($|sL_%desu&_@~vq(8w?QD6;*1vrVNs}*-EQVin8Cr&2X z(XOUbvdNUlgl0N0Lv)VY?45-)s0n=w?iuGK4T2!oh)Qpjk^lulyN%JhdjVe!gt$#h zCHh!nne$I~+^^Di?F3A2Yat-@Dx3|<32baK5OtmaY%;9*G$zSwtIFxN*3-@T6?Dcq zVDfPreFDJ+Ccou47%!8vs;t(Z3pa;uO#6$~N zj_;Nu+&o-XrUzJsy&5O-rr%QokIYDC^BZ;z`MrICMTntPt<#V+Tg-*iw3BT+u8`); zLyUXG94MKjg6-VK-2Qf}nKx=)h83=#($QW)XTOxj#E3bYepU{#1DBh|YXLP1@0*{E ze?|7r)-o9ZE0=?BC1)V$5Cp^W`6_mGQ+gN~+XBmXG*eb>;HT2=0T>3wbCE5D%E@OK zDS@ur9dfh+sl0bkKCGlCtPUp?75|S>LXW{X21v=0n9YZ0LYS(ay7SPPjTy3$D!T!Q!?tMUO_;~ zKQHRtm{(9GzJX@9%f+4NqPX%n!cimRW`>7tP`?sK4p1%KLIlY2T8PyfX}Dz`(5tN` zNAmlUeG8@Y=fs1|+pKx_rh?^gxDL4*%_G(b$#0spD~6oZEW#gQ3pHV9v7b8!nnG=@zM_e zCuGKeQ`cnUfuNC`UQcHD6UJy(WtX4{v+xIG;=tWk@g~-BK0Su9ucJWaKhvK&n~n)U zrsbxJ7SeZ0SGO@Y)U&4tu&{-#?V*-#SL8V4yOfu3%@&5HCVxokeFLo?`=1*;BL9w9 z<7diCZj+ubJdMvs7bbZ|j zl~LJ)?H8XI2OULsjq9xsSL+rrAVuF-xvsyav-bp7BU%HWd5x>t>|xKhwOoyl_KMtk z8cYfo$%E4rj788jPOl&q6qcOoVb`KD)b9g~;y|r($160y?F)awEXKvu&IXDr0I^xr zWKDi%sB>?AMrP!r%AvrIQq9SoM_u<`_4JXWFYN0W?M$a!W2QE%;g>nI)*~8HwfU^4 z^YGD*x}_sqC(GBLbE_+&ML*rnG^Avn>l7E8Mtxh#Ec{$|_|^(fL_-7lpK3axc znp=8xExO3SD;hHfQ*rk{=k`8=@y`97(jJ5#;8wi_5!1o4hcW7D6Au_WlBL+LrcY2)Z8XN(^m4JBBXkcgkdqRG9LRDOOD|riv+8=Xf^Ed z5+|ck+4djUP|rr%f93v!D^z%UbYGS>uy+uO`yR)5{(ZTwcin%?uQ#*kVfzB<(v9p2 zs?$bTzy*h_g%<_-*ieH1)px?uVoz3^h$`8K-1x#>@nQQJmKP8%=!K)Jtl7LLY@FSS8N1`qUIm%ql= zptt+Je|6NVfpIkfsR?m|0=E@l4Y>g;QJ#c=Q3EM zO#62604uU=b?{iKWS`XvVN^%b>KOIa(r5<9TZ7_wjUaKy?r`9>^Yq<+K&_7BLHAq1 z(A$4NX{M?c;tum zQpQE)*?CB-hl-^GVHdL1B!f^!Z$?~eZbgE;T-? zQ60tUhu(YO(pSiiZrOn-ZFwV2ax28nyWI!;J>`f@=?qdfBpEnroB(-5G!wyodCxOEki1kn zL3k@;Gc48wx&e=9MGDzegyKM>V#}8Fv`A%ehpPFb3>!rxJRaFr0Bo0Sf&%-=7bPgd zkbazNmH4qGu+>zhDx7j7T=x;UjZ9_y3Kg!6oLvS!(=Y9G06TjN*oa7mItlGnkHTnh z&F)AnodJi&_S2tD66Wkv4}B-^l?-mR{6U92Or15&(zw|5INnMx)LK`*NMCjQKLH#$ z7!oC4RS+r%QX`xfB)9^PjQKdIdCd!yh*+niaI4&xT8c4*eWmPPj(}aCKL?@8Z_%jw*KAu-PeP)`G2nI{ z=m0Dy@*e8_0nw@++h7@Z80BBwR$MYE&OyulWA0ZmXeV!8ll!vSlC-8jMWZ|$2gNNN zJqk=TH`vAjAi%e#twp~IK9gWw?$@0f*NzL<4Fd^ovJv2S{r7#&&&gpG%#9Li#hR$f zr5Jq$C~XLwC-pP)yILz4bB{4Q?&@Keo62b4aS4FM^hE>bnph5|qvnXa{GT4uo2 zO+$~Jr_jJ)-6mM(=64@e8?lQ%GjcXoynF>mRBBl3&E3FuI^&FQ>1B>e|9B`i!wSK` z-KEV{)*F02{FCtGog>R3qBxH^&kR2zP6Sp%#xG@lswi)%GjNlUf4LVMh}Rf>dEHH% zCqt?aEKSnFaz8|UsDhvf<-p*ojHR^&>;T+9CuQ%i=-os)LGaiQ&La6(yizkay~Aq9 z%8~WbA4(Sx~C)@$G1S|nJEp6#M7{hCia$;mt;F6 z91dOPlAAfamn~Bx!uw!i6puU{KNqUFHhf<6_&A>1m-09leNlv&sB>{aRGVj-)`x{?t1=!5a`_#?drUN$+kU`|ne9PTUXxM9<6H zfIQ=9#}V%~2PyLDmemmW0+HqtT=8WQnjy`s`@Jxt2_7lrsM*S^KXQ0)xhG)0I<+1b zR+aE+YqWr&g~y0j$%4BQ+pdYwj}edjDjp1>okh44udfIX`vOW~R~#Z;*PWdsCdxe< z7S_b#^;_<6nUWI_4Yo>eYPScEm0NnAJ9Y}Cim<#R{${=ggijj?of_-s-5LgYoG4-h z>S!al#Pv{v1&6ikA3}cMym=flnsEl3`f9y=od^lBgU>OBW}@2QO!>#D54LwZtX~}6 zs0EWgqPUr}0Y!$Yvz5+uSA++Ke|cc=hBCULDX?bp*teu&g;Mh6?|C^7&K!fKfM0!Q zM^$x_31b&jAuuwI#N2cC?;!_#Y3k-bkfV*F3RlxE5`0FZ#ah-HTEIG$!iQgoI2Fee zK4RKAT+B9RV$_C&_t233R_r}#+#9w9vHF!H$$nO5?6Ebr!TH>DWn=%dA@{)ImGY)4 z{>T|BoOvl$FZ)vYQpaj3B`;g>AK!D%{y)p$t+7Gc)s^#TM{Lr18i2gB$e0SFzpo`M z1KBs_>$Z$7O^<9asEEm$X0UGPc%l*Zku*#8D=2gb+f@g2Mnr@do)fv$Wf9~=d<#|Y zh)D*gPvTVlcRkqtl(Jg#+0c^mOKl?ftmoRjOj2N z>*1eK(+kh_ahBx7V$0l-M~G22FrGru#z*vfO8cp2iM`FP+>H%o-%jgi~s^sPYhK> zXi1v+3B(!*De~>^F2ndQI$?`Mt_~wFt+p8mSbs8`R~r-gD@f-0cnz2F6i6BiaXI+&Y=>J7C2O8c z$NPetU4K9vz~xk?=9#kgA!K9K!)!P+7lwi$w3N8Xo#7aulsoxPR3_K|UG={V)kjLh zCrvk$-p@EaE`s!^duI4Ldm*l|(|*Z^GcHZa@iTDZ&%I^EH6L!kLv}qG zoXa#koawo^ZFo5@_b0ll2!8vi&r$?#bl*h5{3Q{-Hn7-N5DIv>&e@~hL_V}UZUXLf zlTaz=jNhoB9>5WnErh?>ct{;cZ81I?v94w$Y>I9tEVMwxfl~LH(`^=j5{B|Z6f~I(bcu9NVR}aBX&%f7X+Z?m=&_w^+DQSL;4Q?r z#5a~rMjRf{-Y_2(&P#Q#%ihfq1+wdh>66*gul#pz0VRFOJMm`$kn+0Es-KK+TH!bS zZeb*d)vGJ6`u|AmvIThKXiiF{>@bw$<1@K3PVAq-c<2WH4b#tljj5*it_y;9YKL_u zy^Rks9S_$Lw^{-9HyuO?>*OYb$r2>|gBD1vcsv7}sMx_Jk$ge1v~*&W_ML^ZM}R_- z3KWtlnN`w9xHW3<`w{mO!%NdJ_NV159**6@JK4@nd|~~7>uk~Lz~8zIJ|C6DJx51; zt9oq5)y+7TPj8i5cf@9yJ_jCB0c0~ZHb94%Kk|*tl_em#jS%j)IQtZ@tclb(Ys)v4 zSn^9>rl!XJ-1XA_wSI4=azWK-0!djLW8s~on(BA6sW)g_Ll))NQ3r>}uehN4%3Vuh z^O3b92PT___MDykm5>G-}7zlVd}j-PPX26+s4K8 z<~HTa13=C8EELGVukK;AZ68!s+odDKmFN$$X-!w zMa(S~#fk z{|5>T_K@@p-z|~4+MXmUq`f7P-!3z*?vQ54Sn2mwP2zVh$yR;&qjle8ywSfuU@*HS>2m$85I z$su_3enQ3KvimbosDqF9OR`a5{$G^>GL;3sXVmr=6>7!NszNQX<3WMqUAG3+`6mBkNr0A<4wn{#! z(~7!R6NoQw>n0`Y{r#k*@V>@lnd`IgZ`I8_s9()EH}yxDX9n*wV`y)=<$sv-q`9b8 z)$34Ehsjy9FQIZ8E%H8Tarbp1X!73agPrx(dDs7dGzt`NcTK1*c#5{aXdnxIE~$-e z@*7z**dJNJ>fu#nuLJ%~d-~Q7ccWdmWJ}ea+nUX`mPf6nNj_i)q5Qr7&Ucn|*ckm{ z%V+(KQ%~t@h*IoBJ|K`HFcIhhn-3EwzF*PaZOh$SrKuU|)Sa zvd#T?{&T& z=J;Gl0e{X>)AX(E3U~0!%el76L9gmWwu?FjUo_lqD4bsSsk0#StL+6J+<4#P^5{d2 z0aFqYq9eDEobm+~y1#x4Fm_V5WU1<9@%OBMsRPgPnB9$p2Z%M3pL6HiFDcgfw5&j@1tZ1EAjRp^Au5ibR*XleV(GsN=Kp9m4!aX^Ze{4t zpw=-XjC^uhSiFJ~af)M?o=F+g5%K%yG*tSv?||u_Go1I7)8sj%d3GUUrD^^0x47#b z<%LW?^S~b?%i-OE|1m!Xy1g#9wEy&ipzb%~et4-t)X-qKGJNIQ2OV|149MuG(tM=V zJh=9A8a9ChZWyJi!SDSP7dxnwy_!mYkIPRgyz;&8M4jT+j`yjJ-AmeMc9s42KaP>t z2BMwp)&~4)7?ZfJ$a~4KY0)%(7uN4xx*aygxVnu#E}pWU+7jK7_jd4tix_7PFJ=Yh zR0a4~Ad&yDdxxgFD@v9<9SkDMamSudrb0doPyHzKw=|d=Ubx!dUf>!~IY&x#9-cCI z9FU)?C&zo037w_uoLJj4N=A=I%!6iWcN{T}lzEdDB(F1LW3)v1CEy<~nKM%{W;2_* zb2ItGdZ1Lbmf?}v2Pzx-hfsk(GTA@(yLl}@RPS`a=L-9nbaboli%F*t5dx6WWU)6Fpx#37@VQlKk#Bzyf0T;Y}RfL|# z+`CMl=RJU20I1OaX<&1k=1qC&!VdEdH)UTXzV~2rxq_cWRq6S0IVS58qQf|I+JIr7 zwfEr#EFGl&2lO(T6qe7?s89={2SNatKt<#!$pPPaWO;G5O@# zKOkM^8|TF?-7b~Kb3arp!l>%PQLqHNo{zD7^OWAk{S7-Q3ErbIG2d99{8j-r_dxv< z3AVbacw5!rwltG!ua!;?0Db7-qxmvIu6xh?(%M}ea05PUd3&n&v{iEl#6HsV`=^mB zfv;x^q+2ge5XR0Pb7TS`kBQk{40+@ot8j=cnMMth$jm92Pn_?KthhgS+HP2jtu@FZbLCQDG`Qkv{rnZ2vny`qFxv#qE zVu1GfK=gCRsOSnzF8vY&K8YP0>h?+s-*;h@wQFCEf_;<2-ToJEM=knyS$#|RjKO^x zx8?)Uy1*5{tA*x z41^I?!;sK#Ii24}xitTp<>k3xk;Ty;i}lJO^~8eZ3d+F5{p`JV2Z1MR4@`6N!)))( z`_>GJR=K?qn_B*xHRp$9>$+I&nOp#`bHe*X4~(vtQv96wd2U=A?8jRkrxG_z);I4H zbj3bY)U*xHj!xcEzI`+!W_G1Duw?D+mz$wo-*-T5m-DgT{$e+O3C?wlf-aXn1N?Pt zT((vO`1ZALaqx`ggiOC^@&&(I*R|8+2GEWbKp+h@{Ne_uoQ6+=1LAY_e_!+5kQYOx zQ3Bwdx}=f1}WA1c^&4YbP!u78I9FWB?F7bOR3qh?^uuaO8!Qh<$r5wE0n65A&9? zzZ-(75rZ5ErHgTNi?WbxLe5ZmX4qq7Bm76!QadR?x}bk9jrSFA9SX;PRPyhVWTWTq ze!vIF;vasz4z%)|SLSr(eItjK!+HACM2B7odUdn|4P$sdiY@YW8`)$7oghN>fRqWc zJ!v&8RU%!9F6@{_aKg+Pp5|s9D5=h9UCuzWPx#sis(q&XwI^xdwr>`grFkwb=d8t9qt)Be~ zIu;pmn~Mq)Fho+8mNz-up~oFJUqUuIRG@745-!=c?Nsh+=xJ5oy0z3Y`$adk9|C}( zocMLX=Ja0(b)go4@8YB8FRmxBzw9vv$UED@P+yKX*)olX!H<#DMSJah zbPrF?5epy=a%$KXSHKN+2DOdi)uikH63Mk`ZaTnTj3?S%lsdBMk@M&Xj_L7b$#XKiH#P(j)nHww!%JTM z8xLgr2|nd(V*TVtgePb(4tkUf9$}m(!b}4GIA~fLNQ^(stx1^*W}HiRu-6V>Boy zQxOK40H{8T4=!`}KRq36DCVEqAACgEdbh4NyCrV2Sxe71T$<xkSVtF z;{$bq9%63*b9Os3(C=-6XY*LXC)KtG*>2WfL05sRb)qgm;Bp-7lveT)p|wrr=3ka$ zd$Y4Xn@jJ{M<*jYK4Oe1yLgvAqrwbG_8zH^W2&h!(%4S2V?NRDVH_BaUq};#8)wn6 z25qV_(%H*y&)erys88&5tALiNnc#AO>3YMHz3*Ol?~Ig|v$LvP zzu%Jze4Ywy$Zt}z#E{cS7Yt3x|AP4JyqY+S``mxHFZ$NeN-5?drKet%LFlU{zJ8XH_h*E4j$iwKtbSx;6aM<*LD?0hQYW zy=&+HjZe}E(K~agu?rP(hXbSRWqe|oFGBTB5#M`azk)W!0iz*fG(wjl?={;m)myBF z5RqR&hLaa^L>diJ3($x@UaKa2(iig+8`wYFzOTYBuH3p+au=8INipKPeC{<+DSY3H zqpn_$UP?jLqkX7HS16BD(HDg(WM)1M4E#j29Wy*C7G}UKTY#P9`~@*BOotOQpvF25Y?EfZ%Mb&X z?9D-{$*Ew$Tz+w3Ft9yDjC%-f)o<;5XV#6)H&hF9b4U^EvNXvZv7;FXi5gsiDwrJ{ zXP}jQ>f5#>#YeoRn=|mT`7yb3c2Rq;;qcH~Bat^p)!JS#T$q;?K8%FP-*4ILuwlZo z%gZ{`IKUnCkuh3&Bt<-+Ho62hS`xCcT-)`IP-5CK8NVobjd=gR-Ox{ocR|$Jk$m1u zfO>gHM9C66z?lQ9R)eJN!8nGGfEwAum%g}m?1+Z_dZcA)pk6=wh!sT+jf4%BqJOVy za}Uua=+0CB+vv|&pe8&7^FSAO+dtw$p8i6IjiDDGeFOODuOcW#?~R%ZMBQ@l&QvM* z2+yn~kkr~~+Ku{FJ?)-qy2AvV3$zO(nN6s7C-H$p`2CAt78TCTdIcdA8oNikf+W4F z{GW6ArTskCD2EbC52$r@hR}>s{493(_FD|JrFHtqQye{=?-x2 zKiG)#Ur5H#uzObI-_7CS8R2Pz=TLvEgC7nPkixrwC$xzEPb%u-&r+kM za6M%i$WzW8o*4e`PG3P!Qy{B~SD+JjV9QIdt>JP}{S1J1yWP|+Wc9bs7s02|AQf{`^M~4RZdV?8n>06;(65W@Q-Ogi zhEQ#m^X-$-d7p4NIf$I>o~Duq07-`r)B*7#e5Nbaelc^fM=fre!ijmkc$%$ys_|!I zEIsqz9{@LmCI?1W;j~w4EW`>iyKrbv&0;+l)gY{A{oKlMZ0-%MsS0AZObfyfAivqS z=i&=@jvb{=Q#kh9Y2*5j=C8$I)bJ;p=d|J+7kI_GtrImszBKD?MeO1Lgb@jl^shYT zfyvlKNi_T0DCUaqyR>y!TWB!0r*|*Z$uxfo3V(9_`kX%q;&8t^#izp&Mx!Qmm(oI- zuLkn&gvh*J0Cm+a$nI(ccdB&6ui|=&d`j2Oynh`!!AP==7pdX%@!9wCb1+p4W$kx7 zqv60%3MkV1%Q-l$HH@*k;Xb&gikxN&{uHx8d72)Rd_+Af<5+WfHpC{|8?Dho)Fl88 zrB!x3d^EpOnEo=OMfM#_p=uZ4YMS#a)CNhZDpXb@z{e44aCRD}uAfLfOP{^UnfaI4 zs6{Ke7PCA+0utor|H?Y=^#IiCpMBzb)R#R2(gksaYZyf2CO4w_i<_c95p4lTnUYuS zmEdJnUBY{#S!!)rs?+gaX0U5ZKZN>gQzzNl3?vx1{6aC1{5GV21>JF>5lEj?Kwfv` zJQ3+k_FjnHJbn3^4OPGG62(1AZY|F>+Fw=9q={l{Fh+Ewbl?N^&t*cExFP!EeRS)o zyY=*|3(C2b^f}JVWX8&n;e#-+t$9e;CW!8%T$$&2W-4F*K0}%?PjsKhJYC6E;%Q`FQg}4t$VzPo!JovQRS^l?ZSY%K1!A2r-{+cZhISQ@ZP4TzuL? zQroab6%nmL8;Jo4HD$M!LS%yx8Y7T&o)foN{+C;Pih+Os*Q(2=5r_=-GFbR2eDlOJ zM>`w2Rthn$7xai5-P<7oA${*IUNCl%W=n9JaZi;ND-<2>F%1!}lqOVekIj`wv&WCj z2Tq_r_v_mp$@%ZKdtzpZ84Z7p?U|JELo@2A-tGsxQv89(A&;;ZMP(u{1)FH=B9EqV zB7)XE$VPbI)niz!+j;&S^I6{%6x}N{JZbENCB+`?%Wcj>q3 zGaG;MHZ6{}KI8Ev04peR?d)`N+W+82R-)K0{a{kKdiIB5+Ns^mQG_VdIZNsYXi*|Q+HeETct(_PA5f4K1z(p`*9 zNdfLU#{o=n?SLh_c+f|&bhwyy58(vxfxLTx4Z}o7+;vAbSECbFvq*SB&}m-U%;M4b~xU6>LRk%mxA6|~5kzS>JhOKI~gILOB zPd5la*iI?ZU#Yj~z%1kK`YF(RJS)JRFSpxIc|U0ChC@btVrj%Qo}0j8RI7>a0h9ta zu6{T!alB<|5r|ai#Fbvptk2+2(#}{x2-6D;?J`0J`zrR`5&z|@nN$pQ%lMa zL>T?<*;r2GuC%)^Y;N>g>xn1zM1KN6_ODk1Z$!2maO}7$eGRz>l<+R| z-2QK4HV)1IsRk~3TR!KgT6d!R()@d>m-_-VNn4CY$y<*ZEQVDpmW zNM6aCv2~@s8)v6? z_zGJ0k8j!n=kn1*zg=$7f4{EKVaMF&m6P+wFpOJHAR6tM0q7_hFEKX8(8n$0BkfPT z$~-V({@@kYdDm+yE{IH=xIB%^@r9ZyJ3HTdQp$9|IYxaV&Ec=Jzl2xYxe?sMku5^P z!Hgs8s$-o|U4*RgI%*Kx#)jtu6iYBtkM^^32gqbTuE%zHa2{`SX^JsdWVj$k6X31|`;mw^!50CLYncI2DNz@M9<3HxhVA6mvk=5$E< zt+7Rv^saI#Ej+d1M4!d=`5tq|)=cuk2T$0&qU7YY@g6?%ZeNdB>&n^vB$MTY_q`Vq zp2$nzVB@PYDQ||i?t*|4n(98x?%tu?9qm}VH~eV#=3n1FBQp-_>Y??Jh%&$DwqjNY zK)`YUduFKh?o{56%k`z_HUxzXAN;$2cy?$?6WIJsP#a953z6-p{V=pEVtD9b(%75Q z>#es0rR1f98CxFm!^48s))ogkw`Rq5t%v`*Y4?T=$3XvkvI`zM6!m2VLSOfkDWiG0 z0}c0nM$Wz(IFMFyZAh{q9JMQ7D+TXE8U9cMF=qek*l_lf(dUB=>BH36#9J$^uUzBU zxPYCZB@1JrPr}ohmBKTkh8JKXs*Nq~52m*sgh?s5{>wjIK@7M9Wz5gF(^0cnnNIhc zT_j)7pf=u!k%Avf>EaQVR&0Bb`d32p+n^eC;!3u9E~0+SXp=A&mvl-$RIb5)pPUBh z`X|Jq1h$P*VOs`!ZB%XK;%^gp55x+& z*&ZJwokED9QF!46zogfZYYv#%4c}YL1kVV-l~dRr?Q>cT4@w$vxx_?`0 zy04v>udl{WRR3b-Vq816Lll*RvxT$h9iS-S&Ga;;8Gv=|{J?%5QMH0Jj_ah|*LNMs zB-#-B)1yD9Q!Bd?KM#4Lv6`TRpHJP{-#u`pZfoS$UCS>PzZFV;&p!0w#`EpZ^<3?r zxxe~YiD)pw45dQ^BfvfLk6G`0bbL>#+Y#Kkx+BwXV;Ievb06D^cGjRX5<{y~`Dy$h z=f5h-W>Z|49(fY-hEL>Jn)Ep@IN4(Fx&CLS*j$PQejZm$!E|=&HkwpKLnsCuL#bA) z_x%%-w?+h;1#QIkX?RWz$dQl5am@5;Lq<61owJdIWPh*9uxNy@<$Qy_&pYlmV(q|! z{506-lW~1_bW4&h48nZRaDD+DlR7W~%Xu5^-q!_g)O*q&8>cON59nX7$^sh3p9_79 zlTV`-42kSa62=hh=hJ;KiY&>21pPRAeXOqHuJdd~&8hI}rOjIa{jupfIsX?@V0e0) zihss~ZO^7vYsB!U+#tQA30}{ zoxSeqfRevIa6a+0_<3|;kxX9(bi}yUCfH9>)3ok5B0tCL46&WbMj*IirFFS{(9;;| z5gL@Ctr3L#oW?nRT=}Dll~xrooF@ZhLX4%s;ma z%$TD+lNDf!3(Uk6?^)$(JIy`Zoaj$~fK@Pu4pUoqifkp5-+V-a!G*=wn?!VDlZZ^Q zFq5P09E*a3(Z02dXkS)BLVQc24p0E^T@se`Ck(MO!W)7GgLQ4Xn%3#?mt1M_0Cb`Q z0nles@cn>H_rV}Bh(;f~h#j!d@?dH5u;eDsgCb0BK79y@0FTaRGMxqGcArft2QiB) zY11H%sYUS5t=WbHFO&2?zTaMRH=%k7_WZlCdVc#7Zpb4%t*-RNi;yv!49&F!hfI5u zJoMWf0Gn*(V3OM%Afw%_sw}Q(vRJ+6)_upA4zxqEf}ckS5DEUbJI6Hk9xQgs+mq6Y z&&|*A|9){aHZaAEGxF>D0PzyQW3upe8WmF-<87SJj};M)xA5C*crh*U1Ge9vI-+Z9 z2!8)?m>3!mu_Sz(wtvT1fviq_vz9d zs^*}xj6n7!->2#}U@oLl8k4S-XVhu;*WYR{Q9P=57tXr%ZXK<3f=Pu8SQ!e?cvBTm-HDKMqx8x@oIk5VQtMj+$}%+h8#=k2yl*I= zIUgA>n~u5udKKwxkw3&<%ATNPaWKMqx16jEDQhOK=DGO((Y&D-FLiX5&fm!^)<~S!!QiA2k zgG6I`Y{+oo^j1MG2Li|@@G4wKSkWs1P2pNjVi%YO^07kt0%ko2uyp^hc`SFOwJ6iN z+qIL2Kz73+d20*ljh;Fk(FV0AqT*5XWQ7r@b*j0gjbp!OCpnh3&9Y9%FJ`-+ozskk zN1jaUItEXoeFq}FB**4u0dF)p*7Ky_aeKS*1P)k{JsMlw2sEtBz_4W3uxCwRkYUsU z(fdCMZ2kY#9aDZ`vB?ityd(Tr-X1Gb$RZ3Q>(Z$jKCVm&OG$!ZCJ75NVaZo(4&BIv41y0OsC2hWjoIq zzMp-IkE?H~n_jzq1%jLS9gjq z-JwP2BHR;ob@L-N*Ggovs&n$dbS3m@{KMv|mU>-!zh-!RDH2G~zchA=V!i_`aH*fC zi84v_ocP}NH}~)LO?fRbpBo#EopiL!+q*Xf*wlL_vz5hkedQP}SFT2M`#I1yX8ItU z6zkU@q#yij^BIZ$>gkUMf>>E?r-uKiiTpSl`DP|?eQDd^-L~esxr(Bfg7_+@_y}3t z;Pqc~0{#MnM~c#CCz^9*y}=@nZ?;@#7|0f}zCGbTJo2|ZJM zuN$`nQ(ld%1zLE?_bC<_3VI2rv+(Kt#xCM!ZKC0HHH+Ymyr~f+YcvgQe|;E#%e=|& z=Qcc=(YW&~52l0j`zEj0{$uOM^5KBYw^&q2Vz(a>6>^cy*yHu%={e2=jyM)tZ zW!vV1d;#^eC_~qh*H^a`1e^6ZJx1_s@906(=$f~_50}FC0d2OR&FEu4&bIaUuN+WR zT)QJrBUZMTPNkI})8=lp(>%+xawzHCmb}JFq+7La+rS#gURbPW>?9{53uGaGv#=;` zaMA#J6VEW+1Xr@^1g~$!vh#2bU@6F~1gT9o2r0EC?!me?=d>p?Gb>BYZG)|! zjL-T%hO??NPG7J7yOdBo^4DNllIF5gk?;p(rnCSNO*a!gpE?a9|Igy#@6Wiunsq08 zcZiEduF@=$A!tNHp=`ipX4SA43Vd<@aM&cfSch2L07avgqqdNltd3 ze3}Y~8ny_kYhMN>;4|cPxo2z!?>2`dwU?aJIemD08eiq~K;B!vc(Z4M)QaI8ZY-u} zuH$(lzGu~x1IJ3{4}P1=X?dgpS}Y*F1Uck8hwX1X&@u{r<1;q5MzYZY-SB7r1@3TG zo94m3CJ3qielJ?TIAvz99Dw0An!R6Z*JU)V9VEQyf*qS!dy5)@z4oOS(- z?X9H5giu`FP?ahKnUG-7crMe^vN-SGXD9I{G*zdyBgOmGVpy8<6Q6`C@*MA17Y|r8 zeO2CSuZqU6pt=LDG`lm&-iXc~@uCCy2h*Ie-HqTckYXA=eSzoj*j8^Ijr@jMl+ixy zW!N_oDEqP^Prgp_a6Zspvyk|nnHACd=A-JooL%ehcu}v5hL2tUbiWA2w=yw+WZ^%V%`Fv1@)vsA%dMK=*36zGsn1Uz%VMD=z z5L>U?H}@v{OQNKYhg~vzI2C3vl{sKSc_{sK@!$?Y=+si+Wa>zyv;SusL0d*_T3S^z z`Ib;F zq~KtY|6G7)F&7N82r#`W*&;2mX|^mR&ySjPuXay4Xf9d^-t1tPDK5S!?@L(&i!EA3 zcP-BCiHy8iQqB4$A&ZbSNTmKv_;c(ayEOjv+rMwl-EC)`6vU(fB)EiJWi*ooL_@Ei zjj}h6dEB0Ho8DxNuxSLP0;CT!U{dIq=x_bat2s`{rYY8S0G< z9TDEV8h5oL1sd^y!}Vx7SiuTpU0P|8k^HI}OSTJ1`|b)SLgJWZGb^>d9n;RV)nKP@ zF1jx23I{A85Lyfw`&&%Ab8!pvXmRfv+cBO!$eqso_MM^XC0OYSk}Lq{LmE(i8ydG) zrz9tvaTOzvJFHCei}PIj9{-el&WUn&7=5xvTUIwYZg5vrXa?;wugTx>*>r}*u!8W@ z)8UuxUj`a3JnucAq~*b_6w8!NUqRoQI2Xfi{VXe%kPXci-rUb-uDys3v79VMSfO`q z;5yjt_U@jEZg->j@JutL-!u0{A8GQG2)&cDtQP;W9rJgDse9lO^7gAK?G3fz)qhog zyxxB8Q3L;^;=DBCc)x5UVi^B~>k;VJEMo;#1?>J^Br)`7PIacZ$LgUE*vUb0HtG0AnPDY<6ucRtw`|Luz-KC(VPEUc2;YI5hJPh-j%c@)wi`}0D#jy=Lx7_BaNi1bmgI$Vu39K zn0XMpJ)@v3py$Z)|EK))(RF(coyrHsWm6NjzO)c~!XFJQ=g z5L2WLRKAk{+$gnejQeAI`4Rv`fOh#wAE>@%0i9m?Vsvsah>Hkb1{ZcX(b72)F6ZVR znhflILAo3hMVqvQ45YaA066@PQ`SB5fmA^JmDnzfSQkEMX6$PciQv-bhG9S|Je6xW z8z7Gz7EXLfX{flCkUCu#H8W{b^inyPGJUKAl-mKL8<02yfw0b=10x%=#dO95$Ey~W z%Rx3N_;feA)~*Eq7>F3JG2~+-d(X06|2mJX1jE@K5G#8N(h1-bIc1r*sm&u*#=oba z83-00xU#mrs9txBjEp}<<;bK=7pUIrm>r#(Jh;260Nc zFdqOWIV1+{AvX2Q7Ok-!>zVR9N~U7T$C8}c7L0iidI4aeqj)e~{|A4FjXNpWLo6%y zjyE2XB6S!QFnqjWdr6n3|Dm(jwbyMVH;;5*RscN?*%wtvi%N&fmQ@;sj^FTBp*>GG zeAA#7{L(VmE~Fj`{qyd%WVk^Op_DH@A&~a;Gw{^VR67oj#Ucclluz)GJsCd&75qTq0>q=m)q#5J& zZ*qfyVmdq=H~ZU11JZnfEnRr z7pdeuGlsXdnJYd;vu7DuW8nyI30Q=loosig)4dCDpjRCqQ zj^4#Iayn;{7mQ!xD48UHCMPv|4m@e&B6z3>0`ClDg08QlY2av7f~AOS)8D#^f0-*vpKNbK1E9Hhw6FMhowXhD zs3k}LyqFqH|73`FqvPo$osh}~93B|jR0D|>WLnxr*96w7+Q;TJUqSf*lHSWG{8;RD zN$*bD!x7Ne?RM*Rw?!WX5Ov~FLLA7k$gLJ|#5uaS8vWQ7uyqLf{XPQXNV&umkfpgZ znNo5o^u3UY7kx!>X z4fF(gA-}r79B>y_A*Q?mFF){tZP`w|*d9yQ>z2fx3%o;F$j$K^E#N@W(n@0-$H#&{ z0iuz$x=?^)P$Hbyn0Vb5gBBQF6h;s3_=k(rpbi@|PBcHaXpI_d*LB2o4yS>oiRo^9 zYaS7b@G+1g1@}f{S*S1)gT$GC)Q#e4#o7~BYfN~@a!c0Ie^-lh84+U;?~m(%u%)+Z z5RNLit+wZ0b%Dy~fCvYJWvR6U)gK?!@*n56Ba#qv}_Hp>|(;#WR~Ju)DpQ=7MHEvzO*U4*^ZE zC|ft-#eKe+*5W(_fclia=QqP=*uYJl6qp zi`D-<Oey*!rrCV7i8thsubBprT7LTRx_lsigElXs+t|io}W9M%P-FD%@Rp; z>71?T$VZ?by4`ikWd^fREG*4D1uB8u*ZM$c2a;0|J=O|slzo`=IgCcOy#$j)Gy6m- zE)`UMWDt9zJv=8V!k5HMT%9Q$zzFC!6kU3q=Fz7tD{Dw@;Z%SFa$#Vj0jCTCQM7t@ zXqVP_8%ONq>hFpj?n$VC z8AbQ4IF(51C<1|O8Ub2yrs~jYk7#(0)M>=jvXEYO_6T=3cRMh{(?RjtbZwHB)Rk-d z4|UNU%aM~8uDa#Y@?2%S2wb`j+Rb>DTVR4*pO839$|ciW z4lFh=Wp9*ZG8iGj7P)b(RlpNH%9uxqvPdC0yc_g23VJz0x-f@)IkKtM!hqmP5ldnL z3z^0I_6)=nXA40cJRzWDL_f2-XI==1C`c(saI7_bEAM9b)+yQ zr%880)8GvfBRXt)zG+cO=q|oi>TM{d3~;15Et~b;T-%kN6asfw0R` z%CaOC>1V?^(?7!fBNf2vf=ER|qaE{|n;}a_Vl4j9OX594eWY*BFU-v^=zvKvGk91m z2-rP-@}^g5qn)g~Q<6b57#RhZ!>;qb*|$Z2Aj zy4$PhiNyqlY;IDhbQL3AEbz9t)lXE=tUo*#At$`caYiLdyyQIaX%M7R>e?QYjSKa^t@K>>r@>!c2 zdB-S*EC@oRv&B>Ye2+>Dh2=MZir|yYg?z`#S%K`x8xs|e37?=6-O0)&3c?B=R=9M2 z?qf?@Slh}UawR{x-59+_Y|UYllvGaJ*@(&wGHnMc>RJIZ;^-2h(?*B;?K{(`=;B$0 zuow_)TQ2QmPwbn>fqZi4hDMIRBlXzbuXs=w{~#pNFV2rRo2m~WZNlS)MY7S}haS0} z7|wG8DVXu@Qj{2Z!QNB~n{NfgJug9E3v@hX;9I4!Rd-45?=NL6=-Ik)!;im~pY1__ zVN%CggbmzNx@+0uMvFHW@vEN$1xFE~N%vELg?4uV3c$(OZ>;1`}_mXo?37+lzum z&v{^vlsgPq_(5{{Y}Wae9RE%C*Md6~1LS$=u?BJqrXj~&{Vvx62pdn3J2`rQ44!rq zvg}t`=47d4Tu}z?sh6{HeOE)!tyf@e#>%X=fH5B98vy$1N8)@hRS|vzm|IM=rs3B(x zi2dJs_*J-a<%V+?;b7|?C#IEzW(0dN>224XH^v7Q^$Y4twc1h5}Mp{s=PyuBUop1M^Jaa7p5u6{TRLZ>c-ZT_pVq8q^z5+x!oH1zpnX z2rDKXGHS91p3z|!Hop^s;#)%iQ7oG6>eYDc)JzIoMh}L|=g{`C%Y zg{CBHc%CsIapfjC{vc>Xz`9O^QywG&Q}}OOYX5rrrQ=R?#Nz3Dy}!q#hBtbeD^Iq$ z^6OpmM;7hgofvd%eZYu4%TWlQ2+u?dB5QRh=ehRqCH42eIhoF*t^pd}cRFUfvlL{k z&nX+kSCF}qb3ECsgR7Z6Zv4lXO@N~L4BQ$U;N(Q2tDUQAW=9ka`gOQXRw_<|jhohv zgDshf!9l;y^Go7sDgMTiuON{?_=$7E@PIA4@3m#Q?a5S9#=KG!)4#j@r+C53 zSMQ^YKP)Eck@H=Cdt3i@B|Oe-pHBLA=v9Dn#>-9)y6}xz*yydQw6og}63&cb zhvtP_o#^i(f1s>$=+;*1!t)k$c5}AW-Z-LFuwi9?}5ATeExlQx7yAkZoWag zEjx30>%wMD>Tz=2Xe%)T?f;4By?;p}yPQ4uXX}`^G?7G40!$lwVzkm7d z=zM^4on&L^xdU!tvWEJDC%%Fj#sM56d@UVEc}P55;WxPqlq25|fP?uD*=vEnWy`@y z-~ADG_A6*DJFX4lcYtWUd^^FqHfeL{@2}oIT8{mkP*1=9ID9CCJUrF@6Tb+(F*C&a zPIP|chcl#g;aRuCevaE7obV)RqNqiZbThtX^5)IiC&b0+w3CnC$2lpcTCnG;1wi*{ z)i6WS3vG}J^(a)t*pZcM8V>ODS;T?JXNuQlffFna>Y~@S`Eh2vV}D%6xc6Y{o{e#p zyByuw7g~RN=*+p49as^z^Ash>OTB+rO31oU|Nc6w#HR`E_C-6R|E7GlK2vgFmt)H7 zg&s$tvo!*r-#gt-hm4_s?45>dZO}-3%@A2qKeB`Ni(iK}Q zA2N`kQFZE6)h6A=9+*X;Pv;aVg~PHzTk*o^h=0vDj36`)^naFmEl9iLfBB95B5^hJ zphlYLPW%%7siQ|?9t+ui*)gXsphcFJ_9Tgq4#MxM;~zt|$18m^9aA0g3%r47J1X0% zyy;0yvt$9IInMahJ2K;c>~&hO+|iTZ-G<~)qQi|>PB>C?!w!<^+%c4DKPQ*Y+f zkd3{u<~79%JQ9!LJhN$Afnoc;;Npc$Wr)F3mk}Sj>O~Oi<%l1lKdkNYI`8WVpY|;RhQOLA0F?0cL36(v(2+65TUxaq6P4FgKtl-`>hVB-!YR8t7 zIr)Vo+r!Y?XNGi?Hfk7l4ij`lApHC0tw?~dsW7fV-c*!F;`s}5No*pv#|ktL=lw~h zNz&|Noho|+?$u){txCUo>NyKkoj*Icf=jP}|`u&iTAwtdb6Sl|Pdk z@yBPddUMylSrpUuwtnH$hxg6|>5Ef~r(T?jC>6#G&Zc^`lLS6Z4i(;jkHEbi8w?NI zX}}&&^2pjo0YPls6auillnGIQOuSjw9|aSVGi;Z;-J@b`Hqgw=6N#!FW ztFB*XG-6e#x3)s#(-W<=gMeWDKE-0QfLXAsY8rr#-t`D=(R!Re8wbdfoeeb?uMTd_ zU8(f27{lWh{&+|$EIR4R^9FGN$PK~@GwAHV-MfRLZ?top6LTLb&16O5b!S6f@D zpME^0Iv-P%4qFT+fV!bdL|AFY&0=&_hMZ3-YY@ykRkaWQ;YDpWvPeEyN@kCh^R%yr zL<*+fca%i+Cn6k|Aat=KY_1m{+r)FCo7FvkMZg(qEht8?Bn!yLv27*ws`8 zAf8b)b4*ck&=1^R6S3S#dSrh**gFw2)(M7yFw|oPWXjI{bsFUdk2smcC@;EsH$y&& zmkHW{$wJGMmvoE1baITj3J}|a9`bdU(vG*-vNL`JTXKyXvs7@=Moi(`jH9kR2pf)i z>s7YsMX!3E+r7000$EfPcS_~I2s5gi+YWpf`KVhWl>S!p2L0ZttsfW{$Fbw%(^uhA zuv{m5lR`47t^;9;<=O1afaMnWOK90+&j;vm#H^}=`OW#9O|%sf<%b^(=?%dm@d7B8 z8i`dLDh?SRZA+*cObdN9G*dkME>uP^>~FsoM2x)tdenD~l$JW_&tXAe7L8z&5lys)8yVK zaxWn9VBVhtL@y)rYB(8nf$g9ev2Eh1Ry_*Rjs(+7R%(qkTZiNg>9qs`sphiz9j!m8 zu+SiWLzh0c7Slh?CE2DjXN|Nw=VKB7NHVx^5Wu`qL-u9Yd(I|RSXs)ZP+*<;$K2CK zZb1TSK~IY!e_m}r?-5<8P<^>kHXP9MZ_NsPy0tD|aj3pTo;j|WYnI`crj24xOFjZr zVgta|B$*Dhe)&;0(mT9;P@_L^8ukwGasczUrobHrVjX1s9MGn*_wo^{53u|V zd^pGRLtRUr3t^3-1JHz%&%~uSEQKzjCIqZW^`i{DoCx?Slbn|KH$SVdt9`lB=HdFV z-Dfn#J!*Xxc)(aLa4J}n{$<+bp|k){VD3eSiHg;;OlqjTB(zpGwmgagr#T#$#LnUCcW%QIS0F2&kAZ-WJ_6hiP1qSe3m*CwWI!2J^g_q3VJ9R zAEOe1d0y-v!d7L%w*m6>WBeizudy4K?vy_rv^BI(%!g^@0v(hU9ZyQTqB&tCWXe0` zSC60rBXyI;>UwI7!y(z-6^|fp=bp6u9#8mmN-z{dUKoFwk2(};T7==qMd?k5Vj?vdSUS&G-_0XfrPAkNrAyA2|FPHacpG2*oxN#qi z-;o&c{|DIYi;nj9-~A7KFg1EhwmyQ#(ig-!r;@5YLSLP^C>u zn2k3WGroP=KD$RYUA#$uu}|I zb1$lr-U?+#eE$t%#Q_fD4c%i!hc{YH#y=2*hWbq=8FnoYquZLbNkS&jN%qiQH$Mzp zkLii%s_?5{WAkz<*)_0)%Ny&(aPG+#B`|4|NHueEXLm9lJF1J-uTXZTqfomrg8XI7 zsG37;RQ#eCWETrboorshAtQ;xi#0~(T8m4%O-%7PF-*$xndLtM#xw=Lbvl6}J0JtE zM3#AO#HLZ`0~2exxgduwN(ZKF*5h|CNRgrN{Vc>U&tR}A$Yh0l&tAsZ;o}R1C!;| z-u5J@nif^uCrSkfZA@aEKcf4U8Pa8l=Na8_m{EZ|%Z>#k=w1NQlx(kCKg!16XS3g; z0zuC+}M;e<{a_zuv`&4_2)^y-@5V8R7l$lEOUs0I73KMWZ zx1Xp>pA(RR>~0RK*kVH}RG?RvGn7UGY7Z{#pr>7h1*(Kpwl#9)DH>?I`pn?dnKh-M z08w{rX@onH@cSzhBnQIGRwHaY)N?5a5dV+~U7zX*VD*B%J+Vcrp^$sU@v$DE6-0TW zjBi6&pmx|EnK{3>#^&N0J;8W;cGkP5<$=w^RVg3|rO`n!g)eMr&+2*j$zKcsk3s<^ z6!d-v((ObPFh#&6KP43)=Aez9$LcP+RMS%J7sxtwHxx5czlKoP5oony^YEz@fAifCIpEunPf3e$FIBd3DOyn%q_%C!+_ z7v0prG9`0LdCAfg%>`;DPD~U;G<1k)YJ$k^+4=T5zdZlI^L#(w=kvZ^N;T-%bmo56 z(50$;OQ`nX`KI%uVJ_a~7&bN2wyQdt_4yZPQ!n_ta;YqsM3cM!S9!^eL9){joVu)m zeMF}8t)7s!Qyovx86{@fw7w(!G@oAK4?Sx zX(dyjXd{($Mk5r8C*HK;jCfZr%!qDFVa5eSD=JQ9 zCk;r=(#W~Q%Bo+UH}f?*;R`HpGF^k|yC&F{26wmDasZ9Qt*A-}CNV;F!yEO}zAsnd z>$ah=-XLGibHLwcoqz@r{C;&0|Y945cb z6II`gTnIqv`ibr6mzYHM=O1RzARLJH&Ss4O8@BoiRL71;(E_^ zu}j0pDcJVVkBYM$n0H2rEW(G6g4!>J_oZ^n95*KCm}`FIWXcwf8CqIEtt;l@t2X}| zn4$pGlvu}mdI5t-m7!wkm`^oLp3WLav0E+Swc+^mhIx8peMY^4el0H82Q$G&$aE~X)wG3#bMmZ@i4U{2W(z&i(>ZnOfd`V) z9!APSTQYRVH{WheOsqjOHfx(?_sEqUmd8RblE6-jiqR$3GV&YRuPoEl6#vI1$rSqeY?}Py# z*fxMNkJ8RO^O(|de|Ps?UH|mLH}830-G`0wo0p++)nGCANc<{n>&@G_BMGjs<_m$< zPWys8KnXK-C~Oz5cLcOChj_pR|J_!W2GjNJChxvuVs3-=tn$qpn&j*2)Tp z3g+o0z!!HEgcKG_T`f$5Esb$nD8Y^{20MT^jhf{#$pll>|CeQeIZh{d5?kU)pi@LJR zP02~NAaGM z>)bt=IllEJtoTx>v)#JtiIDBgf2a8x??wD|3jL<^^rwv@3?ci%SX`PAI=mrwW2c=R z?ucP~;atDbSv|%pKx0ut?*gi&^e2KZU3zOqxB#|?0!tf0P- z@`J9=)!K%v9N?~eF0XohwzFH?qjn_<9SA@J z!_9jiV!m^U1`bTLA>QR*l-CHhdpY;5!JOB=!@x6Rm;?HyC0QIVJ6+XmSgE1f=IoI@ z=7D_|FrFB+($C7qO<-O0m?N$nK`cS2FRvlIDWh1oo0r6-wHTrhBp z9pk_a(ZikP%G7RgED^K)Z1Q*RpfZh=YVwIcNI8$S1Oy0aV?*dh4V$m13!mu2n3Y-t2?!9vCd}to%xqZ3kRE7$ ztU?%vVjbK~eBLkP=Nsqy*ij3S-S-Y~%o^=Lc44>rUsxbbs z>tJl4tuYz+XUwSXfjLqu?)4fShXj0hJNdiGEhDwmc)S+aWOh`{oLkP+GpD9QV^aRr zLdRz7xV(JVDD_NA_?(EMSC=v3{w`jx{DuKHQ~I(3sb$9+*`F7x-V~ZssDvf!&QJ8x zA>{$9KUp)CrW2Ze{KxJy;}!QR_{Wn!sxR!9C*Bg#HRWshI(A&WqlNfz zb$GYP%h$y{kazRv6PEeEu-O@)Facx%sO2RzRgGSzj65fo&)4Hl7f9RY8X8OrLGRGE zh6j^Qbn1t}9U>e$>;e}J>Vg1@E;p6i z$n2OE3I;u|#biLuGQkT{Y8f{upT!ev!^>EU9TMatE6%WN$XMer&MWUxTaCs_N0l;Z zX&6GbEKpX=QL<*WEyw0&K7GXs(?}I6SBR0{<~H_(B3S}3SM+^wiJg1*HFbkA`~XBz zRlOaMC({GumWO&_@#)$#TQS8BPQODu4Z50Xi)&ovQE-Roerp!LeNmLcD0k9Vo}^Y= zVbc`0G6gYsVO13Qo+7TuQfI{f0wvNI@oaPAU#9gEUmFfUnZSL2$HYPUQxt+@vWIDi z`-UCEzT@8F^6w3Lct7-YE8cadR_wseSMcFH@~Le<48_dflah5)wfQzo7qf$4*99*~ z^A-n!LBxyOHTU+r1EX9_!)ssBe#=M)dPU9t&ET;)dL50CkCOVnp)K|6g?B~I-F|x( z?}6nwIOV?d*8s#$1T-K!MMFh`3A{*_8Kc)RuFTFq5nj%bHbiQPHSNkc;2$hy5kDqy zS7SP;>5`+~5f$xr5)DVHA2(<6?Y`<>uUNq$sf(P6cV}_z3WtxhH7Kl0p)HL9(iOQS zT`1rwGX@SH(g|PtY*+L7Qzq&LUhLL@Wwp?x8P(6N1Q6^}u1I`4HGvG_NeYa>HLHlY+JvES!(CjPX==MW=>43@YsQ?dPWQNTX5XMxeICk@zZm z*QLQ_{v2s0tSUsW)|%4;)g?zc(|_6!zLJj#?EF9*{8VylO^uPNYX;6{eEP#mwUU97 z8D{od^*S4-$7&a%ex!r4QPupUZ>@VI50Fe4bRd~jihmmfjfsU*zr>JRr1xg#Gz_Rj zsjb=82R>gwi-Ef?rn<6Hp4t&e+b9*tSWx>Vme=IJ+}mMh8kOPfr;X0u-q>EEPlOP~ zdyCAuV{IHYL?f7gi3hR}+mE@Kc1sGRWJ2~>JSbiELG89I1lx1ssgEUA3!F*U4dl?F+HSuy6}xs&4{K%n^zFK&$lgy4v$6Qkjl9qlJ}q{D95Z{I*l zEd-h0UZDY7Z#~HMNH9^yT{C<7{HE!)drkGqn%zD_J)X7gD*ku7dTrNqS~r1YzMqKo zb-TVXZ^f0FkG0YnkGhZlY_Jpq1TaA3v0SZ zsa!brBBiiUoMV8p%P%=N9aN*KDRe5VAY>*5?H#rG+s<`s45&CN;eqe6pZ%sJ0EpY( zGWYgFVFSO~6pHdVv~29>ryqp9Jg)*Bb2&gSP4E->r&rp$Jw}U_dT3f)hv+AkwI-lL ztZW3M%;q;gy))vzOQ$sikWhGCpI5?Z<+O@h0{K{;>RQHzmQFZt+KZz|0=ax%65`CN z|JV`jYyac0jHV;p$^j70rPU2hA8+$VF}yhh^MdymlzOqrsfan=b9c>r49v}#; zM`G>v%U8JvDX3?cHRx#|9$Qc^)^3S9@LN3}BagC{yVmUyAN6utD?)q$gmQ#Hqq83X z--o$83E-bW2RL9_GnLbVHbM2ylfoF%O@W5o2}OSDldSQmwttHfm?kf}jAxEhWEh^w zQ2Axy{h#Xt9zVTZ5#Z`HVc6(8)Tq9Av2f=d=+R7R3SWQwEZD=KyI<;J;d__(b0(?Q$zV4hOZnxcBi1R0hP(Xypr z_TUev@)FxUK9EaZ?=H=H0-6lqKv^8RvIjh$FFX@oX&TWpLCNTrraS0Mt&48EU1GZ0 z?dydXW4>MxK7GC?)OWr%nY^hqnIiHp^U5myb7-RWW&8QtvEdW1Y`r@uzz(Yj1hZBX z>-$GUwdG!X7xwLqKV}Z&N?25n)>rz&x374--%IVO-BR>ZQt>WBJ$X`a>z|ST0lukE A$N&HU diff --git a/.github/readme-infographic.svg b/.github/readme-infographic.svg deleted file mode 100644 index 1c90018..0000000 --- a/.github/readme-infographic.svg +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - - - - - - Mnemonic: Cognitive Memory Architecture - - - - - - Claude Code - - - - - - - - - Mnemonic Plugin - - - - - Commands - - - - Skills - - - - Hooks - - - - Ont - - - - - - - - - - Filesystem + Git - .memory.md (MIF Level 3) - - - - - Cognitive Namespaces - - - - - semantic/ - decisions/ knowledge/ entities/ - Facts, concepts, relationships - - - - - - episodic/ - incidents/ sessions/ blockers/ - Events, experiences, timelines - - - - - - procedural/ - runbooks/ patterns/ migrations/ - Steps, workflows, procedures - - - - - - Extensible Ontologies - - - - Custom entity types - - - - Entity relationships - - - - Discovery patterns - - - - MIF + JSON-LD export - - - - - - Features - - - - MIF Level 3 Format - - - - Git Versioning - - - - Proactive Hooks - - - - Cross-Session Sync - - - - No Dependencies - - - - Multi-Tool Support - - - - - - Integrations - Claude Code | GitHub Copilot - Cursor | Windsurf | Aider - Codex CLI | Gemini CLI - - - - - Quick Commands - /mnemonic:capture - /mnemonic:recall - /mnemonic:search - /mnemonic:discover - /mnemonic:validate - /mnemonic:gc - - - - - - Powered by MIF - Memory Interchange Format - - diff --git a/.github/social-preview-g.jpeg b/.github/social-preview-g.jpeg deleted file mode 100644 index 5d0c6378f1dc5776a25d2c0167b6c641a8909799..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572636 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

)u9l?t+PI?u+ZkfjG)|-DCef~T^W9^Lw@Ir zx;kDR?JVoO*t~ex1GK`e+tXmufi`>_jk3jsZMcM3OKo_%Vp?pZyh#ixQ>`@xFA~yF zsGrH0; z9%06{!vsTDS}ym-bPaXRJqBRJXoXg7ESnlag;aSNeiW1$u{AMMYEOlNVstbHDzzIFTA3)IJ!TZ$0StQs4nL-P#ebc?>?{?ke`=D_piRc%$-k~*^O zUdKF^5cQx}_r$7uL3~=o^#^$c-S}vkH*GfyZ<3M&I{mm?3I`M)KD6=FFg|%FEv*Af zRFo$Al0_{~#%xwpF%wCu>@lM`Bp;J~_S8Qlsr&{oU0_QKZ=Bz(yj*3oXC?HplL82x z9K#fyZjr z78wUySBoY}_QoY{k7y4jJkn9$p4hT|x}f_Qqe!g~3JphAXO&|Om7|a?9@7scVhzJY z6BZH;=4-GLk9S8_Hub--p@55(01&1VMhAH8N z>WZ21_(8U_daAt_hH#ToKnXB-+`&KYv)Og!nG#KXc92FyZkK3_a-QjFtr!WuA)Z{7 zL}v0wh-qf393+*?7gK_#qNps|5Z$k0SS-EMS)f8N?xZsZ3dRScgh5fO?VKds+ldtmVNgSeU3Mt9Rn^eE?v8JIP z`&wsha|$;WghMh z+I9m?IuU7Nm>9-+b3wDbRyn+HZQ?Gq&?gZ3gTzCzxWO0aB!g{Q#Dk|%WsV(*lQe&L z8Jswribf#i*GVWxpGWI$uo-#ONtj8oeV2aVe1LlCrWz-fTpK05@O~q=$tC~1_p<6! z_m1sJ6GmFz_9bEGAHj-i+gK0kzgc%#*;iqHl$oPQm7!(q((Qnyo77<+?*1_3!E}eD z=$2?ku|PXIoX2}yt8C3m(P?TT-yx<@@ahF^=Yufk%U(SQ(7IN*%FnV}1JAx(cI2?j zqw|H7ZQEX@u8=-C6BeQ^n>^U?jH!`1k~FN_(3TV&<)0~;RxBjo`%J1}L(<)+D&@7Q zFIso7>G{l8IXh-8l@6C@jNBO*yvJsBEvzU>b6%uh(IbDJ+dtc{(SV>R>%6TZx+yO& zASR-C=q<)kKmK67f!I;w{vy;8DG+Av(M(v?YLfGfc}oM^ZtmHk5+a+LZD%94h50fu zYR@6C*yYN&do3iLBrxAFRDr(;o@|j+E<7pi9$91E8eN-vIXrdaV1%DFU(42~$f~gs z;t*&|Ir7r=T>CX!t0GGHb-8@8I3)=&>swCMs!3UKHPR-yy9=TLeU&N)=5sR;hhbB+ zhxdy^0!2aDJq^}Q70E-G-OSifG&kbTt59@dbGmi!D9FUU^;}YLe5{le+ngxk{hZOL%< zYi^rE(WLheOVlb7m*phgZi?f`O*4$gk?qJs1NQ!LDFhu`tA_qj&}?Edw=Iaple!nR zC6`GbO(tLTfj_z12EK7!fdEkM!yfz^VqG?8{DW>3Sb z_$~W=wrp%IDP|XyHed?tH+YP!x??9T12dM2G4FnsmMV>8Ke8b-|8yB<>ZUH6Y z{ICYAVGXzJ=^-@S=D~E?On!%W6+*o`QS!XOU`{oARfBFO*`6Kl=TfS zDfMhjm0p`SFN;ThFq{M!M(Z^B+u(zHx-HGUpLwaZ1)96S*2h72shw5IuqkkIF6hdL z@EwRQaK7@CQ>&=B@y5A8gPqsuSFV%NeN68&BtR)<4k;E=+J*@=@WFkM3fC+*tI6* z_y*P}SQ~FA5o}tHC~ogBZDYm0Xi=1 zW~HdeY)TAk4Ko#z7@4~VIl?k~W;3u#k&>I9V%UdZH&;NDsCl|nCcUljfCIb(N9!}j z3yFEF)=H~OB{b!AgwXPoe30D@6h$vOhw8l6ydBPgUdKjJ8QnvV`vE=QcCVzZf>fgE za`bvr<0z=7-rD>g5;@p;Z@^Swj>tJg*Pw(@8xW{u(_!759+V3?+0ICDAd7)i^a91G zv_9tf4W^###BVG0z53WnsGwyUM|#z4cd|yOsU6RKq^h#V} z?_o6OD)PLFhPy{W4R7M#rEV-LOegjXjDmK9GnLH-{98F3h8l_d014TiA~lJs@}MWz zw3rG^y<4B)hKS_;p%|NpQIOUU>O^y`OcVWb-@BWoJpT*iqe>*go{ z>+07HN=A;4t2F>~V}B=XfH%mHRNUynt*>uh6XX?8I&h^dc93d%oWWC!DZ}?#p(yrk z+>VguYjUL9iZO?!9$X$d+EFn#()477fFMBqmWWTL3^O@AM?y5Wg-dNCy{apZ%>*Rp zqWc+1WoPHDx);_EKq(pyDlZF!vi2_zjs}#mfmCLiofK@u>1^n!!bVlHNrsNhrhZlf zN3Dm(v~nFXLe4zX3`l!ltx$@_-9{-d%9DG#IG8IhzFSkFfAP9{JfMA=mo zKuwElP!z>M-NPFWJZTIs!n6szXS$pSb=j~big?s^StQlJpZs8KWSazqByqr6-5`2l+EME85QUTK5A;i7c|?IOriSoLa9M$mUXn? z9WXCsh(>b;_&Se(ITBIIs-cHTXFZ8)s4y`C;4n6e>S8`jXl`(@ly;-&$Ww83fyNMT>xKb~nWv;?VR;?V`jJgI zy|A7|&CCPM@4LrwCG+I|k(yc$7WJ=jXNx9`KRUFGwZrq|+$yfUI{Gy^)!>1GXi)vd)E;SQ1W5vC`hMfOzy%yLmr z0sGRqX^C&=nTqH&1FsnOMsCYjLH$FhDsYtW3N^>{W{YeWob2w$L=d*Ri-mp<(mqytGW0sIYsLfCa_RR6>fnlU!K3LhrC3Qp`N z;Q&M^tJXCSX!rCrgfP>@naE=5rHNa04>k5Qoda`3OXn+ zuc4ZFh}uv)3bGq!6iSg@5=^2L8Aw*5Ac~t+KdZ=9&!eEekrd`oCSVI@cJeaYSUnB&r2N<49eP6#-&dtUN`ihN!e zKb9YC_j#MAp2RDNTDQtR|Xc^N_?@VXmC6}V|LO`x#53MU3b>a<4 zu?e>Tc(d6`o~o2)ng>)<9+%2mg-0VmQifR6QmJDtOayePEx3~ul1A@kQC+JtuB@uB zuP;v@1GTIyLxMMh?ReY}Q1yKat67;Of(|th24z^GV2});>ZUs}h`IFOR%UFu&EA zH~>9^T3(T>Ito$^HbnO_C=R4!EK8^&7O6mssYsH@63YS9nEYhFoze6m0zv>)t^-{K zry4TO7>$Gj@YZ4S))1hnQF(8@YfOmJ6kz<~zll|}GzvDOT2T9_oKEW~s65S$l}LWj z&#H?+!H1)TF3p1I3?GW4$@6h^ImJx0d{^BG78+CF zDimR=^>p{gKpRvj#%qlP1o+TMZ*qU7MIVoZ#|9fp=at(RL3gQG3^DjbvaY0K^gw5` zNs%`P~EH58+SG8P!d35c#ehWxu-D2iQqS%oRHLskWUod7kb z7n{h7=wwFkc%DmBE210Y2U$Zchi;wek4vLj(CMn%rE!2t8%G#4Kj>-dx_AK?M_Qr? zBU-4^m8vQ`Vu0J*!1!+l)KUY7)y#*=9aG2RaVgS4y{IIVUMmMNP^pnngW?U}g+N%; zKH)Z2aVv^1FiNgUI;KEV#S)5z7X3LqVR?(BloZs&jzE;c@i<*R zR(V;#F!BUPf+r-(SR4B7dG06zbH3^~Z2x$h! zw(uGlA^D8Sm3y}Yun&BpO|f!MEr_vHBnSEC1l^eVVicrPEkB?vusJR9a;r{fLW4pl z`A&~X*$v%kctyozs!}a@T_b|%AIL8Ci{yh zCL^48gnX>I#+fKa1%heJNYWwaYQ&(*NP>&z3hz*NGVGvjEEY$_m1Tx13okk&Ji&`u zrjZ1=G@6vkBAGqR0#zDC9z_xOL4xwl>wP5~ z+OMK*T0?3O>i8IWmE&xx>JfSMRHKn3OJoO>m1NW#o0)2@ILKr_3pcHBIqiW^K(dp{ z%A|CfNrL26D2k)5jcY*x#qv#49{?tl%#AeWMdL+`Vk#Imw2P3UVOD1Yg|gx{*6y8@ zP8CwAnxU4ENkXs>S;A~;q>vhUwX!ruH5U?R?pssOdG)|WFzfYOBf!!K+=P}y+6I9M zf!8X~2G>~SnI3luHX;e&%}spntybAy9zK-O%x+K`sfC%0;037ZLM42d4z&=4V$rx` z!wEk~-k=tyF`1HQ%;WNPNX5E2XR8c_DvV@`ZYGnWBD_F!o|O(_C@2whnoUU+ z_m5n-x`B=11@I!~tEcC87Myrq{Hjxfg(=}n_p``UKzZmrStF24tm#Q=-s%Bf%MenU7L>Dm1p1PlyXBV4&)V5*>6~TTMaY}$dJtXe-K~fRjbQ6?4U@uX? zya2~#6s>Z#GXaLppkD6VWOldk+CnoJ+&0lmGu6tWGZtolQLPjtZYKs!OMyjJ4t8?8 zLP$G%ZBn&?%4EFAWHvP;cnzH9y4GHip&CMV@ySz{0XIsxn=_hvO!l&?8R7+2fsYgq9$r6x zQtIk+sS*KagEy0*bIqDEB^kL+2ZkK4A1q}BsNB=s(CBaBJALCT_8M+U-~+#c2AA`W zSvB@~{y^i!vYPVBL!9>3!^^{;Ntv4WTi-rwWIsJ$*v}yCzpWb;Z#qvt(EP~Z;hkq& zv-{f$?N9CSVs5RQe?aBL(#QwOr+KL%XKZ=dwMO=aH}jGwP$$nG&N7f&V+~( zmPbE%EFd0o6OIq*-1W)B+shCcZlj-60Ks_$!+bwRU>8JFP<6G&Q*XGGoT&78bU5+7p3&_^;adr<&I%&s>^Y} zmf+~@8icMS14=23DX-W=LFEJ9T}qMN%~oMdIbf?}Ga2%O{0b_kCByzikvd0ykb%%h zjG)>@_u6lIA$YT~3Dn4K|MjI8}#o@lMH9H5O^EyI;RJv-(S1hfW zxI*W)@}6fW<{2M+vc3LLg3rC@R<=d>C5YxVO@3FN34U_*Gk@!ZDrzYidMJjlpPVYD zt}mm%O&_FV!n3<`>kCH`ZWcV`5KdgrEHS0fLSMD}rMo{IIi6&DMP^fK)Qc^tcJ@wd zn00Z$O3l*VIc1S>Zd|OXJ4jwVMaqn6f}; zoa-;|Tx~DO^`fMo)C5-H3Il-oq1fL)nku1u>>g`uksOlb(b^?O78rPr~ zV7hJ;bhANdJ8Lk;fEau-ul~jLE7uE3QAg^NXxFaQOA)05%gKTri7|WTDiHvG^=lG8 zg64d<5W!5NUF23m4$&N;<<@dh=sE$eS^$e0kk4-`I?A7FJVH!w^LuqK%9&={84x~P zpq2G#XFSveY7&VQ6>es~z|pjv)IGFImlRrKwkrf{!zx=7NH~tJoJnR9s9hS8i6aXu z&LDDpjMHD>>Ud%5q#MREh(Y7Yb{&t5bf1#fpX(6lZ3|tJTX_2VQ3V!c#&=fSn?|bS!8_Qw(sPn>{J;%Q<(DMCanV^b zIjXYN3u??Y6%0cVR6F?o^hL@`-yxh1Rca zPuCF&VaF(Flh3VJGEYYIZ@B(;^?LrmhU;ZZ;fT%HN%xaiPcO!iVnZ4Z(d#;Qb}>>2 zIP!x$c|K9u&t~54b;on&DO?wam&Ux_cL)rB*s2>)^VCM_RR~kYY=*Lqtp5>b1(4Hj z=*c?)iw#q5FIB+irJgRVU6*tJaABrPm*IKV@Urfl@&i_r4`Ka03%Z)_n{K>*zwtbG z?%3pppJCrW3~aR#M8`bQo+T`!1doubM$=M6J~eKt-p6+Kg(%3tcnoLVWj zC%OMc4{EZw=>OyB%;S>G-ZqY5k~5BG%cK*iGg`Fg(gF&iHMvz-mR9bijhVUNE{3>F zS^XH?Qd(MNm!oi=!3(mpd*yJvpLJh^`43Q|>0LX%fU*Cb8_B><6BNH4;m`2TdyXM!3^|Z8d z{)urv!Zy#K)AoXvP+X+^+e^pn4fdiZU@~6SW4`|aYBhcevZ9_-E>a9SZ(IFw$%Ybd zQ|H&5Y>}07gJM(F;~&XF-?cER)Yr7F3JVW=2`0_gb`X7U-X&9~+jtjl2U73}P(!LHPe3=X zz&31J=b@XIeryJj++}+zcH<>{NCf0~*LmuRG#rn?l~Mt5f#S8q;nvwN^b;Kg51$-q z4~qMY_8$K{IB@s9du-3{>y3=SqH)2%^u^?)%z@3nk&1L93!SuTgJ@7J$0QW2i0m4z z!%4|Zr1@QKS@o37Bk$bIBl#PqTmUs35L!3Oaw<>W9D0=>+*^JG@yPnSu=-L2et z+g|U5rH9>OZrxwuH3RZ`zld=@p=hQ3+R>E2qujyiMIYZCseVB-s^9M4%oWuaog@lw zAk`UU>eEss=ZpGZkVhM8-^;&yb?-K@ADUgV-Ep|IvEP|_xRrVc6!XriGakoo;AuSX2KR#^i#QgB)+ zBMcsp?qx*r1}Ey&#FMxV0Ens!M=bRKmot_bwPXPsdpy&f0|9}#ux2H@j$n%oFE=|v z^Lz(269&(or%1NPB6{z6^zbjp#BZ9T)0np(y;@Ms2l_=dcRV$;#Ug=|FHz%QNc7N) zb)b-NWLrBPJ&L({Hj7H{fD*H#*|MQRJUKg$f}i6vR?yP)T1q}%yr4L(8xM!su%&!T z97(L!!Cqc~n%Tx!Lx7IWaoAal;oL)Gy6@L-p8EHNNopA zG7Q6*dw!t3&Cxb(AqeUx)ym;5UW|l)L14c%b>z}i`v{bf!dX#hw?OeEfGJW+sL7ht zbIDUWQZ6Y~ZHO14cORKgu}B01KXwhlVqh8eZoBKLwWeZJ5T- zsmaMxHW{bF$Km7t!1XwY-mfgpqZm`s2#iDkV^+z!Qa5+m$M-n}k~S#iq}*LPIdhwm zQ6!aw{=^jhGOO>J8PLP{s0<8+08W#%2u8D`K9#52=dlAz)#ml+1zN?Pzb|H{fX&34 zhojKg6j?@>YecxAbqqrI(o`st_Lxd}C@@REcbp%fsTDlMuK5%Z+zQCOGyMJD^%3FE zF8FW*-=8&8#C6XQN4ji=gBQpMktuz{tF#+ARXyw&?^q;+Ot35PJXJ&N|J4oVFagq>gUZi+sMKEgW=@v@mN zl()9m)-gWA2NjA>Z>^PJQ(2EJYf48;V7@vI&d6vKfv(}5mWYo33J88Ui zu|#lUXpA|YFY9n2U;BFn6u0)B1WiOhOvKb=w&ib+x>>Osz9Z0ju`&1sg^d4bDv(7o zzKuYNAn0XiPGAe#VF7#6pO{L1la&ve!k#yKBaezB;}0JlcTm?Jnix%sT57)4^(xxs zG2p>D(g=;7X*~~y|J&B6L`{QAB{{U2ha%X}ZWyI~j{Gue4FZ=g!JnA+>BZ#~N5dU& z>-ig~Sa1_$C;E~ojSpnZuDC<3_6-+JBoC!YE+&JQ*h4=x4zUhmrE1`=i3 zYk{TxdHNbkr9D50?6xxJ&MSCB_bG-cj#(&zHF9aod1ATd?XEg9JwYD+`;0gtj(cDlRX>|?Y z3vb8lLP|^=vsM-~Rfqqor3Z25jA9`WGI1?PGIj>1lCpW0nz-+~OfmJ79IVY$>Kt!~ z92=KMW}AQMC&bBS^zJ6|Pbba0FX8z(pxDAun*rpEN_~sIwhsb>)FV+!_Hr8f)vXsu z4TiJ8u8X-QHuS_UYYBk$<#=t&zR#19`=1W9A=EYU)@Ew>(aroUpw6=4WR^(!-7e!a zOfPj&#-HmJp;W30S*8(^^U`F-W{qfgyTB2s9EP}_MG@^v3a9#CX!@m8Brb3kWq^qpAQ7q7n;KlA=f3UV_fH zoccL^a~3U**McTusbywmhjd8ko^W&n=Sv0+t5KhELKEL=v?k?%60Xv`UQ(+dIlk+! z{tNnv?yUuAg!HdApTcDQ+JLsCO5)FP#ZXjaDsUeMadBj7F&d%R+BKr$}MB~O*U%t(#7wtr$U$x z)D*T%DqoB1F`aU|w)f~iPAnmbWP^a`x|()@@%hOJvFMvvf;k8_VI!A-SGKkVFc5Vq zIS&k7Atq+!B2%4~?YQFxyVP9%GNTljV`2txS7)>XF5l)WwC=@W}z$(v)`28B#AI&9U1Z%M;XR*;S_6Y>F0! zqs^l6WC7qP@NzDXJ0wC?C~XS+I3>=PPO#^P)<$Q09(~5|n`(OM>nl%~VesnnLU)<4 z*j8bV4`6yuGj0%=b=kdGQm!rb67honYFj3<5e$;1ALVsFphsn2yK?Sv*mFNAC&mSoY0 zS9E$nVGt5|_$QJ17cKtW9axGui=S(w?c1iSgvMJ|RVMT~$=F~%4O^D;_oJjhA0Oo_ zd`i4hKKON}xmi$*{h-ORG=v6LZx>TD>rS3Pa~I0BzQ?R0m-A?`nx321%Q66!0>1&C~oZ z-LU!`l?Vgy?z01~11ZW2DsA14SIVH=VAZ0Ok11|3 zUHi!ba2+<90;Qb-Y)*-(>;rItIB>!OTm_a10N(;xiEh?51766|uQr^(tPJ1~P$hQR zhrrIK2H*?<3Rg?oIf`;i!H!ujHn`et;Tq-`Hg0o_gLkCFydAsx&w<&ia)s}!x z4IyV1ztmD6LQFvg)N~5fwX{?h6$0p`s8GPAG6H&H4Y*4Ytz`sx@}OP}-CME+aL-#a zL$^*;p{Y0#T{Sa;j&bghAW()egxBV$3~CrriVNJ-q`}^$3GLJNd#mlVgtdJF>LcaG zxyC$_3IdBwHgWtj42kR(J@RCuU$W`ZlD=fA=jBYlTcCoBEbe+|uqD~EGLFT+7mgGr z_Rb@O`9}R>s=mgqyF@--Bc1B_XLD=dbpS3{xtnWG1AG?Rtis9iQ<`~>xkQlR>Z~;@ zd8x>G>-Z@P-Q`%~khm!4J<(ibDP=kJUy&S@vO)t`GLtmtWy#J09vmssHGC)Pj~k}a zr+2%VX_;%pcamAytsj9NB8%WSySd%g+Nj>~jkX0qNVdw~66~SG928MCe@)6R)u@&1 zH2WVsne3<*2~|k6k+X018$~^?{}{BuRXaI|AUvACgiPEgTmaS-!V1?PLVl}})F1aK zrHBm-pb~OgJ0R*tt>3NV4!r9EDQU@4wq|XOC;A0RB5#$w@_c-L@J;O-zb1LqN5B44 zfVwZytRX(?8kQ%B5L)JI1@oG)B+iGGeV0Dj0+OFMJ3^0H)FBCS8ftZ{SX*19H7pH-Pa!mSw&bePk6 zuBg_L;wV~k9$!6Jknh=|;C5g{t}vWtt;J$VNZ7ST{L*VQzgq|L1TrU?lWRTK0l*c& zyV=P&m-!U!k6N6}>8C3$Ha!@+l$It8qj~tRl2bHj{H%@ARQ&&p-HGZVo3}9-q{|<@i^MT7*XBw z;K&ecz)D}&$I?-Ib zScb|YPmCK9v4X#JGn8f}96E+pXD@n9txV79X!=&JOeK^ll!cEr^=hQj-?NA|Gl z5G71DOn$9UiIW^lUfT=Q+Qvh^6$6dUKBN5FN9~L>=5X7w1Yz7lg1J{5$xP2lDPqD+ zfp=PFx$+CXS#QI7=lxmB`OZ+%sxe8dTvyWMw|3Dg*VfinhmB3?68-hsAtuJAhsRW- z&88QdKC2kslgvVacNvg{tMRL>mlEG(QvmCLPEKKW1Zv`i31_xbgk(*e)|_+CYddOF zc`O*DKNFV$^f#iq^$y^?ytedYINGzc%Z}sa>ExnwutHJ!sDo7_tz^g|3qP-!W7m$n zo*-g?xQl1So|q5)P%?z~LSyfBK5v1sHYY&a;+ErRapV+>C;>hwHE32iUbyNv7oJug zR+F@n(}70x0Vj1(%yt>Y=;lJt63hYUQSUEKXhA(LLx7I4b!MB2<~i8LH^PvDl`wM0P@&6Lkb(Quvmb5#1;rZ_$an~aXIRr} zf@k#f1fgpuBoH09LXpgUblmljyzQGX3aN8}zVF>-Ck`^oVd0#KDEr}K>XE<8LzCXN z|IlSWnHC1wbBuZ&xg#8OW}WLNm#phqefl$ULHwUDtU$@@9=RX>M{wFQVoh-(Qpu|< zwtUE#sfY-AI9`|YJGGv0pqO^d<=PdAV|*4EXL8HXdHeZv|CyP@U#E|QPcqBNVR`@C zXvyb*C6{k?>NqLEy1|L>y`k~uUpl)8XvZ@0aLw5aai5{{yGx?V&=q3dM}5J`#@hXd zKR2bejWa5m@Y2+ay{FrbK5ISMI&?H?DFGi48Lw>k&0vEL*&TXh!&Mz;A%zszFV3Ur z^!yscY_rnoWR1D6zY}9PWB0+j%UZ|coOPPNv2vQwK;u=ZLnps9Q}Rt_UH8xD(Mr)a z87vXymkXY$%qGU0=J5!kEBD#Kk@>dwn))(4-tXjhc^Ok_xrDa+MAfbV$LLx^H-t;C zp9jhz_YoyBiXINS*=yL@Gg-Xs4*O)b;)Sg2CYM!y$vk@C$YhF87>}?Bv81R6+pe$H z+F!4az8ghL{a#c&c0CndHu^EeW%1SLwxD>`1wZ4oWZ?dAR#}ex?gA{9KHmGNnA`Ex#Tpv+>O?mR9NGkM=i z0x86tG6XJSXUs4?oJpUDaZ%}6S#j2qfsp@!(S$o|$S<`OKx@EoRZFMC&Q?kVCqD95 zYnsN@vd9G4^IyT{g&8QZ@(iL+ziUIE4Y~ZMk#jD8>ls>F-tKc=X_I6A)&u=r6~(4- z)lq6mff7!QHL{}lYY&X4CtWV4-Cyi;l!aK9iVESnPo&2feM6^f&G>b4_$z|?dP_OA zI5nKmIMo=0=hBaD%0j(3r|Q-QQ?(srJCCaJuvo@%mIPsb79e9%zE+N2{P}nXXp^JY zv^DOvaj~iCM0rMD{-45&7NHjPgAlc za})gxbZ-66mXf>hddKxUL*s4I8baW7-x9Moq>97vSBk2YOBFx7+oWR& zDdpS@;g6}qr01-aAW5c^iHd{8<=ha8GMqUQu4)PP{kTzuWXJY`Br)^am--yzf z$7ylPU;oO6xqii>At798-e`GWY6vtI)D27P2$Fap5kSHHL`8~V1dOB2>F9={w*7*9 z^CB%Zkvkh?Yhw!kc7yE1nsO6Xu~3WK}{Uz_xQ{d@#)8in?w;s3ye(o{ow_K=A zRLor}jue&Vox%a{8}DA1`_fVuR0i6$TB=^9+EW3J%W#OPmHSB}j|AWawM~Q3gez-i zGA<#i-A~rC59p`pl9p*^Urf8e2B_^E^ zE+A08rFG&+i3-XZ5y<1YhWsWs%XXt2D`fSbcLEt+)=uMtzdg zd{F8P5|zlooE^GbSQdh1Aii2C;IJy5Dj%r)DS#`H?fyn8rq7o-J;j?*|f zH(oOU=`O_7y zvp+vN`zZC8Pt@o^QsC_yW)M~c zq^YjKeE1KcVUs{;z%Y)l7MZUeh&*|HF2mw#k>1MhbFdzuxBPM4R#8mK$Zt<9t~!JA z2Tc5nBWoKsW^Erf)ZwRB>7#x&x7NLdC@<#m%Gx2g&Z-R-X{IO@@-jOu9pLiaw(ju@kX`*8^t7Ey@X0t`gWmRT zrhcSCRxe0uXPD+xs{xh^lO639YapU_&{r@XHZ#P(iyqQFf#d7#t*utq{?WIHgk8*i zW)1NdnX;W?Q$~#@t_I&RsT#vtyTQ`DJZeI84MLKk@u$bQjB#%J+BQM^6g6 zrr%C=w_ozkw|1W|@5w=Bp3gMhUTJD_H1;BNtBuv4Cbs_TP90#mXSLlC=v)olz<*cr zcXJAMkAJm8`@O|TX;LIr8j-{-%uWfYzA;`{%V?|dAp|rnw3lHg^o~PIm}CgrRm1`W zImFnxbi3CX=>)8`p8kF|^q}rKoj%`!9iE&P?3dRDh zG^x1JVhtc1yv2yQnFY(jc=SqOI+dCYw-Q0ND6WbXOH(xM{bJ6C-$w`6QWHkPmjovr z|2B+`O-$GCmQdo&-&4XU__&eY3dSyTYqn!{HEPoaSWlO2GUAKaqEo!daY{l4jrr*~ z_ql6~(3|st#{U)qjG`FgNjgP+I#YIy@5h^3J^zr`jc)_c*^@uWSAZ~1L~&sxZ@yh_ zdt}d#uwFLiofF6m37U^vj=Se=YQTR`!i-HZaV#@2>DpE>CD?Cg32$~R$zk{x@T)mY z^o849Mn5>|CP+-gA?CT7lqXGBBWj`E+K3Lp(gxOn#B|_rvY}L&blG%|;*GiFk04yp zIi7_Ub~{y!%gS_!Pc;xP^q_URoV$gFDQp)uGzib=hc+qt+R<+v>|kq^;ov;r!07WC=*w^@SYQ zBc)Y6r=L9$O&=R?iL7M=n30EogY@&K=(>9!D=M15GXtnVX3U=B5uR8#w$2qXc`vu@ z8=%&yUf^HoweF2HevmOKmMB7+Z91WOpXM@kkUbxh>|L`-Z8+nrKlLA6j%S(f(eJ#$ zz$?cO{=L5Wn;w`Xwz+~MK}jH2Cj=NAWfw>|5ymeziM%@@u|N z_~??LxUO~uvxAVcIp?jH*~>g&#y}WKWL3b;MSQ^~_w1S29&b9&w?u_NLxX{=5600Q zl~Wl!n=%UeGh-=Dy8Q(%J(21@Q%kiEyLaiP*|EIIt*H3*4V-alx~EBxcww-`vHh{f zH1DrR4Q&JbcolPqJbn%(kiVu!htDtp8S-FR60?y&Epf!Q^!G|)#9@>W$6*!%I{%~j zOxDM^V&BW#+p*>AL7Sz2J>L>ciOaQ@04}ljbw}f1!`~2{ecsLnb}aOUuCWY2#NVF% zIKm8?ob>JIzYBWK%`cEsy3dio3kK?7@aL1;^smw0j3%CzMeNi@UMpWb&7SmVp9G9 z#X9=)Dz86^8g%jxiLoHNPa(jweaYzg(=kiAwl-cZ{`1&@TpaoQF0iSj&b9aLj)?Zn zQKPkollYa){Lg}3S&d`1(IwBKnWd4Nyp!dNEBhHYzKvbJ3zA|6mHWDVL5bX{U) zU2D1edmXP=c3~hWGWUUq)*Y{M+${7*UtoU@jvq(zaefJ!_C*jBIP-_!w1GWA`T z-k!vc$j{11>Chcda%L3{M6uc~Kqki;cPfpaPiEFfCUnES16BEK$UB z{9!!G{qQ}Q7KG9`20%Up`z^sn4GU^l-M*-S!kPdDIm>9^ETs?HccRoCA3j}hqX)S7O43Le*Kq; zVhbZF_w{$2Y$%H*Whq%pOD56+)gfXK@5;>3U1t0%84*aIMKL&4-!sO{qfg}kLJiPh zSLfiymefmSvt2|$d(H7U%YwsPy&O`_t2LNkFtzn-_y_a|tBJKG)dhx#ak)H$N1f1$ z=Gi=M<*CpFP;i1=G3{E#=G7vg@hr(~k0q7h29XWs=A?~xbZfc@&qC6?Q{_D30UAMd zVDGrkOuZr~0+U@KkC2rKoNZKUH6;-t$?8Ku4Igg7lao8;9BfH@hp+$t4*zGZx zYJrOQcnz$%hv6)rbt7^Z5Y3{xe|wr4vq=Lo=2`+oCJmeRKviafRPY%c3!3&8t3Dg8 zrwouu@k?c3q=d%fTJoiAqOaa=D-}}J2hkPAYn-}lN1VHGN_(SclWov|~r|C+A7u`bf#yG0Gs72GGOZ&%EzuQqr3Emjvw9-xy zWw7fEuSfw~!u(;iN8uSylrae!Qtyw;>&7_qp7-n&2_E{DjR%Pb0W({C{N%}+wt6b> zd$aHN_W9!(eMpv?im89{wE*pG&O^fa0I;I!C1;`LK818}HQGbQc{za|RH>A5I= zhSAKJ7`|=SB}p*_n;jptCTP>vYY;_Issy}j$)n^NO0>G4X5et>a@(u_(T>0PA3=`n$b?B z-~A*QX5_DZpeq5? zfbM75X+R$9Nok89%Df6%6?K3ceNDlLJox$IM)ywkl^CNlNKhWtB?Ud}KK)SPtPUo7 zBDZ5Vh)RW|Tzj+eYdv67gpvb1aSQwpgrhtxjTqFXNE+V6^`Q>Edc}wa9?NPU-k4{i zOUzIKAv|YTIKmMyJJK*+CDihm6w%8mSLhOqEp>Yfx{c@#I%PmvU=eV`C zh4tJv5)7(c~uZLCCMt9lL+#)z0*7PE_L|P%Uau; z0b9+%b|>4E9aSz-OVkO-iY{A1dwPgwsn6jIvd;xmA1#LX`aS^)O;HDYNuN`?2t2~t zu`rB8zo0*hiz4ou<1DZKQE~zd#HV$vA;4rQp6sNn2ryUZ3l#`{$+87-;mNe?v$kj4 zoYSB?k4Aq`Z2s>8T5JAaAdpsJD$eV|x*%tas(XQyq^^3sRXhx-A^tCeWcW}w0hRDI ze?>gk9j;k)VLF{yZ3NTUgv+t4A3LD$(WBrPG7H& zsG&>v7bGKobe{=ZCo2&d0CzihhbRUMIb8a`Aiw!e$-ujf?>6G8?HZ~cE*&4LWVb|r zN=s%3ai~U<6AxNpv<4f4dF%jlPA)Crhu)fau(ZH$?A1o#7p zy4}!xXBCXqBUX#@a*58)mCf$V)C2cqGfn@3`leozaN3?R1QLD6N<`y*;{;yb^Y*1M z471z(F1$bm5D@r_5K~sS;~Np$C0W)jmk&O?70vsU*s1*PipF`>)yKC6B>IqRxX)Ii zNWzt*`8E&rnvCFf(U=N^7;-9)>QM0WdU3R4Syr1#OOk!)yNe30Y@+h2#mtn0Q1V(Q zz4I&wAx`M-`H0w!6vY5TVW{p_h4P;7p3xp2o+l#X+orTXYlc>98>O);&ug#EG_M@J z+N@|xa<8jMT)}Smu?w$~2wv(M1sV-yWg>wmt)&f8#9j;hAIH=rl$t#KWMiDJMe(` z(*6V7)8PbeMDx)6eA2L&9)N2+fwe43NJ(PD`)M=@;0IF@ZTc`~hFC|Mq~p}t+u$eD zxSTp04l%m^E72{Y_(W1tSWRjT+CFh%s1q<2>4A)HFC6Lvt*tzIe1sRE6wAbV2IuwT(2IbU9I~b=jq| zJNZSXh>W66M-O0Rr8q9oMXS!}B_lNWcr_lVJx+O4o&SG%bZI{v3+&apWVwtDO6|W^ zm_Id&6(meBw6uTX!YsMhMU?~s0=Rut=26828?Cwa&7(Ns!tgVt5@c9bz+y{Jk0B-W zpeR9K{s{h{>B!ELFE2>>TSD<`uDE3) zwh_mr!(JmCsT5%RVl{c9NC`+uxB1b>B0KLGZur5;;I-klm%(YX!Z6Cb@bG_a4{Va{*4)XPet9-zI&3 zOMY1Pc%?uPPqXdV-hBC0Gi zV~v2{CnE*tjiu|kcdb9vLb)+h;5)UX(9~aO=U=~FUjAH}m=t-lu8B)%ns~SGVne)` zDydAJ$A@H)gyd_$s`n`F4cn2AlL%EQ4$j&RLjUG+a4zHRedQ zu0dCczB0^IxUr_Eyzu+P|H^zC6rm*(#S^`1#(0-Uk84oUOcTS`k5Eti^=IS1=JPf} zEMpwTa7&wOLM8h==r_b*=i)1cfBk;Vb${;Q%Pww9*AII9*DeoCt)N*Mo9%4&y=x#Q z=ex^$kO**wyvus`?g`#xYe&HLm2mpgh0`xzkB>9sN2Y2c`0dODU)8iZHkre1-oQbM zxD3mRqtpi|Qi84_hDyYw-G2>|R1!GE!Q5OUWDon)s_6BSs9N*vLQPt<5?GtJb!$Ug z@xVniThNU&kx|qk?}Eur&|TY$3-Ub* z*!5?0B$lQXHw=p4RuY>3Z4hqzcHOqb znLV}@CwGG_VvWw`LtMHLV&mM@IImqI3y^1E2`(Lrz5sARp1MLk9hRPSctS&Jn;^7CzT$2LvdO7)oq$)y zI4wb7Cjx|iC(>;Xgke0#-zpumx!?}Hr`I|^RR5Iop!!R(+3W6L^aZ39)BtCHJAZV` znTt*DzHB z@x0$eN5~=-G99Eik4+b88l*WlRYgChM48+vPMioBz9S-|=I47SL+)N!YnIH^UHn>m z__>eh=&8V9#H);q1hh?3Obb~jKMwkbANijb#;*@grsQ1-&ikDnAM^V!2utK-=FCoa zqvMC_t;!942Ak|R;g`swZ#&d7qNG87<%+bP{BrTyd)}qP^wVAw*wMWsk*QCP^GCPZ z7$?Qh?_Rp-_xp$ZQ#Q6WeZ8^AKTfi9jdI^wbq)Tn`si3ANn+u@3mC8W!@z;zzw2Uj zolOibZ`XTj5oKywmnx*9Q$v-~DH{*g&ko5DQ`oYU3ufF1nJ<^@cl^g|aPMS?&(c!e z_)K#XCA?g*wOb zBv#bd7PDA;ayFg8sMuros|b>0@K>+3@~SX2_zT%IZN5c(Qt`o(xvA?fFKsN0zc%8&{^G`7JT%kRhV4Zx z@ngzvIIP_pqo~A3>)TVqc!zOxtIG2GL2Ye*g0c&W$jI^9^$8r$;`3w8Gb=X)C9B`P zG#K**_KM8CD~^3Cj9(99F349r?(`jn{1qDq`;7UWibKiD6eC3XM+2x5q zr-!iT9)AhroPL0zZX|DjyE`9mzvskM8Ff0Dix=_3CaebKlRNIt;B7M zH-pz+@vC$VPNh@k@yfNhGbiUi9&!J6DHbD)B)8LL97vW={Ab9S7m|Y1YxYXL6F+y+K_>;n*b3Btidl6E`LagmRzM1q=g*5HtRQI`e5ggQ4v!P-18`>a|_Jpp8 zyC9XV7^cYiPpTFp0tAHiByMQ!e86c;YU&QNBI2^qi3NVc{Jv-xUAG@~(xH)?GP=91 zE~krrSP_*SG>Le(CE9i2Ozc1Rj_-^C71{MdDL?m+W{-b;A~q`r=qp;b87o0DRPJ)s zp>xl;Gjt=4nx$CHbm}_3ZudNV?#SYWLG|Ib!9{u4h~M*xr{PT>nrUGbim<&Yz5yX`jG4}I%yUSyHSB+0@Gy(xRi~W6DU2HGi0U39Hdv^YL>C8$?e0ZSTL0We=;%U27 z-CI?EIN^Cg(_qt=?OjXbH(CX$%&&lca;|&Eh7^MA1WBLovy&0jZMruP#=5?_>_u!w%{(Kc@!JTibJL zzdxSG{y1@c?lI#{ZEY=+?-_BaX7AL{+sS(u{X)A#Zmuhp|H`A-+vmUf_4}0n(KA>> zOM~(RBsyILPA3L>UWrMO{ozpj*GZ^CK0tGzZpwY>PX>7h?YRNH(}%2Be=sX(#sLmMcw;@+T8~DaYkL22m-O&e zIumw|Pe70V3+k@VSPXXS-sW1Vr_Y#i?&eghC05>voqZ>FG18WCb*K)233!!Lzs7t-leeb6ol!?e;yWSMira0JNJ22%~4ykd-M z(LhY434h>mL<2z`b?xy@1|d2uf>}qE?nrEv4yldpHV=c4KWtgA(My46o=lKf6`blz zUURWekSQp5?K)tH+9HZ%J}c+InD*yGftk~@;8~eeBmJdo$iqJ9sV7l(Iw8qtn}ybF z&B$}^{QK_jJSUOxvervW)CpqWwM%^N)Z5T#oi3pXH-RzFF{>RgLv#JNd zxgqK>du;{e2`wAD-(R#Q{PhW%>l#H!hJ$9hr?(`8kMA9C+mWc)Tj%}95P3+}-1D6z zIFx`LPw{KTcdga(A`d9SB3}O&1@sq&3eCBErPPyjb1DfM1r3g)Zjp?UC#V$fqLBl! zTTSwlO8>U$oa_(HU{B;^y#8j_S;^j9LpS}&;(YwCxn!MR(-Br#w-CX0xj!9-ZT47< zxEc{S6usit=DRrfMZWcMA@};IthNasxGFf2dR;XDxbB4P8+kMKVwEKqjPX4M4TIvT zkieK!k@|D}tF{IxRL|i-t}#+vkiq`g4a&uWq>tS}qyrycy);=cP4h+(YtCh29bT;5 zb^<^0t*9;fU%V>m!o3DT!l)Mi(`l>Py2lfvBavl{)I*J`UHcAxu-Whi+A^6wz16Kp zlJ5x>&hLI-n563j4vUNV$LS27x-ntJ+3}s^@gF}Y9B@xU^xRmW;K;qmS?P z`twM}xd>UG9q-Aa&|nrf9Q(>A{Q3-kyw0y8l3E>~*vh*Cb88Er*N#dDC$O9V;(iaS zTq9HHP1ehwNa8x@ZUxyMKEvgMabql&qA7lV>XN9EOkjy;K=JqZ`;Ucp+@KPY3=o%G$^)79Yn#OxYXKpCG2kIE|vk@;0=uM`!JhL{xwi^u)u_oFj6xB_74=dfv2Y|wYh`gZsM~TeF<~q^m z!_B=jyy#G1I^P15oxVi`&j-h1Z5DLMc3Jt!a%yr-;+ztBBRKe$si_jQ$#4re-_sH{ z-Rueh3CSr_Sfk?#snplUBUUf257((%QdSLqso>l&v)LZ#!}U%|Po*S4ErGcbbL0`xj(9V_E4J`A>?K!3)+|YE10jg`?UH##e>} zjkK=aAd8OgJ&dFN;3k${DB`MA3cW_&* zN5}__Tn=6HI3)F^SXAsf(Njf_^kvSdl0J`V(Q`-dEsPm$_I@jDfSxuu`l4)yN6DqX zfAIP=SR%Yj1{FoJMz!w zsiK`_esy6q^t62wzsw!Ug1mQYw>tgR`K#x)X)QeB4hjj$+}TeuzMf+l-f-+N z^Y^jsNxKorf0o7Xk*~ou&*O?jCc-54lqXL^1e9!Hhfk*DOUHLF!EWPWjgL1(_iCfy z_WK5kh?m~dDcRXh`_t~9(GKIQ4{o|#CDpn#)+`Lx1eTYsSaa{6^9m2QDsS{Hua7W) zvK;sR;f&qgS(BSlSMR<%n_t7x|6IMRr|Zw!e<+XgNByEF*z=peqOGlRZk<8)^neUP zjng6ixq3*U!M%C3FF)dlzDd*rutJA&)T-JN+>EE>dk(hmd->zHje4LRu9)3cV&Uc~ zP}c_OQfx%$;RkbVVt;B2tJ6gEL`)v$1R6TkOHuo=SIvL#*vlA+S`7#fV=TJ(1)j?c zUu4eAOwkPWdB*ia7X-q8$&x){|KS67@bp(nT9k_X4WcI;dbQEXwZ*|6d;o*tr#@I!F~#$a0lqb24PiB^=Z1np0n-8VKQr;7s^UhNCAg>?q$!Q- z`<@`;lY|Ce*cl{)^thSW?c9DcFsg?9`2v%1fm@+bMn*2IOh+VK+bOM}y-U#dDovVaVJK()?ypQV%M=%SNt{EhlWX1Uc{J<>P_jWsd#^^PcE*%e;?v z`F;i|rVg(;K2RM}$XZ$VwC!$qJfmYWBB-6`H?wxaG=TV4d3|lQc7hpM#qAfHf5-{c z5Fot4`(|%|OfIl7zWg6Y=N`}G|G)8RGL;WS2Qr5~)JWx&+A!0}G1f`SxhP2voAaFM zoaPitGszu&Lxx}Mi8N*ysT zik8BMvZ^O6bBOWdpVt>cY2YQA($@ye|-Yl;iCua$UKs11BIX=$V-yi_vn=i9a zS~4@9-^r?a0EZzV%iA~{Z~V81Iy8aLB?25orE-%R<&pjs zXNTbVa94g*LFA)Fc0m`{nFzQ}?C;`OfS2`upyE^>mkQ|OP+&G#sU(m#R0gs$g1*>P z22x)XDvID2c<)cKCZ$zYpQ@S@mXhs$&0&a*=FP|rHlN)H4>W08=>#u}%#&?qcBvBr znAH=gj(iAtlLh>aOA~V#H~H^`4R)@siwp*4n-RjT&#Yz=irt@T9NZJ0O<(4;Yujdp zdkVvZg1>PRpI3dn$A%mhy`VQCj+Tun(@ zgEbD!L{Wo;Gm}kj{(#~;4#DRvjh``;!dP-V$N64SN{<&l38IXcLJE+%-V$Zia4qrg zW{v*as9qDPkuOgy0n>ex3jb&oS2Ss*K$#qsAtWZ8BeG52t*#3KSqWk<&m^#$n^B3? zlZn&Tgw<_LeY_5OlFp?sQP2=LykpPB438%!S^op+0xckd>#Z$n2}!pSeIf2iNc}#4 zAgy8YZjnzx^ccC5{kn*H;GOV^1Z6lvmA$Yk59CCkn9O$ux&53H=OGtf(|Z(BsbRD; z*wQt;Y??Kx3SqIHlHOg@ciBHJ`$bH5DKnI;eo}^W-L+VNf?@6)bDlS zGe5d~*U2V<5jW`LRr_JCbxBDz`N9!6($>h6&fIiUHoT_P^bXl5Ln51OPIy*%;lK&F z=tN&#e59sDi-H=1Y*LFNMYokcN_7}@HdyCGBF_X{7rZ~9SWr>b7?Oi`}64V%p!_b_k&wIre=y{EXO#lLpH}74zMS zv(>}hz+eXZk?gJYFlF4XU~Qlt$1TY1b|<3}&k?pKu;#v@5R$EYWUUfzB9Xvhp|$yqZg*3jxWghNY4Z(hv%OYodMsRbn1%^KOjH$|ldcV-|&K1B4-y)m9*G zunL^;)|3FPEz$nUsm7>n6Rs#02;KoN&E5YDc%8)lRB|Cw26#4H#v^6!M*alv*Xe=N zNaB1^L_lIxMa8>0+zMb;$|m{Bz!dUe;?fuZFNoo0v$K73_7DhB<_vinm%4nqVr1(q zLn(Z1O_?Btuc#FOfCLx-pj4r+`~)dCZHE~Hy4?UEb-zRc&`t#f8eK`BSzv401JSSz z6-y+`%LBm(9CX61pBQQaY@`i6l;6^FxMSJVjOMJE>%Wp|*M&R|5iy@SoVY?C7p{!O zkB`GUX_Ko04E{}IXx@%!ZS1+V83?*<1V^?4qSk87=rT080BxK|duau7BH*!*Dj8om zASKVNgTbrDtI+UBY4|D-?o}J-jPyoQbT^`4OTfCUnDfUOzKy67g_#s9u1hu3#-%ja zfj?7r>My*N26ZQnMxOvaOz8z#Ltf%JW;~tG;d9yo=J{)D>x*=_@B#JLb~Md}*i1W` z#b;KJ&;h4k(^TGSKVx>)+pZEY-r!5l1+2oVYz?C#8xtqbO(oezcT%FMg-SIFzUPeB zXmF5}ThOdbgs65V@02cnTLOv1BB+1Ns~(&NfZVvXh4*~`>f5ENR?FhX-o|)OBTI^@ zIGeCK<>vVXUO-_1E|Z>#P}Rf>#IPPCX;QwK1!4l&e?ViCpQynIcwvaKSkkh&IG%tX zqTR*JnyUtO{7nJ)KSpNrUg3_F!iCbQN|jUTm6i63#eZ+s)uZzVh`HlKrk(0>Si|KT zah4REGFmZ4y&sd@LJ3_{!AE5w;ap21N&dw5WCrnnpqyro7}=wT#Cc$-=)do1E*40< z<#s3=0Lk-m_WfEySLp#0824qGk_|LiTr9>g2*#}T9cu{O3GjYSmsZu4xY{xrtG!Bb zuJ8xmJldP>RWj1J?P0oR0aXdZ; zk47=j^>-ZRo9gNVnc=vj(a5@6|J|ilg@w7q-@@o^Gkh(F>bJ6u+kPNkI=&Jav$Bnb zijeg%qGqqxW)r6?6rzbUXG{7Gngwg0X8Rqu90abR6(M85;+_h}aq(3d zn*e8EqQo6x%u?V|5UV3_!M?{vu}+@yEv+yx>9R7mA&84#HKASapsBix$6BiZ?u`Y3d+JHSrWHK^$EC_W6JPl^Pf)awrLhbyN03BA`iP>SneI&wha1 zyfiF+_c)4> z8xt!0@6xYY775CzefB%Uf`*vW2Z39>g51r-p5r2?KAU4}ob8A9T0{x4#d;+Rcn`f> zN{oU~fbGw7n{ZdMRZK{HltP-(L5w_@h-<@8&T;4`6Eolx^D9_?f4z@yJRysowR5)1 z=3q5Yl0Fd|+H&A$NmW_bn4`mbRh50CX!{f_zjAocp)@cg{6Phm;SIxlY1vbcqyY{= z^@UkmxEf4FgLFKm#yC5pS=_fLocNA<4QpnuUI>m~%y!z^j+B8^Dm7CDEP-9SiL)<5 zFU2u!mY>}h;lw`(9#Z@4%1VMzd{#}9V7O;O5Yc=*hP zCy0hpX2o3 zx8loh64NbCep8zWduqOu`OmPWN7zx%FnQs!MSE7c?#e-Rq7I1GB|YK}at>^N{e>;D zFc-oU6%0H_HUszzhx5VLuh^V&9xHR8mag_yk|GmG=y&uq^YHFl^OBq(##m*luY=3a zOAos?j^{reeU_`SQ*RUjjwi@UD}v;Plc15&+hMGxXqtm_JNiz297Gi#dT$zid4k6s zBo=?NGy6S4Nb}vxtDn9r{cQ+gHW{`V3%VKc(g!=JZ^CQ2 z+$&9~+|01?t9n)Zx%bw}Z})0w6hyefd;y;WfeRP$xhT;GE??4Pr@X8=w3yFUl7xd2 z5@JGGjYrgj5vx=(0(EZ2KRS()X~VQH?(bp-Ru0tH`%PUe7}q||jec>P+-AFN;Ar4~ ze-AZ6F41Yne@8yo(=luyUfIH-)76OIJyRJoR+i!=u{Y6l5{jg2WIsALWSHX_kJ3qV3sp8KrZDst@)YS>iSqM*bJ3K^mUoP_HF3x0gXE? za4&Zi;}^uU=5;5g(#76Lu{7^|F;Cm4w(d=k8|gs*Jkoi>I-+*k^xv}a`^V@VCrY>9 z-S6lM{tQpuX&XQ>+UqYyy}Wwedx(}5fC|#|4ot-ljyiOA+Z_BWtrzeLo#q`nZk9$Y zeKgn9(^RkEQ`@3GCG`XZ%2j}0?0Ujd0IOUdOg>Z82`MlWn-K$cr~d<;gAy?gM{;V0 zPoV;|{9!N5+JI%#Id+BMfA8@wLt%>C)lMIEdC%Q_a1*DFkoIHx-#ThHpYhaug4o!n z@K1zOo8+Gd?(@HLygB*w@+#tkKAZNEVeJL9&--AX;Vsvuj*`}y{RCi)i~+(2vWSUg zNllq-HQET9PRZH2(j zo7=7Jd9XIz?)SGw=34=E{YrLGVC2Y+h0+MI2y7G6It|JyB@h!!VfO~DDt z1etS0TXW6nRaGdjw@4I5b0NvgQ!5j8NUE=F8-@U8CRn~ESUirZ9D@TSg4G$rY~0U) zf@bltbjy?1{9Ms1r`fN#?5|td<}<5N_s%KGVs#K5#=Mbb$!&c+sZsGf8+7*3au{C~ zDiuP#K0nyP>{P7bEI2Yz7k;r3tNAcwh>DB;FSh(5H}L|1mA9JZ1=BC4R52IExaMVz zyKTHY*~35K!{eLUp5a;#>_Fh!^AmBQ+VzW23{?$jxfupiCs-?JB`d%m#XSj;xUT@x zIs`fTwZ(lVAnBC3@3I+P_g0QLgy{afRetk&Tz`}FMU2+jYo>pR$MDd|1iddR2EXFh zf7k|0k*qz8v3q_PZpI(IL@_S1vVTon5HQmRZGYx17FT6HtdRCtNXz$8{s~)Hm~VDe zA9h?AuJ!Sjx+!?&bnxi~?|lc~1G@GW*(dRbD|WbKFZ}J-m1ITDj*d((y*vA!tF<26 zKXy)h+Ql9g_{mo1dm8M>j-r1nPCn&2-$;iXO#af@d2(&b);1u8iMKQ%k)7Jz<5I-b zO|y!rX$rHiWBP~zt*S}2Qf3d{+gvZ7@;$X^9`tiyW|8x8j$h@U@P>VCGut2~*z+i|Dm3M1e1OApX=4vqI+Rh0U0UD67Z{|0lHHmU?On2oN z=$(JqCeC8NTuOc-X#O&`rKU$OZzWE$wX*{OnwXl}M*#MB6lsEkPl*ZV!Pt98Yi6Xu z*ZSJJLMA8N%Udh2qOLr0+{X_K^~7Th6J)wm$CucN4q`BQd1WDSyABuSZ1{@`iQAt_ zb@AWD+4c`;Rk=q4M4GPQ}iN6kGEEhJMFbrqu$&+wSAdo8{#L%&!CW zZ}Rt-WoQRhI2+8DFK=7WYB&_hH7=g5BwAMrE!y!FG_*S>>Go4xV2g@=wy7j_CtgDH zd@)N(J<8f=(_LIJeWO<1chou@2W2~uJ-(~_7ROaf4kQR|Ra`6hMfq-@`4 z>50nz!A)dl+WNX(b>#KROk3u9cv&P)Qu z{soktsJrp-58q%bPN=`mv%H>`yh|FcI*||_C#j|Ynf_B*VsO;P_SDGBpI%3U8q-q- z<^)>D5;)hdvN1kqkG*kiASU60tVT=gf^lgtX0h@TzJS~mORt3hWJpe&4Ll&8S*FW} z0Ngi(67q|Ex1&>vr`^}ATF2+P$``(LUPpfNT)#MdE@fmV+r*j`WKSFpk1Rb7mYcYQ zQQW1P0m(jfscQk0)mqijsBlhRzDv3ju#e60Z;I~qaear4&U!}P7<}n6R~ks9`Q$U` zf6#$stb`NMR*Zt|pe=WZnkwbAWZs9W679z!$y79T=>Te#pQ|7O;!unwq1H)amh;+* zC6GSb8uxJUdCvC9|vHB|&{(%}?E{Z_0jB z#m&zuEq8fR)Uk!k>4e8F!Kr8Uae(oUMB9@&y~B0L^xIZP7t%HN@ha9F2xs;fJ{ae?^A&>i<^$u+A9G=G_I!^XoI3O-13;ISV zJ4aIs>it{VAk(?VRgt;0^jV)IMqq{XRUjFjd0zO@T}^|!8ZA*(j4KRD9v)4XS--F)%hp~~*85AJPA zU-ngj&K->?*eaH6-EpB4BGYS^)~|T<_U&D;=_9caaE_{6C!7lTGG*`Tng7+O=)7qN zWyi8!7zJ3T7A0PcR(=1fjKS5zG6w!SN{-m6iMLF}q!bH~QmwIO3j|+q5oo6ZSh|Rv|Aj;_HM*Uu85)uoC7<&>@J+}@p z2zzbeN*f9)8l9>uo$?bpRD;!>&GBH+-SaKl8aH<7(__qga`?yfW2F18t4PYcm5jXy zQS+9?dANgidMmvUn% z%J=cU1b2EN^)k2}u0@h{mq_M->bK4CRbkS z`#*UB^>LD-eQ`R${mBV;&{yD7JE9vaU$pe>dc5Lf(Vl;7?)BxXq(WL6SK1G#mZA&uKNe{_9(C}SSTcbpmVDeGJx zns21p_I_5-15LT@z-+RO_xf8*OeN`o1lFw&rIL3@SSldYjK$)AOKBtEol=GbA^l^D zi~5zGWxdC*u{1U1=gEb7MzW@oA6~%idP28cC)ZoYpUb#=mu7wpoyT{P9Tm>uRe%$R#E-T^nM@zV#?t*=QcrNqp(Ax8jsvD7uL-gCw zmDvA*cCq8-g}*xx-~{5v#Qo-wZ*HEdP%%Ki2%U>WMv9T!P#Z_SN6CHO{?K&lLQd#V z#GOc)x%JZ5X3nTK0Y3GEqbjdC?y?QZg{ya|=%J0;GwEfo!yeX$pQ2BHEf!6mc#>?p ze@C(Td4z(=wsZiahDBaEt7vJW_Pyt<<>V4=?C~Fw{3yITZLH7B=oF`^`8!eb*Y!Vj zYuBx3f1M!hqNgkRVW)*cU2tetH%Ttn80We3E0CG5HrCj(bY2vPzP z-eEmqaQOqO-GORK`b5CDBZ)+9N6-~j-TgbMuxi!R7%V29sZ^JQ?$WCEc5YM>jQd?G zNar{E^~env0JBNjG-vtqOHfD)`?x;>j!+)r0HaP`vTHKXGvsovc`|zLQS@_I`+o6> zJGRM78&DSVOi_<+tCALjZzeMP6zwS{MUM<5O90?yi;Bmvf_v=Euvwuru)KzscY7|a7>s)CG``Us&VQ&~KM_lFd5+uScdhgFWpCKUuop5o24;POfRiJJv zkH|UH&y@}{=c}{E$QR}c^Sc#;tOTUugh%uDik+2T@N4oCs{GHXLsylyq*%4I-k{UZ zVl0f^lI)A7R9tinDtXtHMz|LLs!YJj%FOdG5u)W zF2kJdTSMVh&ECyMM*&oPHHHeR^0!ncOoeck32wZ4R1wnxYlzviH8Hgc z-D~7Ip0I>T9$&&m0QQ0k=VompzbnK05&3^0-%;(X`q3dy_->L9;Mj%1Yj{-{1L|hwIFnHJB$LS*h<3L3Daa`^JFvaV^n-K zUlgg0*<9a7Q0avNmhiy@4k*w>oohv`8XN%6kGV! z-hdRe0z^DMfoLct6&uYZ+h!xfckhyKQFkYbwScR8_Zs52FCByT0NgBj`Mdf8kR_az zaK-Y`1e9H1E2-p&K!(A^@wQ`d(hjQyaRQj&mi<JIhG>TfPp~@mQ zhzQZiGm)Hx>j{J^LxLNI@c}Fkje^ffJLT+4vBi~{%5Msm{B=;qY0&EdD{{o|33yvE z8Wg`F2T0SC=sU;}ur`Tfk#8%Z-=k*#{!<^3liJvd88iJr03idI`(PRf1K#t_DQ+=a*v@`&) zPIceOGUBVBT3&S=A7xj@wBHJ6wgu`A7iCZNhH*#OCJnqq!1ysR`^;qYODcy^?K}E_ z4HJlJj78>3OaAb2$HmQ~qUaZS*UCD>S-0>V?Bmm`G3!ws+I(`K!}Zu&!R@b zpL~eAGD($9z?;bw7)3r*AH_@W59(B+-DIiq!6&OB#%u3%lL-k2I5ZxZb{QJTf~zNZ z+_y_(tXDX2inl5vPY<{T?_0m;=`&weG@j;avl>!4%)FpYUs4d7G_K*t$BZ%NqzfXz z9y8?+@XGaK z!5`uOvB;5?FdNIml0d#Q_VUJ)Sd_9JD{gmeb&*&(a1*Zv)9KA{`ET`&rOa*{?a?!2 zdZbakb$XHGX7q%hUchWjdjn^ac+$vFN>o!kbgvAe{Xab)M&{?Au$G0uQWMq?6K4WC z6gt%)#{Rp{=(ob4{$_L<;PnWa2?L1TuHL1tHi4GjA@>II>K6;zn$wz3F>WqEWcugRh~#E>V*DnbW~qT|W}0geH;5d=^3=ox6utrcdW{ ze+zgE$PTczn|~e=E*?FXbIMY_1>}inRlfpOF*TA3kME#GJ@yn#k7c1~Xew!SM|zB$ zFo0nU+^Cw-R+30ON^Bgs3i+>rdlZoTx4J$K;KZ9r6Xp(JfTAI08y-&}?t&>8gK)_S z(xDT|{*qQQ#z|+fGEUHCTS;gj1q5M2vuc&hFZ_3lBV0+#Raqi;+xP-z&XXBJLzgU{ z;q~Crk;?(wC^A4RHmPVd1oFFpRf4u$ATmznP$A<=brXW*v3Q~mx*6TFB491&+?`5r z!v?gP0RHi8TYrgNtygW2hILKp82g740@lq8qbpn4HMqE2Zb2>ctsH`s2QNvVKv=#G z*px$CD5H6?NsjUqvt2HGg4p>d=juvRu=NAc#Ck`UYk~Ceg~~|AXdjc*VYX?jBW<_< zYX*M+EBa$Ccg8|sDW2*}5(BWJ&M7GwDp0|Up`5Ssx447fv-ivdnAS}-8Dc>b-?}0A z>hf`2_gKw>$B zsjM2B8W|LWPzpZ`GKOmQM4De8XXF5-JJOhVbJz!EQsVXA1cFpx8aqyObB2IHC)2IqP9xOzt96A)y{?sRl(aK z;8aEqrw6W*F+I-9Lq=!&N1D5k7|9%~FjV3)2d@*2eh8%5fH-(2oYBOJ+qK7VVUsi5*X>7`Nh-SEIZ}@R^ zfD+M-f2CskFjSxtTZX^hvDmKoOo>*wM!|@bHfWI3HGYep$}yhR)4*He=c8O{(CyHP zC@?SYknmGOb7|DpQ`{0rX@!x%0|?U8=p4N;mQomS1+av=V~KQmfg3J7m<^4(kt4Rq z=X01$j&K?H3i#`?DVC?IoP8qSb4yD%B!PmD3>9{DzN$KZRmJstupn5iQ5y`netNtx z#AY^WQz%n){xKWT31ij*nz_+drk-?U9boa9@@nyz3W5|unjmP>&*j+EWUA@2gar2w z9T1{!JQWVK&iUi628DYIv>c<~RBQ@%b2xOzg1VCEY`?eH(N*R(3iF$5+a_;nxJ;7C zcm{((p0teTZm<$pI2&94A^y418`?GkQCv2L%S3gnRijB!yFD4CLd2TTD3Hz1{Yz64 zbCL?_IXC4F7v~Wo!*a!!WK^YMt8-M@F&Lm%bXyXfT_rYsr~m_$E3Lz4O$a(zxI7h% z&qCr&RoTrj(siw;-}ceLFc5y*oD4=?LA&gH{Wc|+Ad>@KfTc+2r-aHQ(GCVegRQlh zaiMhjQG+gW*$c-dZl95B^LYc9S`2(L(mW#06g;j9Jgf38@Oz*qJohw~A4<3vCjP~V z4Gz{Ph_$0MvO^x>YiUaq-PqPm>vgCwW>wr>D*4qJOYvZ(L-Yp|FHxGB+X_W0>Bz?3FJWt5tr0msW?Q}kjk z1Bzq!3VwNnD1{-ozuZ4eh}>23k6f5Y+;HFg_hO30Z)4vMZdXU%Q~6n}WCtfXISHs_ ztE^LuX>!|Vq5uAQs%{l4<^B^$m+9>=}n5k99s*WPU9iWXSsoN|O0urUL=v z-<{lEEaIfn_7C)XX$Nl^1T|KMm#WyEUgv~-Y)lyzAWMr*Cs`kqf1>ey zK26?OPwZE2;ql*K_VvnNOSAIHb|R+sl78RB=b zDtK_cpX;1eeY>dZcz;t@|B4ULy`C;`7`6N48Iby0?AJCjARFDW((V!y{c+4)lvO9U zEZS0fVNA5u?VSoSAf8PqxB7(t1lH1&&U25;)|^V47j9NdES8U@##T6Bs233Go{9mp zNMzGP|5ty#X8z>yo2ndvQ_s`7nJ0*Vb4H6Ajvh@Kjc5JB$Crl~P-)ys3#<7K(Bdi} z6!qZ55*g!gRw{97YqyD8l+%uY*KLbffJq28W|JeJf6HE>G;dmSY|6_^^6Q>>cLEGO zbAl;8PwZ%`{8Sz`Fke2%8nAiXt>gZTOzEp13i6 z<6h>am-0j}=!CjErqwvL=fHlCue!scWc*itCRN|2USH zXx)?3+Amr3Ps0Vo_bbQt;jmMupS^DHFxczl2~*4IH1`ez^tGw0hYIcK?~w`4Vg_58ojgg&LmuS=;Xq@ogIHV z*7q$g=RA(3f%eL0)leZuwQEx$>?Tc9Kt9$_(%o?1%9&vOT9>CN@7J8Cs{=4UaB*zH zR#1@|-W+xZQf9Gx-wk&9T~oj|ng(XV6^|Yqt$iPC@9fiE^}4jee!lp3&G7O0ttyAk zA%m^vC&A5aCsXc1wu-Nm$5JqjA?`-1N$ZoKN&8c+x!}U3x2LLCF$U2<+Pi z@cuIU3ywJ*XoIQwi@PI+L7=^sbLPM#Nb{)AS#;e^Yuk*?2c_Pl$2#k-S>Nxk_bay! zza3Og_j!K9Q}Oc;__uiCJBkhf%}-7dYyDFZw14FEMA!NMfjov(g5mF{X-;5#TQ%}w ziWD?9Ng_-=B}~nj{bi9jTH<&^{_y=B6AuQ}@mMiAx5;zt1ZfkWyrA}nA4iTcE*&H? zD(J!XV?Tu%$#U6?nkP@xmX_Zvx2epZr$-tL|JCWS&{}0d<05fH7Qi%-e$-~1l>Xb) zOr_!V8_WGU9fYMcDPlkeI|0YWzk8EnDCLeA!BCLZ zAw2=V*Ntxmf33T@LeD1-R?ZjuAYC0lzoA?4u=L_;??uM_vQ;7b;NUuZub!hV)~4a- z7GPyMS>}|L@cYW=k)(zRC;hzz70K3e71wev{hRzI+3GV};kX$t2`;ZjjLD1=lh;ZK zWiQR?1PBvt|CCa(=Rcj@w_SWd{!*}(L6ezSRZZLJ3n>v*GSX42w~b0H3Tc)G2So#o zqX?hSp_%)XOKjGrjsp4^`09yCz7Jms0l%fF#cP&P9k?La10 zAxuVsOCeu8Z>D#-2OJj8%b8a#9H5}zNuK;`22vo(=PDaitPsv z+e5H_XN|#pu(*2xg8j1m$jZGo|9h$Gg(%8za4NkB0_6>tq^?`dbI)>?%$=Jjn30xa z71biBOM0{yrK{7iZiU`Bp&8%G?Lc%~kp#K(kPu%??B!+PXn~*Fm+f1lwxWh$!HX_F zl7HR$wFO-ECzSPh4T6kWv>$G9j6L>2tF>lF)t8-T%M70exqSm{8%Au`vr>oQ>Mjot z96D+DsY%noBYiQ`9_Z@4Sz(XkXckt688tsSx@hTD-Z;z&xffLupr;siKl+qprX?n; zP(OAc3xEEj>Q>M9<4cy%yMx`{?knO=HS)(!-#zgWKC_~Ev(610{LMXv_rl5JdO>Y+ zZ@cWt$||hSA9V#Ctkm+?u&aO%0@nNGBl zhur+k*Oh3;0KZ6Cxm2&SmFX{L*IZT{9IYz@*B;uQRU_UeC7mw!J$?q@fMQPR9E4vv zZuSbc(7{Bmx7N@Y_tKEK2?sEeLHpr4~&4nJ$G%xa{kbL&gF zbG5Z2_iOpT0D&nPe{LA=cja6s;%>OR_}@>mDKcZ=nx&(rd*X@KHu`rO%aNzry z4Gh`-)H*giM5-i&Y`O@}Y)OT?%a1L5ikS%WkVS7r$Y|m%hK{Kye4B!v|M_=E?D=B> zm6o81*f`7X$dSpfiIeTtjlECJRM%DUX8u^kBe7}_1VrA=%L4DBmsHE?SiZI12@AXk z^yqaf+4jA(!RF_`Z%kVZUv5-d?F+H51N`Ngjr^}Sy_^FX8AAKP;nKO6@4$E@&{qW` ziEo>7Tk?EIJi$;*CvbGp<Qf?E%4R?PY zF3zrnkX-$oaCl5+PlfM?{P~^iAwl)@CO)*VmVWn+5|DJ74*>&h=oKy1mWa#TQHSYrIHR+)PwK=#%8o3Is(*H(= z^e2=}vVF$g*qT)6I{47`q&m}a)mLCNGaORS$z_Ik9aT_gIOYMG_Hgj#G1T1B$Ykj| zp915`ihh~nw%I2u+X$NON&jZW-!qj%ObqJ29m;*Dtgt_+qw8ucTR|M$m9U@yK`5vg zSasCExt!$6&k!Y~{tBjZLhh$UHSBJCfXeW{rooFRzMhwsR?U{UsGz#}Nd4J|-XT<6vgucxgZ-B7je}I~zsW{#2y3V&Ep7?Q zLTmu>i=}a#MqAfhz~l2j%zYu}Mqf;ZPl(yHm)%GWxl&nK+3x@d0La~Wt0BQJu>&Pq zMMLxDi)Ev-U*vbb0C`~6pDDn|rlBwxA((CJ>6W+N`I>`TZe3Wti}Z(ce_7No052E2`8T}@3KF&qd4Zv6T8`#`#t?J#onRpj*tO=0K>t1eom{W079$T=wEe-}&f1 z%KGpHCySgkI7l({`SF|}d;fmVoD2OL-4=h(V}}s;VJEDm^IsUfpu%{Rhtil73{f{G zjP^*3h?FqG>)QLs1;~x(JOWAh@8b4YLKrBQyVn{A=F-zGHAuM*{DGsv(|xm*Ud~3f zVMep7(>AV)!Hy9_m7bExZ+0FHRb2*#7`8ZGay))lkN!;NL81o{v_IwkD>h=Gtr-UM z?KQ`6FPzx=9A_)pq3AHZ|wYRmet2`2N_kkr#ekXl9$!aA@2iPoo zf*AieygoLD7eq-jMQ7=k28hS*yja7$zv*CfyMDFa{_j_ZGiCF=e3d7FVk@-gou!yS zmsDaKj0!_Zlql`NoZbfA$wtj1K4`~*g?FzjpJY1ONS!opRab53E8O!As&Sv(XM+;$ zy0aDL`0;dec}V+n$|02*Loq267qih2NRDd!(_tVSuPu~2WO-@39_6uVwc|R=^V#TU z-E?aot8+cN_3NP&gi~De8SgDW9_fX_mbUD}s`Siueq)~A_vE(y&(#tP8l=xp?`rkD zkHDULv=5)1gdrXNt8nnnvu}4adP@)2ggCe`hn+2d`D2_?@#*$e47xLoow!$ciRw=| z`_HqsNsj%Khx-aQe~rA^%=?tD&kH6LC%mH0=%6zzJkh0(b3KTtWX-GX9?s90K3 zm2!*UZcH+Tz$t$L<@c~P5Ylejt~rH$y>&{6rpe#&o1FMz;@tXzQB|WdrmoYXDlBOJ z9LzI+fy)ZH!d5zZEwp25e+va9k8+u)jkx{?F1l0Z8vlEGHG? zeq-O<9uX7QX|6$yO6HZL89sjHD4qX-o_A+*^vy-YxmV zYdMnKt#(?K3A$)^^a+0xNkHeX^)`H34ZMTCjTfgr1R>|Y32irAF0Q03KYm5UT|Qn5 zRy;qVLosC&O=(4`8&5L-1YB<3d0po5mG(bN8)0xtF~$xiSyfA_vwr7nIcC@xD6m!L zx$FE`NoYQK3+I1}U~~9d>NTg&Syuk3iHpwp_cPZW>g?-!Mf)Pm^Y#S0-8iT)teX%6 zantPuAzA^tOsb1@(fPhz&sj%4*Mh;|4=y?v+@Pt%29OqqeDJpUJMe*>?;kFx$_@>m zPrzEJH38rV5X0!smPv#I@5w7J4*mF41zC!<-lW5O{rCNZtAry(!Tv|IY-kzVlJ05e zzGCifFfu1Cdu;QDXwmwR)h@%zBa+o?*~hWI$NOxyJ5Tu?r3<`wzPplZE3?lbOQY!) z>E_4Bj&<}gZ^w3Q>FDZ!iiWMJy3{K57mo%>1#Db&V*ei?aktc8RcB(vdVqAF zw4?kgIe)Q9MYwxO%V=Z$Pfrm~>t;-f=)i_z-f0{>8NRG-qOmdCPiY6;y=fVNnpl)= zO{h48Ezv|=Sc_HOdrUiST&m%prMyDsp_gT!o_)`L@d=^wK>0MU;p|}M(J`HGnplOR5bI>0ny}Ma@04gn8c4V1z zvvKKniTf=3j^k-%l;y*UtV(rWGX$Mdg2snZ}Tv(iSmB%hR&5616kQ8cyid1GZhsx z4aOCXDZPT`%iA9e{A4sMHqaA^;zE^5)%NYu$t}ff*$vTyq4TL29)xn8YdDbigLFy+ zO>Fz@d!n!Pa8@2&XkEe;#6KJsk&C!>mEYg9e^r)jm0lBhx~JT0XiE2Drcdu-DaC*i zi4|+zN3P{5_Go2R+G_$jASf&> zKpo>a%yhh1s!peAJ@1FNeXTDp3oWy%aoC@$sd37Kd^|Ox-^OHd$aM=>mWPDb%^1x zyKv9JARaC5nvP6KL-9*Jy<1YjD*cb6_VB`Xqb8Mqodfy)b9jfO%J;*UBWe}q&k_RPCMP$Ve%b6ln=WvTkI)TK8XXy~q~&m$m##-MUkWA{PBlMFeAPwoS$sP&@X8NDSlg}B`&k5p$e0o zyjK&6(ho0!Uw=ETR%ZA@<^mI-q@|<9Lfh0#lm@E)2m1O5p}>myt%!-G(G}R6o=arm z{@h1lh3@bm+Vw3B4)LRwhkbXiMWQM8Tu=0nxM#U$409q^(p^8f~s>on5viu!V{)6*@zx* z9z-O)Cxv}!>Cl|FXK z=E=%D@o&odLl)mib;!7t*y51*eCO*oO~|EzlJBY1|KsS~!+U44H z@4f53_kO=#&)4Je+fr61h1Q&JdcFcXrMq2yrwu#g)0OJBK~fkGZ$8(hxkW$zqS@l< z+1tbsv}cfRX&vPj_LY_OTe8J8;x787%N+b_^Z5{IjJVVL`?oM(qjTZ~IN zY0y5g%Yfesl#y%n$XG9e?ZAoOly8S*;XFnThABp^Jzyl=zT02-X;Z=r$*Xd}W($4& zPw$VkDk*XnDrII%~cNp zyD27iItno2sCJW{Q@E+^-diIgZS(2e?EoRq&I9`331tx=g2?EFHvqv)t(M)llsF1& zGE)%&3@!s4<5e$x8*kq+Qd5_oHs;0mDVz7&7CV+;X{Hk4VsYC?Ez`DsgCA65WWtr% z#sMt#K)r*!Mwff7^ffnj4nYz}EMmpcm4P;K!T>Q~2QIp`*tesQ6f(bkr+3rkOWg{8 zC*lWC)wS%PtqbXo?a%yg3bs!4@K_OZ>?hBhH!{g?5_zAYI-vIJx4rByirI; zKSyuh>xk6*#{!|alTX0~ZAeC(-Ge|hO;C1W0h%C5gBcUiFmyGsJ3SH=z<{qncx%13 zB^8|d@{u`qdDb8j6=+_gb|Sd0pIVfY{=%J9huGHIqN4~>64?j@M`^-6-S<7+WjXaK zg&P7v`D3=Kg9Sgu6mN}HEJIKlYl)F+$INrOVYi+b~pWV6F$u&Wj^-Vmk$P|BW7z8sHH2f+9K z5vE{D!mRVghM><}6Yms2gHhHk+3oHg&p~T;p9>%{F732bbl; z_TCYpuE{6`PAIIyU?|yN3$*#b#?`L5$cCM2mwEZ-VAFMDMf{sat~^^TK2$D5i^65f zbm5byqe%ehorFJJzUft0&I)X>i>!IN;#XdGXcKVG@z!1#>SwaxF#W2n=Sm@vE_Jtt zY}kHQAzp*7gf*3$klUe174AihO925U2^k0%Wii0-Iy1zIbfFcl%&fB79u@RgGz?dl zZ)Cx40`DknXs#zDUDkh|$ft->GXy*q2{ZI|A|N^u==831nY4s%pA~_30b_dz?h>zW zWmd~_VW%N4X**c4%Lq&V2&)MkKO-jvG+8a)j${ZyM9FcIk-<3U+-1?e!^DN*z1G-} zL?UN${6Y2d5{GICVMO*xCY}7CwAwZm=^H!Afx1&X{4(0>K9$>*3GD4ztO|356jqgP zR;iiING(5-H<_Kb>K#x05jZSv2mo9PO%a^UG3&!Jl1BbVsCCVkAv|`DM3?1}*nmT( zNE-}E-&?2`bsQG2ZUTde-D0%wfePSqQWmC4B2-G?tZr(j%ZLM>Rknh2F;khI%zp8= zEYYE6Mrb=(H$N8HzP+c)agh~crVur8bYI(~kq8625oPzc?c}pPh(%Mv2{9^E;!Lccb`lGRI$l#2SJBN?D>Rr_*W5sA3DnpU)6V z%S?!BsgD?`7Vs;KkBeN1X41qK={KqG=z3hyIv`{(ZV4rcOnAsWz#2(e7|Jiep?u%! zu@0k(5N2eO{Fp*jfV&~1k?0LFBK-u!K-(q$nW;xijh}DFkwMqENQk@a3Vwj z!|MnUwxC@)rZN<;27uxhkH;;hKlT;TljDk!V!<;A&XyKkYGs9vfNbG*E@e4*`bsK8ts5Y8+U}rO{`R+H<)NxYqlP?vY*GGJ#;J`&tE-)AxH!nhG@z!jt zC}-B6BTxZ}2`ptWWJ(?M^9Ds7!MG`v5#P9t45p)I3i%h$s^A4ZydtmB?exUmHBJ`` zHcuCBOpVM>Pr4xiK&&y4=mbo1N(_H+_v%)|=j@zE7B&ZC;DYHf^mBqU=cD$)QaO*0 zD5M)PF_B1$6@~L&ISQtk3P8c=5PCZ>UK;CbIBEKeI*-dp2}R`hM`IBnSG zWQ1;8=u#+xRUXe+3=gDa(s#-({@#gfh+4@R4{2-K4n=Guaq+r;qK;Q>W46O)HGnl6 z-wgz0;@1Brq8ec#deY9^9P|m7WuAe=j0oV_BhJ8nyvksHLC}<7^A?f*Z^Pj$c+-*N#-R{5kF^4^|r+CSm|;y^v=Jmf?jYI=tE>_b#V|vZHTi$QUIW@8&-lvJXpAEz~ z8ID{8T#pn>-IJ5s1fv?XuP|}~sOlQ=cu~s3wCFL^G7GL0G$jpE5SK=s{Uzq6q$3Sx zlGSCS6Pg%TFsvgVZZMn%Uh#1aYH1rtZ>dq=`He`^5C@I_B`I9EsTTE_>6TZ43k?jI zUh@EO13M9(o-dI#z5{%RPtIvhb^l1yA|tlzYYES9NObw@#|}qC&|NUE5L_`g{bAvX z*vd{QWYSXfBO?c)P-nsiBBFU>KwYwVwR{^rj*BHT`$KGdE=R850+)JfXuo#|Dd_S2 zr!^=dTi=A)pJJjmNwrwCA|sZy-s>tt1nE-K{{^yGsHbYGAn+}!DP0-l!OWfSi;y~V zT)0kf&NKln7+Jy+6DV%%O2w3n>_#AQ?D!taNLe+bI#UOZ}Ip*LO}S`dXqE!uSbmgf|fRhWBWOavax;sCY$sMq|St zK5c|TTQ2{y+6KZ+qj%n+;s8v^*7L}*X2@Fw$ z!h9r^0z|xa>aM)9hyVkL*n#W}JK%AHMxm|1G}u^N2a!M(9MF`;q|*|K>TJ|G@UNLz1|fj zoC=7Wh*d@b#2PeXX$qw94A|vUF!Y9XVdnZWdpdo2Ae!J3!(Q0@^{#b-m_P+Spa4){ zY1e6LB1x7OY1m&ES^SKujHe>=L76v@k8|Q#?xo{aosDUE9)q8)I z#;`FMOr!bznZex1EA?x&S^`v0iYcF!mmGW*C_RAF>zbgkXJWBpFvEi8;rXz zni^jZdEnzRlo#kRQZUW2Gx~b$K7S!x-fM7uM z$fj_*L1=F3mBzyU+imN|qbc_)JjjFc(l-ybx{7AEYK&97t@_5PwcG~1W!_IM*MKJ? z4x*|_P0Dd^w*#W^Zs2U2BD|XNgCg7fijca^t<-^8D?ejs+0f9?fD_pXP=$WO(aD+` zLco5TE|6a|2JY8^jo$diCE%qk4L0yZim{G08v`CaO8-x_`VVvi@gL|E2|yqbEO7n^ z;r!4mw4%j!EP>~;>_UqtP=O6CI>}U|^T$4hCY^C_nbeTNxjEe}>8tl_BFb1Et~9}w z>Cz3btbn8*b6Mw0S3#>e#0f5NbMzYrmi8A!0Jqr1pFkI@ZQ2WsLZPK+njcJ#<*u_E zHjSBEgzujaqAWdE`7uVEfq|%)KyPotdI&-(C7cW29HWK1l60*j5%cSP{7JumPc9g5 zsV>Q~WE%B0spA`*ilUF%z$c-mr|Va4+>h%hQslA<&MirI3uiPKzvI!4-RPPf`KgA& zPsClnWDrWEuyqo0u}M@6q`n7bYz(7gRB$od3IiM_eBvrYBRz#s3v88}$Dv}6H zI_&%P`T$*zUvkOgzNVqlxla?x!EhTxveWywB8mLFEt-kd*42;sc_Z}>dC0Qt*$pSJ zpd8KAS2e*mdVR`;CC)(8Y$q9ZT;|%V$rGVA;n}3NKVlPM$HAC=(dp-|lMiqI-0c7C zk!>1qFL#*Ts{eg=A@8Nz1G45fE!_{^?;pB~D6!XbG0E<2*E+=aNUO^CHSad!thmFW z3&CYA>Xyh;^UI|2`>7!n^+`F2T~F@38@WSEdYz+mO}X)n2=qWSz&io>%XeyQRwpuH zvdBSffoy#>ET`Pg&RE_zrk{V&IpM!Q`Ctjz#A`67 zj_HxSbRcrBXHUy6zba9+l_-fDS*Fl$ySjdm8OirMiN$W@AJnP|?&r3=j`PRSi%a!4 zx$x?jMg!2p^?!$V8^NG5u7j{eZR|JqpO^BxpL(#NFr=@tpXPDpH(xlJ%ZYN)Py>X4 z$t6lvYVX`}(=&PYE2FAT-evVgw!%v}9B>EhajH|>NPC+PEYm5oC(!JQnAp7+P4Xh3 zkQU3yIb*9%y*WLqRu>XvAhRW{@Fawx{eGm&lEsG41G=fXM{TpZ6CN-UJ&rk+UhuG} zC~+jue&oXD-Jzknq|Oh1wrutTT6_D(O3l_!J%uzlKzU#mN|$@;aulf%(wsib)?%uz zLMCb>&N4?=q3-MqqHFB)gn~3L&NoyvGG`FHM$-t>Pksn%5N)y^8NzmF*K~KDf!*R-kij8zoq8Z;SlH z!AwxA1N)NfVC_}f_H|*OM^t)8@m}?`OJO5DlaBnZAr+4~+HzSw=Zl|%+QFoWe7C^P zcJj3Y>6Fh+9Tg_euPdjtHvOZ16&e!1`}R`zy(gZl@W%7MfG!vL-yai&moJ*?sLRH$ z=W5y;sPmXeR0rPrd<=S#y{Ic~Pbb4|&oy|bpG zAiviPU{I`#AYmSZ-|kJB0Xw)obi$wUU@=8QBKOd_c#YzBL5)DDSCmS9KmY6b3jo!O zi;~z_Af)_WGp`U;JZ%(t+ZCWZwF|n%2$rC&i@e{YrrPHLxEyTN$HmA2L#H$P-nU+IKt6hJs+5Z9{-!PB zvq8LQW{McBP+V(xLZ}p>MK6LzFg?Z3C|+@_+UA~p{l?#wj=A_*z6J4cUCttWhh0_ z!EilpxkhS#zb5({s11Dmt56yKR)A>Y&5yy4mY&4jt{I{Zm=*>V6mEDiyTAK750J~_ zQa6IF>_+&^5{=+P@bS2L*I+(Fe`^QzXvkO+>=@F@V3I<)%RFnoT8jisUR>O8WjkU| zlf3zvt4)wLxx;Cdpv2ggaXbeB!m6t59-DLipx=Ngv0GQ&9$F{ZJ6Inzr<8RwfS|LpgoEi(nG7vB*J4r^*A4bA*?my{AcYYn+9 z?=LIofzq}$^P*m~%KVT~AEQx8%^Gnasx-p#i^Bq9J7i^_Aw`XHvMcpK~&0&5_ROYRqq@_&R~t zd)1sY;loR?ea_DO@^sDDc4c*wnf6|R1FQDa_glW>BW{@n4?;C(bWHdE3+}8)c-n_P zgU!f_UCT&PelLRLSasMvw@eOBHibB_p-a!}D%%aDR*|>%E;-&5NB8gtOv9vZ+qnBZ zVqVRj8NxQ7b8&3T{gqYuaHoSPoBM3w3V4P1%Jj?+V=q}yj~++*cH!yQc9i7z=jT#z z#y+a+!IDSc&6dQAky+K>5Kl&M(L_EAKeMLd zTv0*(_D0_%ax=N}y6M>PH(Wz0U!i=m`xEQf%Ij|yZ+>LlH^1`xFkfx^w-4l@nYQv< zch3tJh)VOH;O>2PpD>edwaIT6?miX zmtVW(A$b>-;*DG-B_>4}2-jiPSW>N&S>Wp5$}eZz25Abm{Nr=Eqa(UCgqL-?-^vr8 zSd&+?RYH)G~L2(0Dcym1Zktk|)URHkE9F_5x-#2(e z*J+3F!E%1SDB)U5*o1Vr>*~rX`u9+xXKNRRY%&}9jxmAW_%mooMRKO#^G#?M+(RZ^ z47Y^XCMXt7-fFL&EBIpjALtUHqvXV-Ur=CL!?;St#NDq%Str+t1KMj?DG+$mh%Pfn zcp5FLN_sc_&PJ3H6V?PHa#7O%Nco#`!4!9So{FN|0EWJ0_PZ4VK@ZtN6}A?m#PI+s zNWT%$rKuag2fAQk8Sc^G`40a=Z`Xc@I!4CV_tLfMIXbb?_NGVWaq;#V>i@f_Rk0#x-uRb zKDX4-OOKDa;*op~*MgJ$44L?PuPMHfEG>v&N434OP!!z>E5Fh%ZUkbVoTVk+=y-<2 z8Uw)6VS==Cnu*dTlPFd=E!*y_|L`|kIZo}!gX*+`rBCr9-V+j&WZTEnK{XZ(kAhNm zhu=R~r*)U=fllqAzki*CJ$dNl`Mv0pk-H}MK1atkwU+uD$~Uggw`lG`kRSN(Y2;2v z>56vgujndly&CgW_ECHC;;z)E*MG%bP{D)6`&ozlja%2g6IGQ!l=m5~_3rNG2TxYy zTs4xGb&|Sy4J(4UmH13A`nIy4hX({8S!y9go%#Sd6{A zDLJ?K3#KIXjv?CMXC2nIa!Sy|L1`M_BLnran(>4#j42tA`)G70HqOWL8qwc%iK`ND zl(ftSg))w#nz&$M6X@E%!;oG&r?e%StOembZfkHljtT5)*M( z({q6FHqrE)bEh4NF&Tk~@x>OyR#9e=;s`8rgK9~*#mb$ZX7Ef5V9>)PE%ughtF8qz ziRm2*?B{<1GVx}f!OcryoJC18CnQxWpop-@1T4?8Zz)sI~0>{lxFTEOw!9F|t zLYZ%M8bZbmU(v||f<+TXh_=?#w|=73veG2q-xz8kh*D~AE%i}>pzYv? zz~q3i8q(s0Ala|izWk0QitK#VnFS%vUElxJ(L+`(8{XbZZ;dY!gTB*rC9%2DKCHRpyE-GIPLTHy1$7s)wmmA4pZ=Pj5^( z8|#tvs|w82;b1sS1&jY(Ekf}C$q_x2d~yo=oNG>Rj<6fdoi?6O3Z%#t4u07y%bTS6 z>#t9%w_}4jahX9ARFGhNNp%Xnd*~UJIid8PBetNc4x+eIHHJl^$vC^1DGJ00Agi>E zdt`vd;~bA6#skqtp=XMQ)I<=c?ih*8|J@b9mU9aZQ%azkhutafbC?+^t?8X%2QhDd zVFrgs`oY@J#t}>h&-%~PUSYhz`3)eSF2*cAxWgut{QD78!MX5a@SO3;*M4>pd}9GG z2h!Sp6*`uF)GHsmr*24G8tF6cY`P*Rl(!U(-HQ1S)O2Y?nxDOSK^5ElXO29^C$u8( zFxruc%oz#33yb~+@*n8CT~QHqzu~4^zPeCMp%$pq6!~$b4?XCl-jj83)fsVMx3eMy z{K@Ve{l#a#VL7|aauoF6;BS-z%xe6+pH@;E$^xBokImlrlL%b|5cy~ZWD6PLxoL_} zTAiL=!%#fZotyQ(M(vqFpp1)dF82w$bQj0c86O&^ds$^WE(_a?mN@~_{F23XwS#YJ zV4vSx#TbIiUvU)P-?H93ybS0DpX%MxKyMvp(#ICw+4ERC@^OE_QMCHfg^``~oX0H9 zs~k0z*+0+z1KE`HoiDg|`Og^Nx-RKQOrM2X&%-l|+c(^8W+F3lImJT#*nxUCAkq`Z zCinpBgNju0)R;M;KwhoaTiC0z`U0T(N*ljqya|l?jQ=wFAL!HI_Qy{qO8EE6PYWMB zyPT}Fb03F5zUtC^U2%My_GINQTu08K=`3x=!^~x+gt4N25>H#6L)11@RY8F)eo>NXd zRCBMKbS7rkLGit;!Lh?TlHpc8`G5Oq3(iHKr||ZcYbN36%c&X*ytANZJHrdvEoC&L zn&8Bh*DprEqt}&Qt(pCZe=zy-<=sQqjYv0*PnAbLc;KxYZ{u&ECmCg=y75hw7W??< zS=}ILszoOGvo+so6pKx9$Qn&c*sf^~T>6`7OPsdNO;P<}Q8aL_ZL=u(b`ICNts->H zZ1BQ!;tY{-vQ=4fxFpJ89Gi8RszFB`PwVe!%_R_ppbsMF{0#5 zxI6K1oq@0BFRq;2p-|2~B1`R5Lb6L*h(bV&?g7Xy6Fp#1q7{&c_c9~PE!xJ6@t0-< z>yOK-Hk^++&oIpj9UM|->yD5s%m*r%*Mm%xzD-G2gmc-f;x3$Zrl!uM*a1+Rnveld z;&3q|ONMU?4dL8wvWaqfIQ5<4)fS9pSxJ501-`d7&+G$_xB2e;Y<~VY`S0A)+#j1~ zL%jn-VqtR^U{qkN>69rn+34D}hyFQ#`7%2F`@)}J0xaq?m~Xi{3$PUyFZGreNQ?#dHivCS@0``#JlzCQprO3Yc1V1 zyYD@0&o3^wst4xgckl-$-`yrDBx15vEwJ_o!@GFX(`lJHS-CCtHX)x?&S7p44!?Qh z$UE@0G7Nq%|BHofZT5|o+a8}LX{S@0ub8d&T9nQk?Y)FTw~QUTpoht~AHGgA1fV~X zQ>o$3iVMb1yeGo|JjI?h``)`MCA|fI->Qzz9M>8){}TG#o)S^v!kQ0Kb6%`ve>`H7 zuV?Ykt`d-mTr5$ligD9_&-lf9T==}ym#NGEb&z|MrAx|`7F`CkB(C+UG~C3;jckh@ zb+j0l6J7e~nk6o}`>V*1bkNV>{G%sq`cCfouKwoJrw=&joUoQs=4+nAu47iQw%^=% zqhgc<&%I@DG{?_A#{O&fHjV8I47=6%ITZD(`L(zityyjAK9auBrf2vE{Q`aHLZ(`r zro81(U364wmX`uU%vHh1>Zhp?!%RZfN98}zZnE-38>0n#$)`{5F=e-c|Y z-G$&z4r5i@BavQ9Q)7qpkB1&X+*(-vUDRZ`Z{+*sv(Ih&w0)2*qbKd;lHz&wS`CLt z(y3X9)yK5a{s(&0>{hJq-vS#I{W_AvsTewVYd4!CGB(;sza9_`!>(JedN*MR?mFX&9j15a!+iz zf-FBnxjE{FdamOFK!$Z`uJ#h*`gecpCoENm5$zNseqnLQn8Tw8ZS0ID?VJ`(rZ?}n z1qS!|bn;6z+ql5e;PUc@qHxy*{gjXUW$B|L_>rr>(Q)>3E|QjkqmdtfM?CCTA%_jv=-^<9^brU3ZPCnYu zVAY(dcW6=r8iWC{L!*$XpJY|GtVeuUS?^gw^r)pZ?E$W z$L6gy{(fgA6} z<=~h|m#+jU87%=6();OoryHKuUw6M`WXLV|V3y*lC6p24<3UHWrHBEsG7nqCMZiGE z?rV!lN5pJE>TH0+UN1P@q|ms*OARyPK>$;@~g>^)~d;jKUPG}-7Z|)cJreIeCPL!e;8zi z8!xU7Z_ORM{(#XQ*5xmy8y!=rELSWCq@ImGtt9lW*sG56$1H5qk_vjqNXeb|nVztt z5hrl-KH6pdA0lo0SH|s!sjslOU^rN&O{PsK=jtjlDk^%0;YJ1s`60?+QN48MFqy)x z2(`ESzu1X>-2D|enR|0{|3^{&TbxsR&cX&b=c29{4_HvXdJtsP6n?SQpJBMpG^SEa}qLp`_GZ}{wA@ zn5B8Rus=+7D`l*AHbwPP$>Yv3JFmQ=nt^d6>HDULjRg@gf1IKfP*2#?Wiv4$Kxq*v z<3zX5^Yqh1Ij&NZyYF ziDV7t?HC4D-A-(1d(5(^nPx3QLL|8rGIS*(;rP{!)y~Tpz~-`NgG2O}*8d^(UeK|T z+&W!5A@{6HM9d>0mO_ym2Xy2AfzB%oV?p$hkJP6auT~IR%VQh0)8EAh5tz> zjfm?;Ay!nGR4zcT1=+<`z+yxYaw4R3i?9|ct-GIndf7E~g%#gQdfOta?GJx*P@NJ+ z0DMHB%iY8Z=q@Qs1h>f5P|l4;xYcrYpR1fC8Px{wl91ssGf=ocl=hK3FlFWaO%s5= zhg{2{If@P>$`^O-(Ifq9!Vo3<btOh`TjSxUMQqEQIO_SLh9$hI&+K+8Wg&qKeN(WGh2O z+L~G+sCi3PX|>v>@n0kV6e(bNQ^gZn}WBl{Ec4< zlh-{g;PbZ{_J&+#C5)jBcSr?_@=amHa&BSmG9B#&{zWcdQ)6;x&^i2jiMzh&KE$I$@L7pW8ob-f=lhg9EwkJVBpVk z%Ui~v16b+s1UA}OL7r9ldHsyi)=`-7^P811yPILB-{a! z|3J|6e*vVx?TV3yb$W9ns|{^4j)3E}aHXu2UBIvLa#*p$ei179K&kIgnrNzJQQZwG zDNApHy4LjAM;@D6AXli-VmTAB5jY-9FMMosA0Zmw3hqe%1EVYfw=qwUl{PSxlQc44 zT_?nCvv|Ld)1UCj>3rK&KcCg|w12;=Yx*07A^4?ac$cMN7ntx^9DtUika0Hw?8nB$ zGDFIZvS83<$ZNY9VbDe|M2;W6X>EwC8uw|zw5t6|=;jtdxT%MOeOH5Do7MICt#7D? zz5VbFU#DHY!{@K^*yWQX1Rb4BC`9W*-0_kDBn_ZnP22|O&YX?n7AdW?0H$+e0-XlH zD)-)T2U`6lVR{%QgkH=rjHY7l=FCyQbix|UVCxqfNp=zC-+Fm-4K4#4l5S5y2Ps%M zx)4LHYB7cDfy|Y6@5NKdVCB!wlqF-?FaiC@UyvL?1ZrJ>DJtWfA?ZF5EA&3tXk~#} z8b74bces_|FCi*~-m(}d>*W=0UZ$B{D944jq!su+C>TpycknA(AB(U*1*EfSP^`(E zrg+!{7EF^@zgN5wgK6yoSL9&g4O?M)mQh-*yPu(OF{VxHhVorVPR3+*q_s2{9OvzU z0`^dxuX-d9jZu*dK*j*zoB8^>olf32KqEThTUfqSJ%TcsqOZm6Q~Mx@`+wy!t;_ z)y8_}Dh` zkZw#5FyzSL0{J8ZA*UQK{JF0L$dWxf^vXVbb*7+qo4+)=ZKn(e7(=+;$h$!7WBV~^ z2DA3R--}4s#h)NKvIF#izXoug^rp?+O&a#+Pv5}D=%X@{aUbb^LyaNRu6y6fC3 zt(n=#LP96pAE0h`~7mz^B@R$!61Iq<}20_lzp{kJLIV?9Owv6w6nY>SQ-Y)^ zhaK4WrZL7uiQ>vp))OU7keaE++Lcy~<8tE)gmgne8;^I@O)L;HE`?#qxdRoH0i5kw z`=ME8Btgvw@8v@rc%ze6Xz;@wYpUcy(gFe&34;K;Ng7|K*E`(dh)KHCmp~G~)-$45& za#*4M3(LNM;+HvA|0bKDjfnfluE=r1?Jp-GwsAd-OO|>B5j`2&>;WdaOI3-v0+O>m z+#}x&5cEi?0Ae7+x0d^8OXSFcQLlu&G-4bpCEd5eOBe(1&QD6YGvYPSVRkvBtNCaU z{~{P}Th|sUQ6!NeBu9^gvWhxJal%nla%P<@Rwew{ z-HP9>9A70=rY%9Z)Gd!+x0oC2k#*tKYE1!j1A@X61+*5uSicWsiN0ciRhI^*TjK(v zyB7^$apByeaZL0aLMWGd)O3Obd~@>jNa;d}or8&_w;$LOHNbvBk>wi9oSZBW2zTQ1 z_sH)`tmL2pzIsqAqaztSLr(?4#vpBUiz=WCo?8yOu8(L{E<=iNpaJRptz!ttVu+t7o=*yR&m2-F>sE`vr; z%yCoz>m!t+_~CSB+jL^1Ub&?&a$^;y=T1CfHQ7T8@o^ZPW0ef*q_QHY6)G3J5I0r_ zFBiUaF;^H#D(@$o{A+@2(~FHJE)v}}x{%mV{dYM)E07Lv7CQGG|XfG@aV{tZy1{A%^-kXMT3ho01Rxd*RT6rw>qu3trD@5)$C`kzj=8L2t<-! z?rHUI0D&z2Gz4zdPFjHW(ufL_iJWfw>b2tO$%;|o_k`8T^{<+toAn74;fyW^0vr3P znDW@L5(`O)(O^!~LBTLm=Eu&x+fJjYd_VIc7rfI*bMi*^Lvn;q#AVwaCw9U<J%bZH8+FLI5*jH3JfwM+AGW>I&;zC| z1U6z~2}9KqHst zhuA$z`Sd$E_v4Q1W=-Ge&*+l;M01teQv1Nwg1TP7gIOng`qot9bYVwMH3~O1u(_W5 z^i)$4X|c8ZMbY~T&{L|j^#NSTn_hR$eQw01N%Hlj)${)x%K!R9{lmBZHe{BoR`T0# z01aLJzGIO^05i%2!3ScXNX%&b_!}DdS0ddXzd;E^=`2#@hU|4r^N`3oU8kJc{L+X^ zGY@>d0v^xPE>%qXu<$x_DORtew|pBxMxk`8R#7%PAt7o{fmyh$yvf9~T^+d~ic|D3 z7c_CKMPrO~<{TL`Y0?Gf0Hu*8R2WCO$Z_Dw|7PDGhk|9ju{g!GEs#gC-d1ykqg0ZO zOMS2BW@7bFM~WHpZVr{bbES~tc0A(t4ZEJ1G!s?TDZ%EZua&il(lMB*ULXUsqBkBL z`)fhN_Fg4<|4-?5&Y|nD&LdG=)$=}Y{r9=c9g;p5(3bzcMVF#rip~ISEMX;Jq*@aR zXi+3yv_)i`lM8Rbi3$rm>B+r5Ilz$S$R*jFln$2;8`Y{ddeWtSZDCm<+YX<%V_)iY zr=YOQ=S5jkiFs|w!@(C#KMohG9h_CJR1twMM|s;EYKBVnbjtqVq!ohTQ+wdepXFst ztr22Gn*_RY(lyz4F;||dR0>6DRd7&3Vwbs~@{aO>;ivW2(JIAQw-;$yN!6k_Of&Sn zoA-gAaYw6(4}i?8SI6v_@x!Fvsgc573trw!=k)I!)$B(NFIBU%S6tdZuD(F%&a_5772#Q4J*#B!EZnI#DF5o>d>;^c%i?)N`` z@;k&*u9cPM++jlP@3|#QTgMkFCm8JCoHA?ZsJ`vkuM`zASGV3KrywmyC{?eGa}?Q+ z{STx@t+1_6?g{Mi7KZSG3(|)3Ck9yl4qK{sQTmhFtG2sNSSuKvAND;zsA8ZLW1`mW zmMdmkb7rTtl(Ta`WF(a5LtAW-lG?+OX%dC!e@88^2exuDI3()xbf5R?+79}ZnbasS zXh|(_2QU`!NR`tR+ft@g+I)y?-6*ARZnXqoUOF=7^a<FruU2!rW8;n8YB>2$o{fFh!g)cOFk~!yJmuc+eAFj^( z{Ew7~w;NegT>4%soNr8g+HdP93ozLk4*|7$~RMjXnTX5>^M2pWE`%*_BAe- ziGzVQoPPe;P&jvre{5N@!}`?fAfC2&o`$Bm%j8FlG+|rrK)N z7mol~_EuRD_QUJ+QTgO>z5cFWw+0mPtG57q=U6Goaynlov zvoz_4i7z>qK=ku|HK;}|Z*ywUPAaH>Q_3H1S+f1>vLZ~h*Y3q%%IWHamf^AtzZCbuZ2u z;e%&rHw0gJ!Q0g8i=`iI#|r0wV1F^=EPbfAe!9)U>6TewYVgtk%UtV#sylHPFwm(S z73qps2o`V(af_z_ZnG$&6;KoNO4I9lzRgIPeBQMyRHjL30ZfxyrRPr1Ahg7kW$VI} zNg_=^cwn5Ydk8L08*Fk27W593kMJWlvX{Ny((Ifaaz{HJWHR&WlSiiUmrDk6og*J^ z2w)l0>D;Eq)z4O!54^~q`xnHndPm)rYaoHOF!)E@)QZ$!;Fn$Vy~0jYDfa37$Z&qG{3;nPX;8p);QEDf!$xg9;5SEdTX zD$^Y9{1)D|M?`UMRy?>&>vlryKN>^+<^I+*gjC*S^0**`pz_0L^r(Z`$(ZusCbCXb zd+E|KP3IfnU0%+OGU8v_Q(Yb=pwXFL<;nA3q#pEQ>iGm7Wv23M+qP<3JMw4)US1L#u_HV|=_r zo+YiIb!DIkIa5ao?1z2`4hb>$-5jjb-RFnv`Jpy<`=ZZr6`#M7lE$#pz5d}mot;x| zr;oYn{mK^0P1!t$%y930h$oA9F#ldNzjBgndi_@UItaF!T>19Q@Jf7v&9BRcyTW8& zIA8Wyqyw6VP{ID@Yga+-gOc+5lrv-Y#y3l5`5Qu%DBL=)c0QypPS1(lKtGz@=Tyk- zftRj^gs7SY-14Q&e{mKleiy#>a;VYC-}dpm?JDvhP>DDv_gTzWQQh%g3IYh?+pn$LAclL5KGkS6F)vX!7O@T)vX7<4SG}cDbdT!>x<== z;Hz&uIyiyBFhqTzYP8O;?Nn{e zG#T-$B3{j*)YZYLZ^THj(qYe5USD{lTSAM;maalt&522hwf#?3FE1Rb8mUs#(DrNk z$%oOdF;W}S^FdGj8x`ND9q?6qFO`%e=11i7MZyn;rC4-A+OWr0B{^63Nk|*J6p(B^ zY7~kcLbSrxN^s+DIegN5u~#etJ@}RSd?zMZUP6g#&pRwP&UUyuwZe9unODDc8tpdF**m0rdS%6CXB+3eQE=;=CSYM+ zB1);7N$&p`&1>B258|9mja7^^(cAhpK@Mo$@Bl083EOnaMVn-8d=U^)1Sgs)7eLbD z$BevJItg9+C8lHe`mg{o;J9#PFH^^|QVRKH%OY~|KU*E&Q~;SkswF15Dfglp^7 zN>Pox1GPuN|N3JXS6;TZj5G>juFRnhV2_IT--_}-E*}AzB!xjG^Wiyj1MLG2Il}&# zdRsg)!`dgOtfa)xy)Zd7FQ+KeWg@R4MMlMv(k`Nzv^^BdboWr{3foP08aub}7>uNp zl9S)fvD>=ppHU>REGDs4HrmCon-de!a!y6o zp*)RjS6&k|?>ll3V>aSba6T2U=Jus0i(1h;fXhidpR_Nlp_4Kb8%HQUU?4Lqj@4qt z*|$pdRJxzf*R=Dbx0^x`dNC4`vd?5}!P&mL9wt7Su+7_{D0qo-q5gA-!swtwSc`Z- z6Fq!<6N{Ormz_)4k>z#B1`etr@&*0#Wd+@V!D%Z2yoUlSOY@pXwPnBDUObqL`M$Q< zu5tL_wm?SXn@C!#j3qp-&MsNv)H(S`JBX2(W*ZYJV+y#xq>PNlr5$!lAPrQ$MQPMP zDXwm03;#?6R5I3fK=IptmS36UXB{`s_lvAhWuLF8%LiAULVX+q?w%=UvhBi(g6?MH z>xM?0975`!wP(hfBB#jD=FL=d%I6DTJ3sRdUg~0>x-u&Ql^*{G5e9jakO5A?9>r1i zQdA0ZPsX@7N(JZX4qcA{jVLt_f9(RjA)n`R<0aouQie}8`+oLR1kc|1VKgBnL5X5k zDJwQ8gP)A={<3>-v8^NoQyeS4`?-OpM4JFI;VRO3ZRmNkf>*e?b62PL2M4F2)ogQHDj&g>K*cN@wm^r)@+ScWn338KfXanTOg`PSi!v49{YBQq> z+sz6d_P0CP)Mu$?rZAt$vh&@%Q;hE{d@COM?d`Z^%!!?41PTG8F^S7}YfNS9eI)=U zRKegoES?i@1cHImkiR$6&IbaDQn%LWv?~k#COi@)nq(?^>YGJCZ1*!5Xig0Ce-xd2 zJk#GF$0sr(5`~&eQIh1IVM909Y^6}H6@@g+{Wd~Z&HYx)R4&VP<(|7P8!5xEa%VI% zw=v9IzQ51!AAk76!`(}t62x$8oe#>ANM$zn%GxWY5t3dlg?5^zuHTv)?`{0nJOtEdT>Je@<^5oj;Dx^*EN{=f~U??iQH7Z~N~;<`X_o z+x=hZCM5srcY8;2|FwU$mg!**jegKg{gicLFy)9Ahn!Qfc12T6#McZ4_O1EiSLo=2 z=qg+Nt2^Gq(;dng^L^FzSGDM9R-%t|P?P$R^=hk)zhx86eW$OiRynA6(Vu|S@Zi}k z(Yugs04G~g&RMpptB$m%RDTPN^l#85)Hdrt?hm`y z84vW%JHzFOi)F@TdzedlXH|SiXPvt@#P@_LQ>x8c+mH5sNrZi~eSMV;`wt|g%M5Dc zFTB6}{l+WZL`P%|_v2N?`W2jnlWcJvbvef-V*Wv#fo_xaonz}U<;%x@-TcwG`bi{r z(n4TTQdFIzEXc3Y=4z?L%>>?HRMhppJ-NN1iT!(L!rtl`>?o~_{8;5KlX-a=-r>fH zQ*uVu1E}?6iAUmrFjtQd(#D0Lv`Lpo(g%-Zrn$I{T@+}e4*mz)IkLSc+%l~;l6SRM zAyGP8+V^x?n6cbMhg9O{8?I*x*++@tMbD4UV+eYS~3im6FPErr+zx-pl5iN=W|}Md|20wujCO!U5}ER>3Kf3 zu01+FV~=jwoo1kXGb=XkHeBa}U}OJ4AnUAlk~wtqA5Qsj2y<@iKhTj5Iu(c{vJC<9 z@FsBAhSxTpBXIx5ra`zz7eEAAWt9ZwQ)U*>ZqIkygS|e0`A6fA($@lW!}5GtDb}7` zfAgKV{ z%XPAJTr6DTG;ULVnheS-+qqlaaS2v+xf*cG*V~a7pua>QqW-SGc6w`l_pX-mOgdJ~ zKO%G{!gF6Mu-nI#kH8dGY)oFR3LkjR-u!m|&!|*98*E8YiT|0NOfZGM4+ii|0IiM- zajYs3PkbUMn}*!inW}hB@Lvqq`t{j+^*Y+mZizb05;NN-fr^dm3V&nh6AO%K%HQKt zMgM^kcl6js-|;Fd=Lzq`73L(oTn{y1^c_F5Z>fgT1&7wvWYl5S_oS|S9mBotoo#LT ztRIn>m3NLdwAX5r{xCzQ{6p>I`r}r4=THX*RbcR|GPVTU^t?Oz(q0`-Z<#2{hbg>d z&kDpc!&Z?RGjeztIa|C;l0UVQ$Q+1L zpGJj#i@-j%XzT@4Tc_#%YH|JEYfepp-D-ymC-27JIaa?2XKP%yRF6XWOll-#d8G*^ zPdmiw9*ng02c0dOel3DgARTJEW+VRcFd!3NoY1=;282(Cf)2Xb^#*T?j43$vYj{%E zQ7X3eY1He~Wz=YS9nF6AS(d?(6>H7mzKpQH1s)MAnCoe$S(&faXeDRAEXJ94cT9R> zQl9vF2Vmf<9{29k0=qA{L}D* zQIV70$b0aOmcmQqf5F(G6_ID7i!{&%Xcf((!BYQ-;b(EulA}%|P913Y;IF=6K;!k} z+@`+%&7YrvZ#sP^o}>O&D@R{GR+H9rR?#!~=G-^%S^s|p2}Cok+T}At&sxSj*b=1! zwzMqC=UMeP=Z2i;ZZZJg?9J^T26~2{zu!!=G(y~NpyBS(Hg6J&%4u%zf=&Kv(0@F8 zJIIOQ`_1ORbU=A;jEk%YiHL1O+Br<*7VTfH*lm>4NTj!RhofGPxC0?9dV7*Y zaGx|0`P)t08<0P*>Ghm!{d8<1>WocTZU75wBEPXp{@G?tHN*7woMo%`49KKb1V`lE)ELt@&;IukV*boAk2!KOfAc)eCry z7j>)M?hl%Nq*IJvvvM{UE!pHrAB*}))I zY9MN5^K1Rwcgo7z*PJwwyi0oqE>VHgO)-mab6ixe^l{Xg^HI5BzWlZB_G zyG{3f**UR&f%{p6i=>CXHdb)`iOek6@#Lb=;YB2b#j9q&mAd8cs}@o-dOs+!k0s-k z%#WqTH;LT2SJGhrb(;ATiLdaqaoC_fl1>W?x5K&1Nf{K_mM3&xce3D!OqqfarYIv82hxfI3wV}1PBVfG zQJw}l5oNgDU*!+gT-r2NV|zZ|(G$4q>xl_!HIj?g`>hPg2?r5E*<9P2{weW|5J)yc)pGl#<^KeY$M$U5pBk+nzI;nXfIbqL8 zF;2LHeej>Axa%8oJ^Y7_D9n4PqYuF*#FYrOHrLEPcWNrTMyK5bbnonY4=@s zTpBtVp{dorugb2j4hXi(SuR{;_DH2JM2J0&4^f$mSO?shZb32B9jYH32egGD*=d{+pFKmlg9*ziqV>nkX8G&J#{45a<=-*~F!3vm zEK6?5)N!}iajllRPlF4UzRSi!Vbtqc&=V`0FN3Amh^-J-eKqQKvo!tnhvKi1FK)y1 zr|aT&q&^J<+nFeNr%Kk(-k%6xLDp#j*LtLwF#%vawX%y%?}FSD7Bw{()k+f#J+Fzz zJ$P<71NsrQ<8i`1pTz7rc&o@(%`x~SQMxn~X$KuMyWy)2Psa7Ak|hyKh)hRYJOA|$ z*?PzN>d&PQqsMh#_ZMB5QX|=4Sb|A@WJV+|C6{^A9DU1*T%DQ2_*{%{uj_5MJKZxb z!!DOkE+=@MO1hGIJK$Do=Du3gj&j&(?ZEncjX9)ZkP5^j1(VIc;R$R*D>iK-DjTU> zg-P+m9Q_WPo6fXal*Uygmh%_Ki{(b;|{ z7_sO+Dgm@Nd5G!Y3Gw-(eL%S9`EHYcX^f{_DE|}i>*!-~+F$^BdP<8-Ak^?0y*CsTJ-jT-<0GlWWSi z%RtM6wS1x1d=-wIIb%Rd47=rTQlTYDpR_yps6I1zKMBZ(B5Mc@v!Vc{jdEOAq;+jNDz7=l@tJ$D~oS_c0G?! z4CRN+9F_CGfb}<5M&s_c%-I9LD^b1<^4+l_tWalXfaJ3apLNZ`7CRlcY|DFJR|Pby|bqq%FHJs*Eq~Y8(3f* z66qEb6%FxNn-_`ch`?++t%yWtPXyCqxX~3!h00LkPM7Rwcl#%@UG9N+)FZ9kxVmLE>FcK1*YT0geQZfW`_+(;LpnR8M!2L1IWe< z``QRLjjRkLK#Rjv@XfJZkQGba#R9o-MXaY12v`5y&rUuMYpug-hDvmE zSblK%)R6w6u_NhLH01I)#mDU)Qkm~R(7tbySa;=^qX8g>pD7X)cND7VE+fN0&wOOa z&LUMpqq#RNzI&vIS<3P&K@BK~7qcWyA?U$j>qJv-F&}&pa-uy8GvM~zU@)tuY1H5ct9O(PqRX&oL z<*X&yR3|-2^Ee3qB3{x7v8z^?1Zdb^kaEMKqTXR58|T0_WBX43padshFwP< z4Y8`0M_f4jrP44#!^@=;OUu4ZbJ?LXV7W%@3UW+|IxrL1pZZG0B%cb2d4cdU-odR= z^SNR=U3+0a&I`*jloZcUe)piC7;Xo~FI?5lTt+z#4o~FeJG3?tPyAI!mDO%GwKR=% zJ5UG0Z{5uM(_H2p1l%$1bo9S8z5`8_EqQg};S3ldTt zFy_!?VQa~`a3&*VH2z7nvpXowER2bZ@9OHAN;!LSro481OxLpPaeDs-VmWl?Qh;Z#~Gk`w` z4nKh#-8|Ixg195j>V9{sD#USXO#Mg=qANUhb7lpD5huD;s63oET!%78J!97kA?rO6 zn=(6rJD)jHg&_bNa}AOowHrv$RW}>~vPv(`s;WJrMiNR}aMCMp>9YHeY~P+15r zY77HXBMZ2vm_vkLDxzcC1@hmBdVsFL*FI~WkjKWj}`9LTbhA0%eb@sDsk z3D7I00!_ddQ@~70{Sh4ga~+daW)e`7jaYMK4>tjMyZ zPNxY>J+q3lz0`V1R3Zt1?gDOS$1pZBn7*qaD~eBSC?7@>U}}^UFK=$o#Wvqhk7=RGk4{i{ zcHVRnZvmyik%);Gu4AN2o_~_^E<*Cxl2^}kFp8n%z;%O7=CyY{2Bb-ISUMJ<9aZKH z_~9ipJB55{VD(Y#B1wlV!{C?yJ9dq+v%y;%X`B6hLOFz@lGJvYLtmj(oF?wMtRr13 zyz9o+KjpNx#>{fPnQNaG0&)A0Z3c81&}@V_dN^BoCSt9Vg1m+wi^R9SwO{X0O67S1 zGa73a`QAitJVpLp3|{pw$}h8#IXkBDB}61#WnyK0k$Xb?GWOu;#!iRaF3H?k%;x{~ zt*}jA|KwUHJi>DXF9^qcig=g~3dA#%CnX2iaRHV<*f7OF@i6aHQAP127s0@2rr;&6QGiK4UA->^92K4ymoboK0hw@o4bj)mv(GEvNu$ZmcXMzfceuMNBFHg# zzKw#;GbLZ73NU)tA+cLLu^$L9!kFD-*(pnzfKJ9~;RS`{0v14GLo<+7O^dFXI3b3@ z6Gq7oKJ&*Z`sgl*M-ab&2R?s%PA4I%E4)JEL!0%EecgW`-Nu$Nnk#L-Db%{<>11e+ z(G0zWC)U#BSt~;aglZJn1{tX1UHhThKC>cDlwC61B&llQ|twH$N#50pklGJ`(>KL`K<|9Ju1 zB!jk-^ruh}4<(sE_TEKbNv@C+1pB!nX#)Uwn9(i%p8Q^cz)jFLRrro+pm1#ugIObO zDm+PUoc|f)Eg+V`U&3HbeB?cRBAUbim?${X)iA|^Gk*rcNKFc-Cr1H$HaYq`K}IP} z9D(D*zg?u(f!%w&6eX~b;7M^L&{syLj;I?&G~y{4w7??jk ziJtuCe)%~U!Q(4TtUM#R0CZ7_mh-Xf&Z%e~&u2FB(Ri-cl~S{_KZmMXYJ5j(7NdQ$ zUF{ot3A2?8_r7#7>flXpaE2Pf3lZhGX^j8#O8IF0>z=H@}%h^E>3 z6i&EAK3?{DOO69hR;Z31F}|6*Gm|NTrewuikFDbPD5g**3EeRD1lrY33gfTzYku4; z5of6w(y>fcPXbOCxEb~xx}v`!T`?HAY*)wyPQp##;)CvIpu;S`94l5)WqwyZ=Ge7< zNo31N%TUYB)}Gyr+`9QLuS*uE>QduLGLYolN^6h60e4tHnC@49giKPC*(e|hJ`@0s z-s+MSEF3nQ!b$dG^I3oHev}KuKY9KvDKHPHiQn<~3^1sHu{e3$;pn@8)sCzRJbT!= zsX`i6xjFwh$Im=^J6t`-p{31u4p4D_ly8_fA-eTm52v`ksEgnq0ir4A0xiTrGn3o$ zn#lXWFAGiX?aQPX!1Te!047!(#&TF|ohZ)N=&cHG|L%;-4P!GCfAb>fG?-@&UBDwv z{Mt;?Zt~^PP0sJzIPB%rjyNr#upw&>ll&jZv23RRAGSd+;mE+YMIoWTZ&d>1Oo*|= zraSNx8+l&WLWW18IId-@+usHbhrWiEQU8AT$UyMxcQUNtziD=3=_i= zWv#gbbr%>j0uS^3j*B$e89m>Axi1rT!9(VN)@Yj1VuuPi_O_TQy&g?1)}rEYPXgN) zQyq^U)@-a9JrdjWq)K!A#pXNFIMW`!tp++&=3l9fGiRyhUqWjZ({pujqOG&1b_!uX zOd0e2$utTY-yCe=L>wu6*<1yZdY0OC-_-6~ipT|1XUV}QKfC0wJUW#bVI&GP z%gRvse*sjdWMZMjs=TVF|LRXcX-UhM?R*BQ+(~-q{o6qd1HHpo%;ZIo=uB$YT|vVD zp#?tX?ljnAta*KWxZ-4aMSX7TSXbhx((i&AyR@+)`QPVhPVfa-)v_Dp(BUa@*5srh~b*v%5h;jxgd*E?z3HP(9yYlqlL{(SOp z;ep)ENl)Vz)n?E1WK)Dtk2p7}fxj5~wdzUPb0|MpEzLsUt_LsJ_=N#8{?X^jLuN5g zQKWD{IawU8j7b;+@kYq-L`bVI@9?_?;dVwkN%-+cSvowrMH}H` z1rp0EW5ib@877<^oG5!>bEotrNN{FmCJl@j4IIh06^GmS+_|(|JYODtMU60(pZMK1 z>Chn&T%5GmuyPIjt<=(=T} zvH7OAe4qmc2BKlW*_k8=?ULdDe+c);gL}8mu6=gplc*G(kq?j#k+4e5P6zX!#d`Be zx5S~PZXttc~U8XgO(_6UKZ^wKP#J+G8LpRD-5lC` z-THGpKYAos3#AtD*Sc)5>2w|yHH`GWQL||y3TlCCIea`BO)2f8zdx@?2CxBi_7G5 zQf0%5*tyH1^7IOn)k)N`_Ky-xk8<9(cfQQ5qXx!Vu68*eB&hY6{m>gk+JU3dP;vu_ucYqKckL<^zgj#n=P_4GZ9sR-JlRq0ylx7)D=JCj{~~9U z@1Bzx-L&qK2OMl)w9TMG7I@y6^I2tPLrj+Xc!heX#Pzt#N0b8x4uQe6deZ&}}1X&rb_yi5qcy+Omw=*QtzQLj3fr$JS22tQv``I{c>R{4#gC!nW< z72_9vUev6A!`F4m>Q_7z^idf~IYl=K6(~(gzI9!zQ%>s%60U>81q9-J<>PY#CJ!Cb zyw^*APrgCAEEWzpTH23Lg;1FCoIyfSMP;Kdr_HZA64ygmU5>0tn++MP%j)S411zKJ z75>M2-CK?BuA+M>o<%0P&NWE)=jFO6g#Klt!sqJyN$OeNVHXPVZ5wQk^`?B#&-m zCeLSmUfQykfo=U`_ZWHZ%k+y{~j&;QrWr z_aF-fS6;F3`#LPwM?!(XV-g5V9W5vL41JNgLPv1z7`&E=XYxnRB z0U4ct-^BlQi7P)ah;WejM4eJ9sjE!^H{ZjR(@G#$tM;ev_jp9p57qbjESEA&3fx~* zRb&4ND0Qhud!HidppCkX82>UG_6a;|)b!=+nhTQ)7r;aYLln;lB?acHWZAEB;73XXWB-LS9CsZI0NtL@)8T)lkp zp7Kt?7ubq6nk*Mci=BhcsW^o|KFcsuWYX~?=-$9IBmw%{hy1Yr@V-e=Iu6G_`U&V4 z@9Z&XABwkBkF8DKeBO`HHZ@qL0+SsBaMJK?!%XQWa7(`VhQlmt^UfRO5uq_7y|TW- zte#yzV$s;9jjW^k$78K2fdH`{KC-E~e+C8;yhze&zy`~I$oui>PG#$j)lnoqhFKG@ z=qaN-6G&BFMZ3QG;Dyk$QO}e`f4rSCD{j~Ls``okK6DzwOlw4j5c58x;mc2`f_KCH zkky!|U5cU@_%aDBAj&)ZlSO*!rd(d6er%lmLa%?2;K^G`Hiq&vB%s?@E1*Ufh)sww zX=~SA{c6}^!F6%iS_()xmHKB5uk&XnwyXSR2?UoUau*xgP64au{cczC8n%@4;N498 zaSP|JTq!7S^OwI>3qKQS?@1g}Q+`!b_;GY8>FSv=S@H1-okwA!1j0Ld8|-O$F z8|`I6&dcA$J%5#DPq_5|Y2)8ad4+oQKyZA_ID*pn`Ac=`(P^dQhFM9bKiNnHXxjMg zzaMh6O%hH&5I6#TaFUP;+HOz+<7M1sNESCJpB3@&t4LIgUO7rcIn+KaYW1&k<@Q79 zEd4o&?c#_!SO5FovE#?zN-v6>7&v$P^_@RwT}cflXKpV!oW)13fTUs}p(o$m6nK2fQib35q7wcoUwqdH z(n_Yp#8%wfr{g^c`cl_$c#&F-H{((VX{Yw{@> zy_q~4zXriUg1Sytp?%DWKEbtZ$9dt89}yz!7Ew--b05YNcq&y9PS(XXpX6j;ox3=A z-B;o3)z>qt78~HC271D;RlcjKoe7Zqag*^t(iQY-zq}>X$gcI_1Ld4iwPW4~pWSiW zw!8T7`hDATqboxDE+=V{z5Fuv-F81_y7c?RsR?-C&p5$-qI@;L@#wmyppaDARaanf z?rx|L^(wpL_o23?kGJ(h)o7r)$}T9ht}bEAdv(w|_`Hl6EC!T$u# z9WaZ&O`0yhn8{AJi&dP#)f=dk$N`~Uf?ws;+h>K8Anqzj`2Rpz#;vjXXopJS0 zM-{uMb(jl!(<4wq^EEeW zX9Su#@k7p(GK}8fMD-Pu3D*sS8J`#NnfieLMnK|uj}XN_Qj;Rr!aa$zg7S5A_9$N$ zN$=XCK~o@4(9dP~&uNQ7i*x$bT~JFCV}33uVDa;*EKbeH*3dy{c=|;cMcEh`xez{N zQX5;J<|Ns)W|D2-6q)}(@1FhX;w6bY$DG5tLz3RW4HO|_Z{-_y*du}0pJk0$qu0)S zP8B(!tak9y%ClhT87HN)e+-m^%PV5*<-y>(UVoD@B}H`p&7_E1LkPWNRor_h^$jIz z+r(f^7TaE$-l;GKhn-*jy{CBXj`bB|#jsdCaPtF}m&MJ_7d^@; zTkUY|L(p)e-am|bEFXnS$2Id$PrS@&ZZvtSYhB^HIu33f@JyVn?ys>i5c3?2x>!D8 zjVkmqwD}~Pe|?ast}YcP+VnW2X??+BjSx9-$xn~*sQQ6)8g6MQ=CB~!&;DQip(pD9o5x@Hg zgeC8~nZ@p4`*N4Dg=Hb#dS`0VX#clq^ymLTk8{6GO=xVNl5O*bRytwsH$RYmSP^jx zb$rdt?okJxFs&fZ&7Bq_?$*=Qeb?*<1-$(pQDvs7K`hO{BhQly?~wh9=L|gzP98L} zs;>PMdrN4sz#w9|^>~=4GduYe$L%0Dy6^nDy4e)=YOzK6BC3L}Gd|y#`1hVzegQLt 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

pYGlno6GO?8UXb3`}ZJ@xKK061ziXk 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%0A7>T_vKrwc?+ayIr^B-iKWA6zInDYeucQ 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≧t1Qi1ryB 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 E+1GlhfdBvi diff --git a/.github/social-preview.svg b/.github/social-preview.svg deleted file mode 100644 index 242dbe2..0000000 --- a/.github/social-preview.svg +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SEMANTIC - Facts & Knowledge - decisions/ knowledge/ entities/ - - - - - - - EPISODIC - Events & Experiences - incidents/ sessions/ blockers/ - - - - - - - PROCEDURAL - Workflows & Steps - runbooks/ patterns/ migrations/ - - - - - - EXTENSIBLE - Ontologies - - - - mnemonic - - - Cognitive Memory System for Claude Code - - - - - MIF Level 3 - - - - Git Versioned - - - - Filesystem - - - - No Dependencies - - - - - - - - - - diff --git a/.github/workflows/ci-doctor.lock.yml b/.github/workflows/ci-doctor.lock.yml deleted file mode 100644 index 202dbf2..0000000 --- a/.github/workflows/ci-doctor.lock.yml +++ /dev/null @@ -1,1173 +0,0 @@ -# -# ___ _ _ -# / _ \ | | (_) -# | |_| | __ _ ___ _ __ | |_ _ ___ -# | _ |/ _` |/ _ \ '_ \| __| |/ __| -# | | | | (_| | __/ | | | |_| | (__ -# \_| |_/\__, |\___|_| |_|\__|_|\___| -# __/ | -# _ _ |___/ -# | | | | / _| | -# | | | | ___ _ __ _ __| |_| | _____ ____ -# | |/\| |/ _ \ '__| |/ /| _| |/ _ \ \ /\ / / ___| -# \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ -# \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ -# -# This file was automatically generated by gh-aw (v0.45.0). DO NOT EDIT. -# -# To update this file, edit githubnext/agentics/workflows/ci-doctor.md@eb7950f37d350af6fa09d19827c4883e72947221 and run: -# gh aw compile -# Not all edits will cause changes to this file. -# -# For more information: https://github.github.com/gh-aw/introduction/overview/ -# -# This workflow is an automated CI failure investigator that triggers when monitored workflows fail. -# Performs deep analysis of GitHub Actions workflow failures to identify root causes, -# patterns, and provide actionable remediation steps. Analyzes logs, error messages, -# and workflow configuration to help diagnose and resolve CI issues efficiently. -# -# Source: githubnext/agentics/workflows/ci-doctor.md@eb7950f37d350af6fa09d19827c4883e72947221 -# -# frontmatter-hash: 2cb21e1f83777de19c0137fc0a4ac2c3a3441a38e8d13c72756fedf132379622 - -name: "CI Failure Doctor" -"on": - workflow_run: - # zizmor: ignore[dangerous-triggers] - workflow_run trigger is secured with role and fork validation - branches: - - main - types: - - completed - workflows: - - Daily Perf Improver - - Daily Test Coverage Improver - -permissions: {} - -concurrency: - group: "gh-aw-${{ github.workflow }}" - -run-name: "CI Failure Doctor" - -jobs: - activation: - needs: pre_activation - # zizmor: ignore[dangerous-triggers] - workflow_run trigger is secured with role and fork validation - if: > - ((needs.pre_activation.outputs.activated == 'true') && (github.event.workflow_run.conclusion == 'failure')) && - ((github.event_name != 'workflow_run') || ((github.event.workflow_run.repository.id == github.repository_id) && - (!(github.event.workflow_run.repository.fork)))) - runs-on: ubuntu-slim - permissions: - contents: read - outputs: - comment_id: "" - comment_repo: "" - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Check workflow file timestamps - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_WORKFLOW_FILE: "ci-doctor.lock.yml" - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/check_workflow_timestamp_api.cjs'); - await main(); - - agent: - needs: activation - runs-on: ubuntu-latest - permissions: read-all - env: - DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} - GH_AW_ASSETS_ALLOWED_EXTS: "" - GH_AW_ASSETS_BRANCH: "" - GH_AW_ASSETS_MAX_SIZE_KB: 0 - GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs - GH_AW_SAFE_OUTPUTS: /opt/gh-aw/safeoutputs/outputs.jsonl - GH_AW_SAFE_OUTPUTS_CONFIG_PATH: /opt/gh-aw/safeoutputs/config.json - GH_AW_SAFE_OUTPUTS_TOOLS_PATH: /opt/gh-aw/safeoutputs/tools.json - GH_AW_WORKFLOW_ID_SANITIZED: cidoctor - outputs: - checkout_pr_success: ${{ steps.checkout-pr.outputs.checkout_pr_success || 'true' }} - has_patch: ${{ steps.collect_output.outputs.has_patch }} - model: ${{ steps.generate_aw_info.outputs.model }} - output: ${{ steps.collect_output.outputs.output }} - output_types: ${{ steps.collect_output.outputs.output_types }} - secret_verification_result: ${{ steps.validate-secret.outputs.verification_result }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Checkout repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Create gh-aw temp directory - run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh - # Cache memory file share configuration from frontmatter processed below - - name: Create cache-memory directory - run: bash /opt/gh-aw/actions/create_cache_memory_dir.sh - - name: Restore cache-memory file share data - uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 - with: - key: memory-${{ env.GH_AW_WORKFLOW_ID_SANITIZED }}-${{ github.run_id }} - path: /tmp/gh-aw/cache-memory - restore-keys: | - memory-${{ env.GH_AW_WORKFLOW_ID_SANITIZED }}- - - name: Configure Git credentials - env: - REPO_NAME: ${{ github.repository }} - SERVER_URL: ${{ github.server_url }} - run: | - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git config --global user.name "github-actions[bot]" - # Re-authenticate git with GitHub token - SERVER_URL_STRIPPED="${SERVER_URL#https://}" - git remote set-url origin "https://x-access-token:${{ github.token }}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" - echo "Git configured with standard GitHub Actions identity" - - name: Checkout PR branch - id: checkout-pr - if: | - github.event.pull_request - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - with: - github-token: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/checkout_pr_branch.cjs'); - await main(); - - name: Generate agentic run info - id: generate_aw_info - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const fs = require('fs'); - - const awInfo = { - engine_id: "copilot", - engine_name: "GitHub Copilot CLI", - model: process.env.GH_AW_MODEL_AGENT_COPILOT || "", - version: "", - agent_version: "0.0.410", - cli_version: "v0.45.0", - workflow_name: "CI Failure Doctor", - experimental: false, - supports_tools_allowlist: true, - supports_http_transport: true, - run_id: context.runId, - run_number: context.runNumber, - run_attempt: process.env.GITHUB_RUN_ATTEMPT, - repository: context.repo.owner + '/' + context.repo.repo, - ref: context.ref, - sha: context.sha, - actor: context.actor, - event_name: context.eventName, - staged: false, - allowed_domains: ["defaults"], - firewall_enabled: true, - awf_version: "v0.18.0", - awmg_version: "v0.1.4", - steps: { - firewall: "squid" - }, - created_at: new Date().toISOString() - }; - - // Write to /tmp/gh-aw directory to avoid inclusion in PR - const tmpPath = '/tmp/gh-aw/aw_info.json'; - fs.writeFileSync(tmpPath, JSON.stringify(awInfo, null, 2)); - console.log('Generated aw_info.json at:', tmpPath); - console.log(JSON.stringify(awInfo, null, 2)); - - // Set model as output for reuse in other steps/jobs - core.setOutput('model', awInfo.model); - - name: Validate COPILOT_GITHUB_TOKEN secret - id: validate-secret - run: /opt/gh-aw/actions/validate_multi_secret.sh COPILOT_GITHUB_TOKEN 'GitHub Copilot CLI' https://github.github.com/gh-aw/reference/engines/#github-copilot-default - env: - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - - name: Install GitHub Copilot CLI - run: /opt/gh-aw/actions/install_copilot_cli.sh 0.0.410 - - name: Install awf binary - run: bash /opt/gh-aw/actions/install_awf_binary.sh v0.18.0 - - name: Determine automatic lockdown mode for GitHub MCP Server - id: determine-automatic-lockdown - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} - GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} - with: - script: | - const determineAutomaticLockdown = require('/opt/gh-aw/actions/determine_automatic_lockdown.cjs'); - await determineAutomaticLockdown(github, context, core); - - name: Download container images - run: bash /opt/gh-aw/actions/download_docker_images.sh ghcr.io/github/gh-aw-firewall/agent:0.18.0 ghcr.io/github/gh-aw-firewall/squid:0.18.0 ghcr.io/github/gh-aw-mcpg:v0.1.4 ghcr.io/github/github-mcp-server:v0.30.3 node:lts-alpine - - name: Write Safe Outputs Config - run: | - mkdir -p /opt/gh-aw/safeoutputs - mkdir -p /tmp/gh-aw/safeoutputs - mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs - cat > /opt/gh-aw/safeoutputs/config.json << 'GH_AW_SAFE_OUTPUTS_CONFIG_EOF' - {"add_comment":{"max":1},"create_issue":{"max":1},"missing_data":{},"missing_tool":{},"noop":{"max":1}} - GH_AW_SAFE_OUTPUTS_CONFIG_EOF - cat > /opt/gh-aw/safeoutputs/tools.json << 'GH_AW_SAFE_OUTPUTS_TOOLS_EOF' - [ - { - "description": "Create a new GitHub issue for tracking bugs, feature requests, or tasks. Use this for actionable work items that need assignment, labeling, and status tracking. For reports, announcements, or status updates that don't require task tracking, use create_discussion instead. CONSTRAINTS: Maximum 1 issue(s) can be created. Title will be prefixed with \"${{ github.workflow }}\". Labels [automation ci] will be automatically added.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "body": { - "description": "Detailed issue description in Markdown. Do NOT repeat the title as a heading since it already appears as the issue's h1. Include context, reproduction steps, or acceptance criteria as appropriate.", - "type": "string" - }, - "labels": { - "description": "Labels to categorize the issue (e.g., 'bug', 'enhancement'). Labels must exist in the repository.", - "items": { - "type": "string" - }, - "type": "array" - }, - "parent": { - "description": "Parent issue number for creating sub-issues. This is the numeric ID from the GitHub URL (e.g., 42 in github.com/owner/repo/issues/42). Can also be a temporary_id (e.g., 'aw_abc123', 'aw_Test123') from a previously created issue in the same workflow run.", - "type": [ - "number", - "string" - ] - }, - "temporary_id": { - "description": "Unique temporary identifier for referencing this issue before it's created. Format: 'aw_' followed by 3 to 8 alphanumeric characters (e.g., 'aw_abc1', 'aw_Test123'). Use '#aw_ID' in body text to reference other issues by their temporary_id; these are replaced with actual issue numbers after creation.", - "pattern": "^aw_[A-Za-z0-9]{4,8}$", - "type": "string" - }, - "title": { - "description": "Concise issue title summarizing the bug, feature, or task. The title appears as the main heading, so keep it brief and descriptive.", - "type": "string" - } - }, - "required": [ - "title", - "body" - ], - "type": "object" - }, - "name": "create_issue" - }, - { - "description": "Add a comment to an existing GitHub issue, pull request, or discussion. Use this to provide feedback, answer questions, or add information to an existing conversation. For creating new items, use create_issue, create_discussion, or create_pull_request instead. IMPORTANT: Comments are subject to validation constraints enforced by the MCP server - maximum 65536 characters for the complete comment (including footer which is added automatically), 10 mentions (@username), and 50 links. Exceeding these limits will result in an immediate error with specific guidance. CONSTRAINTS: Maximum 1 comment(s) can be added.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "body": { - "description": "The comment text in Markdown format. This is the 'body' field - do not use 'comment_body' or other variations. Provide helpful, relevant information that adds value to the conversation. CONSTRAINTS: The complete comment (your body text + automatically added footer) must not exceed 65536 characters total. Maximum 10 mentions (@username), maximum 50 links (http/https URLs). A footer (~200-500 characters) is automatically appended with workflow attribution, so leave adequate space. If these limits are exceeded, the tool call will fail with a detailed error message indicating which constraint was violated.", - "type": "string" - }, - "item_number": { - "description": "The issue, pull request, or discussion number to comment on. This is the numeric ID from the GitHub URL (e.g., 123 in github.com/owner/repo/issues/123). If omitted, the tool will attempt to resolve the target from the current workflow context (triggering issue, PR, or discussion).", - "type": "number" - } - }, - "required": [ - "body" - ], - "type": "object" - }, - "name": "add_comment" - }, - { - "description": "Report that a tool or capability needed to complete the task is not available, or share any information you deem important about missing functionality or limitations. Use this when you cannot accomplish what was requested because the required functionality is missing or access is restricted.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "alternatives": { - "description": "Any workarounds, manual steps, or alternative approaches the user could take (max 256 characters).", - "type": "string" - }, - "reason": { - "description": "Explanation of why this tool is needed or what information you want to share about the limitation (max 256 characters).", - "type": "string" - }, - "tool": { - "description": "Optional: Name or description of the missing tool or capability (max 128 characters). Be specific about what functionality is needed.", - "type": "string" - } - }, - "required": [ - "reason" - ], - "type": "object" - }, - "name": "missing_tool" - }, - { - "description": "Log a transparency message when no significant actions are needed. Use this to confirm workflow completion and provide visibility when analysis is complete but no changes or outputs are required (e.g., 'No issues found', 'All checks passed'). This ensures the workflow produces human-visible output even when no other actions are taken.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "message": { - "description": "Status or completion message to log. Should explain what was analyzed and the outcome (e.g., 'Code review complete - no issues found', 'Analysis complete - all tests passing').", - "type": "string" - } - }, - "required": [ - "message" - ], - "type": "object" - }, - "name": "noop" - }, - { - "description": "Report that data or information needed to complete the task is not available. Use this when you cannot accomplish what was requested because required data, context, or information is missing.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "alternatives": { - "description": "Any workarounds, manual steps, or alternative approaches the user could take (max 256 characters).", - "type": "string" - }, - "context": { - "description": "Additional context about the missing data or where it should come from (max 256 characters).", - "type": "string" - }, - "data_type": { - "description": "Type or description of the missing data or information (max 128 characters). Be specific about what data is needed.", - "type": "string" - }, - "reason": { - "description": "Explanation of why this data is needed to complete the task (max 256 characters).", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "name": "missing_data" - } - ] - GH_AW_SAFE_OUTPUTS_TOOLS_EOF - cat > /opt/gh-aw/safeoutputs/validation.json << 'GH_AW_SAFE_OUTPUTS_VALIDATION_EOF' - { - "add_comment": { - "defaultMax": 1, - "fields": { - "body": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 65000 - }, - "item_number": { - "issueOrPRNumber": true - } - } - }, - "create_issue": { - "defaultMax": 1, - "fields": { - "body": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 65000 - }, - "labels": { - "type": "array", - "itemType": "string", - "itemSanitize": true, - "itemMaxLength": 128 - }, - "parent": { - "issueOrPRNumber": true - }, - "repo": { - "type": "string", - "maxLength": 256 - }, - "temporary_id": { - "type": "string" - }, - "title": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 128 - } - } - }, - "missing_tool": { - "defaultMax": 20, - "fields": { - "alternatives": { - "type": "string", - "sanitize": true, - "maxLength": 512 - }, - "reason": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 256 - }, - "tool": { - "type": "string", - "sanitize": true, - "maxLength": 128 - } - } - }, - "noop": { - "defaultMax": 1, - "fields": { - "message": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 65000 - } - } - } - } - GH_AW_SAFE_OUTPUTS_VALIDATION_EOF - - name: Generate Safe Outputs MCP Server Config - id: safe-outputs-config - run: | - # Generate a secure random API key (360 bits of entropy, 40+ chars) - # Mask immediately to prevent timing vulnerabilities - API_KEY=$(openssl rand -base64 45 | tr -d '/+=') - echo "::add-mask::${API_KEY}" - - PORT=3001 - - # Set outputs for next steps - { - echo "safe_outputs_api_key=${API_KEY}" - echo "safe_outputs_port=${PORT}" - } >> "$GITHUB_OUTPUT" - - echo "Safe Outputs MCP server will run on port ${PORT}" - - - name: Start Safe Outputs MCP HTTP Server - id: safe-outputs-start - env: - DEBUG: '*' - GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-config.outputs.safe_outputs_port }} - GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-config.outputs.safe_outputs_api_key }} - GH_AW_SAFE_OUTPUTS_TOOLS_PATH: /opt/gh-aw/safeoutputs/tools.json - GH_AW_SAFE_OUTPUTS_CONFIG_PATH: /opt/gh-aw/safeoutputs/config.json - GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs - run: | - # Environment variables are set above to prevent template injection - export DEBUG - export GH_AW_SAFE_OUTPUTS_PORT - export GH_AW_SAFE_OUTPUTS_API_KEY - export GH_AW_SAFE_OUTPUTS_TOOLS_PATH - export GH_AW_SAFE_OUTPUTS_CONFIG_PATH - export GH_AW_MCP_LOG_DIR - - bash /opt/gh-aw/actions/start_safe_outputs_server.sh - - - name: Start MCP Gateway - id: start-mcp-gateway - env: - GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} - GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-start.outputs.api_key }} - GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-start.outputs.port }} - GITHUB_MCP_LOCKDOWN: ${{ steps.determine-automatic-lockdown.outputs.lockdown == 'true' && '1' || '0' }} - GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - run: | - set -eo pipefail - mkdir -p /tmp/gh-aw/mcp-config - - # Export gateway environment variables for MCP config and gateway script - export MCP_GATEWAY_PORT="80" - export MCP_GATEWAY_DOMAIN="host.docker.internal" - MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') - echo "::add-mask::${MCP_GATEWAY_API_KEY}" - export MCP_GATEWAY_API_KEY - export MCP_GATEWAY_PAYLOAD_DIR="/tmp/gh-aw/mcp-payloads" - mkdir -p "${MCP_GATEWAY_PAYLOAD_DIR}" - export DEBUG="*" - - export GH_AW_ENGINE="copilot" - export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_LOCKDOWN -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.1.4' - - mkdir -p /home/runner/.copilot - cat << GH_AW_MCP_CONFIG_EOF | bash /opt/gh-aw/actions/start_mcp_gateway.sh - { - "mcpServers": { - "github": { - "type": "stdio", - "container": "ghcr.io/github/github-mcp-server:v0.30.3", - "env": { - "GITHUB_LOCKDOWN_MODE": "$GITHUB_MCP_LOCKDOWN", - "GITHUB_PERSONAL_ACCESS_TOKEN": "\${GITHUB_MCP_SERVER_TOKEN}", - "GITHUB_READ_ONLY": "1", - "GITHUB_TOOLSETS": "context,repos,issues,pull_requests" - } - }, - "safeoutputs": { - "type": "http", - "url": "http://host.docker.internal:$GH_AW_SAFE_OUTPUTS_PORT", - "headers": { - "Authorization": "\${GH_AW_SAFE_OUTPUTS_API_KEY}" - } - } - }, - "gateway": { - "port": $MCP_GATEWAY_PORT, - "domain": "${MCP_GATEWAY_DOMAIN}", - "apiKey": "${MCP_GATEWAY_API_KEY}", - "payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}" - } - } - GH_AW_MCP_CONFIG_EOF - - name: Generate workflow overview - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const { generateWorkflowOverview } = require('/opt/gh-aw/actions/generate_workflow_overview.cjs'); - await generateWorkflowOverview(core); - - name: Create prompt with built-in context - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} - GH_AW_GITHUB_ACTOR: ${{ github.actor }} - GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} - GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_CONCLUSION: ${{ github.event.workflow_run.conclusion }} - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_EVENT: ${{ github.event.workflow_run.event }} - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_HEAD_SHA: ${{ github.event.workflow_run.head_sha }} - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_HTML_URL: ${{ github.event.workflow_run.html_url }} - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_ID: ${{ github.event.workflow_run.id }} - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_RUN_NUMBER: ${{ github.event.workflow_run.run_number }} - GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} - GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} - GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} - run: | - bash /opt/gh-aw/actions/create_prompt_first.sh - cat << 'GH_AW_PROMPT_EOF' > "$GH_AW_PROMPT" - - GH_AW_PROMPT_EOF - cat "/opt/gh-aw/prompts/xpia.md" >> "$GH_AW_PROMPT" - cat "/opt/gh-aw/prompts/temp_folder_prompt.md" >> "$GH_AW_PROMPT" - cat "/opt/gh-aw/prompts/markdown.md" >> "$GH_AW_PROMPT" - cat "/opt/gh-aw/prompts/cache_memory_prompt.md" >> "$GH_AW_PROMPT" - cat << 'GH_AW_PROMPT_EOF' >> "$GH_AW_PROMPT" - - GitHub API Access Instructions - - The gh CLI is NOT authenticated. Do NOT use gh commands for GitHub operations. - - - To create or modify GitHub resources (issues, discussions, pull requests, etc.), you MUST call the appropriate safe output tool. Simply writing content will NOT work - the workflow requires actual tool calls. - - Temporary IDs: Some safe output tools support a temporary ID field (usually named temporary_id) so you can reference newly-created items elsewhere in the SAME agent output (for example, using #aw_abc1 in a later body). - - **IMPORTANT - temporary_id format rules:** - - If you DON'T need to reference the item later, OMIT the temporary_id field entirely (it will be auto-generated if needed) - - If you DO need cross-references/chaining, you MUST match this EXACT validation regex: /^aw_[A-Za-z0-9]{3,8}$/i - - Format: aw_ prefix followed by 3 to 8 alphanumeric characters (A-Z, a-z, 0-9, case-insensitive) - - Valid alphanumeric characters: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 - - INVALID examples: aw_ab (too short), aw_123456789 (too long), aw_test-id (contains hyphen), aw_id_123 (contains underscore) - - VALID examples: aw_abc, aw_abc1, aw_Test123, aw_A1B2C3D4, aw_12345678 - - To generate valid IDs: use 3-8 random alphanumeric characters or omit the field to let the system auto-generate - - Do NOT invent other aw_* formats — downstream steps will reject them with validation errors matching against /^aw_[A-Za-z0-9]{3,8}$/i. - - Discover available tools from the safeoutputs MCP server. - - **Critical**: Tool calls write structured data that downstream jobs process. Without tool calls, follow-up actions will be skipped. - - **Note**: If you made no other safe output tool calls during this workflow execution, call the "noop" tool to provide a status message indicating completion or that no actions were needed. - - - - The following GitHub context information is available for this workflow: - {{#if __GH_AW_GITHUB_ACTOR__ }} - - **actor**: __GH_AW_GITHUB_ACTOR__ - {{/if}} - {{#if __GH_AW_GITHUB_REPOSITORY__ }} - - **repository**: __GH_AW_GITHUB_REPOSITORY__ - {{/if}} - {{#if __GH_AW_GITHUB_WORKSPACE__ }} - - **workspace**: __GH_AW_GITHUB_WORKSPACE__ - {{/if}} - {{#if __GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ }} - - **issue-number**: #__GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ - {{/if}} - {{#if __GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ }} - - **discussion-number**: #__GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ - {{/if}} - {{#if __GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ }} - - **pull-request-number**: #__GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ - {{/if}} - {{#if __GH_AW_GITHUB_EVENT_COMMENT_ID__ }} - - **comment-id**: __GH_AW_GITHUB_EVENT_COMMENT_ID__ - {{/if}} - {{#if __GH_AW_GITHUB_RUN_ID__ }} - - **workflow-run-id**: __GH_AW_GITHUB_RUN_ID__ - {{/if}} - - - GH_AW_PROMPT_EOF - cat << 'GH_AW_PROMPT_EOF' >> "$GH_AW_PROMPT" - - GH_AW_PROMPT_EOF - cat << 'GH_AW_PROMPT_EOF' >> "$GH_AW_PROMPT" - {{#runtime-import .github/workflows/ci-doctor.md}} - GH_AW_PROMPT_EOF - - name: Substitute placeholders - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_ALLOWED_EXTENSIONS: '' - GH_AW_CACHE_DESCRIPTION: '' - GH_AW_CACHE_DIR: '/tmp/gh-aw/cache-memory/' - GH_AW_GITHUB_ACTOR: ${{ github.actor }} - GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} - GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_CONCLUSION: ${{ github.event.workflow_run.conclusion }} - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_EVENT: ${{ github.event.workflow_run.event }} - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_HEAD_SHA: ${{ github.event.workflow_run.head_sha }} - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_HTML_URL: ${{ github.event.workflow_run.html_url }} - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_ID: ${{ github.event.workflow_run.id }} - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_RUN_NUMBER: ${{ github.event.workflow_run.run_number }} - GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} - GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} - GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} - with: - script: | - const substitutePlaceholders = require('/opt/gh-aw/actions/substitute_placeholders.cjs'); - - // Call the substitution function - return await substitutePlaceholders({ - file: process.env.GH_AW_PROMPT, - substitutions: { - GH_AW_ALLOWED_EXTENSIONS: process.env.GH_AW_ALLOWED_EXTENSIONS, - GH_AW_CACHE_DESCRIPTION: process.env.GH_AW_CACHE_DESCRIPTION, - GH_AW_CACHE_DIR: process.env.GH_AW_CACHE_DIR, - GH_AW_GITHUB_ACTOR: process.env.GH_AW_GITHUB_ACTOR, - GH_AW_GITHUB_EVENT_COMMENT_ID: process.env.GH_AW_GITHUB_EVENT_COMMENT_ID, - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: process.env.GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER, - GH_AW_GITHUB_EVENT_ISSUE_NUMBER: process.env.GH_AW_GITHUB_EVENT_ISSUE_NUMBER, - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: process.env.GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER, - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_CONCLUSION: process.env.GH_AW_GITHUB_EVENT_WORKFLOW_RUN_CONCLUSION, - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_EVENT: process.env.GH_AW_GITHUB_EVENT_WORKFLOW_RUN_EVENT, - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_HEAD_SHA: process.env.GH_AW_GITHUB_EVENT_WORKFLOW_RUN_HEAD_SHA, - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_HTML_URL: process.env.GH_AW_GITHUB_EVENT_WORKFLOW_RUN_HTML_URL, - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_ID: process.env.GH_AW_GITHUB_EVENT_WORKFLOW_RUN_ID, - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_RUN_NUMBER: process.env.GH_AW_GITHUB_EVENT_WORKFLOW_RUN_RUN_NUMBER, - GH_AW_GITHUB_REPOSITORY: process.env.GH_AW_GITHUB_REPOSITORY, - GH_AW_GITHUB_RUN_ID: process.env.GH_AW_GITHUB_RUN_ID, - GH_AW_GITHUB_WORKSPACE: process.env.GH_AW_GITHUB_WORKSPACE - } - }); - - name: Interpolate variables and render templates - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_CONCLUSION: ${{ github.event.workflow_run.conclusion }} - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_EVENT: ${{ github.event.workflow_run.event }} - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_HEAD_SHA: ${{ github.event.workflow_run.head_sha }} - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_HTML_URL: ${{ github.event.workflow_run.html_url }} - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_ID: ${{ github.event.workflow_run.id }} - GH_AW_GITHUB_EVENT_WORKFLOW_RUN_RUN_NUMBER: ${{ github.event.workflow_run.run_number }} - GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/interpolate_prompt.cjs'); - await main(); - - name: Validate prompt placeholders - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - run: bash /opt/gh-aw/actions/validate_prompt_placeholders.sh - - name: Print prompt - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - run: bash /opt/gh-aw/actions/print_prompt_summary.sh - - name: Clean git credentials - run: bash /opt/gh-aw/actions/clean_git_credentials.sh - - name: Execute GitHub Copilot CLI - id: agentic_execution - # Copilot CLI tool arguments (sorted): - timeout-minutes: 10 - run: | - set -o pipefail - sudo -E awf --env-all --container-workdir "${GITHUB_WORKSPACE}" --allow-domains api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --enable-host-access --image-tag 0.18.0 --skip-pull \ - -- /bin/bash -c '/usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --add-dir "${GITHUB_WORKSPACE}" --disable-builtin-mcps --allow-all-tools --add-dir /tmp/gh-aw/cache-memory/ --allow-all-paths --share /tmp/gh-aw/sandbox/agent/logs/conversation.md --prompt "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)"${GH_AW_MODEL_AGENT_COPILOT:+ --model "$GH_AW_MODEL_AGENT_COPILOT"}' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log - env: - COPILOT_AGENT_RUNNER_TYPE: STANDALONE - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - GH_AW_MCP_CONFIG: /home/runner/.copilot/mcp-config.json - GH_AW_MODEL_AGENT_COPILOT: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || '' }} - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} - GITHUB_HEAD_REF: ${{ github.head_ref }} - GITHUB_REF_NAME: ${{ github.ref_name }} - GITHUB_STEP_SUMMARY: ${{ env.GITHUB_STEP_SUMMARY }} - GITHUB_WORKSPACE: ${{ github.workspace }} - XDG_CONFIG_HOME: /home/runner - - name: Configure Git credentials - env: - REPO_NAME: ${{ github.repository }} - SERVER_URL: ${{ github.server_url }} - run: | - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git config --global user.name "github-actions[bot]" - # Re-authenticate git with GitHub token - SERVER_URL_STRIPPED="${SERVER_URL#https://}" - git remote set-url origin "https://x-access-token:${{ github.token }}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" - echo "Git configured with standard GitHub Actions identity" - - name: Copy Copilot session state files to logs - if: always() - continue-on-error: true - run: | - # Copy Copilot session state files to logs folder for artifact collection - # This ensures they are in /tmp/gh-aw/ where secret redaction can scan them - SESSION_STATE_DIR="$HOME/.copilot/session-state" - LOGS_DIR="/tmp/gh-aw/sandbox/agent/logs" - - if [ -d "$SESSION_STATE_DIR" ]; then - echo "Copying Copilot session state files from $SESSION_STATE_DIR to $LOGS_DIR" - mkdir -p "$LOGS_DIR" - cp -v "$SESSION_STATE_DIR"/*.jsonl "$LOGS_DIR/" 2>/dev/null || true - echo "Session state files copied successfully" - else - echo "No session-state directory found at $SESSION_STATE_DIR" - fi - - name: Stop MCP Gateway - if: always() - continue-on-error: true - env: - MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} - MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} - GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} - run: | - bash /opt/gh-aw/actions/stop_mcp_gateway.sh "$GATEWAY_PID" - - name: Redact secrets in logs - if: always() - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/redact_secrets.cjs'); - await main(); - env: - GH_AW_SECRET_NAMES: 'COPILOT_GITHUB_TOKEN,GH_AW_GITHUB_MCP_SERVER_TOKEN,GH_AW_GITHUB_TOKEN,GITHUB_TOKEN' - SECRET_COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - SECRET_GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} - SECRET_GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} - SECRET_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Upload Safe Outputs - if: always() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: safe-output - path: ${{ env.GH_AW_SAFE_OUTPUTS }} - if-no-files-found: warn - - name: Ingest agent output - id: collect_output - if: always() - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} - GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com" - GITHUB_SERVER_URL: ${{ github.server_url }} - GITHUB_API_URL: ${{ github.api_url }} - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/collect_ndjson_output.cjs'); - await main(); - - name: Upload sanitized agent output - if: always() && env.GH_AW_AGENT_OUTPUT - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: agent-output - path: ${{ env.GH_AW_AGENT_OUTPUT }} - if-no-files-found: warn - - name: Upload engine output files - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: agent_outputs - path: | - /tmp/gh-aw/sandbox/agent/logs/ - /tmp/gh-aw/redacted-urls.log - if-no-files-found: ignore - - name: Parse agent logs for step summary - if: always() - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: /tmp/gh-aw/sandbox/agent/logs/ - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/parse_copilot_log.cjs'); - await main(); - - name: Parse MCP Gateway logs for step summary - if: always() - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/parse_mcp_gateway_log.cjs'); - await main(); - - name: Print firewall logs - if: always() - continue-on-error: true - env: - AWF_LOGS_DIR: /tmp/gh-aw/sandbox/firewall/logs - run: | - # Fix permissions on firewall logs so they can be uploaded as artifacts - # AWF runs with sudo, creating files owned by root - sudo chmod -R a+r /tmp/gh-aw/sandbox/firewall/logs 2>/dev/null || true - # Only run awf logs summary if awf command exists (it may not be installed if workflow failed before install step) - if command -v awf &> /dev/null; then - awf logs summary | tee -a "$GITHUB_STEP_SUMMARY" - else - echo 'AWF binary not installed, skipping firewall log summary' - fi - - name: Upload cache-memory data as artifact - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - if: always() - with: - name: cache-memory - path: /tmp/gh-aw/cache-memory - - name: Upload agent artifacts - if: always() - continue-on-error: true - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: agent-artifacts - path: | - /tmp/gh-aw/aw-prompts/prompt.txt - /tmp/gh-aw/aw_info.json - /tmp/gh-aw/mcp-logs/ - /tmp/gh-aw/sandbox/firewall/logs/ - /tmp/gh-aw/agent-stdio.log - /tmp/gh-aw/agent/ - if-no-files-found: ignore - - conclusion: - needs: - - activation - - agent - - detection - - safe_outputs - - update_cache_memory - if: (always()) && (needs.agent.result != 'skipped') - runs-on: ubuntu-slim - permissions: - contents: read - discussions: write - issues: write - pull-requests: write - outputs: - noop_message: ${{ steps.noop.outputs.noop_message }} - tools_reported: ${{ steps.missing_tool.outputs.tools_reported }} - total_count: ${{ steps.missing_tool.outputs.total_count }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Download agent output artifact - continue-on-error: true - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - with: - name: agent-output - path: /tmp/gh-aw/safeoutputs/ - - name: Setup agent output environment variable - run: | - mkdir -p /tmp/gh-aw/safeoutputs/ - find "/tmp/gh-aw/safeoutputs/" -type f -print - echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/safeoutputs/agent_output.json" >> "$GITHUB_ENV" - - name: Process No-Op Messages - id: noop - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_NOOP_MAX: 1 - GH_AW_WORKFLOW_NAME: "CI Failure Doctor" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/ci-doctor.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/ci-doctor.md" - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/noop.cjs'); - await main(); - - name: Record Missing Tool - id: missing_tool - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_WORKFLOW_NAME: "CI Failure Doctor" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/ci-doctor.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/ci-doctor.md" - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/missing_tool.cjs'); - await main(); - - name: Handle Agent Failure - id: handle_agent_failure - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_WORKFLOW_NAME: "CI Failure Doctor" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/ci-doctor.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/ci-doctor.md" - GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} - GH_AW_WORKFLOW_ID: "ci-doctor" - GH_AW_SECRET_VERIFICATION_RESULT: ${{ needs.agent.outputs.secret_verification_result }} - GH_AW_CHECKOUT_PR_SUCCESS: ${{ needs.agent.outputs.checkout_pr_success }} - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/handle_agent_failure.cjs'); - await main(); - - name: Handle No-Op Message - id: handle_noop_message - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_WORKFLOW_NAME: "CI Failure Doctor" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/ci-doctor.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/ci-doctor.md" - GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} - GH_AW_NOOP_MESSAGE: ${{ steps.noop.outputs.noop_message }} - GH_AW_NOOP_REPORT_AS_ISSUE: "true" - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/handle_noop_message.cjs'); - await main(); - - detection: - needs: agent - if: needs.agent.outputs.output_types != '' || needs.agent.outputs.has_patch == 'true' - runs-on: ubuntu-latest - permissions: {} - timeout-minutes: 10 - outputs: - success: ${{ steps.parse_results.outputs.success }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Download agent artifacts - continue-on-error: true - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - with: - name: agent-artifacts - path: /tmp/gh-aw/threat-detection/ - - name: Download agent output artifact - continue-on-error: true - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - with: - name: agent-output - path: /tmp/gh-aw/threat-detection/ - - name: Echo agent output types - env: - AGENT_OUTPUT_TYPES: ${{ needs.agent.outputs.output_types }} - run: | - echo "Agent output-types: $AGENT_OUTPUT_TYPES" - - name: Setup threat detection - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - WORKFLOW_NAME: "CI Failure Doctor" - WORKFLOW_DESCRIPTION: "This workflow is an automated CI failure investigator that triggers when monitored workflows fail.\nPerforms deep analysis of GitHub Actions workflow failures to identify root causes,\npatterns, and provide actionable remediation steps. Analyzes logs, error messages,\nand workflow configuration to help diagnose and resolve CI issues efficiently." - HAS_PATCH: ${{ needs.agent.outputs.has_patch }} - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/setup_threat_detection.cjs'); - await main(); - - name: Ensure threat-detection directory and log - run: | - mkdir -p /tmp/gh-aw/threat-detection - touch /tmp/gh-aw/threat-detection/detection.log - - name: Validate COPILOT_GITHUB_TOKEN secret - id: validate-secret - run: /opt/gh-aw/actions/validate_multi_secret.sh COPILOT_GITHUB_TOKEN 'GitHub Copilot CLI' https://github.github.com/gh-aw/reference/engines/#github-copilot-default - env: - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - - name: Install GitHub Copilot CLI - run: /opt/gh-aw/actions/install_copilot_cli.sh 0.0.410 - - name: Execute GitHub Copilot CLI - id: agentic_execution - # Copilot CLI tool arguments (sorted): - # --allow-tool shell(cat) - # --allow-tool shell(grep) - # --allow-tool shell(head) - # --allow-tool shell(jq) - # --allow-tool shell(ls) - # --allow-tool shell(tail) - # --allow-tool shell(wc) - timeout-minutes: 20 - run: | - set -o pipefail - COPILOT_CLI_INSTRUCTION="$(cat /tmp/gh-aw/aw-prompts/prompt.txt)" - mkdir -p /tmp/ - mkdir -p /tmp/gh-aw/ - mkdir -p /tmp/gh-aw/agent/ - mkdir -p /tmp/gh-aw/sandbox/agent/logs/ - copilot --add-dir /tmp/ --add-dir /tmp/gh-aw/ --add-dir /tmp/gh-aw/agent/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --allow-tool 'shell(cat)' --allow-tool 'shell(grep)' --allow-tool 'shell(head)' --allow-tool 'shell(jq)' --allow-tool 'shell(ls)' --allow-tool 'shell(tail)' --allow-tool 'shell(wc)' --share /tmp/gh-aw/sandbox/agent/logs/conversation.md --prompt "$COPILOT_CLI_INSTRUCTION"${GH_AW_MODEL_DETECTION_COPILOT:+ --model "$GH_AW_MODEL_DETECTION_COPILOT"} 2>&1 | tee /tmp/gh-aw/threat-detection/detection.log - env: - COPILOT_AGENT_RUNNER_TYPE: STANDALONE - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - GH_AW_MODEL_DETECTION_COPILOT: ${{ vars.GH_AW_MODEL_DETECTION_COPILOT || '' }} - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GITHUB_HEAD_REF: ${{ github.head_ref }} - GITHUB_REF_NAME: ${{ github.ref_name }} - GITHUB_STEP_SUMMARY: ${{ env.GITHUB_STEP_SUMMARY }} - GITHUB_WORKSPACE: ${{ github.workspace }} - XDG_CONFIG_HOME: /home/runner - - name: Parse threat detection results - id: parse_results - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/parse_threat_detection_results.cjs'); - await main(); - - name: Upload threat detection log - if: always() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: threat-detection.log - path: /tmp/gh-aw/threat-detection/detection.log - if-no-files-found: ignore - - pre_activation: - if: ${{ github.event.workflow_run.conclusion == 'failure' }} - runs-on: ubuntu-slim - outputs: - activated: ${{ steps.check_membership.outputs.is_team_member == 'true' }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Check team membership for workflow - id: check_membership - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_REQUIRED_ROLES: admin,maintainer,write - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/check_membership.cjs'); - await main(); - - safe_outputs: - needs: - - agent - - detection - if: ((!cancelled()) && (needs.agent.result != 'skipped')) && (needs.detection.outputs.success == 'true') - runs-on: ubuntu-slim - permissions: - contents: read - discussions: write - issues: write - pull-requests: write - timeout-minutes: 15 - env: - GH_AW_WORKFLOW_ID: "ci-doctor" - GH_AW_WORKFLOW_NAME: "CI Failure Doctor" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/ci-doctor.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/ci-doctor.md" - outputs: - create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} - create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} - process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} - process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Download agent output artifact - continue-on-error: true - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - with: - name: agent-output - path: /tmp/gh-aw/safeoutputs/ - - name: Setup agent output environment variable - run: | - mkdir -p /tmp/gh-aw/safeoutputs/ - find "/tmp/gh-aw/safeoutputs/" -type f -print - echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/safeoutputs/agent_output.json" >> "$GITHUB_ENV" - - name: Process Safe Outputs - id: process_safe_outputs - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"add_comment\":{\"max\":1},\"create_issue\":{\"labels\":[\"automation\",\"ci\"],\"max\":1,\"title_prefix\":\"${{ github.workflow }}\"},\"missing_data\":{},\"missing_tool\":{}}" - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/safe_output_handler_manager.cjs'); - await main(); - - update_cache_memory: - needs: - - agent - - detection - if: always() && needs.detection.outputs.success == 'true' - runs-on: ubuntu-latest - permissions: {} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Download cache-memory artifact (default) - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - continue-on-error: true - with: - name: cache-memory - path: /tmp/gh-aw/cache-memory - - name: Save cache-memory to cache (default) - uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 - with: - key: memory-${{ env.GH_AW_WORKFLOW_ID_SANITIZED }}-${{ github.run_id }} - path: /tmp/gh-aw/cache-memory - diff --git a/.github/workflows/ci-doctor.md b/.github/workflows/ci-doctor.md deleted file mode 100644 index 3bab6ad..0000000 --- a/.github/workflows/ci-doctor.md +++ /dev/null @@ -1,196 +0,0 @@ ---- -description: | - This workflow is an automated CI failure investigator that triggers when monitored workflows fail. - Performs deep analysis of GitHub Actions workflow failures to identify root causes, - patterns, and provide actionable remediation steps. Analyzes logs, error messages, - and workflow configuration to help diagnose and resolve CI issues efficiently. - -on: - workflow_run: - workflows: ["Daily Perf Improver", "Daily Test Coverage Improver"] # Monitor the CI workflow specifically - types: - - completed - branches: - - main - -# Only trigger for failures - check in the workflow body -if: ${{ github.event.workflow_run.conclusion == 'failure' }} - -permissions: read-all - -network: defaults - -safe-outputs: - create-issue: - title-prefix: "${{ github.workflow }}" - labels: [automation, ci] - add-comment: - -tools: - cache-memory: true - web-fetch: - -timeout-minutes: 10 - -source: githubnext/agentics/workflows/ci-doctor.md@eb7950f37d350af6fa09d19827c4883e72947221 ---- - -# CI Failure Doctor - -You are the CI Failure Doctor, an expert investigative agent that analyzes failed GitHub Actions workflows to identify root causes and patterns. Your goal is to conduct a deep investigation when the CI workflow fails. - -## Current Context - -- **Repository**: ${{ github.repository }} -- **Workflow Run**: ${{ github.event.workflow_run.id }} -- **Conclusion**: ${{ github.event.workflow_run.conclusion }} -- **Run URL**: ${{ github.event.workflow_run.html_url }} -- **Head SHA**: ${{ github.event.workflow_run.head_sha }} - -## Investigation Protocol - -**ONLY proceed if the workflow conclusion is 'failure' or 'cancelled'**. Exit immediately if the workflow was successful. - -### Phase 1: Initial Triage - -1. **Verify Failure**: Check that `${{ github.event.workflow_run.conclusion }}` is `failure` or `cancelled` -2. **Get Workflow Details**: Use `get_workflow_run` to get full details of the failed run -3. **List Jobs**: Use `list_workflow_jobs` to identify which specific jobs failed -4. **Quick Assessment**: Determine if this is a new type of failure or a recurring pattern - -### Phase 2: Deep Log Analysis - -1. **Retrieve Logs**: Use `get_job_logs` with `failed_only=true` to get logs from all failed jobs -2. **Pattern Recognition**: Analyze logs for: - - Error messages and stack traces - - Dependency installation failures - - Test failures with specific patterns - - Infrastructure or runner issues - - Timeout patterns - - Memory or resource constraints -3. **Extract Key Information**: - - Primary error messages - - File paths and line numbers where failures occurred - - Test names that failed - - Dependency versions involved - - Timing patterns - -### Phase 3: Historical Context Analysis - -1. **Search Investigation History**: Use file-based storage to search for similar failures: - - Read from cached investigation files in `/tmp/memory/investigations/` - - Parse previous failure patterns and solutions - - Look for recurring error signatures -2. **Issue History**: Search existing issues for related problems -3. **Commit Analysis**: Examine the commit that triggered the failure -4. **PR Context**: If triggered by a PR, analyze the changed files - -### Phase 4: Root Cause Investigation - -1. **Categorize Failure Type**: - - **Code Issues**: Syntax errors, logic bugs, test failures - - **Infrastructure**: Runner issues, network problems, resource constraints - - **Dependencies**: Version conflicts, missing packages, outdated libraries - - **Configuration**: Workflow configuration, environment variables - - **Flaky Tests**: Intermittent failures, timing issues - - **External Services**: Third-party API failures, downstream dependencies - -2. **Deep Dive Analysis**: - - For test failures: Identify specific test methods and assertions - - For build failures: Analyze compilation errors and missing dependencies - - For infrastructure issues: Check runner logs and resource usage - - For timeout issues: Identify slow operations and bottlenecks - -### Phase 5: Pattern Storage and Knowledge Building - -1. **Store Investigation**: Save structured investigation data to files: - - Write investigation report to `/tmp/memory/investigations/-.json` - - Store error patterns in `/tmp/memory/patterns/` - - Maintain an index file of all investigations for fast searching -2. **Update Pattern Database**: Enhance knowledge with new findings by updating pattern files -3. **Save Artifacts**: Store detailed logs and analysis in the cached directories - -### Phase 6: Looking for existing issues - -1. **Convert the report to a search query** - - Use any advanced search features in GitHub Issues to find related issues - - Look for keywords, error messages, and patterns in existing issues -2. **Judge each match issues for relevance** - - Analyze the content of the issues found by the search and judge if they are similar to this issue. -3. **Add issue comment to duplicate issue and finish** - - If you find a duplicate issue, add a comment with your findings and close the investigation. - - Do NOT open a new issue since you found a duplicate already (skip next phases). - -### Phase 6: Reporting and Recommendations - -1. **Create Investigation Report**: Generate a comprehensive analysis including: - - **Executive Summary**: Quick overview of the failure - - **Root Cause**: Detailed explanation of what went wrong - - **Reproduction Steps**: How to reproduce the issue locally - - **Recommended Actions**: Specific steps to fix the issue - - **Prevention Strategies**: How to avoid similar failures - - **AI Team Self-Improvement**: Give a short set of additional prompting instructions to copy-and-paste into instructions.md for AI coding agents to help prevent this type of failure in future - - **Historical Context**: Similar past failures and their resolutions - -2. **Actionable Deliverables**: - - Create an issue with investigation results (if warranted) - - Comment on related PR with analysis (if PR-triggered) - - Provide specific file locations and line numbers for fixes - - Suggest code changes or configuration updates - -## Output Requirements - -### Investigation Issue Template - -When creating an investigation issue, use this structure: - -```markdown -# 🏥 CI Failure Investigation - Run #${{ github.event.workflow_run.run_number }} - -## Summary -[Brief description of the failure] - -## Failure Details -- **Run**: [${{ github.event.workflow_run.id }}](${{ github.event.workflow_run.html_url }}) -- **Commit**: ${{ github.event.workflow_run.head_sha }} -- **Trigger**: ${{ github.event.workflow_run.event }} - -## Root Cause Analysis -[Detailed analysis of what went wrong] - -## Failed Jobs and Errors -[List of failed jobs with key error messages] - -## Investigation Findings -[Deep analysis results] - -## Recommended Actions -- [ ] [Specific actionable steps] - -## Prevention Strategies -[How to prevent similar failures] - -## AI Team Self-Improvement -[Short set of additional prompting instructions to copy-and-paste into instructions.md for a AI coding agents to help prevent this type of failure in future] - -## Historical Context -[Similar past failures and patterns] -``` - -## Important Guidelines - -- **Be Thorough**: Don't just report the error - investigate the underlying cause -- **Use Memory**: Always check for similar past failures and learn from them -- **Be Specific**: Provide exact file paths, line numbers, and error messages -- **Action-Oriented**: Focus on actionable recommendations, not just analysis -- **Pattern Building**: Contribute to the knowledge base for future investigations -- **Resource Efficient**: Use caching to avoid re-downloading large logs -- **Security Conscious**: Never execute untrusted code from logs or external sources - -## Cache Usage Strategy - -- Store investigation database and knowledge patterns in `/tmp/memory/investigations/` and `/tmp/memory/patterns/` -- Cache detailed log analysis and artifacts in `/tmp/investigation/logs/` and `/tmp/investigation/reports/` -- Persist findings across workflow runs using GitHub Actions cache -- Build cumulative knowledge about failure patterns and solutions using structured JSON files -- Use file-based indexing for fast pattern matching and similarity detection diff --git a/.github/workflows/issue-triage.lock.yml b/.github/workflows/issue-triage.lock.yml deleted file mode 100644 index ff84d16..0000000 --- a/.github/workflows/issue-triage.lock.yml +++ /dev/null @@ -1,1062 +0,0 @@ -# -# ___ _ _ -# / _ \ | | (_) -# | |_| | __ _ ___ _ __ | |_ _ ___ -# | _ |/ _` |/ _ \ '_ \| __| |/ __| -# | | | | (_| | __/ | | | |_| | (__ -# \_| |_/\__, |\___|_| |_|\__|_|\___| -# __/ | -# _ _ |___/ -# | | | | / _| | -# | | | | ___ _ __ _ __| |_| | _____ ____ -# | |/\| |/ _ \ '__| |/ /| _| |/ _ \ \ /\ / / ___| -# \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ -# \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ -# -# This file was automatically generated by gh-aw (v0.45.0). DO NOT EDIT. -# -# To update this file, edit githubnext/agentics/workflows/issue-triage.md@eb7950f37d350af6fa09d19827c4883e72947221 and run: -# gh aw compile -# Not all edits will cause changes to this file. -# -# For more information: https://github.github.com/gh-aw/introduction/overview/ -# -# Intelligent issue triage assistant that processes new and reopened issues. -# Analyzes issue content, selects appropriate labels, detects spam, gathers context -# from similar issues, and provides analysis notes including debugging strategies, -# reproduction steps, and resource links. Helps maintainers quickly understand and -# prioritize incoming issues. -# -# Source: githubnext/agentics/workflows/issue-triage.md@eb7950f37d350af6fa09d19827c4883e72947221 -# -# frontmatter-hash: 9a6e7204ade267f685c491ee9911cd7527e7ed2736a51a1fbb104d897af68384 - -name: "Agentic Triage" -"on": - issues: - types: - - opened - - reopened - -permissions: {} - -concurrency: - group: "gh-aw-${{ github.workflow }}-${{ github.event.issue.number }}" - -run-name: "Agentic Triage" - -jobs: - activation: - needs: pre_activation - if: needs.pre_activation.outputs.activated == 'true' - runs-on: ubuntu-slim - permissions: - contents: read - discussions: write - issues: write - pull-requests: write - outputs: - comment_id: "" - comment_repo: "" - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Check workflow file timestamps - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_WORKFLOW_FILE: "issue-triage.lock.yml" - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/check_workflow_timestamp_api.cjs'); - await main(); - - agent: - needs: activation - runs-on: ubuntu-latest - permissions: read-all - env: - DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} - GH_AW_ASSETS_ALLOWED_EXTS: "" - GH_AW_ASSETS_BRANCH: "" - GH_AW_ASSETS_MAX_SIZE_KB: 0 - GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs - GH_AW_SAFE_OUTPUTS: /opt/gh-aw/safeoutputs/outputs.jsonl - GH_AW_SAFE_OUTPUTS_CONFIG_PATH: /opt/gh-aw/safeoutputs/config.json - GH_AW_SAFE_OUTPUTS_TOOLS_PATH: /opt/gh-aw/safeoutputs/tools.json - GH_AW_WORKFLOW_ID_SANITIZED: issuetriage - outputs: - checkout_pr_success: ${{ steps.checkout-pr.outputs.checkout_pr_success || 'true' }} - has_patch: ${{ steps.collect_output.outputs.has_patch }} - model: ${{ steps.generate_aw_info.outputs.model }} - output: ${{ steps.collect_output.outputs.output }} - output_types: ${{ steps.collect_output.outputs.output_types }} - secret_verification_result: ${{ steps.validate-secret.outputs.verification_result }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Checkout repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Create gh-aw temp directory - run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh - - name: Configure Git credentials - env: - REPO_NAME: ${{ github.repository }} - SERVER_URL: ${{ github.server_url }} - run: | - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git config --global user.name "github-actions[bot]" - # Re-authenticate git with GitHub token - SERVER_URL_STRIPPED="${SERVER_URL#https://}" - git remote set-url origin "https://x-access-token:${{ github.token }}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" - echo "Git configured with standard GitHub Actions identity" - - name: Checkout PR branch - id: checkout-pr - if: | - github.event.pull_request - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - with: - github-token: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/checkout_pr_branch.cjs'); - await main(); - - name: Generate agentic run info - id: generate_aw_info - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const fs = require('fs'); - - const awInfo = { - engine_id: "copilot", - engine_name: "GitHub Copilot CLI", - model: process.env.GH_AW_MODEL_AGENT_COPILOT || "", - version: "", - agent_version: "0.0.410", - cli_version: "v0.45.0", - workflow_name: "Agentic Triage", - experimental: false, - supports_tools_allowlist: true, - supports_http_transport: true, - run_id: context.runId, - run_number: context.runNumber, - run_attempt: process.env.GITHUB_RUN_ATTEMPT, - repository: context.repo.owner + '/' + context.repo.repo, - ref: context.ref, - sha: context.sha, - actor: context.actor, - event_name: context.eventName, - staged: false, - allowed_domains: ["defaults"], - firewall_enabled: true, - awf_version: "v0.18.0", - awmg_version: "v0.1.4", - steps: { - firewall: "squid" - }, - created_at: new Date().toISOString() - }; - - // Write to /tmp/gh-aw directory to avoid inclusion in PR - const tmpPath = '/tmp/gh-aw/aw_info.json'; - fs.writeFileSync(tmpPath, JSON.stringify(awInfo, null, 2)); - console.log('Generated aw_info.json at:', tmpPath); - console.log(JSON.stringify(awInfo, null, 2)); - - // Set model as output for reuse in other steps/jobs - core.setOutput('model', awInfo.model); - - name: Validate COPILOT_GITHUB_TOKEN secret - id: validate-secret - run: /opt/gh-aw/actions/validate_multi_secret.sh COPILOT_GITHUB_TOKEN 'GitHub Copilot CLI' https://github.github.com/gh-aw/reference/engines/#github-copilot-default - env: - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - - name: Install GitHub Copilot CLI - run: /opt/gh-aw/actions/install_copilot_cli.sh 0.0.410 - - name: Install awf binary - run: bash /opt/gh-aw/actions/install_awf_binary.sh v0.18.0 - - name: Download container images - run: bash /opt/gh-aw/actions/download_docker_images.sh ghcr.io/github/gh-aw-firewall/agent:0.18.0 ghcr.io/github/gh-aw-firewall/squid:0.18.0 ghcr.io/github/gh-aw-mcpg:v0.1.4 ghcr.io/github/github-mcp-server:v0.30.3 node:lts-alpine - - name: Write Safe Outputs Config - run: | - mkdir -p /opt/gh-aw/safeoutputs - mkdir -p /tmp/gh-aw/safeoutputs - mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs - cat > /opt/gh-aw/safeoutputs/config.json << 'GH_AW_SAFE_OUTPUTS_CONFIG_EOF' - {"add_comment":{"max":1},"add_labels":{"max":5},"missing_data":{},"missing_tool":{},"noop":{"max":1}} - GH_AW_SAFE_OUTPUTS_CONFIG_EOF - cat > /opt/gh-aw/safeoutputs/tools.json << 'GH_AW_SAFE_OUTPUTS_TOOLS_EOF' - [ - { - "description": "Add a comment to an existing GitHub issue, pull request, or discussion. Use this to provide feedback, answer questions, or add information to an existing conversation. For creating new items, use create_issue, create_discussion, or create_pull_request instead. IMPORTANT: Comments are subject to validation constraints enforced by the MCP server - maximum 65536 characters for the complete comment (including footer which is added automatically), 10 mentions (@username), and 50 links. Exceeding these limits will result in an immediate error with specific guidance. CONSTRAINTS: Maximum 1 comment(s) can be added.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "body": { - "description": "The comment text in Markdown format. This is the 'body' field - do not use 'comment_body' or other variations. Provide helpful, relevant information that adds value to the conversation. CONSTRAINTS: The complete comment (your body text + automatically added footer) must not exceed 65536 characters total. Maximum 10 mentions (@username), maximum 50 links (http/https URLs). A footer (~200-500 characters) is automatically appended with workflow attribution, so leave adequate space. If these limits are exceeded, the tool call will fail with a detailed error message indicating which constraint was violated.", - "type": "string" - }, - "item_number": { - "description": "The issue, pull request, or discussion number to comment on. This is the numeric ID from the GitHub URL (e.g., 123 in github.com/owner/repo/issues/123). If omitted, the tool will attempt to resolve the target from the current workflow context (triggering issue, PR, or discussion).", - "type": "number" - } - }, - "required": [ - "body" - ], - "type": "object" - }, - "name": "add_comment" - }, - { - "description": "Add labels to an existing GitHub issue or pull request for categorization and filtering. Labels must already exist in the repository. For creating new issues with labels, use create_issue with the labels property instead. CONSTRAINTS: Maximum 5 label(s) can be added.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "item_number": { - "description": "Issue or PR number to add labels to. This is the numeric ID from the GitHub URL (e.g., 456 in github.com/owner/repo/issues/456). If omitted, adds labels to the item that triggered this workflow.", - "type": "number" - }, - "labels": { - "description": "Label names to add (e.g., ['bug', 'priority-high']). Labels must exist in the repository.", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - "name": "add_labels" - }, - { - "description": "Report that a tool or capability needed to complete the task is not available, or share any information you deem important about missing functionality or limitations. Use this when you cannot accomplish what was requested because the required functionality is missing or access is restricted.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "alternatives": { - "description": "Any workarounds, manual steps, or alternative approaches the user could take (max 256 characters).", - "type": "string" - }, - "reason": { - "description": "Explanation of why this tool is needed or what information you want to share about the limitation (max 256 characters).", - "type": "string" - }, - "tool": { - "description": "Optional: Name or description of the missing tool or capability (max 128 characters). Be specific about what functionality is needed.", - "type": "string" - } - }, - "required": [ - "reason" - ], - "type": "object" - }, - "name": "missing_tool" - }, - { - "description": "Log a transparency message when no significant actions are needed. Use this to confirm workflow completion and provide visibility when analysis is complete but no changes or outputs are required (e.g., 'No issues found', 'All checks passed'). This ensures the workflow produces human-visible output even when no other actions are taken.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "message": { - "description": "Status or completion message to log. Should explain what was analyzed and the outcome (e.g., 'Code review complete - no issues found', 'Analysis complete - all tests passing').", - "type": "string" - } - }, - "required": [ - "message" - ], - "type": "object" - }, - "name": "noop" - }, - { - "description": "Report that data or information needed to complete the task is not available. Use this when you cannot accomplish what was requested because required data, context, or information is missing.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "alternatives": { - "description": "Any workarounds, manual steps, or alternative approaches the user could take (max 256 characters).", - "type": "string" - }, - "context": { - "description": "Additional context about the missing data or where it should come from (max 256 characters).", - "type": "string" - }, - "data_type": { - "description": "Type or description of the missing data or information (max 128 characters). Be specific about what data is needed.", - "type": "string" - }, - "reason": { - "description": "Explanation of why this data is needed to complete the task (max 256 characters).", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "name": "missing_data" - } - ] - GH_AW_SAFE_OUTPUTS_TOOLS_EOF - cat > /opt/gh-aw/safeoutputs/validation.json << 'GH_AW_SAFE_OUTPUTS_VALIDATION_EOF' - { - "add_comment": { - "defaultMax": 1, - "fields": { - "body": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 65000 - }, - "item_number": { - "issueOrPRNumber": true - } - } - }, - "add_labels": { - "defaultMax": 5, - "fields": { - "item_number": { - "issueOrPRNumber": true - }, - "labels": { - "required": true, - "type": "array", - "itemType": "string", - "itemSanitize": true, - "itemMaxLength": 128 - } - } - }, - "missing_tool": { - "defaultMax": 20, - "fields": { - "alternatives": { - "type": "string", - "sanitize": true, - "maxLength": 512 - }, - "reason": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 256 - }, - "tool": { - "type": "string", - "sanitize": true, - "maxLength": 128 - } - } - }, - "noop": { - "defaultMax": 1, - "fields": { - "message": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 65000 - } - } - } - } - GH_AW_SAFE_OUTPUTS_VALIDATION_EOF - - name: Generate Safe Outputs MCP Server Config - id: safe-outputs-config - run: | - # Generate a secure random API key (360 bits of entropy, 40+ chars) - # Mask immediately to prevent timing vulnerabilities - API_KEY=$(openssl rand -base64 45 | tr -d '/+=') - echo "::add-mask::${API_KEY}" - - PORT=3001 - - # Set outputs for next steps - { - echo "safe_outputs_api_key=${API_KEY}" - echo "safe_outputs_port=${PORT}" - } >> "$GITHUB_OUTPUT" - - echo "Safe Outputs MCP server will run on port ${PORT}" - - - name: Start Safe Outputs MCP HTTP Server - id: safe-outputs-start - env: - DEBUG: '*' - GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-config.outputs.safe_outputs_port }} - GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-config.outputs.safe_outputs_api_key }} - GH_AW_SAFE_OUTPUTS_TOOLS_PATH: /opt/gh-aw/safeoutputs/tools.json - GH_AW_SAFE_OUTPUTS_CONFIG_PATH: /opt/gh-aw/safeoutputs/config.json - GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs - run: | - # Environment variables are set above to prevent template injection - export DEBUG - export GH_AW_SAFE_OUTPUTS_PORT - export GH_AW_SAFE_OUTPUTS_API_KEY - export GH_AW_SAFE_OUTPUTS_TOOLS_PATH - export GH_AW_SAFE_OUTPUTS_CONFIG_PATH - export GH_AW_MCP_LOG_DIR - - bash /opt/gh-aw/actions/start_safe_outputs_server.sh - - - name: Start MCP Gateway - id: start-mcp-gateway - env: - GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} - GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-start.outputs.api_key }} - GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-start.outputs.port }} - GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - run: | - set -eo pipefail - mkdir -p /tmp/gh-aw/mcp-config - - # Export gateway environment variables for MCP config and gateway script - export MCP_GATEWAY_PORT="80" - export MCP_GATEWAY_DOMAIN="host.docker.internal" - MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') - echo "::add-mask::${MCP_GATEWAY_API_KEY}" - export MCP_GATEWAY_API_KEY - export MCP_GATEWAY_PAYLOAD_DIR="/tmp/gh-aw/mcp-payloads" - mkdir -p "${MCP_GATEWAY_PAYLOAD_DIR}" - export DEBUG="*" - - export GH_AW_ENGINE="copilot" - export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_LOCKDOWN -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.1.4' - - mkdir -p /home/runner/.copilot - cat << GH_AW_MCP_CONFIG_EOF | bash /opt/gh-aw/actions/start_mcp_gateway.sh - { - "mcpServers": { - "github": { - "type": "stdio", - "container": "ghcr.io/github/github-mcp-server:v0.30.3", - "env": { - "GITHUB_PERSONAL_ACCESS_TOKEN": "\${GITHUB_MCP_SERVER_TOKEN}", - "GITHUB_READ_ONLY": "1", - "GITHUB_TOOLSETS": "issues" - } - }, - "safeoutputs": { - "type": "http", - "url": "http://host.docker.internal:$GH_AW_SAFE_OUTPUTS_PORT", - "headers": { - "Authorization": "\${GH_AW_SAFE_OUTPUTS_API_KEY}" - } - } - }, - "gateway": { - "port": $MCP_GATEWAY_PORT, - "domain": "${MCP_GATEWAY_DOMAIN}", - "apiKey": "${MCP_GATEWAY_API_KEY}", - "payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}" - } - } - GH_AW_MCP_CONFIG_EOF - - name: Generate workflow overview - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const { generateWorkflowOverview } = require('/opt/gh-aw/actions/generate_workflow_overview.cjs'); - await generateWorkflowOverview(core); - - name: Create prompt with built-in context - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} - GH_AW_GITHUB_ACTOR: ${{ github.actor }} - GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} - GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} - GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} - GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} - GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} - run: | - bash /opt/gh-aw/actions/create_prompt_first.sh - cat << 'GH_AW_PROMPT_EOF' > "$GH_AW_PROMPT" - - GH_AW_PROMPT_EOF - cat "/opt/gh-aw/prompts/xpia.md" >> "$GH_AW_PROMPT" - cat "/opt/gh-aw/prompts/temp_folder_prompt.md" >> "$GH_AW_PROMPT" - cat "/opt/gh-aw/prompts/markdown.md" >> "$GH_AW_PROMPT" - cat << 'GH_AW_PROMPT_EOF' >> "$GH_AW_PROMPT" - - GitHub API Access Instructions - - The gh CLI is NOT authenticated. Do NOT use gh commands for GitHub operations. - - - To create or modify GitHub resources (issues, discussions, pull requests, etc.), you MUST call the appropriate safe output tool. Simply writing content will NOT work - the workflow requires actual tool calls. - - Temporary IDs: Some safe output tools support a temporary ID field (usually named temporary_id) so you can reference newly-created items elsewhere in the SAME agent output (for example, using #aw_abc1 in a later body). - - **IMPORTANT - temporary_id format rules:** - - If you DON'T need to reference the item later, OMIT the temporary_id field entirely (it will be auto-generated if needed) - - If you DO need cross-references/chaining, you MUST match this EXACT validation regex: /^aw_[A-Za-z0-9]{3,8}$/i - - Format: aw_ prefix followed by 3 to 8 alphanumeric characters (A-Z, a-z, 0-9, case-insensitive) - - Valid alphanumeric characters: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 - - INVALID examples: aw_ab (too short), aw_123456789 (too long), aw_test-id (contains hyphen), aw_id_123 (contains underscore) - - VALID examples: aw_abc, aw_abc1, aw_Test123, aw_A1B2C3D4, aw_12345678 - - To generate valid IDs: use 3-8 random alphanumeric characters or omit the field to let the system auto-generate - - Do NOT invent other aw_* formats — downstream steps will reject them with validation errors matching against /^aw_[A-Za-z0-9]{3,8}$/i. - - Discover available tools from the safeoutputs MCP server. - - **Critical**: Tool calls write structured data that downstream jobs process. Without tool calls, follow-up actions will be skipped. - - **Note**: If you made no other safe output tool calls during this workflow execution, call the "noop" tool to provide a status message indicating completion or that no actions were needed. - - - - The following GitHub context information is available for this workflow: - {{#if __GH_AW_GITHUB_ACTOR__ }} - - **actor**: __GH_AW_GITHUB_ACTOR__ - {{/if}} - {{#if __GH_AW_GITHUB_REPOSITORY__ }} - - **repository**: __GH_AW_GITHUB_REPOSITORY__ - {{/if}} - {{#if __GH_AW_GITHUB_WORKSPACE__ }} - - **workspace**: __GH_AW_GITHUB_WORKSPACE__ - {{/if}} - {{#if __GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ }} - - **issue-number**: #__GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ - {{/if}} - {{#if __GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ }} - - **discussion-number**: #__GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ - {{/if}} - {{#if __GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ }} - - **pull-request-number**: #__GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ - {{/if}} - {{#if __GH_AW_GITHUB_EVENT_COMMENT_ID__ }} - - **comment-id**: __GH_AW_GITHUB_EVENT_COMMENT_ID__ - {{/if}} - {{#if __GH_AW_GITHUB_RUN_ID__ }} - - **workflow-run-id**: __GH_AW_GITHUB_RUN_ID__ - {{/if}} - - - GH_AW_PROMPT_EOF - cat << 'GH_AW_PROMPT_EOF' >> "$GH_AW_PROMPT" - - GH_AW_PROMPT_EOF - cat << 'GH_AW_PROMPT_EOF' >> "$GH_AW_PROMPT" - {{#runtime-import .github/workflows/issue-triage.md}} - GH_AW_PROMPT_EOF - - name: Substitute placeholders - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_GITHUB_ACTOR: ${{ github.actor }} - GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} - GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} - GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} - GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} - GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} - with: - script: | - const substitutePlaceholders = require('/opt/gh-aw/actions/substitute_placeholders.cjs'); - - // Call the substitution function - return await substitutePlaceholders({ - file: process.env.GH_AW_PROMPT, - substitutions: { - GH_AW_GITHUB_ACTOR: process.env.GH_AW_GITHUB_ACTOR, - GH_AW_GITHUB_EVENT_COMMENT_ID: process.env.GH_AW_GITHUB_EVENT_COMMENT_ID, - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: process.env.GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER, - GH_AW_GITHUB_EVENT_ISSUE_NUMBER: process.env.GH_AW_GITHUB_EVENT_ISSUE_NUMBER, - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: process.env.GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER, - GH_AW_GITHUB_REPOSITORY: process.env.GH_AW_GITHUB_REPOSITORY, - GH_AW_GITHUB_RUN_ID: process.env.GH_AW_GITHUB_RUN_ID, - GH_AW_GITHUB_WORKSPACE: process.env.GH_AW_GITHUB_WORKSPACE - } - }); - - name: Interpolate variables and render templates - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/interpolate_prompt.cjs'); - await main(); - - name: Validate prompt placeholders - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - run: bash /opt/gh-aw/actions/validate_prompt_placeholders.sh - - name: Print prompt - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - run: bash /opt/gh-aw/actions/print_prompt_summary.sh - - name: Clean git credentials - run: bash /opt/gh-aw/actions/clean_git_credentials.sh - - name: Execute GitHub Copilot CLI - id: agentic_execution - # Copilot CLI tool arguments (sorted): - timeout-minutes: 10 - run: | - set -o pipefail - sudo -E awf --env-all --container-workdir "${GITHUB_WORKSPACE}" --allow-domains api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --enable-host-access --image-tag 0.18.0 --skip-pull \ - -- /bin/bash -c '/usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --add-dir "${GITHUB_WORKSPACE}" --disable-builtin-mcps --allow-all-tools --allow-all-paths --share /tmp/gh-aw/sandbox/agent/logs/conversation.md --prompt "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)"${GH_AW_MODEL_AGENT_COPILOT:+ --model "$GH_AW_MODEL_AGENT_COPILOT"}' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log - env: - COPILOT_AGENT_RUNNER_TYPE: STANDALONE - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - GH_AW_MCP_CONFIG: /home/runner/.copilot/mcp-config.json - GH_AW_MODEL_AGENT_COPILOT: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || '' }} - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} - GITHUB_HEAD_REF: ${{ github.head_ref }} - GITHUB_REF_NAME: ${{ github.ref_name }} - GITHUB_STEP_SUMMARY: ${{ env.GITHUB_STEP_SUMMARY }} - GITHUB_WORKSPACE: ${{ github.workspace }} - XDG_CONFIG_HOME: /home/runner - - name: Configure Git credentials - env: - REPO_NAME: ${{ github.repository }} - SERVER_URL: ${{ github.server_url }} - run: | - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git config --global user.name "github-actions[bot]" - # Re-authenticate git with GitHub token - SERVER_URL_STRIPPED="${SERVER_URL#https://}" - git remote set-url origin "https://x-access-token:${{ github.token }}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" - echo "Git configured with standard GitHub Actions identity" - - name: Copy Copilot session state files to logs - if: always() - continue-on-error: true - run: | - # Copy Copilot session state files to logs folder for artifact collection - # This ensures they are in /tmp/gh-aw/ where secret redaction can scan them - SESSION_STATE_DIR="$HOME/.copilot/session-state" - LOGS_DIR="/tmp/gh-aw/sandbox/agent/logs" - - if [ -d "$SESSION_STATE_DIR" ]; then - echo "Copying Copilot session state files from $SESSION_STATE_DIR to $LOGS_DIR" - mkdir -p "$LOGS_DIR" - cp -v "$SESSION_STATE_DIR"/*.jsonl "$LOGS_DIR/" 2>/dev/null || true - echo "Session state files copied successfully" - else - echo "No session-state directory found at $SESSION_STATE_DIR" - fi - - name: Stop MCP Gateway - if: always() - continue-on-error: true - env: - MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} - MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} - GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} - run: | - bash /opt/gh-aw/actions/stop_mcp_gateway.sh "$GATEWAY_PID" - - name: Redact secrets in logs - if: always() - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/redact_secrets.cjs'); - await main(); - env: - GH_AW_SECRET_NAMES: 'COPILOT_GITHUB_TOKEN,GH_AW_GITHUB_MCP_SERVER_TOKEN,GH_AW_GITHUB_TOKEN,GITHUB_TOKEN' - SECRET_COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - SECRET_GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} - SECRET_GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} - SECRET_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Upload Safe Outputs - if: always() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: safe-output - path: ${{ env.GH_AW_SAFE_OUTPUTS }} - if-no-files-found: warn - - name: Ingest agent output - id: collect_output - if: always() - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} - GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com" - GITHUB_SERVER_URL: ${{ github.server_url }} - GITHUB_API_URL: ${{ github.api_url }} - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/collect_ndjson_output.cjs'); - await main(); - - name: Upload sanitized agent output - if: always() && env.GH_AW_AGENT_OUTPUT - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: agent-output - path: ${{ env.GH_AW_AGENT_OUTPUT }} - if-no-files-found: warn - - name: Upload engine output files - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: agent_outputs - path: | - /tmp/gh-aw/sandbox/agent/logs/ - /tmp/gh-aw/redacted-urls.log - if-no-files-found: ignore - - name: Parse agent logs for step summary - if: always() - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: /tmp/gh-aw/sandbox/agent/logs/ - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/parse_copilot_log.cjs'); - await main(); - - name: Parse MCP Gateway logs for step summary - if: always() - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/parse_mcp_gateway_log.cjs'); - await main(); - - name: Print firewall logs - if: always() - continue-on-error: true - env: - AWF_LOGS_DIR: /tmp/gh-aw/sandbox/firewall/logs - run: | - # Fix permissions on firewall logs so they can be uploaded as artifacts - # AWF runs with sudo, creating files owned by root - sudo chmod -R a+r /tmp/gh-aw/sandbox/firewall/logs 2>/dev/null || true - # Only run awf logs summary if awf command exists (it may not be installed if workflow failed before install step) - if command -v awf &> /dev/null; then - awf logs summary | tee -a "$GITHUB_STEP_SUMMARY" - else - echo 'AWF binary not installed, skipping firewall log summary' - fi - - name: Upload agent artifacts - if: always() - continue-on-error: true - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: agent-artifacts - path: | - /tmp/gh-aw/aw-prompts/prompt.txt - /tmp/gh-aw/aw_info.json - /tmp/gh-aw/mcp-logs/ - /tmp/gh-aw/sandbox/firewall/logs/ - /tmp/gh-aw/agent-stdio.log - /tmp/gh-aw/agent/ - if-no-files-found: ignore - - conclusion: - needs: - - activation - - agent - - detection - - safe_outputs - if: (always()) && (needs.agent.result != 'skipped') - runs-on: ubuntu-slim - permissions: - contents: read - discussions: write - issues: write - pull-requests: write - outputs: - noop_message: ${{ steps.noop.outputs.noop_message }} - tools_reported: ${{ steps.missing_tool.outputs.tools_reported }} - total_count: ${{ steps.missing_tool.outputs.total_count }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Download agent output artifact - continue-on-error: true - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - with: - name: agent-output - path: /tmp/gh-aw/safeoutputs/ - - name: Setup agent output environment variable - run: | - mkdir -p /tmp/gh-aw/safeoutputs/ - find "/tmp/gh-aw/safeoutputs/" -type f -print - echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/safeoutputs/agent_output.json" >> "$GITHUB_ENV" - - name: Process No-Op Messages - id: noop - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_NOOP_MAX: 1 - GH_AW_WORKFLOW_NAME: "Agentic Triage" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/issue-triage.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/issue-triage.md" - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/noop.cjs'); - await main(); - - name: Record Missing Tool - id: missing_tool - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_WORKFLOW_NAME: "Agentic Triage" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/issue-triage.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/issue-triage.md" - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/missing_tool.cjs'); - await main(); - - name: Handle Agent Failure - id: handle_agent_failure - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_WORKFLOW_NAME: "Agentic Triage" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/issue-triage.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/issue-triage.md" - GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} - GH_AW_WORKFLOW_ID: "issue-triage" - GH_AW_SECRET_VERIFICATION_RESULT: ${{ needs.agent.outputs.secret_verification_result }} - GH_AW_CHECKOUT_PR_SUCCESS: ${{ needs.agent.outputs.checkout_pr_success }} - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/handle_agent_failure.cjs'); - await main(); - - name: Handle No-Op Message - id: handle_noop_message - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_WORKFLOW_NAME: "Agentic Triage" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/issue-triage.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/issue-triage.md" - GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} - GH_AW_NOOP_MESSAGE: ${{ steps.noop.outputs.noop_message }} - GH_AW_NOOP_REPORT_AS_ISSUE: "true" - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/handle_noop_message.cjs'); - await main(); - - detection: - needs: agent - if: needs.agent.outputs.output_types != '' || needs.agent.outputs.has_patch == 'true' - runs-on: ubuntu-latest - permissions: {} - timeout-minutes: 10 - outputs: - success: ${{ steps.parse_results.outputs.success }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Download agent artifacts - continue-on-error: true - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - with: - name: agent-artifacts - path: /tmp/gh-aw/threat-detection/ - - name: Download agent output artifact - continue-on-error: true - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - with: - name: agent-output - path: /tmp/gh-aw/threat-detection/ - - name: Echo agent output types - env: - AGENT_OUTPUT_TYPES: ${{ needs.agent.outputs.output_types }} - run: | - echo "Agent output-types: $AGENT_OUTPUT_TYPES" - - name: Setup threat detection - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - WORKFLOW_NAME: "Agentic Triage" - WORKFLOW_DESCRIPTION: "Intelligent issue triage assistant that processes new and reopened issues.\nAnalyzes issue content, selects appropriate labels, detects spam, gathers context\nfrom similar issues, and provides analysis notes including debugging strategies,\nreproduction steps, and resource links. Helps maintainers quickly understand and\nprioritize incoming issues." - HAS_PATCH: ${{ needs.agent.outputs.has_patch }} - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/setup_threat_detection.cjs'); - await main(); - - name: Ensure threat-detection directory and log - run: | - mkdir -p /tmp/gh-aw/threat-detection - touch /tmp/gh-aw/threat-detection/detection.log - - name: Validate COPILOT_GITHUB_TOKEN secret - id: validate-secret - run: /opt/gh-aw/actions/validate_multi_secret.sh COPILOT_GITHUB_TOKEN 'GitHub Copilot CLI' https://github.github.com/gh-aw/reference/engines/#github-copilot-default - env: - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - - name: Install GitHub Copilot CLI - run: /opt/gh-aw/actions/install_copilot_cli.sh 0.0.410 - - name: Execute GitHub Copilot CLI - id: agentic_execution - # Copilot CLI tool arguments (sorted): - # --allow-tool shell(cat) - # --allow-tool shell(grep) - # --allow-tool shell(head) - # --allow-tool shell(jq) - # --allow-tool shell(ls) - # --allow-tool shell(tail) - # --allow-tool shell(wc) - timeout-minutes: 20 - run: | - set -o pipefail - COPILOT_CLI_INSTRUCTION="$(cat /tmp/gh-aw/aw-prompts/prompt.txt)" - mkdir -p /tmp/ - mkdir -p /tmp/gh-aw/ - mkdir -p /tmp/gh-aw/agent/ - mkdir -p /tmp/gh-aw/sandbox/agent/logs/ - copilot --add-dir /tmp/ --add-dir /tmp/gh-aw/ --add-dir /tmp/gh-aw/agent/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --allow-tool 'shell(cat)' --allow-tool 'shell(grep)' --allow-tool 'shell(head)' --allow-tool 'shell(jq)' --allow-tool 'shell(ls)' --allow-tool 'shell(tail)' --allow-tool 'shell(wc)' --share /tmp/gh-aw/sandbox/agent/logs/conversation.md --prompt "$COPILOT_CLI_INSTRUCTION"${GH_AW_MODEL_DETECTION_COPILOT:+ --model "$GH_AW_MODEL_DETECTION_COPILOT"} 2>&1 | tee /tmp/gh-aw/threat-detection/detection.log - env: - COPILOT_AGENT_RUNNER_TYPE: STANDALONE - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - GH_AW_MODEL_DETECTION_COPILOT: ${{ vars.GH_AW_MODEL_DETECTION_COPILOT || '' }} - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GITHUB_HEAD_REF: ${{ github.head_ref }} - GITHUB_REF_NAME: ${{ github.ref_name }} - GITHUB_STEP_SUMMARY: ${{ env.GITHUB_STEP_SUMMARY }} - GITHUB_WORKSPACE: ${{ github.workspace }} - XDG_CONFIG_HOME: /home/runner - - name: Parse threat detection results - id: parse_results - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/parse_threat_detection_results.cjs'); - await main(); - - name: Upload threat detection log - if: always() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: threat-detection.log - path: /tmp/gh-aw/threat-detection/detection.log - if-no-files-found: ignore - - pre_activation: - runs-on: ubuntu-slim - permissions: - discussions: write - issues: write - pull-requests: write - outputs: - activated: ${{ steps.check_membership.outputs.is_team_member == 'true' }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Add eyes reaction for immediate feedback - id: react - if: github.event_name == 'issues' || github.event_name == 'issue_comment' || github.event_name == 'pull_request_review_comment' || github.event_name == 'discussion' || github.event_name == 'discussion_comment' || (github.event_name == 'pull_request') && (github.event.pull_request.head.repo.id == github.repository_id) - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_REACTION: "eyes" - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/add_reaction.cjs'); - await main(); - - name: Check team membership for workflow - id: check_membership - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_REQUIRED_ROLES: admin,maintainer,write - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/check_membership.cjs'); - await main(); - - safe_outputs: - needs: - - agent - - detection - if: ((!cancelled()) && (needs.agent.result != 'skipped')) && (needs.detection.outputs.success == 'true') - runs-on: ubuntu-slim - permissions: - contents: read - discussions: write - issues: write - pull-requests: write - timeout-minutes: 15 - env: - GH_AW_WORKFLOW_ID: "issue-triage" - GH_AW_WORKFLOW_NAME: "Agentic Triage" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/issue-triage.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/issue-triage.md" - outputs: - create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} - create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} - process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} - process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Download agent output artifact - continue-on-error: true - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - with: - name: agent-output - path: /tmp/gh-aw/safeoutputs/ - - name: Setup agent output environment variable - run: | - mkdir -p /tmp/gh-aw/safeoutputs/ - find "/tmp/gh-aw/safeoutputs/" -type f -print - echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/safeoutputs/agent_output.json" >> "$GITHUB_ENV" - - name: Process Safe Outputs - id: process_safe_outputs - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"add_comment\":{\"max\":1},\"add_labels\":{\"max\":5},\"missing_data\":{},\"missing_tool\":{}}" - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/safe_output_handler_manager.cjs'); - await main(); - diff --git a/.github/workflows/issue-triage.md b/.github/workflows/issue-triage.md deleted file mode 100644 index bd8ea85..0000000 --- a/.github/workflows/issue-triage.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -description: | - Intelligent issue triage assistant that processes new and reopened issues. - Analyzes issue content, selects appropriate labels, detects spam, gathers context - from similar issues, and provides analysis notes including debugging strategies, - reproduction steps, and resource links. Helps maintainers quickly understand and - prioritize incoming issues. - -on: - issues: - types: [opened, reopened] - reaction: eyes - -permissions: read-all - -network: defaults - -safe-outputs: - add-labels: - max: 5 - add-comment: - -tools: - web-fetch: - github: - toolsets: [issues] - # If in a public repo, setting `lockdown: false` allows - # reading issues, pull requests and comments from 3rd-parties - # If in a private repo this has no particular effect. - lockdown: false - -timeout-minutes: 10 -source: githubnext/agentics/workflows/issue-triage.md@eb7950f37d350af6fa09d19827c4883e72947221 ---- - -# Agentic Triage - - - -You're a triage assistant for GitHub issues. Your task is to analyze issue #${{ github.event.issue.number }} and perform some initial triage tasks related to that issue. - -1. Select appropriate labels for the issue from the provided list. - -2. Retrieve the issue content using the `get_issue` tool. If the issue is obviously spam, or generated by bot, or something else that is not an actual issue to be worked on, then add an issue comment to the issue with a one-sentence analysis and exit the workflow. - -3. Next, use the GitHub tools to gather additional context about the issue: - - - Fetch the list of labels available in this repository. Use 'gh label list' bash command to fetch the labels. This will give you the labels you can use for triaging issues. - - Fetch any comments on the issue using the `get_issue_comments` tool - - Find similar issues if needed using the `search_issues` tool - - List the issues to see other open issues in the repository using the `list_issues` tool - -4. Analyze the issue content, considering: - - - The issue title and description - - The type of issue (bug report, feature request, question, etc.) - - Technical areas mentioned - - Severity or priority indicators - - User impact - - Components affected - -5. Write notes, ideas, nudges, resource links, debugging strategies and/or reproduction steps for the team to consider relevant to the issue. - -6. Select appropriate labels from the available labels list provided above: - - - Choose labels that accurately reflect the issue's nature - - Be specific but comprehensive - - Select priority labels if you can determine urgency (high-priority, med-priority, or low-priority) - - Consider platform labels (android, ios) if applicable - - Search for similar issues, and if you find similar issues consider using a "duplicate" label if appropriate. Only do so if the issue is a duplicate of another OPEN issue. - - Only select labels from the provided list above - - It's okay to not add any labels if none are clearly applicable - -7. Apply the selected labels: - - - Use the `update_issue` tool to apply the labels to the issue - - DO NOT communicate directly with users - - If no labels are clearly applicable, do not apply any labels - -8. Add an issue comment to the issue with your analysis: - - Start with "🎯 Agentic Issue Triage" - - Provide a brief summary of the issue - - Mention any relevant details that might help the team understand the issue better - - Include any debugging strategies or reproduction steps if applicable - - Suggest resources or links that might be helpful for resolving the issue or learning skills related to the issue or the particular area of the codebase affected by it - - Mention any nudges or ideas that could help the team in addressing the issue - - If you have possible reproduction steps, include them in the comment - - If you have any debugging strategies, include them in the comment - - If appropriate break the issue down to sub-tasks and write a checklist of things to do. - - Use collapsed-by-default sections in the GitHub markdown to keep the comment tidy. Collapse all sections except the short main summary at the top. diff --git a/.github/workflows/plan.lock.yml b/.github/workflows/plan.lock.yml deleted file mode 100644 index 77e30bd..0000000 --- a/.github/workflows/plan.lock.yml +++ /dev/null @@ -1,1170 +0,0 @@ -# -# ___ _ _ -# / _ \ | | (_) -# | |_| | __ _ ___ _ __ | |_ _ ___ -# | _ |/ _` |/ _ \ '_ \| __| |/ __| -# | | | | (_| | __/ | | | |_| | (__ -# \_| |_/\__, |\___|_| |_|\__|_|\___| -# __/ | -# _ _ |___/ -# | | | | / _| | -# | | | | ___ _ __ _ __| |_| | _____ ____ -# | |/\| |/ _ \ '__| |/ /| _| |/ _ \ \ /\ / / ___| -# \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ -# \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ -# -# This file was automatically generated by gh-aw (v0.45.0). DO NOT EDIT. -# -# To update this file, edit githubnext/agentics/workflows/plan.md@eb7950f37d350af6fa09d19827c4883e72947221 and run: -# gh aw compile -# Not all edits will cause changes to this file. -# -# For more information: https://github.github.com/gh-aw/introduction/overview/ -# -# Generates project plans and task breakdowns when invoked with /plan command in issues or PRs -# -# Source: githubnext/agentics/workflows/plan.md@eb7950f37d350af6fa09d19827c4883e72947221 -# -# frontmatter-hash: dbdade82987b91f02e7f3e88f81d7403a70a8ff8882e51d118d5b590a575e882 - -name: "Plan Command" -"on": - discussion_comment: - types: - - created - - edited - issue_comment: - types: - - created - - edited - -permissions: {} - -concurrency: - group: "gh-aw-${{ github.workflow }}-${{ github.event.issue.number || github.event.pull_request.number }}" - -run-name: "Plan Command" - -jobs: - activation: - needs: pre_activation - if: > - (needs.pre_activation.outputs.activated == 'true') && ((github.event_name == 'issue_comment') && (((startsWith(github.event.comment.body, '/plan ')) || - (github.event.comment.body == '/plan')) && (github.event.issue.pull_request == null)) || (github.event_name == 'discussion_comment') && - ((startsWith(github.event.comment.body, '/plan ')) || (github.event.comment.body == '/plan'))) - runs-on: ubuntu-slim - permissions: - contents: read - discussions: write - issues: write - pull-requests: write - outputs: - body: ${{ steps.compute-text.outputs.body }} - comment_id: "" - comment_repo: "" - slash_command: ${{ needs.pre_activation.outputs.matched_command }} - text: ${{ steps.compute-text.outputs.text }} - title: ${{ steps.compute-text.outputs.title }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Check workflow file timestamps - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_WORKFLOW_FILE: "plan.lock.yml" - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/check_workflow_timestamp_api.cjs'); - await main(); - - name: Compute current body text - id: compute-text - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/compute_text.cjs'); - await main(); - - agent: - needs: activation - runs-on: ubuntu-latest - permissions: - contents: read - discussions: read - issues: read - pull-requests: read - env: - DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} - GH_AW_ASSETS_ALLOWED_EXTS: "" - GH_AW_ASSETS_BRANCH: "" - GH_AW_ASSETS_MAX_SIZE_KB: 0 - GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs - GH_AW_SAFE_OUTPUTS: /opt/gh-aw/safeoutputs/outputs.jsonl - GH_AW_SAFE_OUTPUTS_CONFIG_PATH: /opt/gh-aw/safeoutputs/config.json - GH_AW_SAFE_OUTPUTS_TOOLS_PATH: /opt/gh-aw/safeoutputs/tools.json - GH_AW_WORKFLOW_ID_SANITIZED: plan - outputs: - checkout_pr_success: ${{ steps.checkout-pr.outputs.checkout_pr_success || 'true' }} - has_patch: ${{ steps.collect_output.outputs.has_patch }} - model: ${{ steps.generate_aw_info.outputs.model }} - output: ${{ steps.collect_output.outputs.output }} - output_types: ${{ steps.collect_output.outputs.output_types }} - secret_verification_result: ${{ steps.validate-secret.outputs.verification_result }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Checkout repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Create gh-aw temp directory - run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh - - name: Configure Git credentials - env: - REPO_NAME: ${{ github.repository }} - SERVER_URL: ${{ github.server_url }} - run: | - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git config --global user.name "github-actions[bot]" - # Re-authenticate git with GitHub token - SERVER_URL_STRIPPED="${SERVER_URL#https://}" - git remote set-url origin "https://x-access-token:${{ github.token }}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" - echo "Git configured with standard GitHub Actions identity" - - name: Checkout PR branch - id: checkout-pr - if: | - github.event.pull_request - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - with: - github-token: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/checkout_pr_branch.cjs'); - await main(); - - name: Generate agentic run info - id: generate_aw_info - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const fs = require('fs'); - - const awInfo = { - engine_id: "copilot", - engine_name: "GitHub Copilot CLI", - model: process.env.GH_AW_MODEL_AGENT_COPILOT || "", - version: "", - agent_version: "0.0.410", - cli_version: "v0.45.0", - workflow_name: "Plan Command", - experimental: false, - supports_tools_allowlist: true, - supports_http_transport: true, - run_id: context.runId, - run_number: context.runNumber, - run_attempt: process.env.GITHUB_RUN_ATTEMPT, - repository: context.repo.owner + '/' + context.repo.repo, - ref: context.ref, - sha: context.sha, - actor: context.actor, - event_name: context.eventName, - staged: false, - allowed_domains: ["defaults"], - firewall_enabled: true, - awf_version: "v0.18.0", - awmg_version: "v0.1.4", - steps: { - firewall: "squid" - }, - created_at: new Date().toISOString() - }; - - // Write to /tmp/gh-aw directory to avoid inclusion in PR - const tmpPath = '/tmp/gh-aw/aw_info.json'; - fs.writeFileSync(tmpPath, JSON.stringify(awInfo, null, 2)); - console.log('Generated aw_info.json at:', tmpPath); - console.log(JSON.stringify(awInfo, null, 2)); - - // Set model as output for reuse in other steps/jobs - core.setOutput('model', awInfo.model); - - name: Validate COPILOT_GITHUB_TOKEN secret - id: validate-secret - run: /opt/gh-aw/actions/validate_multi_secret.sh COPILOT_GITHUB_TOKEN 'GitHub Copilot CLI' https://github.github.com/gh-aw/reference/engines/#github-copilot-default - env: - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - - name: Install GitHub Copilot CLI - run: /opt/gh-aw/actions/install_copilot_cli.sh 0.0.410 - - name: Install awf binary - run: bash /opt/gh-aw/actions/install_awf_binary.sh v0.18.0 - - name: Download container images - run: bash /opt/gh-aw/actions/download_docker_images.sh ghcr.io/github/gh-aw-firewall/agent:0.18.0 ghcr.io/github/gh-aw-firewall/squid:0.18.0 ghcr.io/github/gh-aw-mcpg:v0.1.4 ghcr.io/github/github-mcp-server:v0.30.3 node:lts-alpine - - name: Write Safe Outputs Config - run: | - mkdir -p /opt/gh-aw/safeoutputs - mkdir -p /tmp/gh-aw/safeoutputs - mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs - cat > /opt/gh-aw/safeoutputs/config.json << 'GH_AW_SAFE_OUTPUTS_CONFIG_EOF' - {"close_discussion":{"max":1,"required_category":"Ideas"},"create_issue":{"max":5},"missing_data":{},"missing_tool":{},"noop":{"max":1}} - GH_AW_SAFE_OUTPUTS_CONFIG_EOF - cat > /opt/gh-aw/safeoutputs/tools.json << 'GH_AW_SAFE_OUTPUTS_TOOLS_EOF' - [ - { - "description": "Create a new GitHub issue for tracking bugs, feature requests, or tasks. Use this for actionable work items that need assignment, labeling, and status tracking. For reports, announcements, or status updates that don't require task tracking, use create_discussion instead. CONSTRAINTS: Maximum 5 issue(s) can be created. Title will be prefixed with \"[task] \". Labels [task ai-generated] will be automatically added.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "body": { - "description": "Detailed issue description in Markdown. Do NOT repeat the title as a heading since it already appears as the issue's h1. Include context, reproduction steps, or acceptance criteria as appropriate.", - "type": "string" - }, - "labels": { - "description": "Labels to categorize the issue (e.g., 'bug', 'enhancement'). Labels must exist in the repository.", - "items": { - "type": "string" - }, - "type": "array" - }, - "parent": { - "description": "Parent issue number for creating sub-issues. This is the numeric ID from the GitHub URL (e.g., 42 in github.com/owner/repo/issues/42). Can also be a temporary_id (e.g., 'aw_abc123', 'aw_Test123') from a previously created issue in the same workflow run.", - "type": [ - "number", - "string" - ] - }, - "temporary_id": { - "description": "Unique temporary identifier for referencing this issue before it's created. Format: 'aw_' followed by 3 to 8 alphanumeric characters (e.g., 'aw_abc1', 'aw_Test123'). Use '#aw_ID' in body text to reference other issues by their temporary_id; these are replaced with actual issue numbers after creation.", - "pattern": "^aw_[A-Za-z0-9]{4,8}$", - "type": "string" - }, - "title": { - "description": "Concise issue title summarizing the bug, feature, or task. The title appears as the main heading, so keep it brief and descriptive.", - "type": "string" - } - }, - "required": [ - "title", - "body" - ], - "type": "object" - }, - "name": "create_issue" - }, - { - "description": "Close a GitHub discussion with a resolution comment and optional reason. You can and should always add a comment when closing a discussion to explain the action or provide context. Use this to mark discussions as resolved, answered, or no longer needed. The closing comment should explain why the discussion is being closed. If the discussion is already closed, a comment will still be posted. CONSTRAINTS: Maximum 1 discussion(s) can be closed.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "body": { - "description": "Closing comment explaining why the discussion is being closed and summarizing any resolution or conclusion.", - "type": "string" - }, - "discussion_number": { - "description": "Discussion number to close. This is the numeric ID from the GitHub URL (e.g., 678 in github.com/owner/repo/discussions/678). If omitted, closes the discussion that triggered this workflow (requires a discussion event trigger).", - "type": [ - "number", - "string" - ] - }, - "reason": { - "description": "Resolution reason: RESOLVED (issue addressed), DUPLICATE (discussed elsewhere), OUTDATED (no longer relevant), or ANSWERED (question answered).", - "enum": [ - "RESOLVED", - "DUPLICATE", - "OUTDATED", - "ANSWERED" - ], - "type": "string" - } - }, - "required": [ - "body" - ], - "type": "object" - }, - "name": "close_discussion" - }, - { - "description": "Report that a tool or capability needed to complete the task is not available, or share any information you deem important about missing functionality or limitations. Use this when you cannot accomplish what was requested because the required functionality is missing or access is restricted.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "alternatives": { - "description": "Any workarounds, manual steps, or alternative approaches the user could take (max 256 characters).", - "type": "string" - }, - "reason": { - "description": "Explanation of why this tool is needed or what information you want to share about the limitation (max 256 characters).", - "type": "string" - }, - "tool": { - "description": "Optional: Name or description of the missing tool or capability (max 128 characters). Be specific about what functionality is needed.", - "type": "string" - } - }, - "required": [ - "reason" - ], - "type": "object" - }, - "name": "missing_tool" - }, - { - "description": "Log a transparency message when no significant actions are needed. Use this to confirm workflow completion and provide visibility when analysis is complete but no changes or outputs are required (e.g., 'No issues found', 'All checks passed'). This ensures the workflow produces human-visible output even when no other actions are taken.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "message": { - "description": "Status or completion message to log. Should explain what was analyzed and the outcome (e.g., 'Code review complete - no issues found', 'Analysis complete - all tests passing').", - "type": "string" - } - }, - "required": [ - "message" - ], - "type": "object" - }, - "name": "noop" - }, - { - "description": "Report that data or information needed to complete the task is not available. Use this when you cannot accomplish what was requested because required data, context, or information is missing.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "alternatives": { - "description": "Any workarounds, manual steps, or alternative approaches the user could take (max 256 characters).", - "type": "string" - }, - "context": { - "description": "Additional context about the missing data or where it should come from (max 256 characters).", - "type": "string" - }, - "data_type": { - "description": "Type or description of the missing data or information (max 128 characters). Be specific about what data is needed.", - "type": "string" - }, - "reason": { - "description": "Explanation of why this data is needed to complete the task (max 256 characters).", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "name": "missing_data" - } - ] - GH_AW_SAFE_OUTPUTS_TOOLS_EOF - cat > /opt/gh-aw/safeoutputs/validation.json << 'GH_AW_SAFE_OUTPUTS_VALIDATION_EOF' - { - "close_discussion": { - "defaultMax": 1, - "fields": { - "body": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 65000 - }, - "discussion_number": { - "optionalPositiveInteger": true - }, - "reason": { - "type": "string", - "enum": [ - "RESOLVED", - "DUPLICATE", - "OUTDATED", - "ANSWERED" - ] - } - } - }, - "create_issue": { - "defaultMax": 1, - "fields": { - "body": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 65000 - }, - "labels": { - "type": "array", - "itemType": "string", - "itemSanitize": true, - "itemMaxLength": 128 - }, - "parent": { - "issueOrPRNumber": true - }, - "repo": { - "type": "string", - "maxLength": 256 - }, - "temporary_id": { - "type": "string" - }, - "title": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 128 - } - } - }, - "missing_tool": { - "defaultMax": 20, - "fields": { - "alternatives": { - "type": "string", - "sanitize": true, - "maxLength": 512 - }, - "reason": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 256 - }, - "tool": { - "type": "string", - "sanitize": true, - "maxLength": 128 - } - } - }, - "noop": { - "defaultMax": 1, - "fields": { - "message": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 65000 - } - } - } - } - GH_AW_SAFE_OUTPUTS_VALIDATION_EOF - - name: Generate Safe Outputs MCP Server Config - id: safe-outputs-config - run: | - # Generate a secure random API key (360 bits of entropy, 40+ chars) - # Mask immediately to prevent timing vulnerabilities - API_KEY=$(openssl rand -base64 45 | tr -d '/+=') - echo "::add-mask::${API_KEY}" - - PORT=3001 - - # Set outputs for next steps - { - echo "safe_outputs_api_key=${API_KEY}" - echo "safe_outputs_port=${PORT}" - } >> "$GITHUB_OUTPUT" - - echo "Safe Outputs MCP server will run on port ${PORT}" - - - name: Start Safe Outputs MCP HTTP Server - id: safe-outputs-start - env: - DEBUG: '*' - GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-config.outputs.safe_outputs_port }} - GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-config.outputs.safe_outputs_api_key }} - GH_AW_SAFE_OUTPUTS_TOOLS_PATH: /opt/gh-aw/safeoutputs/tools.json - GH_AW_SAFE_OUTPUTS_CONFIG_PATH: /opt/gh-aw/safeoutputs/config.json - GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs - run: | - # Environment variables are set above to prevent template injection - export DEBUG - export GH_AW_SAFE_OUTPUTS_PORT - export GH_AW_SAFE_OUTPUTS_API_KEY - export GH_AW_SAFE_OUTPUTS_TOOLS_PATH - export GH_AW_SAFE_OUTPUTS_CONFIG_PATH - export GH_AW_MCP_LOG_DIR - - bash /opt/gh-aw/actions/start_safe_outputs_server.sh - - - name: Start MCP Gateway - id: start-mcp-gateway - env: - GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} - GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-start.outputs.api_key }} - GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-start.outputs.port }} - GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - run: | - set -eo pipefail - mkdir -p /tmp/gh-aw/mcp-config - - # Export gateway environment variables for MCP config and gateway script - export MCP_GATEWAY_PORT="80" - export MCP_GATEWAY_DOMAIN="host.docker.internal" - MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') - echo "::add-mask::${MCP_GATEWAY_API_KEY}" - export MCP_GATEWAY_API_KEY - export MCP_GATEWAY_PAYLOAD_DIR="/tmp/gh-aw/mcp-payloads" - mkdir -p "${MCP_GATEWAY_PAYLOAD_DIR}" - export DEBUG="*" - - export GH_AW_ENGINE="copilot" - export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_LOCKDOWN -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.1.4' - - mkdir -p /home/runner/.copilot - cat << GH_AW_MCP_CONFIG_EOF | bash /opt/gh-aw/actions/start_mcp_gateway.sh - { - "mcpServers": { - "github": { - "type": "stdio", - "container": "ghcr.io/github/github-mcp-server:v0.30.3", - "env": { - "GITHUB_PERSONAL_ACCESS_TOKEN": "\${GITHUB_MCP_SERVER_TOKEN}", - "GITHUB_READ_ONLY": "1", - "GITHUB_TOOLSETS": "context,repos,issues,pull_requests,discussions" - } - }, - "safeoutputs": { - "type": "http", - "url": "http://host.docker.internal:$GH_AW_SAFE_OUTPUTS_PORT", - "headers": { - "Authorization": "\${GH_AW_SAFE_OUTPUTS_API_KEY}" - } - } - }, - "gateway": { - "port": $MCP_GATEWAY_PORT, - "domain": "${MCP_GATEWAY_DOMAIN}", - "apiKey": "${MCP_GATEWAY_API_KEY}", - "payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}" - } - } - GH_AW_MCP_CONFIG_EOF - - name: Generate workflow overview - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const { generateWorkflowOverview } = require('/opt/gh-aw/actions/generate_workflow_overview.cjs'); - await generateWorkflowOverview(core); - - name: Create prompt with built-in context - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} - GH_AW_GITHUB_ACTOR: ${{ github.actor }} - GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} - GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} - GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} - GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} - GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} - GH_AW_IS_PR_COMMENT: ${{ github.event.issue.pull_request && 'true' || '' }} - GH_AW_NEEDS_ACTIVATION_OUTPUTS_TEXT: ${{ needs.activation.outputs.text }} - run: | - bash /opt/gh-aw/actions/create_prompt_first.sh - cat << 'GH_AW_PROMPT_EOF' > "$GH_AW_PROMPT" - - GH_AW_PROMPT_EOF - cat "/opt/gh-aw/prompts/xpia.md" >> "$GH_AW_PROMPT" - cat "/opt/gh-aw/prompts/temp_folder_prompt.md" >> "$GH_AW_PROMPT" - cat "/opt/gh-aw/prompts/markdown.md" >> "$GH_AW_PROMPT" - cat << 'GH_AW_PROMPT_EOF' >> "$GH_AW_PROMPT" - - GitHub API Access Instructions - - The gh CLI is NOT authenticated. Do NOT use gh commands for GitHub operations. - - - To create or modify GitHub resources (issues, discussions, pull requests, etc.), you MUST call the appropriate safe output tool. Simply writing content will NOT work - the workflow requires actual tool calls. - - Temporary IDs: Some safe output tools support a temporary ID field (usually named temporary_id) so you can reference newly-created items elsewhere in the SAME agent output (for example, using #aw_abc1 in a later body). - - **IMPORTANT - temporary_id format rules:** - - If you DON'T need to reference the item later, OMIT the temporary_id field entirely (it will be auto-generated if needed) - - If you DO need cross-references/chaining, you MUST match this EXACT validation regex: /^aw_[A-Za-z0-9]{3,8}$/i - - Format: aw_ prefix followed by 3 to 8 alphanumeric characters (A-Z, a-z, 0-9, case-insensitive) - - Valid alphanumeric characters: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 - - INVALID examples: aw_ab (too short), aw_123456789 (too long), aw_test-id (contains hyphen), aw_id_123 (contains underscore) - - VALID examples: aw_abc, aw_abc1, aw_Test123, aw_A1B2C3D4, aw_12345678 - - To generate valid IDs: use 3-8 random alphanumeric characters or omit the field to let the system auto-generate - - Do NOT invent other aw_* formats — downstream steps will reject them with validation errors matching against /^aw_[A-Za-z0-9]{3,8}$/i. - - Discover available tools from the safeoutputs MCP server. - - **Critical**: Tool calls write structured data that downstream jobs process. Without tool calls, follow-up actions will be skipped. - - **Note**: If you made no other safe output tool calls during this workflow execution, call the "noop" tool to provide a status message indicating completion or that no actions were needed. - - - - The following GitHub context information is available for this workflow: - {{#if __GH_AW_GITHUB_ACTOR__ }} - - **actor**: __GH_AW_GITHUB_ACTOR__ - {{/if}} - {{#if __GH_AW_GITHUB_REPOSITORY__ }} - - **repository**: __GH_AW_GITHUB_REPOSITORY__ - {{/if}} - {{#if __GH_AW_GITHUB_WORKSPACE__ }} - - **workspace**: __GH_AW_GITHUB_WORKSPACE__ - {{/if}} - {{#if __GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ }} - - **issue-number**: #__GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ - {{/if}} - {{#if __GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ }} - - **discussion-number**: #__GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ - {{/if}} - {{#if __GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ }} - - **pull-request-number**: #__GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ - {{/if}} - {{#if __GH_AW_GITHUB_EVENT_COMMENT_ID__ }} - - **comment-id**: __GH_AW_GITHUB_EVENT_COMMENT_ID__ - {{/if}} - {{#if __GH_AW_GITHUB_RUN_ID__ }} - - **workflow-run-id**: __GH_AW_GITHUB_RUN_ID__ - {{/if}} - - - GH_AW_PROMPT_EOF - if [ "$GITHUB_EVENT_NAME" = "issue_comment" ] && [ -n "$GH_AW_IS_PR_COMMENT" ] || [ "$GITHUB_EVENT_NAME" = "pull_request_review_comment" ] || [ "$GITHUB_EVENT_NAME" = "pull_request_review" ]; then - cat "/opt/gh-aw/prompts/pr_context_prompt.md" >> "$GH_AW_PROMPT" - fi - cat << 'GH_AW_PROMPT_EOF' >> "$GH_AW_PROMPT" - - GH_AW_PROMPT_EOF - cat << 'GH_AW_PROMPT_EOF' >> "$GH_AW_PROMPT" - {{#runtime-import .github/workflows/plan.md}} - GH_AW_PROMPT_EOF - - name: Substitute placeholders - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_GITHUB_ACTOR: ${{ github.actor }} - GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} - GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} - GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} - GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} - GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} - GH_AW_IS_PR_COMMENT: ${{ github.event.issue.pull_request && 'true' || '' }} - GH_AW_NEEDS_ACTIVATION_OUTPUTS_TEXT: ${{ needs.activation.outputs.text }} - with: - script: | - const substitutePlaceholders = require('/opt/gh-aw/actions/substitute_placeholders.cjs'); - - // Call the substitution function - return await substitutePlaceholders({ - file: process.env.GH_AW_PROMPT, - substitutions: { - GH_AW_GITHUB_ACTOR: process.env.GH_AW_GITHUB_ACTOR, - GH_AW_GITHUB_EVENT_COMMENT_ID: process.env.GH_AW_GITHUB_EVENT_COMMENT_ID, - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: process.env.GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER, - GH_AW_GITHUB_EVENT_ISSUE_NUMBER: process.env.GH_AW_GITHUB_EVENT_ISSUE_NUMBER, - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: process.env.GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER, - GH_AW_GITHUB_REPOSITORY: process.env.GH_AW_GITHUB_REPOSITORY, - GH_AW_GITHUB_RUN_ID: process.env.GH_AW_GITHUB_RUN_ID, - GH_AW_GITHUB_WORKSPACE: process.env.GH_AW_GITHUB_WORKSPACE, - GH_AW_IS_PR_COMMENT: process.env.GH_AW_IS_PR_COMMENT, - GH_AW_NEEDS_ACTIVATION_OUTPUTS_TEXT: process.env.GH_AW_NEEDS_ACTIVATION_OUTPUTS_TEXT - } - }); - - name: Interpolate variables and render templates - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} - GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} - GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} - GH_AW_NEEDS_ACTIVATION_OUTPUTS_TEXT: ${{ needs.activation.outputs.text }} - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/interpolate_prompt.cjs'); - await main(); - - name: Validate prompt placeholders - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - run: bash /opt/gh-aw/actions/validate_prompt_placeholders.sh - - name: Print prompt - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - run: bash /opt/gh-aw/actions/print_prompt_summary.sh - - name: Clean git credentials - run: bash /opt/gh-aw/actions/clean_git_credentials.sh - - name: Execute GitHub Copilot CLI - id: agentic_execution - # Copilot CLI tool arguments (sorted): - timeout-minutes: 10 - run: | - set -o pipefail - sudo -E awf --env-all --container-workdir "${GITHUB_WORKSPACE}" --allow-domains api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --enable-host-access --image-tag 0.18.0 --skip-pull \ - -- /bin/bash -c '/usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --add-dir "${GITHUB_WORKSPACE}" --disable-builtin-mcps --allow-all-tools --allow-all-paths --share /tmp/gh-aw/sandbox/agent/logs/conversation.md --prompt "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)"${GH_AW_MODEL_AGENT_COPILOT:+ --model "$GH_AW_MODEL_AGENT_COPILOT"}' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log - env: - COPILOT_AGENT_RUNNER_TYPE: STANDALONE - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - GH_AW_MCP_CONFIG: /home/runner/.copilot/mcp-config.json - GH_AW_MODEL_AGENT_COPILOT: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || '' }} - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} - GITHUB_HEAD_REF: ${{ github.head_ref }} - GITHUB_REF_NAME: ${{ github.ref_name }} - GITHUB_STEP_SUMMARY: ${{ env.GITHUB_STEP_SUMMARY }} - GITHUB_WORKSPACE: ${{ github.workspace }} - XDG_CONFIG_HOME: /home/runner - - name: Configure Git credentials - env: - REPO_NAME: ${{ github.repository }} - SERVER_URL: ${{ github.server_url }} - run: | - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git config --global user.name "github-actions[bot]" - # Re-authenticate git with GitHub token - SERVER_URL_STRIPPED="${SERVER_URL#https://}" - git remote set-url origin "https://x-access-token:${{ github.token }}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" - echo "Git configured with standard GitHub Actions identity" - - name: Copy Copilot session state files to logs - if: always() - continue-on-error: true - run: | - # Copy Copilot session state files to logs folder for artifact collection - # This ensures they are in /tmp/gh-aw/ where secret redaction can scan them - SESSION_STATE_DIR="$HOME/.copilot/session-state" - LOGS_DIR="/tmp/gh-aw/sandbox/agent/logs" - - if [ -d "$SESSION_STATE_DIR" ]; then - echo "Copying Copilot session state files from $SESSION_STATE_DIR to $LOGS_DIR" - mkdir -p "$LOGS_DIR" - cp -v "$SESSION_STATE_DIR"/*.jsonl "$LOGS_DIR/" 2>/dev/null || true - echo "Session state files copied successfully" - else - echo "No session-state directory found at $SESSION_STATE_DIR" - fi - - name: Stop MCP Gateway - if: always() - continue-on-error: true - env: - MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} - MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} - GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} - run: | - bash /opt/gh-aw/actions/stop_mcp_gateway.sh "$GATEWAY_PID" - - name: Redact secrets in logs - if: always() - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/redact_secrets.cjs'); - await main(); - env: - GH_AW_SECRET_NAMES: 'COPILOT_GITHUB_TOKEN,GH_AW_GITHUB_MCP_SERVER_TOKEN,GH_AW_GITHUB_TOKEN,GITHUB_TOKEN' - SECRET_COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - SECRET_GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} - SECRET_GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} - SECRET_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Upload Safe Outputs - if: always() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: safe-output - path: ${{ env.GH_AW_SAFE_OUTPUTS }} - if-no-files-found: warn - - name: Ingest agent output - id: collect_output - if: always() - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} - GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com" - GITHUB_SERVER_URL: ${{ github.server_url }} - GITHUB_API_URL: ${{ github.api_url }} - GH_AW_COMMAND: plan - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/collect_ndjson_output.cjs'); - await main(); - - name: Upload sanitized agent output - if: always() && env.GH_AW_AGENT_OUTPUT - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: agent-output - path: ${{ env.GH_AW_AGENT_OUTPUT }} - if-no-files-found: warn - - name: Upload engine output files - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: agent_outputs - path: | - /tmp/gh-aw/sandbox/agent/logs/ - /tmp/gh-aw/redacted-urls.log - if-no-files-found: ignore - - name: Parse agent logs for step summary - if: always() - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: /tmp/gh-aw/sandbox/agent/logs/ - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/parse_copilot_log.cjs'); - await main(); - - name: Parse MCP Gateway logs for step summary - if: always() - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/parse_mcp_gateway_log.cjs'); - await main(); - - name: Print firewall logs - if: always() - continue-on-error: true - env: - AWF_LOGS_DIR: /tmp/gh-aw/sandbox/firewall/logs - run: | - # Fix permissions on firewall logs so they can be uploaded as artifacts - # AWF runs with sudo, creating files owned by root - sudo chmod -R a+r /tmp/gh-aw/sandbox/firewall/logs 2>/dev/null || true - # Only run awf logs summary if awf command exists (it may not be installed if workflow failed before install step) - if command -v awf &> /dev/null; then - awf logs summary | tee -a "$GITHUB_STEP_SUMMARY" - else - echo 'AWF binary not installed, skipping firewall log summary' - fi - - name: Upload agent artifacts - if: always() - continue-on-error: true - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: agent-artifacts - path: | - /tmp/gh-aw/aw-prompts/prompt.txt - /tmp/gh-aw/aw_info.json - /tmp/gh-aw/mcp-logs/ - /tmp/gh-aw/sandbox/firewall/logs/ - /tmp/gh-aw/agent-stdio.log - /tmp/gh-aw/agent/ - if-no-files-found: ignore - - conclusion: - needs: - - activation - - agent - - detection - - safe_outputs - if: (always()) && (needs.agent.result != 'skipped') - runs-on: ubuntu-slim - permissions: - contents: read - discussions: write - issues: write - outputs: - noop_message: ${{ steps.noop.outputs.noop_message }} - tools_reported: ${{ steps.missing_tool.outputs.tools_reported }} - total_count: ${{ steps.missing_tool.outputs.total_count }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Download agent output artifact - continue-on-error: true - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - with: - name: agent-output - path: /tmp/gh-aw/safeoutputs/ - - name: Setup agent output environment variable - run: | - mkdir -p /tmp/gh-aw/safeoutputs/ - find "/tmp/gh-aw/safeoutputs/" -type f -print - echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/safeoutputs/agent_output.json" >> "$GITHUB_ENV" - - name: Process No-Op Messages - id: noop - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_NOOP_MAX: 1 - GH_AW_WORKFLOW_NAME: "Plan Command" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/plan.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/plan.md" - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/noop.cjs'); - await main(); - - name: Record Missing Tool - id: missing_tool - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_WORKFLOW_NAME: "Plan Command" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/plan.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/plan.md" - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/missing_tool.cjs'); - await main(); - - name: Handle Agent Failure - id: handle_agent_failure - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_WORKFLOW_NAME: "Plan Command" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/plan.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/plan.md" - GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} - GH_AW_WORKFLOW_ID: "plan" - GH_AW_SECRET_VERIFICATION_RESULT: ${{ needs.agent.outputs.secret_verification_result }} - GH_AW_CHECKOUT_PR_SUCCESS: ${{ needs.agent.outputs.checkout_pr_success }} - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/handle_agent_failure.cjs'); - await main(); - - name: Handle No-Op Message - id: handle_noop_message - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_WORKFLOW_NAME: "Plan Command" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/plan.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/plan.md" - GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} - GH_AW_NOOP_MESSAGE: ${{ steps.noop.outputs.noop_message }} - GH_AW_NOOP_REPORT_AS_ISSUE: "true" - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/handle_noop_message.cjs'); - await main(); - - detection: - needs: agent - if: needs.agent.outputs.output_types != '' || needs.agent.outputs.has_patch == 'true' - runs-on: ubuntu-latest - permissions: {} - timeout-minutes: 10 - outputs: - success: ${{ steps.parse_results.outputs.success }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Download agent artifacts - continue-on-error: true - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - with: - name: agent-artifacts - path: /tmp/gh-aw/threat-detection/ - - name: Download agent output artifact - continue-on-error: true - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - with: - name: agent-output - path: /tmp/gh-aw/threat-detection/ - - name: Echo agent output types - env: - AGENT_OUTPUT_TYPES: ${{ needs.agent.outputs.output_types }} - run: | - echo "Agent output-types: $AGENT_OUTPUT_TYPES" - - name: Setup threat detection - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - WORKFLOW_NAME: "Plan Command" - WORKFLOW_DESCRIPTION: "Generates project plans and task breakdowns when invoked with /plan command in issues or PRs" - HAS_PATCH: ${{ needs.agent.outputs.has_patch }} - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/setup_threat_detection.cjs'); - await main(); - - name: Ensure threat-detection directory and log - run: | - mkdir -p /tmp/gh-aw/threat-detection - touch /tmp/gh-aw/threat-detection/detection.log - - name: Validate COPILOT_GITHUB_TOKEN secret - id: validate-secret - run: /opt/gh-aw/actions/validate_multi_secret.sh COPILOT_GITHUB_TOKEN 'GitHub Copilot CLI' https://github.github.com/gh-aw/reference/engines/#github-copilot-default - env: - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - - name: Install GitHub Copilot CLI - run: /opt/gh-aw/actions/install_copilot_cli.sh 0.0.410 - - name: Execute GitHub Copilot CLI - id: agentic_execution - # Copilot CLI tool arguments (sorted): - # --allow-tool shell(cat) - # --allow-tool shell(grep) - # --allow-tool shell(head) - # --allow-tool shell(jq) - # --allow-tool shell(ls) - # --allow-tool shell(tail) - # --allow-tool shell(wc) - timeout-minutes: 20 - run: | - set -o pipefail - COPILOT_CLI_INSTRUCTION="$(cat /tmp/gh-aw/aw-prompts/prompt.txt)" - mkdir -p /tmp/ - mkdir -p /tmp/gh-aw/ - mkdir -p /tmp/gh-aw/agent/ - mkdir -p /tmp/gh-aw/sandbox/agent/logs/ - copilot --add-dir /tmp/ --add-dir /tmp/gh-aw/ --add-dir /tmp/gh-aw/agent/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --allow-tool 'shell(cat)' --allow-tool 'shell(grep)' --allow-tool 'shell(head)' --allow-tool 'shell(jq)' --allow-tool 'shell(ls)' --allow-tool 'shell(tail)' --allow-tool 'shell(wc)' --share /tmp/gh-aw/sandbox/agent/logs/conversation.md --prompt "$COPILOT_CLI_INSTRUCTION"${GH_AW_MODEL_DETECTION_COPILOT:+ --model "$GH_AW_MODEL_DETECTION_COPILOT"} 2>&1 | tee /tmp/gh-aw/threat-detection/detection.log - env: - COPILOT_AGENT_RUNNER_TYPE: STANDALONE - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - GH_AW_MODEL_DETECTION_COPILOT: ${{ vars.GH_AW_MODEL_DETECTION_COPILOT || '' }} - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GITHUB_HEAD_REF: ${{ github.head_ref }} - GITHUB_REF_NAME: ${{ github.ref_name }} - GITHUB_STEP_SUMMARY: ${{ env.GITHUB_STEP_SUMMARY }} - GITHUB_WORKSPACE: ${{ github.workspace }} - XDG_CONFIG_HOME: /home/runner - - name: Parse threat detection results - id: parse_results - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/parse_threat_detection_results.cjs'); - await main(); - - name: Upload threat detection log - if: always() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: threat-detection.log - path: /tmp/gh-aw/threat-detection/detection.log - if-no-files-found: ignore - - pre_activation: - if: > - (github.event_name == 'issue_comment') && (((startsWith(github.event.comment.body, '/plan ')) || (github.event.comment.body == '/plan')) && - (github.event.issue.pull_request == null)) || (github.event_name == 'discussion_comment') && ((startsWith(github.event.comment.body, '/plan ')) || - (github.event.comment.body == '/plan')) - runs-on: ubuntu-slim - permissions: - discussions: write - issues: write - pull-requests: write - outputs: - activated: ${{ (steps.check_membership.outputs.is_team_member == 'true') && (steps.check_command_position.outputs.command_position_ok == 'true') }} - matched_command: ${{ steps.check_command_position.outputs.matched_command }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Add eyes reaction for immediate feedback - id: react - if: github.event_name == 'issues' || github.event_name == 'issue_comment' || github.event_name == 'pull_request_review_comment' || github.event_name == 'discussion' || github.event_name == 'discussion_comment' || (github.event_name == 'pull_request') && (github.event.pull_request.head.repo.id == github.repository_id) - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_REACTION: "eyes" - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/add_reaction.cjs'); - await main(); - - name: Check team membership for command workflow - id: check_membership - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_REQUIRED_ROLES: admin,maintainer,write - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/check_membership.cjs'); - await main(); - - name: Check command position - id: check_command_position - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_COMMANDS: "[\"plan\"]" - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/check_command_position.cjs'); - await main(); - - safe_outputs: - needs: - - agent - - detection - if: ((!cancelled()) && (needs.agent.result != 'skipped')) && (needs.detection.outputs.success == 'true') - runs-on: ubuntu-slim - permissions: - contents: read - discussions: write - issues: write - timeout-minutes: 15 - env: - GH_AW_ENGINE_ID: "copilot" - GH_AW_WORKFLOW_ID: "plan" - GH_AW_WORKFLOW_NAME: "Plan Command" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/plan.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/plan.md" - outputs: - create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} - create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} - process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} - process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Download agent output artifact - continue-on-error: true - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - with: - name: agent-output - path: /tmp/gh-aw/safeoutputs/ - - name: Setup agent output environment variable - run: | - mkdir -p /tmp/gh-aw/safeoutputs/ - find "/tmp/gh-aw/safeoutputs/" -type f -print - echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/safeoutputs/agent_output.json" >> "$GITHUB_ENV" - - name: Process Safe Outputs - id: process_safe_outputs - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"close_discussion\":{\"max\":1},\"create_issue\":{\"labels\":[\"task\",\"ai-generated\"],\"max\":5,\"title_prefix\":\"[task] \"},\"missing_data\":{},\"missing_tool\":{}}" - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/safe_output_handler_manager.cjs'); - await main(); - diff --git a/.github/workflows/plan.md b/.github/workflows/plan.md deleted file mode 100644 index 6cc24cd..0000000 --- a/.github/workflows/plan.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -name: Plan Command -description: Generates project plans and task breakdowns when invoked with /plan command in issues or PRs - -on: - slash_command: - name: plan - events: [issue_comment, discussion_comment] - -permissions: - contents: read - discussions: read - issues: read - pull-requests: read - -engine: copilot - -tools: - github: - toolsets: [default, discussions] - # If in a public repo, setting `lockdown: false` allows - # reading issues, pull requests and comments from 3rd-parties - # If in a private repo this has no particular effect. - # - # This allows the maintainer to use /plan in discussions and issues created - # by 3rd parties, and to read the content of those discussions and issues - # turning the content into actionable tasks. - lockdown: false - -safe-outputs: - create-issue: - title-prefix: "[task] " - labels: [task, ai-generated] - max: 5 - close-discussion: - required-category: "Ideas" -timeout-minutes: 10 -source: githubnext/agentics/workflows/plan.md@eb7950f37d350af6fa09d19827c4883e72947221 ---- - -# Planning Assistant - -You are an expert planning assistant for GitHub Copilot agents. Your task is to analyze an issue or discussion and break it down into a sequence of actionable work items that can be assigned to GitHub Copilot agents. - -## Current Context - -- **Repository**: ${{ github.repository }} -- **Issue Number**: ${{ github.event.issue.number }} -- **Discussion Number**: ${{ github.event.discussion.number }} -- **Content**: - - -${{ needs.activation.outputs.text }} - - -## Your Mission - -Analyze the issue or discussion and its comments, then create a sequence of clear, actionable sub-issues (at most 5) that break down the work into manageable tasks for GitHub Copilot agents. - -## Guidelines for Creating Sub-Issues - -### 1. Clarity and Specificity -Each sub-issue should: -- Have a clear, specific objective that can be completed independently -- Use concrete language that a SWE agent can understand and execute -- Include specific files, functions, or components when relevant -- Avoid ambiguity and vague requirements - -### 2. Proper Sequencing -Order the tasks logically: -- Start with foundational work (setup, infrastructure, dependencies) -- Follow with implementation tasks -- End with validation and documentation -- Consider dependencies between tasks - -### 3. Right Level of Granularity -Each task should: -- Be completable in a single PR -- Not be too large (avoid epic-sized tasks) -- With a single focus or goal. Keep them extremely small and focused even if it means more tasks. -- Have clear acceptance criteria - -### 4. SWE Agent Formulation -Write tasks as if instructing a software engineer: -- Use imperative language: "Implement X", "Add Y", "Update Z" -- Provide context: "In file X, add function Y to handle Z" -- Include relevant technical details -- Specify expected outcomes - -## Task Breakdown Process - -1. **Analyze the Content**: Read the issue or discussion title, description, and comments carefully -2. **Identify Scope**: Determine the overall scope and complexity -3. **Break Down Work**: Identify 3-5 logical work items -4. **Formulate Tasks**: Write clear, actionable descriptions for each task -5. **Create Sub-Issues**: Use safe-outputs to create the sub-issues - -## Output Format - -For each sub-issue you create: -- **Title**: Brief, descriptive title (e.g., "Implement authentication middleware") -- **Body**: Clear description with: - - Objective: What needs to be done - - Context: Why this is needed - - Approach: Suggested implementation approach (if applicable) - - Files: Specific files to modify or create - - Acceptance Criteria: How to verify completion - -## Example Sub-Issue - -**Title**: Add user authentication middleware - -**Body**: -``` -## Objective -Implement JWT-based authentication middleware for API routes. - -## Context -This is needed to secure API endpoints before implementing user-specific features. Part of issue or discussion #123. - -## Approach -1. Create middleware function in `src/middleware/auth.js` -2. Add JWT verification using the existing auth library -3. Attach user info to request object -4. Handle token expiration and invalid tokens - -## Files to Modify -- Create: `src/middleware/auth.js` -- Update: `src/routes/api.js` (to use the middleware) -- Update: `tests/middleware/auth.test.js` (add tests) - -## Acceptance Criteria -- [ ] Middleware validates JWT tokens -- [ ] Invalid tokens return 401 status -- [ ] User info is accessible in route handlers -- [ ] Tests cover success and error cases -``` - -## Important Notes - -- **Maximum 5 sub-issues**: Don't create more than 5 sub-issues (as configured in safe-outputs) -- **Parent Reference**: You must specify the current issue (#${{ github.event.issue.number }}) or discussion (#${{ github.event.discussion.number }}) as the parent when creating sub-issues. The system will automatically link them with "Related to #N" in the issue body. -- **Clear Steps**: Each sub-issue should have clear, actionable steps -- **No Duplication**: Don't create sub-issues for work that's already done -- **Prioritize Clarity**: SWE agents need unambiguous instructions - -## Instructions - -Review instructions in `.github/instructions/*.instructions.md` if you need guidance. - -## Begin Planning - -Analyze the issue or discussion and create the sub-issues now. Remember to use the safe-outputs mechanism to create each issue. Each sub-issue you create will be automatically linked to the parent (issue #${{ github.event.issue.number }} or discussion #${{ github.event.discussion.number }}). - -After creating all the sub-issues successfully, if this was triggered from a discussion in the "Ideas" category, close the discussion with a comment summarizing the plan and resolution reason "RESOLVED". diff --git a/.github/workflows/update-docs.lock.yml b/.github/workflows/update-docs.lock.yml deleted file mode 100644 index 9d6be41..0000000 --- a/.github/workflows/update-docs.lock.yml +++ /dev/null @@ -1,1091 +0,0 @@ -# -# ___ _ _ -# / _ \ | | (_) -# | |_| | __ _ ___ _ __ | |_ _ ___ -# | _ |/ _` |/ _ \ '_ \| __| |/ __| -# | | | | (_| | __/ | | | |_| | (__ -# \_| |_/\__, |\___|_| |_|\__|_|\___| -# __/ | -# _ _ |___/ -# | | | | / _| | -# | | | | ___ _ __ _ __| |_| | _____ ____ -# | |/\| |/ _ \ '__| |/ /| _| |/ _ \ \ /\ / / ___| -# \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ -# \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ -# -# This file was automatically generated by gh-aw (v0.45.0). DO NOT EDIT. -# -# To update this file, edit githubnext/agentics/workflows/update-docs.md@eb7950f37d350af6fa09d19827c4883e72947221 and run: -# gh aw compile -# Not all edits will cause changes to this file. -# -# For more information: https://github.github.com/gh-aw/introduction/overview/ -# -# This workflow keeps docs synchronized with code changes. -# Triggered on every push to main, it analyzes diffs to identify changed entities and -# updates corresponding documentation. Maintains consistent style (precise, active voice, -# plain English), ensures single source of truth, and creates draft PRs with documentation -# updates. Supports documentation-as-code philosophy. -# -# Source: githubnext/agentics/workflows/update-docs.md@eb7950f37d350af6fa09d19827c4883e72947221 -# -# frontmatter-hash: 304dbbcfd8e4a85bff10b8ee2e884ff7029229a677fe5d8d893a8cf320cda0f7 - -name: "Update Docs" -"on": - push: - branches: - - main - workflow_dispatch: - -permissions: {} - -concurrency: - group: "gh-aw-${{ github.workflow }}-${{ github.ref }}" - -run-name: "Update Docs" - -jobs: - activation: - needs: pre_activation - if: needs.pre_activation.outputs.activated == 'true' - runs-on: ubuntu-slim - permissions: - contents: read - outputs: - comment_id: "" - comment_repo: "" - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Check workflow file timestamps - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_WORKFLOW_FILE: "update-docs.lock.yml" - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/check_workflow_timestamp_api.cjs'); - await main(); - - agent: - needs: activation - runs-on: ubuntu-latest - permissions: read-all - env: - DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} - GH_AW_ASSETS_ALLOWED_EXTS: "" - GH_AW_ASSETS_BRANCH: "" - GH_AW_ASSETS_MAX_SIZE_KB: 0 - GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs - GH_AW_SAFE_OUTPUTS: /opt/gh-aw/safeoutputs/outputs.jsonl - GH_AW_SAFE_OUTPUTS_CONFIG_PATH: /opt/gh-aw/safeoutputs/config.json - GH_AW_SAFE_OUTPUTS_TOOLS_PATH: /opt/gh-aw/safeoutputs/tools.json - GH_AW_WORKFLOW_ID_SANITIZED: updatedocs - outputs: - checkout_pr_success: ${{ steps.checkout-pr.outputs.checkout_pr_success || 'true' }} - has_patch: ${{ steps.collect_output.outputs.has_patch }} - model: ${{ steps.generate_aw_info.outputs.model }} - output: ${{ steps.collect_output.outputs.output }} - output_types: ${{ steps.collect_output.outputs.output_types }} - secret_verification_result: ${{ steps.validate-secret.outputs.verification_result }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Checkout repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Create gh-aw temp directory - run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh - - name: Configure Git credentials - env: - REPO_NAME: ${{ github.repository }} - SERVER_URL: ${{ github.server_url }} - run: | - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git config --global user.name "github-actions[bot]" - # Re-authenticate git with GitHub token - SERVER_URL_STRIPPED="${SERVER_URL#https://}" - git remote set-url origin "https://x-access-token:${{ github.token }}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" - echo "Git configured with standard GitHub Actions identity" - - name: Checkout PR branch - id: checkout-pr - if: | - github.event.pull_request - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - with: - github-token: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/checkout_pr_branch.cjs'); - await main(); - - name: Generate agentic run info - id: generate_aw_info - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const fs = require('fs'); - - const awInfo = { - engine_id: "copilot", - engine_name: "GitHub Copilot CLI", - model: process.env.GH_AW_MODEL_AGENT_COPILOT || "", - version: "", - agent_version: "0.0.410", - cli_version: "v0.45.0", - workflow_name: "Update Docs", - experimental: false, - supports_tools_allowlist: true, - supports_http_transport: true, - run_id: context.runId, - run_number: context.runNumber, - run_attempt: process.env.GITHUB_RUN_ATTEMPT, - repository: context.repo.owner + '/' + context.repo.repo, - ref: context.ref, - sha: context.sha, - actor: context.actor, - event_name: context.eventName, - staged: false, - allowed_domains: ["defaults"], - firewall_enabled: true, - awf_version: "v0.18.0", - awmg_version: "v0.1.4", - steps: { - firewall: "squid" - }, - created_at: new Date().toISOString() - }; - - // Write to /tmp/gh-aw directory to avoid inclusion in PR - const tmpPath = '/tmp/gh-aw/aw_info.json'; - fs.writeFileSync(tmpPath, JSON.stringify(awInfo, null, 2)); - console.log('Generated aw_info.json at:', tmpPath); - console.log(JSON.stringify(awInfo, null, 2)); - - // Set model as output for reuse in other steps/jobs - core.setOutput('model', awInfo.model); - - name: Validate COPILOT_GITHUB_TOKEN secret - id: validate-secret - run: /opt/gh-aw/actions/validate_multi_secret.sh COPILOT_GITHUB_TOKEN 'GitHub Copilot CLI' https://github.github.com/gh-aw/reference/engines/#github-copilot-default - env: - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - - name: Install GitHub Copilot CLI - run: /opt/gh-aw/actions/install_copilot_cli.sh 0.0.410 - - name: Install awf binary - run: bash /opt/gh-aw/actions/install_awf_binary.sh v0.18.0 - - name: Determine automatic lockdown mode for GitHub MCP Server - id: determine-automatic-lockdown - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} - GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} - with: - script: | - const determineAutomaticLockdown = require('/opt/gh-aw/actions/determine_automatic_lockdown.cjs'); - await determineAutomaticLockdown(github, context, core); - - name: Download container images - run: bash /opt/gh-aw/actions/download_docker_images.sh ghcr.io/github/gh-aw-firewall/agent:0.18.0 ghcr.io/github/gh-aw-firewall/squid:0.18.0 ghcr.io/github/gh-aw-mcpg:v0.1.4 ghcr.io/github/github-mcp-server:v0.30.3 node:lts-alpine - - name: Write Safe Outputs Config - run: | - mkdir -p /opt/gh-aw/safeoutputs - mkdir -p /tmp/gh-aw/safeoutputs - mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs - cat > /opt/gh-aw/safeoutputs/config.json << 'GH_AW_SAFE_OUTPUTS_CONFIG_EOF' - {"create_pull_request":{},"missing_data":{},"missing_tool":{},"noop":{"max":1}} - GH_AW_SAFE_OUTPUTS_CONFIG_EOF - cat > /opt/gh-aw/safeoutputs/tools.json << 'GH_AW_SAFE_OUTPUTS_TOOLS_EOF' - [ - { - "description": "Create a new GitHub pull request to propose code changes. Use this after making file edits to submit them for review and merging. The PR will be created from the current branch with your committed changes. For code review comments on an existing PR, use create_pull_request_review_comment instead. CONSTRAINTS: Maximum 1 pull request(s) can be created. Labels [automation documentation] will be automatically added. PRs will be created as drafts.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "body": { - "description": "Detailed PR description in Markdown. Include what changes were made, why, testing notes, and any breaking changes. Do NOT repeat the title as a heading.", - "type": "string" - }, - "branch": { - "description": "Source branch name containing the changes. If omitted, uses the current working branch.", - "type": "string" - }, - "labels": { - "description": "Labels to categorize the PR (e.g., 'enhancement', 'bugfix'). Labels must exist in the repository.", - "items": { - "type": "string" - }, - "type": "array" - }, - "title": { - "description": "Concise PR title describing the changes. Follow repository conventions (e.g., conventional commits). The title appears as the main heading.", - "type": "string" - } - }, - "required": [ - "title", - "body" - ], - "type": "object" - }, - "name": "create_pull_request" - }, - { - "description": "Report that a tool or capability needed to complete the task is not available, or share any information you deem important about missing functionality or limitations. Use this when you cannot accomplish what was requested because the required functionality is missing or access is restricted.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "alternatives": { - "description": "Any workarounds, manual steps, or alternative approaches the user could take (max 256 characters).", - "type": "string" - }, - "reason": { - "description": "Explanation of why this tool is needed or what information you want to share about the limitation (max 256 characters).", - "type": "string" - }, - "tool": { - "description": "Optional: Name or description of the missing tool or capability (max 128 characters). Be specific about what functionality is needed.", - "type": "string" - } - }, - "required": [ - "reason" - ], - "type": "object" - }, - "name": "missing_tool" - }, - { - "description": "Log a transparency message when no significant actions are needed. Use this to confirm workflow completion and provide visibility when analysis is complete but no changes or outputs are required (e.g., 'No issues found', 'All checks passed'). This ensures the workflow produces human-visible output even when no other actions are taken.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "message": { - "description": "Status or completion message to log. Should explain what was analyzed and the outcome (e.g., 'Code review complete - no issues found', 'Analysis complete - all tests passing').", - "type": "string" - } - }, - "required": [ - "message" - ], - "type": "object" - }, - "name": "noop" - }, - { - "description": "Report that data or information needed to complete the task is not available. Use this when you cannot accomplish what was requested because required data, context, or information is missing.", - "inputSchema": { - "additionalProperties": false, - "properties": { - "alternatives": { - "description": "Any workarounds, manual steps, or alternative approaches the user could take (max 256 characters).", - "type": "string" - }, - "context": { - "description": "Additional context about the missing data or where it should come from (max 256 characters).", - "type": "string" - }, - "data_type": { - "description": "Type or description of the missing data or information (max 128 characters). Be specific about what data is needed.", - "type": "string" - }, - "reason": { - "description": "Explanation of why this data is needed to complete the task (max 256 characters).", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "name": "missing_data" - } - ] - GH_AW_SAFE_OUTPUTS_TOOLS_EOF - cat > /opt/gh-aw/safeoutputs/validation.json << 'GH_AW_SAFE_OUTPUTS_VALIDATION_EOF' - { - "create_pull_request": { - "defaultMax": 1, - "fields": { - "body": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 65000 - }, - "branch": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 256 - }, - "labels": { - "type": "array", - "itemType": "string", - "itemSanitize": true, - "itemMaxLength": 128 - }, - "title": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 128 - } - } - }, - "missing_tool": { - "defaultMax": 20, - "fields": { - "alternatives": { - "type": "string", - "sanitize": true, - "maxLength": 512 - }, - "reason": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 256 - }, - "tool": { - "type": "string", - "sanitize": true, - "maxLength": 128 - } - } - }, - "noop": { - "defaultMax": 1, - "fields": { - "message": { - "required": true, - "type": "string", - "sanitize": true, - "maxLength": 65000 - } - } - } - } - GH_AW_SAFE_OUTPUTS_VALIDATION_EOF - - name: Generate Safe Outputs MCP Server Config - id: safe-outputs-config - run: | - # Generate a secure random API key (360 bits of entropy, 40+ chars) - # Mask immediately to prevent timing vulnerabilities - API_KEY=$(openssl rand -base64 45 | tr -d '/+=') - echo "::add-mask::${API_KEY}" - - PORT=3001 - - # Set outputs for next steps - { - echo "safe_outputs_api_key=${API_KEY}" - echo "safe_outputs_port=${PORT}" - } >> "$GITHUB_OUTPUT" - - echo "Safe Outputs MCP server will run on port ${PORT}" - - - name: Start Safe Outputs MCP HTTP Server - id: safe-outputs-start - env: - DEBUG: '*' - GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-config.outputs.safe_outputs_port }} - GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-config.outputs.safe_outputs_api_key }} - GH_AW_SAFE_OUTPUTS_TOOLS_PATH: /opt/gh-aw/safeoutputs/tools.json - GH_AW_SAFE_OUTPUTS_CONFIG_PATH: /opt/gh-aw/safeoutputs/config.json - GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs - run: | - # Environment variables are set above to prevent template injection - export DEBUG - export GH_AW_SAFE_OUTPUTS_PORT - export GH_AW_SAFE_OUTPUTS_API_KEY - export GH_AW_SAFE_OUTPUTS_TOOLS_PATH - export GH_AW_SAFE_OUTPUTS_CONFIG_PATH - export GH_AW_MCP_LOG_DIR - - bash /opt/gh-aw/actions/start_safe_outputs_server.sh - - - name: Start MCP Gateway - id: start-mcp-gateway - env: - GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} - GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-start.outputs.api_key }} - GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-start.outputs.port }} - GITHUB_MCP_LOCKDOWN: ${{ steps.determine-automatic-lockdown.outputs.lockdown == 'true' && '1' || '0' }} - GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - run: | - set -eo pipefail - mkdir -p /tmp/gh-aw/mcp-config - - # Export gateway environment variables for MCP config and gateway script - export MCP_GATEWAY_PORT="80" - export MCP_GATEWAY_DOMAIN="host.docker.internal" - MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') - echo "::add-mask::${MCP_GATEWAY_API_KEY}" - export MCP_GATEWAY_API_KEY - export MCP_GATEWAY_PAYLOAD_DIR="/tmp/gh-aw/mcp-payloads" - mkdir -p "${MCP_GATEWAY_PAYLOAD_DIR}" - export DEBUG="*" - - export GH_AW_ENGINE="copilot" - export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_LOCKDOWN -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.1.4' - - mkdir -p /home/runner/.copilot - cat << GH_AW_MCP_CONFIG_EOF | bash /opt/gh-aw/actions/start_mcp_gateway.sh - { - "mcpServers": { - "github": { - "type": "stdio", - "container": "ghcr.io/github/github-mcp-server:v0.30.3", - "env": { - "GITHUB_LOCKDOWN_MODE": "$GITHUB_MCP_LOCKDOWN", - "GITHUB_PERSONAL_ACCESS_TOKEN": "\${GITHUB_MCP_SERVER_TOKEN}", - "GITHUB_READ_ONLY": "1", - "GITHUB_TOOLSETS": "all" - } - }, - "safeoutputs": { - "type": "http", - "url": "http://host.docker.internal:$GH_AW_SAFE_OUTPUTS_PORT", - "headers": { - "Authorization": "\${GH_AW_SAFE_OUTPUTS_API_KEY}" - } - } - }, - "gateway": { - "port": $MCP_GATEWAY_PORT, - "domain": "${MCP_GATEWAY_DOMAIN}", - "apiKey": "${MCP_GATEWAY_API_KEY}", - "payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}" - } - } - GH_AW_MCP_CONFIG_EOF - - name: Generate workflow overview - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const { generateWorkflowOverview } = require('/opt/gh-aw/actions/generate_workflow_overview.cjs'); - await generateWorkflowOverview(core); - - name: Create prompt with built-in context - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} - GH_AW_GITHUB_ACTOR: ${{ github.actor }} - GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} - GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} - GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} - GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} - GH_AW_GITHUB_WORKFLOW: ${{ github.workflow }} - GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} - run: | - bash /opt/gh-aw/actions/create_prompt_first.sh - cat << 'GH_AW_PROMPT_EOF' > "$GH_AW_PROMPT" - - GH_AW_PROMPT_EOF - cat "/opt/gh-aw/prompts/xpia.md" >> "$GH_AW_PROMPT" - cat "/opt/gh-aw/prompts/temp_folder_prompt.md" >> "$GH_AW_PROMPT" - cat "/opt/gh-aw/prompts/markdown.md" >> "$GH_AW_PROMPT" - cat << 'GH_AW_PROMPT_EOF' >> "$GH_AW_PROMPT" - - GitHub API Access Instructions - - The gh CLI is NOT authenticated. Do NOT use gh commands for GitHub operations. - - - To create or modify GitHub resources (issues, discussions, pull requests, etc.), you MUST call the appropriate safe output tool. Simply writing content will NOT work - the workflow requires actual tool calls. - - Temporary IDs: Some safe output tools support a temporary ID field (usually named temporary_id) so you can reference newly-created items elsewhere in the SAME agent output (for example, using #aw_abc1 in a later body). - - **IMPORTANT - temporary_id format rules:** - - If you DON'T need to reference the item later, OMIT the temporary_id field entirely (it will be auto-generated if needed) - - If you DO need cross-references/chaining, you MUST match this EXACT validation regex: /^aw_[A-Za-z0-9]{3,8}$/i - - Format: aw_ prefix followed by 3 to 8 alphanumeric characters (A-Z, a-z, 0-9, case-insensitive) - - Valid alphanumeric characters: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 - - INVALID examples: aw_ab (too short), aw_123456789 (too long), aw_test-id (contains hyphen), aw_id_123 (contains underscore) - - VALID examples: aw_abc, aw_abc1, aw_Test123, aw_A1B2C3D4, aw_12345678 - - To generate valid IDs: use 3-8 random alphanumeric characters or omit the field to let the system auto-generate - - Do NOT invent other aw_* formats — downstream steps will reject them with validation errors matching against /^aw_[A-Za-z0-9]{3,8}$/i. - - Discover available tools from the safeoutputs MCP server. - - **Critical**: Tool calls write structured data that downstream jobs process. Without tool calls, follow-up actions will be skipped. - - **Note**: If you made no other safe output tool calls during this workflow execution, call the "noop" tool to provide a status message indicating completion or that no actions were needed. - - - - The following GitHub context information is available for this workflow: - {{#if __GH_AW_GITHUB_ACTOR__ }} - - **actor**: __GH_AW_GITHUB_ACTOR__ - {{/if}} - {{#if __GH_AW_GITHUB_REPOSITORY__ }} - - **repository**: __GH_AW_GITHUB_REPOSITORY__ - {{/if}} - {{#if __GH_AW_GITHUB_WORKSPACE__ }} - - **workspace**: __GH_AW_GITHUB_WORKSPACE__ - {{/if}} - {{#if __GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ }} - - **issue-number**: #__GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ - {{/if}} - {{#if __GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ }} - - **discussion-number**: #__GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ - {{/if}} - {{#if __GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ }} - - **pull-request-number**: #__GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ - {{/if}} - {{#if __GH_AW_GITHUB_EVENT_COMMENT_ID__ }} - - **comment-id**: __GH_AW_GITHUB_EVENT_COMMENT_ID__ - {{/if}} - {{#if __GH_AW_GITHUB_RUN_ID__ }} - - **workflow-run-id**: __GH_AW_GITHUB_RUN_ID__ - {{/if}} - - - GH_AW_PROMPT_EOF - cat << 'GH_AW_PROMPT_EOF' >> "$GH_AW_PROMPT" - - GH_AW_PROMPT_EOF - cat << 'GH_AW_PROMPT_EOF' >> "$GH_AW_PROMPT" - {{#runtime-import .github/workflows/update-docs.md}} - GH_AW_PROMPT_EOF - - name: Substitute placeholders - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_GITHUB_ACTOR: ${{ github.actor }} - GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} - GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} - GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} - GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} - GH_AW_GITHUB_WORKFLOW: ${{ github.workflow }} - GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} - with: - script: | - const substitutePlaceholders = require('/opt/gh-aw/actions/substitute_placeholders.cjs'); - - // Call the substitution function - return await substitutePlaceholders({ - file: process.env.GH_AW_PROMPT, - substitutions: { - GH_AW_GITHUB_ACTOR: process.env.GH_AW_GITHUB_ACTOR, - GH_AW_GITHUB_EVENT_COMMENT_ID: process.env.GH_AW_GITHUB_EVENT_COMMENT_ID, - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: process.env.GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER, - GH_AW_GITHUB_EVENT_ISSUE_NUMBER: process.env.GH_AW_GITHUB_EVENT_ISSUE_NUMBER, - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: process.env.GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER, - GH_AW_GITHUB_REPOSITORY: process.env.GH_AW_GITHUB_REPOSITORY, - GH_AW_GITHUB_RUN_ID: process.env.GH_AW_GITHUB_RUN_ID, - GH_AW_GITHUB_WORKFLOW: process.env.GH_AW_GITHUB_WORKFLOW, - GH_AW_GITHUB_WORKSPACE: process.env.GH_AW_GITHUB_WORKSPACE - } - }); - - name: Interpolate variables and render templates - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} - GH_AW_GITHUB_WORKFLOW: ${{ github.workflow }} - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/interpolate_prompt.cjs'); - await main(); - - name: Validate prompt placeholders - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - run: bash /opt/gh-aw/actions/validate_prompt_placeholders.sh - - name: Print prompt - env: - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - run: bash /opt/gh-aw/actions/print_prompt_summary.sh - - name: Clean git credentials - run: bash /opt/gh-aw/actions/clean_git_credentials.sh - - name: Execute GitHub Copilot CLI - id: agentic_execution - # Copilot CLI tool arguments (sorted): - timeout-minutes: 15 - run: | - set -o pipefail - sudo -E awf --env-all --container-workdir "${GITHUB_WORKSPACE}" --allow-domains api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --enable-host-access --image-tag 0.18.0 --skip-pull \ - -- /bin/bash -c '/usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --add-dir "${GITHUB_WORKSPACE}" --disable-builtin-mcps --allow-all-tools --allow-all-paths --share /tmp/gh-aw/sandbox/agent/logs/conversation.md --prompt "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)"${GH_AW_MODEL_AGENT_COPILOT:+ --model "$GH_AW_MODEL_AGENT_COPILOT"}' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log - env: - COPILOT_AGENT_RUNNER_TYPE: STANDALONE - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - GH_AW_MCP_CONFIG: /home/runner/.copilot/mcp-config.json - GH_AW_MODEL_AGENT_COPILOT: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || '' }} - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} - GITHUB_HEAD_REF: ${{ github.head_ref }} - GITHUB_REF_NAME: ${{ github.ref_name }} - GITHUB_STEP_SUMMARY: ${{ env.GITHUB_STEP_SUMMARY }} - GITHUB_WORKSPACE: ${{ github.workspace }} - XDG_CONFIG_HOME: /home/runner - - name: Configure Git credentials - env: - REPO_NAME: ${{ github.repository }} - SERVER_URL: ${{ github.server_url }} - run: | - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git config --global user.name "github-actions[bot]" - # Re-authenticate git with GitHub token - SERVER_URL_STRIPPED="${SERVER_URL#https://}" - git remote set-url origin "https://x-access-token:${{ github.token }}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" - echo "Git configured with standard GitHub Actions identity" - - name: Copy Copilot session state files to logs - if: always() - continue-on-error: true - run: | - # Copy Copilot session state files to logs folder for artifact collection - # This ensures they are in /tmp/gh-aw/ where secret redaction can scan them - SESSION_STATE_DIR="$HOME/.copilot/session-state" - LOGS_DIR="/tmp/gh-aw/sandbox/agent/logs" - - if [ -d "$SESSION_STATE_DIR" ]; then - echo "Copying Copilot session state files from $SESSION_STATE_DIR to $LOGS_DIR" - mkdir -p "$LOGS_DIR" - cp -v "$SESSION_STATE_DIR"/*.jsonl "$LOGS_DIR/" 2>/dev/null || true - echo "Session state files copied successfully" - else - echo "No session-state directory found at $SESSION_STATE_DIR" - fi - - name: Stop MCP Gateway - if: always() - continue-on-error: true - env: - MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} - MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} - GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} - run: | - bash /opt/gh-aw/actions/stop_mcp_gateway.sh "$GATEWAY_PID" - - name: Redact secrets in logs - if: always() - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/redact_secrets.cjs'); - await main(); - env: - GH_AW_SECRET_NAMES: 'COPILOT_GITHUB_TOKEN,GH_AW_GITHUB_MCP_SERVER_TOKEN,GH_AW_GITHUB_TOKEN,GITHUB_TOKEN' - SECRET_COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - SECRET_GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} - SECRET_GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} - SECRET_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Upload Safe Outputs - if: always() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: safe-output - path: ${{ env.GH_AW_SAFE_OUTPUTS }} - if-no-files-found: warn - - name: Ingest agent output - id: collect_output - if: always() - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} - GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com" - GITHUB_SERVER_URL: ${{ github.server_url }} - GITHUB_API_URL: ${{ github.api_url }} - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/collect_ndjson_output.cjs'); - await main(); - - name: Upload sanitized agent output - if: always() && env.GH_AW_AGENT_OUTPUT - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: agent-output - path: ${{ env.GH_AW_AGENT_OUTPUT }} - if-no-files-found: warn - - name: Upload engine output files - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: agent_outputs - path: | - /tmp/gh-aw/sandbox/agent/logs/ - /tmp/gh-aw/redacted-urls.log - if-no-files-found: ignore - - name: Parse agent logs for step summary - if: always() - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: /tmp/gh-aw/sandbox/agent/logs/ - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/parse_copilot_log.cjs'); - await main(); - - name: Parse MCP Gateway logs for step summary - if: always() - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/parse_mcp_gateway_log.cjs'); - await main(); - - name: Print firewall logs - if: always() - continue-on-error: true - env: - AWF_LOGS_DIR: /tmp/gh-aw/sandbox/firewall/logs - run: | - # Fix permissions on firewall logs so they can be uploaded as artifacts - # AWF runs with sudo, creating files owned by root - sudo chmod -R a+r /tmp/gh-aw/sandbox/firewall/logs 2>/dev/null || true - # Only run awf logs summary if awf command exists (it may not be installed if workflow failed before install step) - if command -v awf &> /dev/null; then - awf logs summary | tee -a "$GITHUB_STEP_SUMMARY" - else - echo 'AWF binary not installed, skipping firewall log summary' - fi - - name: Upload agent artifacts - if: always() - continue-on-error: true - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: agent-artifacts - path: | - /tmp/gh-aw/aw-prompts/prompt.txt - /tmp/gh-aw/aw_info.json - /tmp/gh-aw/mcp-logs/ - /tmp/gh-aw/sandbox/firewall/logs/ - /tmp/gh-aw/agent-stdio.log - /tmp/gh-aw/agent/ - /tmp/gh-aw/aw.patch - if-no-files-found: ignore - - conclusion: - needs: - - activation - - agent - - detection - - safe_outputs - if: (always()) && (needs.agent.result != 'skipped') - runs-on: ubuntu-slim - permissions: - contents: write - issues: write - pull-requests: write - outputs: - noop_message: ${{ steps.noop.outputs.noop_message }} - tools_reported: ${{ steps.missing_tool.outputs.tools_reported }} - total_count: ${{ steps.missing_tool.outputs.total_count }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Download agent output artifact - continue-on-error: true - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - with: - name: agent-output - path: /tmp/gh-aw/safeoutputs/ - - name: Setup agent output environment variable - run: | - mkdir -p /tmp/gh-aw/safeoutputs/ - find "/tmp/gh-aw/safeoutputs/" -type f -print - echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/safeoutputs/agent_output.json" >> "$GITHUB_ENV" - - name: Process No-Op Messages - id: noop - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_NOOP_MAX: 1 - GH_AW_WORKFLOW_NAME: "Update Docs" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/update-docs.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/update-docs.md" - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/noop.cjs'); - await main(); - - name: Record Missing Tool - id: missing_tool - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_WORKFLOW_NAME: "Update Docs" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/update-docs.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/update-docs.md" - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/missing_tool.cjs'); - await main(); - - name: Handle Agent Failure - id: handle_agent_failure - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_WORKFLOW_NAME: "Update Docs" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/update-docs.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/update-docs.md" - GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} - GH_AW_WORKFLOW_ID: "update-docs" - GH_AW_SECRET_VERIFICATION_RESULT: ${{ needs.agent.outputs.secret_verification_result }} - GH_AW_CHECKOUT_PR_SUCCESS: ${{ needs.agent.outputs.checkout_pr_success }} - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/handle_agent_failure.cjs'); - await main(); - - name: Handle No-Op Message - id: handle_noop_message - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_WORKFLOW_NAME: "Update Docs" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/update-docs.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/update-docs.md" - GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} - GH_AW_NOOP_MESSAGE: ${{ steps.noop.outputs.noop_message }} - GH_AW_NOOP_REPORT_AS_ISSUE: "true" - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/handle_noop_message.cjs'); - await main(); - - name: Handle Create Pull Request Error - id: handle_create_pr_error - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_WORKFLOW_NAME: "Update Docs" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/update-docs.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/update-docs.md" - GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/handle_create_pr_error.cjs'); - await main(); - - detection: - needs: agent - if: needs.agent.outputs.output_types != '' || needs.agent.outputs.has_patch == 'true' - runs-on: ubuntu-latest - permissions: {} - timeout-minutes: 10 - outputs: - success: ${{ steps.parse_results.outputs.success }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Download agent artifacts - continue-on-error: true - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - with: - name: agent-artifacts - path: /tmp/gh-aw/threat-detection/ - - name: Download agent output artifact - continue-on-error: true - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - with: - name: agent-output - path: /tmp/gh-aw/threat-detection/ - - name: Echo agent output types - env: - AGENT_OUTPUT_TYPES: ${{ needs.agent.outputs.output_types }} - run: | - echo "Agent output-types: $AGENT_OUTPUT_TYPES" - - name: Setup threat detection - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - WORKFLOW_NAME: "Update Docs" - WORKFLOW_DESCRIPTION: "This workflow keeps docs synchronized with code changes.\nTriggered on every push to main, it analyzes diffs to identify changed entities and\nupdates corresponding documentation. Maintains consistent style (precise, active voice,\nplain English), ensures single source of truth, and creates draft PRs with documentation\nupdates. Supports documentation-as-code philosophy." - HAS_PATCH: ${{ needs.agent.outputs.has_patch }} - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/setup_threat_detection.cjs'); - await main(); - - name: Ensure threat-detection directory and log - run: | - mkdir -p /tmp/gh-aw/threat-detection - touch /tmp/gh-aw/threat-detection/detection.log - - name: Validate COPILOT_GITHUB_TOKEN secret - id: validate-secret - run: /opt/gh-aw/actions/validate_multi_secret.sh COPILOT_GITHUB_TOKEN 'GitHub Copilot CLI' https://github.github.com/gh-aw/reference/engines/#github-copilot-default - env: - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - - name: Install GitHub Copilot CLI - run: /opt/gh-aw/actions/install_copilot_cli.sh 0.0.410 - - name: Execute GitHub Copilot CLI - id: agentic_execution - # Copilot CLI tool arguments (sorted): - # --allow-tool shell(cat) - # --allow-tool shell(grep) - # --allow-tool shell(head) - # --allow-tool shell(jq) - # --allow-tool shell(ls) - # --allow-tool shell(tail) - # --allow-tool shell(wc) - timeout-minutes: 20 - run: | - set -o pipefail - COPILOT_CLI_INSTRUCTION="$(cat /tmp/gh-aw/aw-prompts/prompt.txt)" - mkdir -p /tmp/ - mkdir -p /tmp/gh-aw/ - mkdir -p /tmp/gh-aw/agent/ - mkdir -p /tmp/gh-aw/sandbox/agent/logs/ - copilot --add-dir /tmp/ --add-dir /tmp/gh-aw/ --add-dir /tmp/gh-aw/agent/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --allow-tool 'shell(cat)' --allow-tool 'shell(grep)' --allow-tool 'shell(head)' --allow-tool 'shell(jq)' --allow-tool 'shell(ls)' --allow-tool 'shell(tail)' --allow-tool 'shell(wc)' --share /tmp/gh-aw/sandbox/agent/logs/conversation.md --prompt "$COPILOT_CLI_INSTRUCTION"${GH_AW_MODEL_DETECTION_COPILOT:+ --model "$GH_AW_MODEL_DETECTION_COPILOT"} 2>&1 | tee /tmp/gh-aw/threat-detection/detection.log - env: - COPILOT_AGENT_RUNNER_TYPE: STANDALONE - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - GH_AW_MODEL_DETECTION_COPILOT: ${{ vars.GH_AW_MODEL_DETECTION_COPILOT || '' }} - GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GITHUB_HEAD_REF: ${{ github.head_ref }} - GITHUB_REF_NAME: ${{ github.ref_name }} - GITHUB_STEP_SUMMARY: ${{ env.GITHUB_STEP_SUMMARY }} - GITHUB_WORKSPACE: ${{ github.workspace }} - XDG_CONFIG_HOME: /home/runner - - name: Parse threat detection results - id: parse_results - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/parse_threat_detection_results.cjs'); - await main(); - - name: Upload threat detection log - if: always() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: threat-detection.log - path: /tmp/gh-aw/threat-detection/detection.log - if-no-files-found: ignore - - pre_activation: - runs-on: ubuntu-slim - outputs: - activated: ${{ steps.check_membership.outputs.is_team_member == 'true' }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Check team membership for workflow - id: check_membership - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_REQUIRED_ROLES: admin,maintainer,write - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/check_membership.cjs'); - await main(); - - safe_outputs: - needs: - - activation - - agent - - detection - if: ((!cancelled()) && (needs.agent.result != 'skipped')) && (needs.detection.outputs.success == 'true') - runs-on: ubuntu-slim - permissions: - contents: write - issues: write - pull-requests: write - timeout-minutes: 15 - env: - GH_AW_WORKFLOW_ID: "update-docs" - GH_AW_WORKFLOW_NAME: "Update Docs" - GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/update-docs.md@eb7950f37d350af6fa09d19827c4883e72947221" - GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/eb7950f37d350af6fa09d19827c4883e72947221/workflows/update-docs.md" - outputs: - create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} - create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} - process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} - process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} - steps: - - name: Setup Scripts - uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0 - with: - destination: /opt/gh-aw/actions - - name: Download agent output artifact - continue-on-error: true - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - with: - name: agent-output - path: /tmp/gh-aw/safeoutputs/ - - name: Setup agent output environment variable - run: | - mkdir -p /tmp/gh-aw/safeoutputs/ - find "/tmp/gh-aw/safeoutputs/" -type f -print - echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/safeoutputs/agent_output.json" >> "$GITHUB_ENV" - - name: Download patch artifact - continue-on-error: true - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - with: - name: agent-artifacts - path: /tmp/gh-aw/ - - name: Checkout repository - if: ((!cancelled()) && (needs.agent.result != 'skipped')) && (contains(needs.agent.outputs.output_types, 'create_pull_request')) - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - token: ${{ github.token }} - persist-credentials: false - fetch-depth: 1 - - name: Configure Git credentials - if: ((!cancelled()) && (needs.agent.result != 'skipped')) && (contains(needs.agent.outputs.output_types, 'create_pull_request')) - env: - REPO_NAME: ${{ github.repository }} - SERVER_URL: ${{ github.server_url }} - GIT_TOKEN: ${{ github.token }} - run: | - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git config --global user.name "github-actions[bot]" - # Re-authenticate git with GitHub token - SERVER_URL_STRIPPED="${SERVER_URL#https://}" - git remote set-url origin "https://x-access-token:${GIT_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" - echo "Git configured with standard GitHub Actions identity" - - name: Process Safe Outputs - id: process_safe_outputs - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} - GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"create_pull_request\":{\"base_branch\":\"${{ github.ref_name }}\",\"draft\":true,\"labels\":[\"automation\",\"documentation\"],\"max\":1,\"max_patch_size\":1024},\"missing_data\":{},\"missing_tool\":{}}" - with: - github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - script: | - const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io); - const { main } = require('/opt/gh-aw/actions/safe_output_handler_manager.cjs'); - await main(); - diff --git a/.github/workflows/update-docs.md b/.github/workflows/update-docs.md deleted file mode 100644 index 597a6e2..0000000 --- a/.github/workflows/update-docs.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -description: | - This workflow keeps docs synchronized with code changes. - Triggered on every push to main, it analyzes diffs to identify changed entities and - updates corresponding documentation. Maintains consistent style (precise, active voice, - plain English), ensures single source of truth, and creates draft PRs with documentation - updates. Supports documentation-as-code philosophy. - -on: - push: - branches: [main] - workflow_dispatch: - -permissions: read-all - -network: defaults - -safe-outputs: - create-pull-request: - draft: true - labels: [automation, documentation] - -tools: - github: - toolsets: [all] - web-fetch: - # By default this workflow allows all bash commands within the confine of Github Actions VM - bash: true - -timeout-minutes: 15 -source: githubnext/agentics/workflows/update-docs.md@eb7950f37d350af6fa09d19827c4883e72947221 ---- - -# Update Docs - -## Job Description - - - -Your name is ${{ github.workflow }}. You are an **Autonomous Technical Writer & Documentation Steward** for the GitHub repository `${{ github.repository }}`. - -### Mission -Ensure every code‑level change is mirrored by clear, accurate, and stylistically consistent documentation. - -### Voice & Tone -- Precise, concise, and developer‑friendly -- Active voice, plain English, progressive disclosure (high‑level first, drill‑down examples next) -- Empathetic toward both newcomers and power users - -### Key Values -Documentation‑as‑Code, transparency, single source of truth, continuous improvement, accessibility, internationalization‑readiness - -### Your Workflow - -1. **Analyze Repository Changes** - - - On every push to main branch, examine the diff to identify changed/added/removed entities - - Look for new APIs, functions, classes, configuration files, or significant code changes - - Check existing documentation for accuracy and completeness - - Identify documentation gaps like failing tests: a "red build" until fixed - -2. **Documentation Assessment** - - - Review existing documentation structure (look for docs/, documentation/, or similar directories) - - Assess documentation quality against style guidelines: - - Diátaxis framework (tutorials, how-to guides, technical reference, explanation) - - Google Developer Style Guide principles - - Inclusive naming conventions - - Microsoft Writing Style Guide standards - - Identify missing or outdated documentation - -3. **Create or Update Documentation** - - - Use Markdown (.md) format wherever possible - - Fall back to MDX only when interactive components are indispensable - - Follow progressive disclosure: high-level concepts first, detailed examples second - - Ensure content is accessible and internationalization-ready - - Create clear, actionable documentation that serves both newcomers and power users - -4. **Documentation Structure & Organization** - - - Organize content following Diátaxis methodology: - - **Tutorials**: Learning-oriented, hands-on lessons - - **How-to guides**: Problem-oriented, practical steps - - **Technical reference**: Information-oriented, precise descriptions - - **Explanation**: Understanding-oriented, clarification and discussion - - Maintain consistent navigation and cross-references - - Ensure searchability and discoverability - -5. **Quality Assurance** - - - Check for broken links, missing images, or formatting issues - - Ensure code examples are accurate and functional - - Verify accessibility standards are met - -6. **Continuous Improvement** - - - Perform nightly sanity sweeps for documentation drift - - Update documentation based on user feedback in issues and discussions - - Maintain and improve documentation toolchain and automation - -### Output Requirements - -- **Create Draft Pull Requests**: When documentation needs updates, create focused draft pull requests with clear descriptions - -### Technical Implementation - -- **Hosting**: Prepare documentation for GitHub Pages deployment with branch-based workflows -- **Automation**: Implement linting and style checking for documentation consistency - -### Error Handling - -- If documentation directories don't exist, suggest appropriate structure -- If build tools are missing, recommend necessary packages or configuration - -### Exit Conditions - -- Exit if the repository has no implementation code yet (empty repository) -- Exit if no code changes require documentation updates -- Exit if all documentation is already up-to-date and comprehensive - -> NOTE: Never make direct pushes to the main branch. Always create a pull request for documentation changes. - -> NOTE: Treat documentation gaps like failing tests. diff --git a/.gitignore b/.gitignore index 7eecc2e..ea77fd9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ # Mnemonic local data +refactor-result-* .claude/mnemonic/ .claude/.mnemonic-integration-manifest.json .fastembed_cache/ diff --git a/README.md b/README.md index 7487e96..47eb22e 100644 --- a/README.md +++ b/README.md @@ -201,31 +201,31 @@ See [docs/ontologies.md](docs/ontologies.md) for the full guide. | Command | Description | |---------|-------------| | `/mnemonic:setup` | Configure mnemonic with proactive behavior | -| `/mnemonic:init` | Initialize directory structure | | `/mnemonic:capture` | Capture a new memory | | `/mnemonic:recall` | Search and recall memories | -| `/mnemonic:search` | Full-text search | -| `/mnemonic:search-enhanced` | Agent-driven iterative search with synthesis | +| `/mnemonic:search` | Full-text search and enhanced iterative search | | `/mnemonic:query` | Structured frontmatter queries using yq | | `/mnemonic:status` | Show system status | | `/mnemonic:gc` | Garbage collect expired memories | | `/mnemonic:list` | List loaded ontologies and namespaces | | `/mnemonic:validate` | Validate ontology file | -| `/mnemonic:discover` | Discover entities in files based on ontology patterns | +| `/mnemonic:custodian` | Memory health checks and maintenance | +| `/mnemonic:integrate` | Wire mnemonic into other plugins | ## Skills Skills are fully self-contained and work without hooks or libraries: -- **mnemonic-setup**: Configure CLAUDE.md for proactive behavior -- **mnemonic-core**: Complete memory operations -- **mnemonic-search**: Advanced search patterns -- **mnemonic-search-enhanced**: Agent-driven iterative search with synthesis -- **mnemonic-format**: MIF Level 3 templates -- **mnemonic-organization**: Namespaces and maintenance -- **mnemonic-blackboard**: Cross-session coordination -- **mnemonic-agent-coordination**: Multi-agent coordination patterns +- **setup**: Configure CLAUDE.md for proactive behavior +- **core**: Complete memory operations +- **search**: Advanced search patterns and iterative synthesis +- **format**: MIF Level 3 templates +- **blackboard**: Cross-session coordination and agent patterns - **ontology**: Custom ontology support with entity types and discovery +- **custodian**: Memory maintenance, deduplication, and health checks +- **integrate**: CLAUDE.md integration for new projects +- **qmd-setup**: Semantic search setup via qmd +- **qmd-reindex**: Re-index memories for semantic search ## Agents @@ -241,17 +241,14 @@ Autonomous agents for specialized tasks: | Guide | Focus | |-------|-------| | [Getting Started](docs/tutorials/getting-started.md) | First project setup tutorial | -| [Tutorials](docs/tutorials/) | Step-by-step learning guides | -| [API Reference](docs/api-reference.md) | Python library documentation | | [CLI Usage](docs/cli-usage.md) | Command-line operations | | [Troubleshooting](docs/troubleshooting.md) | Common issues and solutions | | [Architecture](docs/architecture.md) | System architecture | +| [Semantic Search](docs/semantic-search.md) | QMD vector search setup | | [Library Reference](docs/library-reference.md) | Python library API reference | -| [Agent Coordination](docs/agent-coordination.md) | Multi-agent patterns | | [Ontologies](docs/ontologies.md) | Custom ontology guide | | [Validation](docs/validation.md) | Memory validation guide | | [ADRs](docs/adrs/) | Architecture decision records | -| [Enterprise](docs/enterprise/) | Deployment and compliance | ## Proactive Behavior @@ -359,19 +356,21 @@ mnemonic/ ├── .claude-plugin/ │ └── plugin.json # Plugin manifest ├── agents/ -│ ├── memory-curator.md # Maintenance agent +│ ├── memory-curator.md # Maintenance agent │ ├── mnemonic-search-subcall.md # Search iteration agent -│ └── compression-worker.md # Memory summarization agent +│ ├── compression-worker.md # Memory summarization agent +│ └── ontology-discovery.md # Entity discovery agent ├── commands/ │ └── *.md # Slash commands ├── docs/ │ ├── architecture.md # System architecture │ ├── semantic-search.md # QMD semantic search guide │ ├── validation.md # Memory validation guide -│ ├── agent-coordination.md # Multi-agent patterns │ ├── ontologies.md # Custom ontology guide -│ ├── adrs/ # Architecture decision records -│ └── enterprise/ # Enterprise adoption guides +│ ├── cli-usage.md # Command-line operations +│ ├── library-reference.md # Python library API +│ ├── troubleshooting.md # Common issues and solutions +│ └── adrs/ # Architecture decision records ├── hooks/ │ ├── hooks.json # Hook configuration │ └── *.py # Hook implementations @@ -381,7 +380,8 @@ mnemonic/ │ ├── ontology.py # Ontology loading │ ├── search.py # Memory search and scoring │ ├── memory_reader.py # Memory metadata extraction -│ └── relationships.py # Relationship writing +│ ├── relationships.py # Relationship writing +│ └── migrate_filenames.py # Filename migration utilities ├── skills/ │ ├── */SKILL.md # Self-contained skills │ └── ontology/ # Custom ontology support @@ -430,17 +430,6 @@ npm i -g @tobilu/qmd make check-deps ``` -## Documentation - -- **[Semantic Search Guide](docs/semantic-search.md)** - Setup and use QMD for vector search -- **[CLI Usage](docs/cli-usage.md)** - Command-line operations and search patterns -- **[Architecture](docs/architecture.md)** - System design and components -- **[Validation](docs/validation.md)** - Memory validation and MIF compliance -- **[Custom Ontologies](docs/ontologies.md)** - Extend with domain-specific types -- **[Agent Coordination](docs/agent-coordination.md)** - Multi-agent workflows -- **[ADRs](docs/adrs/)** - Architecture decision records -- **[Enterprise Guides](docs/enterprise/)** - Deployment and governance - ## Related Projects - **[MIF (Memory Interchange Format)](https://mif-spec.dev)** - The specification this plugin implements. An open standard for portable AI memory storage. Schemas: https://mif-spec.dev/schema/ diff --git a/commands/capture.md b/commands/capture.md index 835dc97..99fdb43 100644 --- a/commands/capture.md +++ b/commands/capture.md @@ -34,7 +34,7 @@ Capture a new memory to the mnemonic filesystem. - `--tags` - Comma-separated list of tags - `--scope` - project (default, current project) or org (shared across all projects in organization) - `--confidence` - Confidence score 0.0-1.0 (default: 0.95) -- `--citations` - JSON array of citation objects (see mnemonic-format skill for schema) +- `--citations` - JSON array of citation objects (see format skill for schema) - `--entity-type` - Entity type from ontology (e.g., technology, component, runbook) - `--entity-id` - Custom entity ID (auto-generated if not provided) diff --git a/commands/discover.md b/commands/discover.md deleted file mode 100644 index c7b7856..0000000 --- a/commands/discover.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -allowed-tools: -- Bash -- Read -- Grep -- Glob -- Write -description: Discover entities in content based on ontology patterns -name: discover ---- - -## Memory - -Search first: `/mnemonic:search {relevant_keywords}` -Capture after: `/mnemonic:capture {namespace} "{title}"` - -Run `/mnemonic:list --namespaces` to see available namespaces from loaded ontologies. - - -# Discover Entities - -Scans content or files for entity references and suggests entity types -based on discovery patterns defined in loaded ontologies. - -## Usage - -``` -/mnemonic:discover [] [--suggest] [--json] -``` - -## Arguments - -- `` - File or directory to scan (defaults to current directory) -- `--suggest` - Suggest entity types for unlinked mentions -- `--json` - Output as JSON - -## Procedure - -1. Load ontology from `$MNEMONIC_ROOT/ontology.yaml` -2. Extract discovery patterns -3. Scan content for pattern matches -4. Report found entities and suggestions - -```bash -# Resolve MNEMONIC_ROOT from config -if [ -f "$HOME/.config/mnemonic/config.json" ]; then - RAW_PATH=$(python3 -c "import json; print(json.load(open('$HOME/.config/mnemonic/config.json')).get('memory_store_path', '~/.claude/mnemonic'))") - MNEMONIC_ROOT="${RAW_PATH/#\~/$HOME}" -else - MNEMONIC_ROOT="$HOME/.claude/mnemonic" -fi -SCAN_PATH="${1:-.}" -ONTOLOGY_FILE="$MNEMONIC_ROOT/ontology.yaml" - -# Check for ontology -if [ ! -f "$ONTOLOGY_FILE" ]; then - echo "No ontology found at $ONTOLOGY_FILE" - echo "Copy an ontology to enable discovery:" - echo " cp skills/ontology/ontologies/examples/software-engineering.ontology.yaml $MNEMONIC_ROOT/ontology.yaml" - exit 1 -fi - -echo "Scanning $SCAN_PATH for entity patterns..." -echo "" - -# Extract and run discovery patterns from ontology -# Technology patterns -echo "## Technologies Found" -rg -i '\b(PostgreSQL|MySQL|MongoDB|Redis|Elasticsearch)\b' "$SCAN_PATH" --glob '*.{md,py,js,ts,yaml,yml}' -l 2>/dev/null | head -10 - -echo "" -echo "## Design Patterns Found" -rg -i '\b(Factory|Singleton|Observer|Repository|Adapter|Strategy)\s+Pattern\b' "$SCAN_PATH" --glob '*.{md,py,js,ts}' -l 2>/dev/null | head -10 - -echo "" -echo "## Incidents/Postmortems Found" -rg -i '\b(outage|incident|postmortem|RCA)\b' "$SCAN_PATH" --glob '*.md' -l 2>/dev/null | head -10 - -echo "" -echo "## Runbooks Found" -rg -i '\b(runbook|playbook|SOP|procedure)\b' "$SCAN_PATH" --glob '*.md' -l 2>/dev/null | head -10 -``` - -## Suggestions - -When patterns match, Claude will suggest: - -``` -I found mentions of these technologies that could be captured as entities: -- PostgreSQL (mentioned in src/database.py) -- Redis (mentioned in src/cache.py) - -Would you like me to create technology entities for these? -``` diff --git a/commands/init.md b/commands/init.md deleted file mode 100644 index 161098c..0000000 --- a/commands/init.md +++ /dev/null @@ -1,133 +0,0 @@ ---- -name: init -allowed-tools: -- Bash -- Write -- Read -- Glob -- Grep -argument-hint: '[--org ]' -description: Initialize mnemonic directory structure ---- - -## Memory - -Search first: `/mnemonic:search {relevant_keywords}` -Capture after: `/mnemonic:capture {namespace} "{title}"` - -Run `/mnemonic:list --namespaces` to see available namespaces from loaded ontologies. - - -# /mnemonic:init - -Initialize the mnemonic memory system directory structure. - -## Arguments - -- `--org ` - Override auto-detected organization name - -## Procedure - -### Step 1: Detect or Override Organization - -```bash -# Use provided org or detect from git -if [ -n "$ORG_OVERRIDE" ]; then - ORG="$ORG_OVERRIDE" -else - ORG=$(git remote get-url origin 2>/dev/null | sed -E 's|.*[:/]([^/]+)/[^/]+\.git$|\1|' | sed 's|\.git$||') - [ -z "$ORG" ] && ORG="default" -fi - -PROJECT=$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null) -[ -z "$PROJECT" ] && PROJECT=$(basename "$PWD") -``` - -### Step 2: Create Unified Directory Structure - -All memories are stored under `${MNEMONIC_ROOT}/` with the V2 path structure: - -```bash -# Base directories -mkdir -p ${MNEMONIC_ROOT}/"$ORG"/"$PROJECT" -mkdir -p ${MNEMONIC_ROOT}/"$ORG" # For org-wide memories - -# Cognitive triad namespaces (project-specific, prefixed with _ for disambiguation) -for ns in _semantic/decisions _semantic/knowledge _semantic/entities \ - _episodic/incidents _episodic/sessions _episodic/blockers \ - _procedural/runbooks _procedural/patterns _procedural/migrations; do - mkdir -p ${MNEMONIC_ROOT}/"$ORG"/"$PROJECT"/"$ns" -done - -# Org-wide namespaces (shared across projects) -for ns in _semantic/decisions _semantic/knowledge _semantic/entities \ - _episodic/incidents _episodic/sessions _episodic/blockers \ - _procedural/runbooks _procedural/patterns _procedural/migrations; do - mkdir -p ${MNEMONIC_ROOT}/"$ORG"/"$ns" -done - -# Blackboard for session coordination (per-project) -mkdir -p ${MNEMONIC_ROOT}/"$ORG"/"$PROJECT"/.blackboard - -# Initialize standard blackboard topics -touch ${MNEMONIC_ROOT}/"$ORG"/"$PROJECT"/.blackboard/active-tasks.md -touch ${MNEMONIC_ROOT}/"$ORG"/"$PROJECT"/.blackboard/session-notes.md -touch ${MNEMONIC_ROOT}/"$ORG"/"$PROJECT"/.blackboard/shared-context.md -``` - -### Step 3: Initialize Git Repository - -```bash -if [ ! -d ${MNEMONIC_ROOT}/.git ]; then - cd ${MNEMONIC_ROOT} - git init - - cat > .gitignore << 'EOF' -# Lock files -*.lock - -# Temporary files -.blackboard/*.tmp -*.swp -*~ - -# OS files -.DS_Store -Thumbs.db -EOF - - git add . - git commit -m "Initialize mnemonic memory system" - cd - -fi -``` - -### Step 4: Verify Structure - -```bash -echo "=== Mnemonic Initialized ===" -echo "Organization: $ORG" -echo "Project: $PROJECT" -echo "" -echo "Memory path: ${MNEMONIC_ROOT}/$ORG/$PROJECT/" -echo "" -echo "Namespaces:" -echo " _semantic/decisions - Architectural choices" -echo " _semantic/knowledge - APIs, context, learnings" -echo " _semantic/entities - Entity definitions" -echo " _episodic/incidents - Production issues" -echo " _episodic/sessions - Debug sessions" -echo " _episodic/blockers - Impediments" -echo " _procedural/runbooks - Operational procedures" -echo " _procedural/patterns - Code conventions" -echo " _procedural/migrations - Migration steps" -``` - -## Output - -Display: -- Detected/configured organization -- Detected project name -- Memory path (unified under ${MNEMONIC_ROOT}/) -- Namespace list with descriptions -- Git status diff --git a/commands/search-enhanced.md b/commands/search-enhanced.md deleted file mode 100644 index 48d9fa1..0000000 --- a/commands/search-enhanced.md +++ /dev/null @@ -1,170 +0,0 @@ ---- -name: search-enhanced -allowed-tools: -- Task -- Bash -- Read -- Grep -- Glob -- Write -argument-hint: [--scope user|project|all] [--max-iterations 1-3] -description: Agent-driven iterative search with synthesis ---- - -## Memory - -Search first: `/mnemonic:search {relevant_keywords}` -Capture after: `/mnemonic:capture {namespace} "{title}"` - -Run `/mnemonic:list --namespaces` to see available namespaces from loaded ontologies. - - -# /mnemonic:search-enhanced - -Agent-driven iterative search across mnemonic memories with synthesis. Uses subcall agents for query refinement and produces comprehensive, synthesized answers. - -## Arguments - -- `` - Required. Search query or question -- `--scope` - Search scope: user, project, or all (default: all) -- `--max-iterations` - Maximum search iterations 1-3 (default: 3) - -## When to Use - -Use `/mnemonic:search-enhanced` instead of `/mnemonic:search` when: -- Query is complex or multi-faceted -- You want comprehensive coverage across namespaces -- You need a synthesized answer, not just file matches -- Topic may span multiple memory types - -For simple, fast searches use `/mnemonic:search` instead. - -## Procedure - -### Step 1: Parse Arguments - -```bash -QUERY="${1:?Error: Query required}" -SCOPE="${SCOPE:-all}" -MAX_ITERATIONS="${MAX_ITERATIONS:-3}" -``` - -### Step 2: Initialize - -```bash -echo "=== Enhanced Memory Search ===" -echo "Query: $QUERY" -echo "Scope: $SCOPE" -echo "Max iterations: $MAX_ITERATIONS" -echo "" -``` - -### Step 3: Invoke mnemonic-search-enhanced Skill - -The skill handles the full workflow: -1. Execute iterative search with subcall agents -2. Refine queries based on findings -3. Aggregate and deduplicate results -4. Synthesize comprehensive answer - -### Step 4: Display Results - -The skill produces structured markdown output: -- Summary answering the query -- Key findings by category -- Analysis connecting findings -- Source memory references -- Gaps and suggested follow-ups - -## Example Usage - -### Basic Enhanced Search - -``` -/mnemonic:search-enhanced "authentication security patterns" -``` - -### Project-Scoped Search - -``` -/mnemonic:search-enhanced "database performance" --scope project -``` - -### Quick Enhanced Search (1 iteration) - -``` -/mnemonic:search-enhanced "API endpoints" --max-iterations 1 -``` - -### Comprehensive Search - -``` -/mnemonic:search-enhanced "everything about our testing strategy" --max-iterations 3 -``` - -## Output Format - -```markdown -## Summary - -[2-3 sentence executive summary answering the query] - -## Key Findings - -### [Category] -- **[Memory Title]** (namespace, type) - - Key insight - - Evidence: "quote" - -## Analysis - -[Synthesis connecting findings] - -## Coverage - -- Iterations: 3 -- Memories examined: 45 -- Relevant memories: 12 -- Namespaces searched: _semantic/decisions, _semantic/knowledge, _procedural/patterns - -## Source Memories - -- [[uuid-1]] - Memory Title 1 -- [[uuid-2]] - Memory Title 2 - -## Gaps & Next Steps - -[Suggested follow-up searches] -``` - -## Performance - -| Metric | Typical Value | -|--------|---------------| -| Iterations | 2-3 | -| Runtime | 15-30 seconds | -| Memories examined | 20-50 | -| Context usage | 3-5k tokens | - -Enhanced search is slower than basic `/mnemonic:search` but provides: -- Comprehensive coverage across namespaces -- Synthesized answers (not just matches) -- Automatic query refinement -- Citation of source memories - -## Comparison - -| Feature | `/mnemonic:search` | `/mnemonic:search-enhanced` | -|---------|-------------------|----------------------------| -| Speed | Fast (~2s) | Slower (~20s) | -| Output | File matches | Synthesized answer | -| Refinement | None | Iterative | -| Coverage | Single pattern | Multi-pattern | -| Use case | Quick lookup | Comprehensive analysis | - -## Related - -- `/mnemonic:search` - Basic single-shot search -- `/mnemonic:recall` - Structured recall with filters -- `mnemonic-search` skill - Advanced search patterns -- `mnemonic-search-enhanced` skill - Full orchestration details diff --git a/commands/team-audit.md b/commands/team-audit.md deleted file mode 100644 index 27fdd80..0000000 --- a/commands/team-audit.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -name: team-audit -description: Comprehensive health audit with parallel agent remediation across all memory phases -allowed-tools: -- Bash -- Read -- Write -- Edit -- Glob -- Grep -- Task -argument-hint: '[--dry-run] [--phase 1|2|3|4|5|all]' ---- - -## Memory - -Search first: `/mnemonic:search {relevant_keywords}` -Capture after: `/mnemonic:capture {namespace} "{title}"` - -Run `/mnemonic:list --namespaces` to see available namespaces from loaded ontologies. - - -# /mnemonic:team-audit - -Comprehensive health audit of the mnemonic memory system with parallel agent remediation. - -## Arguments - -- `--dry-run` — Report issues without modifying files -- `--phase ` — Run a specific phase (1-5) or all phases (default: all) - -## Setup - -```bash -# Resolve MNEMONIC_ROOT from config -if [ -f "$HOME/.config/mnemonic/config.json" ]; then - RAW_PATH=$(python3 -c "import json; print(json.load(open('$HOME/.config/mnemonic/config.json')).get('memory_store_path', '~/.claude/mnemonic'))") - MNEMONIC_ROOT="${RAW_PATH/#\~/$HOME}" -else - MNEMONIC_ROOT="$HOME/.claude/mnemonic" -fi -``` - -## Phases - -Orchestrate a team of agents to execute phases in parallel where possible. - -### Phase 1: Duplicate Detection & Archival - -Scan all active memories (exclude `.archive/`) for duplicates across three vectors: - -1. **Same-topic duplicates within a namespace** — memories with similar titles/content about the same decision, pattern, or knowledge item. Use `lib.search.find_duplicates()` or Python fuzzy matching on titles. Read candidates to confirm. -2. **Cross-namespace duplicates** — identical memories in both `default/` and project-specific paths, or in both org-level and project-level paths. Keep project-specific, archive generic. -3. **Shared UUID duplicates** — memories with identical `id:` fields across different paths. Keep one, archive the other. - -For each confirmed duplicate cluster: keep the most complete/recent, archive the rest to `.archive/YYYY-MM/custodian-dedup/`. - -### Phase 2: Frontmatter Validation & Repair - -Validate all active memories against the MIF schema: - -- **Required fields**: `id` (valid UUID4), `type` (semantic|procedural|episodic), `title`, `created` (ISO 8601) -- **Placeholder detection**: Replace `PLACEHOLDER_UUID`, `MEMORY_ID_PLACEHOLDER`, `DATE_PLACEHOLDER`, `${UUID}`, `${DATE}` with real generated values -- **Type-path consistency**: `type:` must match directory path (`_semantic/` → semantic, `_procedural/` → procedural, `_episodic/` → episodic) -- **Namespace-path consistency**: `namespace:` must match cognitive triad path. Strip `/user`, `/project` suffixes. -- **Frontmatter delimiters**: Exactly 2 `---` per file. Replace extra `---` in body with `***`. -- **Broken merge templates**: Remove lines containing `> Merged from memory ${UUID}` or unresolved template variables. - -### Phase 3: Decay & Strength Management - -- **Add decay fields** to memories missing them: `strength: 1.0`, `half_life:` (per defaults), `last_accessed:` (file mtime), `decay_model: exponential` -- **Recalculate stale strengths**: `strength = 0.5^(days_since_access / half_life_days)` -- **Normalize schema**: Flatten nested `decay:` blocks to top-level fields - -**Half-life defaults:** - -| Namespace | Half-life | -|-----------|-----------| -| `_semantic/decisions` | P180D | -| `_semantic/knowledge` | P90D | -| `_procedural/patterns` | P180D | -| `_procedural/runbooks` | P180D | -| `_episodic/blockers` | P30D | -| `_episodic/sessions` | P30D | -| `_episodic/incidents` | P60D | - -### Phase 4: Link Validation - -- Find all `[[wiki-links]]` in memory bodies. Check if targets exist. Replace broken links with plain text. -- Validate frontmatter `relationships:` entries against the canonical MIF relationship registry (all supported types including inverse forms, both snake_case and PascalCase). Remove references to non-existent memories or invalid relationship types. - -### Phase 5: Prevention — Capture Workflow Audit - -Audit the mnemonic plugin source for correctness: - -1. **Capture template** (`skills/mnemonic-core/SKILL.md`): Verify minimal format includes `namespace`, `confidence`, `strength`, `half_life`, `last_accessed`, `decay_model`, `provenance`. -2. **Dedup check** (`skills/mnemonic-core/SKILL.md`, `references/capture.md`, `commands/capture.md`): Verify mandatory search-before-capture step exists. -3. **Namespace routing**: Verify memories route to `${ORG}/${PROJECT}/${NAMESPACE}`, not `default/` or bare org paths. - -## Deliverables - -After all phases, report: - -| Metric | Value | -|--------|-------| -| Active memories before/after | | -| Duplicates archived (by type) | | -| Frontmatter issues fixed (by category) | | -| Decay coverage % | | -| Broken links repaired | | -| Prevention measures verified | | diff --git a/docs/adrs/adr-001-filesystem-based-storage.md b/docs/adrs/adr-001-filesystem-based-storage.md index cfe385e..8211e11 100644 --- a/docs/adrs/adr-001-filesystem-based-storage.md +++ b/docs/adrs/adr-001-filesystem-based-storage.md @@ -250,8 +250,8 @@ This decision is supported by independent research: | Finding | Files | Lines | Assessment | |---------|-------|-------|------------| -| Memory files use .memory.md extension | `skills/mnemonic-core/SKILL.md` | L152-L176 | compliant | -| YAML frontmatter structure defined | `skills/mnemonic-format/SKILL.md` | L1-L50 | compliant | +| Memory files use .memory.md extension | `skills/core/SKILL.md` | L152-L176 | compliant | +| YAML frontmatter structure defined | `skills/format/SKILL.md` | L1-L50 | compliant | | Git integration in capture workflow | `commands/capture.md` | L131-L138 | compliant | | Namespace directory structure | `commands/setup.md` | L47-L58 | compliant | diff --git a/docs/adrs/adr-002-mif-level-3-format.md b/docs/adrs/adr-002-mif-level-3-format.md index f982b32..9fbf2dc 100644 --- a/docs/adrs/adr-002-mif-level-3-format.md +++ b/docs/adrs/adr-002-mif-level-3-format.md @@ -242,11 +242,11 @@ Mitigations for negative consequences: | Finding | Files | Lines | Assessment | |---------|-------|-------|------------| -| MIF Level 3 frontmatter template | `skills/mnemonic-core/SKILL.md` | L346-L394 | compliant | -| Cognitive type classification | `skills/mnemonic-core/SKILL.md` | L143-L149 | compliant | +| MIF Level 3 frontmatter template | `skills/core/SKILL.md` | L346-L394 | compliant | +| Cognitive type classification | `skills/core/SKILL.md` | L143-L149 | compliant | | Temporal fields in capture | `commands/capture.md` | L99-L116 | compliant | | Provenance tracking | `commands/capture.md` | L112-L115 | compliant | -| Decay model support | `skills/mnemonic-format/SKILL.md` | L1-L50 | compliant | +| Decay model support | `skills/format/SKILL.md` | L1-L50 | compliant | **Summary:** MIF Level 3 format implementation follows specification. diff --git a/docs/adrs/adr-004-mif-schema-validation.md b/docs/adrs/adr-004-mif-schema-validation.md index b1851bf..16f7149 100644 --- a/docs/adrs/adr-004-mif-schema-validation.md +++ b/docs/adrs/adr-004-mif-schema-validation.md @@ -1,6 +1,6 @@ --- title: "MIF Schema as Single Source of Truth for Validation" -description: "Validation tool parses MIF schema from mnemonic-format SKILL.md directly" +description: "Validation tool parses MIF schema from format SKILL.md directly" type: adr category: architecture tags: @@ -38,7 +38,7 @@ The mnemonic system needs a validation tool to ensure memory files conform to th ### Current State -The MIF Level 3 specification is documented in `skills/mnemonic-format/SKILL.md`, which includes: +The MIF Level 3 specification is documented in `skills/format/SKILL.md`, which includes: - Required fields and their types - Valid enum values for type, source_type, etc. - Validation rules section with specific checks @@ -109,7 +109,7 @@ The MIF Level 3 specification is documented in `skills/mnemonic-format/SKILL.md` ### Option 3: Parse Schema from SKILL.md (Selected) -**Description**: Validation tool parses rules directly from `mnemonic-format/SKILL.md`. +**Description**: Validation tool parses rules directly from `format/SKILL.md`. **Technical Characteristics**: - SKILL.md is authoritative source @@ -133,7 +133,7 @@ The MIF Level 3 specification is documented in `skills/mnemonic-format/SKILL.md` ## Decision -We will parse validation rules directly from `skills/mnemonic-format/SKILL.md`. +We will parse validation rules directly from `skills/format/SKILL.md`. ### Parsing Strategy @@ -149,7 +149,7 @@ The validation tool will extract: ```python def parse_mif_schema(skill_path: Path) -> MIFSchema: - """Parse MIF schema from mnemonic-format SKILL.md.""" + """Parse MIF schema from format SKILL.md.""" content = skill_path.read_text() schema = MIFSchema() diff --git a/docs/adrs/adr-008-custom-ontologies.md b/docs/adrs/adr-008-custom-ontologies.md index 5d190d8..faa20bd 100644 --- a/docs/adrs/adr-008-custom-ontologies.md +++ b/docs/adrs/adr-008-custom-ontologies.md @@ -318,7 +318,7 @@ mnemonic/ 1. `hooks/session_start.py` - Load ontologies 2. `commands/capture.md` - Ontology-aware capture 3. `tools/mnemonic-validate` - Ontology validation -4. `skills/mnemonic-format/SKILL.md` - Document ontology fields +4. `skills/format/SKILL.md` - Document ontology fields 5. `.claude-plugin/plugin.json` - Register new components ## Validation diff --git a/docs/adrs/adr-009-unified-path-resolution.md b/docs/adrs/adr-009-unified-path-resolution.md index cab6079..5273687 100644 --- a/docs/adrs/adr-009-unified-path-resolution.md +++ b/docs/adrs/adr-009-unified-path-resolution.md @@ -406,7 +406,6 @@ Convert Bash commands to Python: - [lib/paths.py](../../lib/paths.py) - Implementation - [tests/unit/test_paths.py](../../tests/unit/test_paths.py) - Tests -- [docs/architecture/path-resolution-integration.md](../architecture/path-resolution-integration.md) - Integration guide - [ADR-004: MIF Schema Validation](adr-004-mif-schema-validation.md) - Related MIF schema decision ## References diff --git a/docs/agent-coordination.md b/docs/agent-coordination.md deleted file mode 100644 index 683e548..0000000 --- a/docs/agent-coordination.md +++ /dev/null @@ -1,76 +0,0 @@ -# Multi-Agent Coordination - -This document describes how agents in the mnemonic system coordinate their work. - -## Coordination Model - -Agent coordination uses two distinct mechanisms based on scope: - -| Scope | Mechanism | When | -|-------|-----------|------| -| **In-session** | Claude Code native swarm | Agents working together in a single session | -| **Cross-session** | Mnemonic blackboard handoff | Passing context to the next session | - -### In-Session: Native Swarm - -For real-time coordination between agents within a single session, use Claude Code's built-in tools: - -- **TeamCreate**: Create a team with shared task list -- **TaskCreate / TaskUpdate / TaskList**: Track and assign work items -- **SendMessage**: Direct messages between agents -- **Task tool**: Spawn specialized subagents - -These tools handle registration, status tracking, task handoff, shared state, and progress reporting natively. The mnemonic blackboard is **not** used for in-session coordination. - -### Cross-Session: Blackboard Handoff - -For context that must survive between sessions, the blackboard provides automatic handoff: - -``` -${MNEMONIC_ROOT}/.blackboard/ -├── sessions/{session_id}/ # Session audit trail -│ ├── session-notes.md # Activity log -│ └── _meta.json # Lifecycle metadata -└── handoff/ - ├── latest-handoff.md # Active handoff (overwritten each session) - └── handoff-{session_id}.md # Archived handoffs -``` - -**Lifecycle:** -1. `hooks/session_start.py` reads `handoff/latest-handoff.md` at session start -2. `hooks/stop.py` writes handoff summary at session end - -This is fully automatic via hooks. - -## Agents - -| Agent | Purpose | -|-------|---------| -| `memory-curator` | Maintenance, conflict detection, deduplication | -| `mnemonic-search-subcall` | Individual search iterations | -| `compression-worker` | Memory summarization | -| `search-enhanced` (orchestrator) | Coordinates multi-round search | - -## Path Resolution - -Use `lib.paths.PathResolver` or the CLI tool: - -```bash -MNEMONIC_ROOT=$(tools/mnemonic-paths root) -BLACKBOARD=$(tools/mnemonic-paths blackboard) -HANDOFF_DIR=${BLACKBOARD}/handoff -``` - -## Best Practices - -1. **Use native swarm for in-session work** - TeamCreate, SendMessage, TaskCreate -2. **Let hooks handle cross-session handoff** - Automatic via session lifecycle -3. **Capture persistent knowledge as memories** - Insights that outlast the next session belong in `*.memory.md` -4. **Keep handoffs actionable** - Focus on what the next session needs - -## Related Documentation - -- [Blackboard Skill](../skills/mnemonic-blackboard/SKILL.md) - Blackboard patterns and handoff format -- [Agent Coordination Skill](../skills/mnemonic-agent-coordination/SKILL.md) - Coordination patterns -- [ADR-003](adrs/adr-003-agent-coordination-blackboard.md) - Original blackboard decision -- [ADR-011](adrs/adr-011-session-scoped-blackboard.md) - Session-scoped blackboard decision diff --git a/docs/api-reference.md b/docs/api-reference.md deleted file mode 100644 index 54735ea..0000000 --- a/docs/api-reference.md +++ /dev/null @@ -1,488 +0,0 @@ -# Python API Reference - -Complete reference for Mnemonic's Python libraries. - -## Overview - -Mnemonic provides Python libraries for path resolution, memory operations, search, ontology loading, and relationship management. These libraries power the hooks and can be used to extend the system. - -## lib.paths - -Centralized path resolution for all mnemonic memory operations. - -### Classes - -#### PathScheme - -Path scheme versions for migration support. - -````python -from lib.paths import PathScheme - -PathScheme.LEGACY # Current: dual location, flat namespace -PathScheme.V2 # Target: unified user-level, project hierarchy -```` - -#### Scope - -Memory scope for organization. - -````python -from lib.paths import Scope - -Scope.USER # Cross-project memories -Scope.PROJECT # Project-specific memories -Scope.ORG # Organization-wide memories (V2 only) -```` - -#### PathContext - -Context information for path resolution. - -````python -from lib.paths import PathContext - -# Auto-detect context -context = PathContext.detect() - -# Specify scheme -context = PathContext.detect(scheme=PathScheme.V2) - -# Fields -context.org # Organization name (from git remote) -context.project # Project name (from git remote) -context.home_dir # User home directory -context.project_dir # Current project directory -context.scheme # PathScheme to use -```` - -#### PathResolver - -Central path resolver for all mnemonic operations. - -````python -from lib.paths import PathResolver, Scope - -# Initialize with auto-detected context -resolver = PathResolver() - -# Initialize with custom context -resolver = PathResolver(context=custom_context) -```` - -**Methods:** - -- **`get_memory_dir(namespace: str, scope: Scope) -> Path`** - - Get directory for storing memories. - - ````python - memory_dir = resolver.get_memory_dir("_semantic/decisions", Scope.PROJECT) - # Returns: /path/to/project/.claude/mnemonic/_semantic/decisions - ```` - -- **`get_memory_path(namespace: str, filename: str, scope: Scope) -> Path`** - - Get full path for a memory file. - - ````python - path = resolver.get_memory_path("_semantic/decisions", "slug.memory.md", Scope.PROJECT) - ```` - -- **`get_search_paths(namespace: str, include_user: bool = True, include_project: bool = True, include_org: bool = False) -> list[Path]`** - - Get ordered list of paths to search for memories. - - ````python - paths = resolver.get_search_paths("_semantic/decisions") - # Returns: [project_path, user_path] (in priority order) - ```` - -- **`get_blackboard_dir(scope: Scope) -> Path`** - - Get blackboard directory for cross-session coordination. - - ````python - blackboard = resolver.get_blackboard_dir(Scope.PROJECT) - ```` - -- **`get_ontology_paths() -> list[Path]`** - - Get ordered list of ontology file paths to check (project > user/org levels). - Does not include the bundled MIF base ontology, which is resolved separately via `lib.ontology.get_ontology_file()`. - -- **`get_all_memory_roots() -> list[Path]`** - - Get all memory root directories. - -### Convenience Functions - -````python -from lib.paths import ( - get_memory_dir, - get_search_paths, - get_blackboard_dir, - get_all_memory_roots_with_legacy, -) - -# Get memory directory (string scope) -memory_dir = get_memory_dir("_semantic/decisions", scope="project") - -# Get full memory path -path = get_memory_path("_semantic/decisions", "slug.memory.md", scope="project") - -# Get search paths -paths = get_search_paths("_semantic/decisions", include_user=True) - -# Get blackboard -blackboard = get_blackboard_dir(scope="project") - -# Get all memory roots -roots = get_all_memory_roots() -```` - -## lib.config - -Configuration management. - -### Classes - -#### MnemonicConfig - -````python -from lib.config import MnemonicConfig - -# Load configuration -config = MnemonicConfig.load() - -# Access fields -config.memory_store_path # Path to memory root directory -```` - -### Functions - -- **`get_memory_root() -> Path`** - - Get configured memory root directory. - -## lib.memory_reader - -Memory file metadata extraction. - -### Functions - -- **`get_memory_summary(path: str, max_summary: int = 300) -> dict`** - - Extract summary from memory file. - - ````python - from lib.memory_reader import get_memory_summary - - summary = get_memory_summary("/path/to/memory.memory.md") - # Returns: {"path": "...", "title": "...", "summary": "...", ...} - ```` - -- **`get_memory_metadata(path: str, max_summary: int = 300) -> Optional[dict]`** - - Extract frontmatter metadata from memory file. - - ````python - from lib.memory_reader import get_memory_metadata - - metadata = get_memory_metadata("/path/to/memory.memory.md") - # Returns: {"id": "...", "type": "...", "title": "...", ...} - ```` - -## lib.search - -Memory search and scoring. - -### Functions - -- **`search_memories(topic: str, max_results: int = 3) -> list[str]`** - - Search mnemonic for memories matching topic. - - ````python - from lib.search import search_memories - - results = search_memories("authentication", max_results=5) - # Returns: ["/path/to/memory1.memory.md", "/path/to/memory2.memory.md", ...] - ```` - -- **`find_related_memories(context: str, max_results: int = 3) -> list[str]`** - - Find memories related to given context. - -- **`find_memories_for_context(context: dict) -> list[str]`** - - Find memories for file context dictionary. - - ````python - from lib.search import find_memories_for_context - - context = { - "file_path": "src/auth/login.py", - "namespace": "_semantic/decisions", - "keywords": "authentication login" - } - results = find_memories_for_context(context) - ```` - -- **`detect_file_context(file_path: str, file_patterns: list) -> Optional[dict]`** - - Detect namespace and keywords from file path using ontology patterns. - -- **`detect_namespace_for_file(file_path: str, file_patterns: list) -> str`** - - Detect namespace for a file path. - -- **`extract_keywords_from_path(file_path: str) -> str`** - - Extract keywords from file path. - -- **`extract_topic(prompt: str) -> str`** - - Extract topic keywords from user prompt. - -- **`find_related_memories_scored(context: str, max_results: int = 10, threshold: float = 0.3) -> list[tuple[str, float]]`** - - Find related memories with relevance scores. - - ````python - from lib.search import find_related_memories_scored - - results = find_related_memories_scored("database migration", max_results=10, threshold=0.5) - # Returns: [("/path/to/memory.memory.md", 0.85), ...] - ```` - -- **`find_duplicates(namespace: str = None, threshold: float = 0.8) -> list[tuple[str, str, float]]`** - - Find potential duplicate memories. - -## lib.relationships - -Memory relationship management. - -### Functions - -- **`to_pascal(snake: str) -> str`** - - Convert snake_case to PascalCase. - -- **`to_snake(pascal: str) -> str`** - - Convert PascalCase to snake_case. - -- **`get_inverse(rel_type: str) -> str`** - - Get inverse of a relationship type. - - ````python - from lib.relationships import get_inverse - - inverse = get_inverse("supersedes") # Returns: "SupersededBy" - ```` - -- **`is_valid_type(rel_type: str) -> bool`** - - Check if relationship type is valid. - -- **`is_symmetric(rel_type: str) -> bool`** - - Check if relationship type is symmetric. - -- **`get_all_valid_types() -> set[str]`** - - Get all valid relationship types. - -- **`add_relationship(memory_path: str, rel_type: str, target_id: str, label: str = None) -> bool`** - - Add a relationship to a memory file. - - ````python - from lib.relationships import add_relationship - - success = add_relationship( - memory_path="/path/to/source.memory.md", - rel_type="relates_to", - target_id="550e8400-e29b-41d4-a716-446655440000", - label="Related decision" - ) - ```` - -- **`add_bidirectional_relationship(source_path: str, target_path: str, rel_type: str, label: str = None) -> tuple[bool, bool]`** - - Add bidirectional relationship between two memories. - -## lib.ontology - -Ontology loading and management for the bundled MIF base ontology and any project/user ontologies. - -### Functions - -- **`get_ontology_file() -> Optional[Path]`** - - Get the path to the bundled MIF base ontology used as the fallback ontology. - This does not return project or user custom ontology paths; those are - discovered via `PathResolver.get_ontology_paths()`. - -- **`load_ontology_data() -> dict`** - - Load ontology data starting from the bundled base ontology, and then apply - any project/user ontologies discovered via `PathResolver.get_ontology_paths()`. - -- **`load_file_patterns() -> list`** - - Load file discovery patterns from the effective ontology (base plus any - discovered custom ontologies). - -- **`load_content_patterns() -> dict`** - - Load content discovery patterns from the effective ontology. - -- **`load_ontology_namespaces() -> list`** - - Load namespace hierarchy from the effective ontology. - -- **`get_fallback_file_patterns() -> list`** - - Get default file patterns if no ontology exists. - -- **`get_fallback_content_patterns() -> dict`** - - Get default content patterns if no ontology exists. - -## Usage Examples - -### Complete Memory Capture Workflow - -````python -from lib.paths import PathResolver, Scope -from lib.ontology import load_ontology_data -from lib.relationships import add_relationship -import uuid -from datetime import datetime - -# Initialize resolver -resolver = PathResolver() - -# Generate memory metadata -memory_id = str(uuid.uuid4()) -timestamp = datetime.utcnow().isoformat() + "Z" - -# Get memory directory -namespace = "_semantic/decisions" -memory_dir = resolver.get_memory_dir(namespace, Scope.PROJECT) -memory_dir.mkdir(parents=True, exist_ok=True) - -# Create memory file -filename = f"{memory_id[:8]}-use-postgresql.memory.md" -memory_path = resolver.get_memory_path(namespace, filename, Scope.PROJECT) - -# Write memory with frontmatter -content = f"""--- -id: {memory_id} -type: semantic -namespace: {namespace} -created: {timestamp} -modified: {timestamp} -title: "Use PostgreSQL for storage" -tags: - - database - - architecture -provenance: - source_type: conversation - agent: claude-opus-4 - confidence: 0.95 ---- - -# Use PostgreSQL for Storage - -We decided to use PostgreSQL for our data storage needs. - -## Rationale -- Strong ACID compliance -- Excellent JSON support -- Mature ecosystem -""" - -memory_path.write_text(content) - -# Add relationship to another memory -add_relationship( - source_path=str(memory_path), - target_id="a5e46807-6883-4fb2-be45-09872ae1a994", - rel_type="relates_to", - label="Related caching decision" -) -```` - -### Search and Retrieve Memories - -````python -from lib.search import search_memories, find_related_memories_scored -from lib.memory_reader import get_memory_metadata - -# Search for memories -results = search_memories("database", max_results=5) - -# Get scored results -scored_results = find_related_memories_scored("authentication security", threshold=0.5) - -# Read metadata -for path, score in scored_results[:3]: - metadata = get_memory_metadata(path) - if metadata: - print(f"Title: {metadata['title']} (Score: {score:.2f})") - print(f"Tags: {', '.join(metadata.get('tags', []))}") -```` - -### Custom Ontology Integration - -````python -from lib.ontology import load_ontology_data, load_file_patterns -from lib.search import detect_file_context - -# Load ontology -ontology = load_ontology_data() -file_patterns = load_file_patterns() - -# Detect context for a file -context = detect_file_context("src/auth/login.py", file_patterns) -if context: - print(f"Namespace: {context['namespace']}") - print(f"Keywords: {context['keywords']}") -```` - -## Testing - -All libraries support dependency injection for testing: - -````python -from lib.paths import PathResolver, PathContext, PathScheme -from pathlib import Path - -# Create test context -test_context = PathContext( - org="test-org", - project="test-project", - home_dir=Path("/tmp/test-home"), - project_dir=Path("/tmp/test-project"), - scheme=PathScheme.V2 -) - -# Create resolver with test context -resolver = PathResolver(context=test_context) - -# Now all paths use test context -memory_dir = resolver.get_memory_dir("_semantic/decisions", Scope.PROJECT) -# Returns: /tmp/test-project/.claude/mnemonic/_semantic/decisions -```` - -## See Also - -- [Architecture](architecture.md) - System architecture overview -- [CLI Usage](cli-usage.md) - Command-line operations -- [lib/README.md](../lib/README.md) - Path resolution library details -- [Validation](validation.md) - Memory validation guide diff --git a/docs/architecture.md b/docs/architecture.md index 93148eb..3566fc9 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -64,24 +64,24 @@ Simple slash commands for direct user interaction: | `/mnemonic:setup` | Initialize and configure mnemonic | | `/mnemonic:capture` | Create a new memory | | `/mnemonic:recall` | Retrieve memories | -| `/mnemonic:search` | Full-text search | -| `/mnemonic:search-enhanced` | Agent-driven iterative search with synthesis | +| `/mnemonic:search` | Full-text search and iterative synthesis | | `/mnemonic:status` | System status | | `/mnemonic:gc` | Garbage collection | -| `/mnemonic:init` | Initialize directories | ### Skills Self-contained instruction sets that work without external dependencies: -- **mnemonic-core**: Complete memory operations -- **mnemonic-setup**: CLAUDE.md configuration -- **mnemonic-search**: Advanced search patterns -- **mnemonic-search-enhanced**: Agent-driven iterative search with synthesis -- **mnemonic-format**: MIF Level 3 templates and schema -- **mnemonic-organization**: Namespace management -- **mnemonic-blackboard**: Cross-session coordination -- **mnemonic-agent-coordination**: Multi-agent coordination patterns +- **core**: Complete memory operations +- **setup**: CLAUDE.md configuration +- **search**: Advanced search patterns and iterative synthesis +- **format**: MIF Level 3 templates and schema +- **blackboard**: Cross-session coordination and agent patterns +- **ontology**: Custom ontology support with entity types and discovery +- **custodian**: Memory health checks and maintenance +- **integrate**: Plugin integration via sentinel markers +- **qmd-setup**: Semantic search bootstrap +- **qmd-reindex**: Memory re-indexing for semantic search ### Hooks @@ -114,7 +114,7 @@ Autonomous background operations: - **mnemonic-search-subcall**: Efficient search agent for iterative query refinement (Haiku model) - **compression-worker**: Memory summarization for gc --compress (Haiku model) -Agents coordinate through the blackboard pattern. See [Agent Coordination](agent-coordination.md) for details. +Agents coordinate through the blackboard pattern. See the [blackboard skill](../skills/blackboard/SKILL.md) for details. ### Tools @@ -321,11 +321,11 @@ Agents coordinate using the blackboard pattern (ADR-003): ▲ ▲ ▲ │ │ │ ┌────────┴─────┐ ┌────────┴─────┐ ┌────────┴─────┐ -│memory-curator│ │search-subcall│ │search-enhanced│ +│memory-curator│ │search-subcall│ │compress-worker│ └──────────────┘ └──────────────┘ └───────────────┘ ``` -See [Agent Coordination](agent-coordination.md) for patterns. +See the [blackboard skill](../skills/blackboard/SKILL.md) for patterns. ## Performance Considerations @@ -338,16 +338,5 @@ See [Agent Coordination](agent-coordination.md) for patterns. ## Related Documentation -### Technical - [Validation](validation.md) - MIF schema validation -- [Agent Coordination](agent-coordination.md) - Multi-agent patterns - [ADRs](adrs/README.md) - Architectural decisions - -### Enterprise -- [Research Validation](enterprise/research-validation.md) - Academic foundations (Letta LoCoMo benchmark, Unix philosophy) -- [Compliance & Governance](enterprise/compliance-governance.md) - Audit trails, data sovereignty -- [Deployment Guide](enterprise/deployment-guide.md) - Installation and team sharing - -### Community -- [Migration from Memory Bank](archive/community/migration-from-memory-bank.md) - For existing Memory Bank users -- [Comparison](archive/community/mnemonic-vs-memory-bank.md) - Mnemonic vs Memory Bank features diff --git a/docs/architecture/CLEAN-ARCHITECTURE-BLUEPRINT.md b/docs/architecture/CLEAN-ARCHITECTURE-BLUEPRINT.md deleted file mode 100644 index 2ee4f0f..0000000 --- a/docs/architecture/CLEAN-ARCHITECTURE-BLUEPRINT.md +++ /dev/null @@ -1,752 +0,0 @@ -# Clean Architecture Blueprint: Unified Memory Path Resolution - -**Status**: Phase 1 Complete ✓ - -**Created**: 2026-01-26 - -**Goal**: Consolidate mnemonic memory storage to unified user-level storage with clean abstractions that make future changes easy. - ---- - -## Executive Summary - -This blueprint implements a **centralized path resolution system** that: - -1. Eliminates scattered path construction logic across 30+ files -2. Provides clean abstractions with a single source of truth -3. Supports migration from current (LEGACY) to target (V2) path structure -4. Makes all path logic testable and mockable -5. Enables smooth transition without breaking existing installations - -**Architecture Pattern**: Dependency Injection + Strategy Pattern + Pure Functions - ---- - -## Current State → Target State - -### Current (LEGACY Scheme) - -**User-level** (cross-project): -``` -${MNEMONIC_ROOT}/{org}/{namespace}/ -${MNEMONIC_ROOT}/default/{namespace}/ -``` - -**Project-level** (codebase-specific): -``` -./.claude/mnemonic/{namespace}/ -``` - -**Pain Points**: -- Path logic scattered in 18 Python files + 16 command files -- Each component reimplements org/project detection -- Difficult to test (hardcoded paths) -- Hard to migrate to new structure -- Dual locations create confusion - -### Target (V2 Scheme) - -**Unified user-level** (everything in home): -``` -${MNEMONIC_ROOT}/{org}/{project}/{semantic,episodic,procedural}/{sub-namespace}/ -${MNEMONIC_ROOT}/{org}/{semantic,episodic,procedural}/{sub-namespace}/ -${MNEMONIC_ROOT}/{org}/{project}/.blackboard/ -``` - -**Benefits**: -- Single location for all memories -- Clear project isolation -- Org-wide shared knowledge -- Simpler search (one root) -- Better Git versioning - ---- - -## Architecture Design - -### Component Diagram - -``` -┌─────────────────────────────────────────────────────────────┐ -│ Mnemonic System │ -├─────────────────────────────────────────────────────────────┤ -│ │ -│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ -│ │ Hooks │ │ Commands │ │ Scripts │ │ -│ │ │ │ │ │ │ │ -│ │ session_start│ │ capture │ │ migrate │ │ -│ │ user_prompt │ │ search │ │ cleanup │ │ -│ │ pre_tool_use │ │ recall │ │ │ │ -│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ -│ │ │ │ │ -│ └─────────────────┼─────────────────┘ │ -│ │ │ -│ ┌────────▼─────────┐ │ -│ │ PathResolver │ ◄───────────┐ │ -│ │ │ │ │ -│ │ - get_memory_dir │ │ │ -│ │ - get_search_paths│ │ │ -│ │ - get_blackboard │ │ │ -│ └────────┬─────────┘ │ │ -│ │ │ │ -│ ┌────────▼─────────┐ ┌────────┴──────┐ │ -│ │ PathContext │ │ PathScheme │ │ -│ │ │ │ │ │ -│ │ - org │ │ - LEGACY │ │ -│ │ - project │ │ - V2 │ │ -│ │ - home_dir │ └───────────────┘ │ -│ │ - project_dir │ │ -│ │ - scheme │ │ -│ └──────────────────┘ │ -│ │ -└─────────────────────────────────────────────────────────────┘ -``` - -### Core Module: `lib/paths.py` - -**Purpose**: Single source of truth for all path construction - -**Key Classes**: - -1. **PathResolver** - Central path resolution logic - - Computes paths based on context and scheme - - No I/O operations (pure functions) - - Supports multiple schemes (LEGACY, V2) - -2. **PathContext** - Environment context - - Organization (from git remote) - - Project name (from git remote) - - Directories and scheme - - Auto-detection or explicit creation - -3. **PathScheme** - Strategy enum - - LEGACY: Current dual-location - - V2: Target unified structure - -4. **Scope** - Memory scope enum - - USER: Cross-project - - PROJECT: Project-specific - - ORG: Organization-wide (V2) - -**Design Principles**: - -1. **Pure Functions**: Path computation only, no I/O -2. **Dependency Injection**: Accept context for testing -3. **Strategy Pattern**: Switch behavior via PathScheme -4. **Fail Fast**: Type system catches errors early -5. **Explicit Over Implicit**: Clear parameter names - ---- - -## Implementation Map - -### Phase 1: Core Library ✓ (COMPLETE) - -**Files Created**: -- `/Users/AllenR1_1/Projects/zircote/mnemonic/lib/__init__.py` - Package initialization -- `/Users/AllenR1_1/Projects/zircote/mnemonic/lib/paths.py` - Core implementation (500 lines) -- `/Users/AllenR1_1/Projects/zircote/mnemonic/lib/README.md` - Library documentation -- `/Users/AllenR1_1/Projects/zircote/mnemonic/tests/unit/test_paths.py` - Unit tests (26 tests, all passing) -- `/Users/AllenR1_1/Projects/zircote/mnemonic/scripts/migrate_to_v2_paths.py` - Migration script -- `/Users/AllenR1_1/Projects/zircote/mnemonic/docs/adrs/adr-009-unified-path-resolution.md` - Architecture decision -- `/Users/AllenR1_1/Projects/zircote/mnemonic/docs/architecture/path-resolution-integration.md` - Integration guide -- `/Users/AllenR1_1/Projects/zircote/mnemonic/docs/architecture/CLEAN-ARCHITECTURE-BLUEPRINT.md` - This document - -**Test Results**: -``` -26 passed in 0.03s -- 8 tests for LEGACY scheme -- 9 tests for V2 scheme -- 9 tests for edge cases and convenience functions -``` - -**Status**: Ready for integration - -### Phase 2: Python Components Integration (Week 2) - -**Priority 1: Migration Scripts** (Low risk, not user-facing) - -Files to modify: -- `/Users/AllenR1_1/Projects/zircote/mnemonic/scripts/migrate_scope_paths.py` - - Replace hardcoded paths with `resolver.get_all_memory_roots()` - - Use `PathResolver` for computing new paths - -- `/Users/AllenR1_1/Projects/zircote/mnemonic/scripts/migrate_namespaces.py` - - Use `resolver.get_memory_dir()` for namespace paths - - Simplify org/project detection - -- `/Users/AllenR1_1/Projects/zircote/mnemonic/scripts/cleanup_memory_paths.py` - - Use `resolver.get_all_memory_roots()` for discovery - - Remove duplicated path logic - -**Priority 2: Ontology System** (Medium risk) - -Files to modify: -- `/Users/AllenR1_1/Projects/zircote/mnemonic/skills/ontology/lib/ontology_registry.py` - - Add `__init__(self, resolver: PathResolver = None)` - - Use `resolver.get_ontology_paths()` - - Remove hardcoded path construction - -- `/Users/AllenR1_1/Projects/zircote/mnemonic/skills/ontology/lib/ontology_loader.py` - - Accept resolver in constructor - - Use resolver for loading paths - -- `/Users/AllenR1_1/Projects/zircote/mnemonic/skills/ontology/lib/entity_resolver.py` - - Use resolver for entity path resolution - -**Priority 3: Hooks** (Higher risk, frequently executed) - -Files to modify: -- `/Users/AllenR1_1/Projects/zircote/mnemonic/hooks/session_start.py` - ```python - # OLD (lines 180-209): - def count_memories_by_namespace(home: Path, org: str) -> dict: - paths = [ - home / ".claude" / "mnemonic" / org, - home / ".claude" / "mnemonic" / "default", - Path.cwd() / ".claude" / "mnemonic", - ] - # Manual iteration... - - # NEW: - from lib.paths import PathResolver - - def count_memories_by_namespace(resolver: PathResolver) -> dict: - counts = {} - for root in resolver.get_all_memory_roots(): - for memory_file in root.rglob("*.memory.md"): - # Count logic... - return counts - ``` - -- `/Users/AllenR1_1/Projects/zircote/mnemonic/hooks/user_prompt_submit.py` - ```python - # OLD (line 137): - mnemonic_dir = Path.home() / ".claude" / "mnemonic" - - # NEW: - from lib.paths import PathResolver - resolver = PathResolver() - search_paths = resolver.get_search_paths(include_user=True, include_project=True) - ``` - -- `/Users/AllenR1_1/Projects/zircote/mnemonic/hooks/pre_tool_use.py` -- `/Users/AllenR1_1/Projects/zircote/mnemonic/hooks/post_tool_use.py` -- `/Users/AllenR1_1/Projects/zircote/mnemonic/hooks/stop.py` - -**Priority 4: Tests** (Refactor for testability) - -Files to modify: -- `/Users/AllenR1_1/Projects/zircote/mnemonic/.claude/tests/conftest.py` - ```python - # Add resolver fixtures - @pytest.fixture - def test_resolver(tmp_path): - """Resolver with isolated paths.""" - context = PathContext( - org="testorg", - project="testproject", - home_dir=tmp_path / "home", - project_dir=tmp_path / "project", - scheme=PathScheme.LEGACY, - ) - return PathResolver(context) - ``` - -- Update all test files to use `test_resolver` fixture -- Remove hardcoded paths from tests - -### Phase 3: Command Migration (Week 3) - -Convert Bash commands to Python for better path handling: - -**New Python Commands**: - -1. `commands/capture.py` (convert from capture.md) - ```python - from lib.paths import PathResolver, Scope - - def capture_memory(namespace: str, title: str, scope: str = "project"): - resolver = PathResolver() - scope_enum = Scope.PROJECT if scope == "project" else Scope.USER - - memory_dir = resolver.get_memory_dir(namespace, scope_enum) - memory_dir.mkdir(parents=True, exist_ok=True) - - memory_path = resolver.get_memory_path( - namespace, - f"{slug}.memory.md", - scope_enum - ) - # Write memory... - ``` - -2. `commands/search.py` (convert from search.md) - ```python - def search_memories(pattern: str, namespace: str = None): - resolver = PathResolver() - search_paths = resolver.get_search_paths(namespace) - - for path in search_paths: - subprocess.run(["rg", pattern, str(path), "--glob", "*.memory.md"]) - ``` - -3. `commands/init.py` (convert from init.md) -4. `commands/recall.py` (convert from recall.md) - -**Benefits**: -- Better error handling -- Consistent path resolution -- Easier to test -- Type safety - -### Phase 4: V2 Scheme Enablement (Week 4) - -**Configuration File** (`${MNEMONIC_ROOT}/config.yaml`): -```yaml -# Path scheme configuration -paths: - scheme: legacy # or "v2" - custom_home: null # optional override - -# Migration settings -migration: - auto_migrate: false - backup_before_migrate: true -``` - -**Migration Command**: `/mnemonic:migrate` -```bash -# Preview migration -/mnemonic:migrate --to-v2 --dry-run - -# Execute migration with backup -/mnemonic:migrate --to-v2 - -# Rollback if needed -/mnemonic:migrate --rollback /path/to/backup -``` - -**Documentation Updates**: -- Migration guide for users -- Updated architecture diagrams -- New path structure in README - -### Phase 5: Legacy Deprecation (Future - v2.0.0) - -- Set V2 as default for new installations -- Auto-migrate on first run (with user confirmation) -- Remove legacy scheme support -- Major version bump - ---- - -## Data Flow - -### Memory Capture Flow - -``` -User Request - │ - ▼ -Command/Hook - │ - ├─► PathResolver.get_memory_dir(namespace, scope) - │ │ - │ ├─► PathContext (org, project, scheme) - │ │ - │ └─► Compute path based on scheme - │ │ - │ ├─► LEGACY: ./.claude/mnemonic/{namespace} - │ └─► V2: ${MNEMONIC_ROOT}/{org}/{project}/{namespace} - │ - ├─► Create directory (mkdir -p) - │ - ├─► PathResolver.get_memory_path(namespace, filename, scope) - │ - ├─► Write memory file - │ - └─► Git commit -``` - -### Memory Search Flow - -``` -User Search - │ - ▼ -Command/Hook - │ - ├─► PathResolver.get_search_paths(namespace, filters) - │ │ - │ ├─► PathContext (org, project, scheme) - │ │ - │ └─► Compute paths based on scheme - │ │ - │ ├─► LEGACY: [project, org, default] - │ └─► V2: [project, org, default] - │ - ├─► Filter existing paths - │ - ├─► For each path: - │ └─► rg -i {pattern} {path} --glob "*.memory.md" - │ - └─► Aggregate results -``` - -### Migration Flow - -``` -Migration Command - │ - ├─► Create MigrationManager(scheme=V2) - │ - ├─► Analyze current structure - │ │ - │ ├─► Legacy resolver gets all roots - │ ├─► For each memory file: - │ │ ├─► Extract namespace - │ │ ├─► Determine scope - │ │ └─► Compute V2 destination - │ │ - │ └─► Create MigrationPlan - │ - ├─► Create backup (with rollback info) - │ - ├─► Execute migration - │ │ - │ └─► For each file: - │ ├─► Copy to V2 location - │ └─► Track success/failure - │ - ├─► Cleanup legacy directories (optional) - │ - └─► Git commit changes -``` - ---- - -## Critical Implementation Details - -### 1. Error Handling - -**PathResolver never throws** - returns computed paths even if they don't exist: - -```python -# Resolver just computes - always succeeds -path = resolver.get_memory_dir("_semantic/decisions") - -# Caller handles existence -if not path.exists(): - path.mkdir(parents=True, exist_ok=True) -``` - -**Why**: Separation of concerns - path computation vs. file operations - -### 2. State Management - -**Resolvers are stateless** - can be created/discarded freely: - -```python -# OK to create multiple times -resolver1 = PathResolver() -resolver2 = PathResolver() - -# OK to cache if needed -class Manager: - def __init__(self): - self._resolver = PathResolver() -``` - -**Why**: Simpler reasoning, thread-safe, easier to test - -### 3. Testing Strategy - -**Unit tests** - Use mocked context: -```python -def test_path_resolution(): - context = PathContext( - org="testorg", - project="testproject", - home_dir=Path("/tmp/home"), - project_dir=Path("/tmp/project"), - scheme=PathScheme.LEGACY, - ) - resolver = PathResolver(context) - # Test pure logic without file system -``` - -**Integration tests** - Use tmp_path: -```python -def test_memory_capture(tmp_path): - context = PathContext(..., home_dir=tmp_path) - resolver = PathResolver(context) - # Test with real file operations in isolation -``` - -### 4. Performance Considerations - -**Lazy evaluation** - Don't create resolvers at module level: -```python -# BAD -_resolver = PathResolver() # Created on import - -# GOOD -def get_resolver(): - return PathResolver() # Created when needed -``` - -**Caching** - Add if profiling shows benefit: -```python -from functools import lru_cache - -class PathResolver: - @lru_cache(maxsize=128) - def get_memory_dir(self, namespace: str, scope: Scope) -> Path: - # Implementation... -``` - -### 5. Security Considerations - -**Path validation** - Prevent directory traversal: -```python -def get_memory_path(self, namespace: str, filename: str, scope: Scope) -> Path: - # Ensure filename doesn't contain path separators - if "/" in filename or "\\" in filename: - raise ValueError(f"Invalid filename: {filename}") - - directory = self.get_memory_dir(namespace, scope) - return directory / filename -``` - -**Git safety** - Never auto-commit without user awareness: -```python -def commit_changes(self, dry_run: bool = False): - if dry_run: - print("[DRY RUN] Would commit changes") - return - - # Require explicit user action - # ... -``` - ---- - -## Build Sequence - -### ✓ Phase 1: Foundation (Complete) - -- [x] Design architecture and interfaces -- [x] Create `lib/paths.py` with full implementation -- [x] Create comprehensive unit tests (26 tests) -- [x] Write library documentation -- [x] Create migration script -- [x] Document architecture decisions (ADR-009) -- [x] Write integration guide - -**Deliverables**: -- Fully functional path resolution library -- 100% test coverage -- Complete documentation -- Ready for integration - -### Phase 2: Integration Checklist - -Migration Scripts: -- [ ] Update `migrate_scope_paths.py` -- [ ] Update `migrate_namespaces.py` -- [ ] Update `cleanup_memory_paths.py` -- [ ] Test migration scripts - -Ontology System: -- [ ] Update `ontology_registry.py` -- [ ] Update `ontology_loader.py` -- [ ] Update `entity_resolver.py` -- [ ] Test ontology integration - -Hooks: -- [ ] Update `session_start.py` -- [ ] Update `user_prompt_submit.py` -- [ ] Update `pre_tool_use.py` -- [ ] Update `post_tool_use.py` -- [ ] Update `stop.py` -- [ ] Test all hooks - -Tests: -- [ ] Add resolver fixtures to `conftest.py` -- [ ] Update all test files -- [ ] Verify 100% pass rate - -### Phase 3: Commands Checklist - -- [ ] Convert `capture.md` to `capture.py` -- [ ] Convert `search.md` to `search.py` -- [ ] Convert `init.md` to `init.py` -- [ ] Convert `recall.md` to `recall.py` -- [ ] Update command manifests -- [ ] Test all commands - -### Phase 4: V2 Enablement Checklist - -- [ ] Add config file support -- [ ] Create `/mnemonic:migrate` command -- [ ] Update all documentation -- [ ] Create migration guide -- [ ] Add rollback capability -- [ ] Beta test with real data - ---- - -## Trade-offs Analysis - -### Complexity vs Flexibility - -**Trade-off**: More upfront code for long-term flexibility - -**Accepted**: -- 500 lines of library code + tests -- Learning curve for new abstraction -- Migration work across 30+ files - -**Benefit**: -- Future path changes trivial (1 file vs 30+) -- Testable path logic -- Support multiple schemes -- Clear upgrade path - -**Verdict**: Worth it for maintainability - -### Purity vs Pragmatism - -**Trade-off**: Pure path computation vs convenience with I/O - -**Accepted**: Keep resolver pure -- No file system checks in core methods -- No automatic directory creation -- Caller handles I/O - -**Benefit**: -- Easier to test (no mocking file system) -- Clear separation of concerns -- No hidden side effects - -**Verdict**: Pure functions easier to reason about - -### Python vs Bash - -**Trade-off**: Convert commands to Python vs keep Bash - -**Accepted**: Convert to Python in Phase 3 -- Commands become Python modules -- Bash retained for simple operations - -**Benefit**: -- Better error handling -- Type safety -- Testability -- Consistent with library - -**Verdict**: Python better for complex logic - ---- - -## Success Metrics - -### Code Quality Metrics - -- [x] Path resolution centralized in single module -- [x] 26 unit tests with 100% pass rate -- [x] Type hints on all public methods -- [x] Comprehensive docstrings -- [ ] Zero hardcoded paths in new code (after Phase 2-3) -- [ ] All Python components use resolver (after Phase 2) - -### Testing Metrics - -- [x] Unit tests use isolated paths (test_paths.py) -- [x] No file system dependencies in unit tests -- [ ] Integration tests cover both schemes (Phase 2) -- [ ] Migration tests verify data integrity (Phase 4) - -### Documentation Metrics - -- [x] ADR documenting architecture decision -- [x] Integration guide for each component type -- [x] Library API documentation -- [x] Migration script documentation -- [ ] User migration guide (Phase 4) -- [ ] Video walkthrough (Phase 5) - -### User Experience Metrics - -- [ ] Zero breaking changes during migration -- [ ] Migration completes successfully (Phase 4) -- [ ] Rollback works if migration fails (Phase 4) -- [ ] Performance same or better (Phase 5) - ---- - -## Related Documents - -### Core Implementation -- [lib/paths.py](../../lib/paths.py) - Path resolution library -- [tests/unit/test_paths.py](../../tests/unit/test_paths.py) - Unit tests -- [lib/README.md](../../lib/README.md) - Library documentation - -### Architecture & Planning -- [ADR-009](../adrs/adr-009-unified-path-resolution.md) - Architecture decision record -- [Integration Guide](./path-resolution-integration.md) - Component integration guide - -### Migration -- [migrate_to_v2_paths.py](../../scripts/migrate_to_v2_paths.py) - Migration script - ---- - -## Next Steps - -### Immediate (Phase 1 Complete ✓) - -This phase is COMPLETE. All deliverables created and tested. - -### Week 2 (Phase 2) - -1. Start with migration scripts (lowest risk) -2. Update ontology system -3. Integrate hooks one by one -4. Update tests continuously - -### Week 3 (Phase 3) - -1. Convert capture command -2. Convert search command -3. Convert remaining commands -4. Update command manifests - -### Week 4 (Phase 4) - -1. Add config file support -2. Create migration command -3. Document migration process -4. Beta test with volunteers - ---- - -## Conclusion - -Phase 1 delivers a **production-ready path resolution library** with: - -- ✓ Clean architecture with dependency injection -- ✓ Support for both LEGACY and V2 schemes -- ✓ Comprehensive test coverage (26 tests) -- ✓ Complete documentation -- ✓ Migration tooling ready - -The library provides a **single source of truth** for all path operations and enables **smooth migration** to the unified V2 structure. - -**Next**: Begin Phase 2 integration, starting with low-risk migration scripts. - ---- - -**Blueprint Version**: 1.0 -**Last Updated**: 2026-01-26 -**Status**: Phase 1 Complete ✓ diff --git a/docs/architecture/path-resolution-integration.md b/docs/architecture/path-resolution-integration.md deleted file mode 100644 index 66cad8d..0000000 --- a/docs/architecture/path-resolution-integration.md +++ /dev/null @@ -1,465 +0,0 @@ -# Path Resolution Integration Guide - -This guide shows how each component integrates with the centralized path resolution library (`lib/paths.py`). - -## Integration Pattern - -All components that work with file paths should: - -1. Import the path resolution library -2. Create a resolver (or use convenience functions) -3. Use resolver methods instead of manual path construction -4. Never hardcode path patterns - -## Component Integration Examples - -### 1. Hooks Integration - -#### Before (session_start.py) - -```python -# OLD: Manual path construction scattered throughout -def count_memories_by_namespace(home: Path, org: str) -> dict: - paths = [ - home / ".claude" / "mnemonic" / org, - home / ".claude" / "mnemonic" / "default", - Path.cwd() / ".claude" / "mnemonic", - ] - # ... -``` - -#### After (session_start.py) - -```python -from lib.paths import PathResolver, Scope - -def count_memories_by_namespace(resolver: PathResolver) -> dict: - """Count memories using centralized path resolution.""" - counts = {} - - # Get all memory roots automatically - for root in resolver.get_all_memory_roots(): - for memory_file in root.rglob("*.memory.md"): - # Count logic... - pass - - return counts - -def main(): - resolver = PathResolver() - counts = count_memories_by_namespace(resolver) - # ... -``` - -### 2. Commands Integration - -#### Before (capture.md) - -```bash -# OLD: Bash-based path construction -if [ "$SCOPE" = "project" ]; then - MEMORY_DIR="$MNEMONIC_ROOT/${NAMESPACE}" -else - MEMORY_DIR="$MNEMONIC_ROOT/${ORG}/${NAMESPACE}" -fi -``` - -#### After (capture.md) - -Commands can call a Python helper that uses the library: - -```bash -# NEW: Use Python helper with centralized paths -MEMORY_DIR=$(python3 -c " -from lib.paths import get_memory_dir -print(get_memory_dir('$NAMESPACE', '$SCOPE')) -") -``` - -Or better yet, convert capture to a Python command: - -```python -# commands/capture.py -from lib.paths import PathResolver, Scope - -def capture_memory(namespace: str, title: str, scope: str = "project"): - resolver = PathResolver() - scope_enum = Scope.PROJECT if scope == "project" else Scope.USER - - memory_dir = resolver.get_memory_dir(namespace, scope_enum) - memory_dir.mkdir(parents=True, exist_ok=True) - - memory_path = resolver.get_memory_path( - namespace, - f"{slug}.memory.md", - scope_enum - ) - - # Write memory file... -``` - -### 3. Search Integration - -#### Before (search.md) - -```bash -# OLD: Manual path construction -SEARCH_PATHS="$MNEMONIC_ROOT/$ORG $MNEMONIC_ROOT" -``` - -#### After (search.md) - -```bash -# NEW: Use Python helper for search paths -SEARCH_PATHS=$(python3 -c " -from lib.paths import get_search_paths -paths = get_search_paths(namespace='$NAMESPACE', include_user=True, include_project=True) -print(' '.join(str(p) for p in paths)) -") - -rg -i "$PATTERN" $SEARCH_PATHS --glob '*.memory.md' -``` - -### 4. Ontology Registry Integration - -#### Before (ontology_registry.py) - -```python -# OLD: Hardcoded paths -def get_ontology_paths(): - return [ - Path.cwd() / ".claude" / "mnemonic" / "ontology.yaml", - Path.home() / ".claude" / "mnemonic" / "ontology.yaml", - ] -``` - -#### After (ontology_registry.py) - -```python -from lib.paths import PathResolver - -class OntologyRegistry: - def __init__(self, resolver: PathResolver = None): - self.resolver = resolver or PathResolver() - - def load_ontologies(self): - """Load ontologies from all configured paths.""" - for ontology_path in self.resolver.get_ontology_paths(): - if ontology_path.exists(): - yield self._load_ontology_file(ontology_path) -``` - -### 5. Migration Scripts Integration - -#### Before (migrate_scope_paths.py) - -```python -# OLD: Hardcoded paths -paths = [ - Path.home() / ".claude" / "mnemonic", - Path.cwd() / ".claude" / "mnemonic", -] -``` - -#### After (migrate_scope_paths.py) - -```python -from lib.paths import PathResolver - -def migrate_to_v2_scheme(): - """Migrate from legacy to V2 path scheme.""" - # Use legacy resolver to find old paths - legacy_resolver = PathResolver() # defaults to LEGACY scheme - - # Get all memory roots from legacy scheme - for root in legacy_resolver.get_all_memory_roots(): - # Process memories... - pass - - # Use V2 resolver to compute new paths - from lib.paths import PathContext, PathScheme - context = PathContext.detect(scheme=PathScheme.V2) - v2_resolver = PathResolver(context) - - # Move files to new locations - # ... -``` - -### 6. Test Integration - -#### Test Setup - -```python -# tests/conftest.py -import pytest -from pathlib import Path -from lib.paths import PathResolver, PathContext, PathScheme - -@pytest.fixture -def test_resolver(tmp_path): - """Create a test resolver with isolated paths.""" - context = PathContext( - org="testorg", - project="testproject", - home_dir=tmp_path / "home", - project_dir=tmp_path / "project", - scheme=PathScheme.LEGACY, - ) - return PathResolver(context) - -@pytest.fixture -def v2_test_resolver(tmp_path): - """Create a V2 test resolver.""" - context = PathContext( - org="testorg", - project="testproject", - home_dir=tmp_path / "home", - project_dir=tmp_path / "project", - scheme=PathScheme.V2, - ) - return PathResolver(context) -``` - -#### Using Test Resolver - -```python -def test_memory_capture(test_resolver): - """Test memory capture with isolated paths.""" - memory_dir = test_resolver.get_memory_dir("_semantic/decisions", Scope.PROJECT) - memory_dir.mkdir(parents=True) - - memory_path = test_resolver.get_memory_path( - "_semantic/decisions", - "test.memory.md", - Scope.PROJECT - ) - - # Test memory creation... - assert memory_path.exists() -``` - -## Dependency Injection Pattern - -For better testability, components should accept a resolver as a parameter: - -```python -from lib.paths import PathResolver - -class MemoryManager: - def __init__(self, resolver: PathResolver = None): - """Initialize with optional resolver for testing.""" - self.resolver = resolver or PathResolver() - - def save_memory(self, namespace: str, content: str): - memory_dir = self.resolver.get_memory_dir(namespace) - # Save logic... -``` - -This enables easy testing: - -```python -def test_memory_manager(test_resolver): - manager = MemoryManager(resolver=test_resolver) - manager.save_memory("_semantic/decisions", "test content") - # Assertions... -``` - -## Migration Strategy - -### Phase 1: Add Library (Week 1) - -1. Create `lib/paths.py` with full implementation -2. Create comprehensive unit tests -3. Add integration documentation -4. No breaking changes - library is additive - -**Status**: Complete (this commit) - -### Phase 2: Integrate Python Components (Week 2) - -Priority order (least risk to most): - -1. **Migration scripts** (low risk, not user-facing) - - `scripts/migrate_scope_paths.py` - - `scripts/migrate_namespaces.py` - - `scripts/cleanup_memory_paths.py` - -2. **New components** (medium risk, limited usage) - - `skills/ontology/lib/ontology_registry.py` - - `skills/ontology/lib/ontology_loader.py` - -3. **Hooks** (higher risk, frequently executed) - - `hooks/session_start.py` - - `hooks/user_prompt_submit.py` - - `hooks/pre_tool_use.py` - - `hooks/post_tool_use.py` - - `hooks/stop.py` - -4. **Tests** (refactor to use test resolvers) - - `.claude/tests/conftest.py` - - All test files - -### Phase 3: Convert Commands to Python (Week 3) - -Convert Bash commands to Python for better path handling: - -1. `commands/capture.py` (convert from capture.md) -2. `commands/search.py` (convert from search.md) -3. `commands/init.py` (convert from init.md) -4. `commands/recall.py` (convert from recall.md) - -### Phase 4: Enable V2 Scheme (Week 4) - -1. Add configuration option for path scheme -2. Create migration command: `/mnemonic:migrate --to-v2` -3. Update documentation -4. Provide rollback capability - -### Phase 5: Deprecate Legacy (Future) - -1. Set V2 as default for new installations -2. Auto-migrate on first run (with user confirmation) -3. Remove legacy scheme support (major version bump) - -## Configuration - -Add path scheme configuration to `.claude/mnemonic/config.yaml`: - -```yaml -# Path scheme configuration -paths: - scheme: legacy # or "v2" - custom_home: null # optional override for testing - -# Migration settings -migration: - auto_migrate: false - backup_before_migrate: true -``` - -Load config in PathContext: - -```python -@classmethod -def detect(cls, config_path: Optional[Path] = None) -> "PathContext": - """Detect context from environment and config.""" - scheme = PathScheme.LEGACY # default - - if config_path and config_path.exists(): - with open(config_path) as f: - config = yaml.safe_load(f) - scheme_str = config.get("paths", {}).get("scheme", "legacy") - scheme = PathScheme.V2 if scheme_str == "v2" else PathScheme.LEGACY - - return cls( - org=_detect_org(), - project=_detect_project(), - home_dir=Path.home(), - project_dir=Path.cwd(), - scheme=scheme - ) -``` - -## Benefits Summary - -### Developer Experience - -- **Single source of truth**: All path logic in one place -- **Type safety**: Python type hints catch errors early -- **Easy testing**: Dependency injection enables isolated tests -- **Clear interfaces**: Explicit methods for each use case - -### Maintenance - -- **Easier refactoring**: Change paths once, affects all components -- **Migration support**: Support multiple schemes during transition -- **Documentation**: Self-documenting code with clear method names -- **Debugging**: Centralized logging and error handling - -### Future-Proofing - -- **Extensible**: Easy to add new path schemes or configurations -- **Configurable**: Support user preferences and environment overrides -- **Backward compatible**: Legacy scheme support during migration -- **Clean abstractions**: Future changes isolated to one module - -## Performance Considerations - -### Caching - -For frequently accessed paths, consider caching: - -```python -from functools import lru_cache - -class PathResolver: - @lru_cache(maxsize=128) - def get_memory_dir(self, namespace: str, scope: Scope) -> Path: - # Implementation... -``` - -### Lazy Evaluation - -Don't create resolvers unnecessarily: - -```python -# BAD: Creates resolver on module import -_resolver = PathResolver() - -# GOOD: Create resolver when needed -def get_resolver() -> PathResolver: - return PathResolver() -``` - -### File System Operations - -The resolver only computes paths - it doesn't check existence by default. Use `get_search_paths()` which filters non-existent paths only when needed for search operations. - -## Troubleshooting - -### Common Integration Issues - -1. **Import errors**: Ensure `lib/` is in Python path -2. **Test isolation**: Always use fixtures with tmp_path -3. **Circular imports**: Import paths in functions, not at module level if needed -4. **Path scheme confusion**: Explicitly pass scheme in tests - -### Debugging - -Add logging to resolver: - -```python -import logging - -logger = logging.getLogger(__name__) - -class PathResolver: - def get_memory_dir(self, namespace: str, scope: Scope) -> Path: - path = self._get_memory_dir_impl(namespace, scope) - logger.debug(f"Resolved {namespace}/{scope} -> {path}") - return path -``` - -## Questions & Decisions - -### Q: Should we support custom path schemes? - -**Decision**: Not in v1. Keep it simple with LEGACY and V2. Custom schemes can be added later if needed. - -### Q: How do we handle Windows paths? - -**Decision**: Python's `pathlib.Path` handles cross-platform paths automatically. No special handling needed. - -### Q: What about symlinks? - -**Decision**: Follow symlinks by default. Use `Path.resolve()` if absolute resolution needed. - -### Q: Should paths be validated? - -**Decision**: No validation in resolver - keep it pure path computation. Validation happens at usage sites (create directory, open file, etc). - -## Related Documents - -- [lib/paths.py](../../lib/paths.py) - Core implementation -- [tests/unit/test_paths.py](../../tests/unit/test_paths.py) - Unit tests -- [ADR-009: Unified Path Resolution](../adrs/adr-009-unified-path-resolution.md) - Architecture decision record diff --git a/docs/archive/community/CONTRIBUTING-COMMUNITY.md b/docs/archive/community/CONTRIBUTING-COMMUNITY.md deleted file mode 100644 index 57345ab..0000000 --- a/docs/archive/community/CONTRIBUTING-COMMUNITY.md +++ /dev/null @@ -1,229 +0,0 @@ -# Contributing to the Mnemonic Community - -How to share your experience, stories, and improvements with the community. - ---- - -## Ways to Contribute - -### Share Your Story - -Help others by sharing your experience: - -1. **Adoption stories** - How you're using mnemonic -2. **Migration guides** - Specific setups you've migrated from -3. **Tips and tricks** - Patterns you've discovered -4. **Integration guides** - Tool-specific configurations - -### Improve Documentation - -Found something unclear? Help us improve: - -1. **Fix typos and errors** - Small improvements matter -2. **Add examples** - Real-world usage examples -3. **Clarify explanations** - If something confused you, others may struggle too -4. **Translate** - Help make mnemonic accessible globally - -### Report Issues - -Encountered a problem? Let us know: - -1. **Bug reports** - Something not working as expected -2. **Feature requests** - Ideas for improvement -3. **Compatibility issues** - Problems with specific tools or setups - ---- - -## Submitting an Adoption Story - -### Option 1: Pull Request - -1. Fork the repository -2. Create a new branch: - ```bash - git checkout -b story/your-story-name - ``` -3. Add your story to `docs/community/adoption-stories.md`: - ```markdown - ### [Your Title] - - **Author:** Your Name / Anonymous - **Setup:** [Tool(s) used, team size, context] - **Migrated from:** [Memory Bank / Other / None] - - #### Challenge - [What problem were you trying to solve?] - - #### Solution - [How did mnemonic help?] - - #### Results - [What changed? Be specific where possible.] - - #### Tips - [What would you tell others adopting mnemonic?] - ``` -4. Commit and push: - ```bash - git commit -m "Add adoption story: [Your Title]" - git push origin story/your-story-name - ``` -5. Open a Pull Request - -### Option 2: GitHub Discussion - -Don't want to open a PR? Share your story in [GitHub Discussions](https://github.com/zircote/mnemonic/discussions). - -1. Go to the Discussions tab -2. Create a new discussion in the "Show and tell" category -3. Share your experience - -We may reach out to feature your story in the docs (with permission). - -### Option 3: Issue - -Open an [issue](https://github.com/zircote/mnemonic/issues) with the "story" label. - ---- - -## Documentation Improvements - -### Style Guide - -When contributing documentation: - -- **Be concise** - Developers appreciate brevity -- **Show, don't tell** - Use code examples -- **Test your examples** - Make sure they work -- **Use consistent formatting** - Follow existing patterns - -### File Structure - -``` -docs/ -├── community/ # Community-focused docs (you are here) -│ ├── README.md -│ ├── quickstart-memory-bank.md -│ ├── migration-from-memory-bank.md -│ ├── mnemonic-vs-memory-bank.md -│ ├── adoption-stories.md -│ └── CONTRIBUTING-COMMUNITY.md -├── enterprise/ # Enterprise-focused docs -├── integrations/ # Tool-specific guides -└── ... -``` - -### Pull Request Process - -1. Fork the repository -2. Create a feature branch: - ```bash - git checkout -b docs/your-improvement - ``` -3. Make your changes -4. Test locally (if applicable) -5. Commit with clear message: - ```bash - git commit -m "docs: clarify migration process for Cursor users" - ``` -6. Push and open PR - ---- - -## Bug Reports and Feature Requests - -### Bug Reports - -Use the [issue tracker](https://github.com/zircote/mnemonic/issues) with this template: - -```markdown -**Description** -A clear description of the bug. - -**Steps to Reproduce** -1. Run this command... -2. Then do this... -3. See error - -**Expected Behavior** -What should have happened. - -**Actual Behavior** -What actually happened. - -**Environment** -- OS: [e.g., macOS 14.2] -- Claude Code version: [e.g., 1.0.0] -- Mnemonic version: [e.g., 1.0.0] - -**Additional Context** -Any other relevant information. -``` - -### Feature Requests - -```markdown -**Problem Statement** -What problem does this feature solve? - -**Proposed Solution** -What would you like to happen? - -**Alternatives Considered** -Any alternative solutions you've considered? - -**Additional Context** -Any other relevant information. -``` - ---- - -## Community Guidelines - -### Be Respectful - -- Treat everyone with respect -- Be patient with newcomers -- Give constructive feedback - -### Be Helpful - -- Share your knowledge -- Answer questions when you can -- Point to relevant resources - -### Be Honest - -- Share both successes and failures -- Acknowledge limitations -- Credit others' contributions - ---- - -## Recognition - -We appreciate all contributions! Contributors are recognized in: - -- **CONTRIBUTORS.md** - All contributors -- **Release notes** - Significant contributions -- **Adoption stories** - Featured community members - ---- - -## Questions? - -- **GitHub Issues**: [Ask questions](https://github.com/zircote/mnemonic/issues) -- **Discussions**: [Community forum](https://github.com/zircote/mnemonic/discussions) - ---- - -## Quick Links - -| Resource | Description | -|----------|-------------| -| [Issues](https://github.com/zircote/mnemonic/issues) | Report bugs, request features | -| [Discussions](https://github.com/zircote/mnemonic/discussions) | Ask questions, share ideas | -| [Pull Requests](https://github.com/zircote/mnemonic/pulls) | Contribute code and docs | -| [Main CONTRIBUTING](../../CONTRIBUTING.md) | Full contribution guide | - -[← Back to Community](./README.md) diff --git a/docs/archive/community/README.md b/docs/archive/community/README.md deleted file mode 100644 index 774aa2b..0000000 --- a/docs/archive/community/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# Mnemonic Community - -Welcome to the mnemonic community! Whether you're migrating from a Memory Bank setup, exploring mnemonic for the first time, or looking to share your experience, you're in the right place. - ---- - -## For Memory Bank Users - -Already using markdown files for AI memory? You discovered what research confirms: filesystem-based memory works. - -Mnemonic formalizes your approach with: -- **Standardized format** (MIF Level 3) for cross-tool compatibility -- **Schema validation** to catch errors early -- **Multi-tool support** (9+ AI coding assistants) -- **Research validation** (74% accuracy benchmark) - -Get started: -- [Quick Start for Memory Bank Users](./quickstart-memory-bank.md) - 5-minute conversion -- [Full Migration Guide](./migration-from-memory-bank.md) - Complete walkthrough -- [Comparison](./mnemonic-vs-memory-bank.md) - Side-by-side differences - ---- - -## Community Resources - -### Adoption Stories - -See how others are using mnemonic: - -[→ Read Adoption Stories](./adoption-stories.md) - -Want to share your experience? We'd love to hear from you! - -[→ How to Contribute](./CONTRIBUTING-COMMUNITY.md) - ---- - -## Getting Help - -- **GitHub Issues**: [Report bugs or request features](https://github.com/zircote/mnemonic/issues) -- **Discussions**: [Ask questions and share ideas](https://github.com/zircote/mnemonic/discussions) -- **Documentation**: [Full reference](../../README.md) - ---- - -## Quick Links - -| Resource | Description | -|----------|-------------| -| [Quick Start](./quickstart-memory-bank.md) | 5-minute setup for Memory Bank users | -| [Migration Guide](./migration-from-memory-bank.md) | Complete migration walkthrough | -| [Comparison](./mnemonic-vs-memory-bank.md) | Feature comparison | -| [Adoption Stories](./adoption-stories.md) | Community experiences | -| [Contributing](./CONTRIBUTING-COMMUNITY.md) | How to contribute | - ---- - -## Why Community Matters - -Mnemonic exists because the community showed the need. Memory Bank projects in Cursor and Windsurf forums validated that: - -1. Developers want persistent AI memory -2. Filesystem-based approaches work well -3. Markdown is the right format -4. Cross-tool compatibility matters - -Mnemonic builds on this foundation with standardization, validation, and multi-tool support. - ---- - -## Navigation - -[← Back to Main Documentation](../../README.md) diff --git a/docs/archive/community/adoption-stories.md b/docs/archive/community/adoption-stories.md deleted file mode 100644 index 22c04d6..0000000 --- a/docs/archive/community/adoption-stories.md +++ /dev/null @@ -1,119 +0,0 @@ -# Adoption Stories - -Real-world experiences from developers and teams using mnemonic. - ---- - -## Share Your Story - -We'd love to hear how you're using mnemonic! See [How to Contribute](./CONTRIBUTING-COMMUNITY.md) to add your story. - ---- - -## Stories - -### Coming Soon - -This section will feature stories from early adopters. Check back soon or [submit your story](./CONTRIBUTING-COMMUNITY.md). - ---- - -## Template - -Here's the format we use for adoption stories: - -```markdown -### [Your Title] - -**Author:** Your Name / Anonymous -**Setup:** [Tool(s) used, team size, context] -**Migrated from:** [Memory Bank / Other / None] - -#### Challenge - -What problem were you trying to solve? - -#### Solution - -How did mnemonic help? - -#### Results - -What changed? Be specific where possible. - -#### Tips - -What would you tell others adopting mnemonic? -``` - ---- - -## Example Story - -### From Cursor Memory Bank to Multi-Tool Workflow - -**Author:** Anonymous -**Setup:** Solo developer, Cursor + Claude Code, web development -**Migrated from:** Cursor Memory Bank - -#### Challenge - -I had built up a great Memory Bank setup in Cursor over 6 months. Hundreds of patterns, decisions, and learnings. But I wanted to try Claude Code for some tasks, and starting from scratch felt wasteful. - -#### Solution - -Used the migration tool to convert my Memory Bank files to MIF format. Now the same memories work in both tools. I use Cursor for frontend work and Claude Code for backend—same context everywhere. - -#### Results - -- Migration took about 20 minutes -- Zero memory loss -- Now using 3 different AI tools with the same knowledge base -- Validation caught 2 malformed memories I hadn't noticed - -#### Tips - -- Don't try to migrate everything at once—start with your most-used decisions -- The validation tool is your friend—run it after migration -- Keep your old Memory Bank files around for a few weeks, just in case - ---- - -## Why Stories Matter - -Adoption stories help the community understand: -- Real-world use cases -- Migration challenges and solutions -- Team coordination patterns -- Unexpected benefits - -Your experience could help someone facing the same challenges. - ---- - -## Categories - -We're looking for stories in these areas: - -### Migration Stories -How did you move from Memory Bank or another system? - -### Team Adoption -How did your team roll out mnemonic? What worked? - -### Cross-Tool Workflows -How do you use mnemonic across multiple AI tools? - -### Enterprise Use -How does mnemonic fit into larger organizational contexts? - -### Creative Uses -Unexpected or creative applications of the memory system? - ---- - -## Submit Your Story - -Ready to share? See [How to Contribute](./CONTRIBUTING-COMMUNITY.md). - -[← Back to Community](./README.md) diff --git a/docs/archive/community/migration-from-memory-bank.md b/docs/archive/community/migration-from-memory-bank.md deleted file mode 100644 index 76b6f83..0000000 --- a/docs/archive/community/migration-from-memory-bank.md +++ /dev/null @@ -1,365 +0,0 @@ -# Migration Guide: Memory Bank to Mnemonic - -Complete walkthrough for converting your Memory Bank setup to mnemonic. - ---- - -## Overview - -This guide helps you migrate from a Memory Bank-style markdown memory setup to mnemonic's MIF Level 3 format. The migration preserves your content while adding structure and validation. - -**Estimated time**: 15-30 minutes depending on memory volume. - ---- - -## Before You Start - -### Prerequisites - -- Existing Memory Bank files (markdown) -- Claude Code installed -- Git (recommended for backup) - -### Backup Your Data - -```bash -# Create backup of existing memories -tar -czf memory-bank-backup-$(date +%Y%m%d).tar.gz ~/your-memory-bank/ - -# Or commit to git -cd ~/your-memory-bank -git add -A && git commit -m "Backup before mnemonic migration" -``` - ---- - -## Migration Methods - -### Method 1: Automated Migration Tool - -The fastest approach for bulk conversion. - -```bash -# Install mnemonic first -git clone https://github.com/zircote/mnemonic.git ~/tools/mnemonic -claude settings plugins add ~/tools/mnemonic - -# Run migration tool -./tools/migrate-memory-bank \ - --source ~/your-memory-bank \ - --target ${MNEMONIC_ROOT}/default \ - --namespace learnings -``` - -**Options:** -- `--source`: Path to existing Memory Bank -- `--target`: Mnemonic directory (usually `${MNEMONIC_ROOT}/default`) -- `--namespace`: Default namespace for migrated files -- `--dry-run`: Preview without changes -- `--preserve-dates`: Use file modification dates for timestamps - -### Method 2: Manual Conversion - -For careful, selective migration. - -#### Step 1: Analyze Your Existing Structure - -```bash -# See what you have -find ~/your-memory-bank -name "*.md" -type f - -# Count by directory -find ~/your-memory-bank -name "*.md" | \ - sed 's|/[^/]*$||' | sort | uniq -c -``` - -#### Step 2: Map to Namespaces - -| Your Category | Mnemonic Namespace | -|---------------|-------------------| -| Decisions, ADRs | `decisions/user` | -| Learnings, TILs | `learnings/user` | -| Patterns, conventions | `patterns/user` | -| Bugs, issues, blockers | `blockers/user` | -| Project context | `context/user` | -| API notes | `apis/user` | -| Security notes | `security/user` | -| Testing notes | `testing/user` | -| Session logs, events | `episodic/user` | - -#### Step 3: Convert Each File - -For each memory file: - -1. **Generate UUID and timestamps**: -```bash -UUID=$(uuidgen | tr '[:upper:]' '[:lower:]') -DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") -``` - -2. **Determine memory type**: - - `semantic` - Facts, decisions, specifications - - `episodic` - Events, debugging sessions, incidents - - `procedural` - Workflows, patterns, how-tos - -3. **Create MIF-compliant file**: - -```bash -# Example: Converting a decision -cat > ${MNEMONIC_ROOT}/default/decisions/user/${UUID}-use-jwt.memory.md << 'EOF' ---- -id: YOUR-UUID-HERE -type: semantic -namespace: decisions/user -created: 2026-01-23T10:30:00Z -modified: 2026-01-23T10:30:00Z -title: "Use JWT for Authentication" -tags: - - authentication - - security -temporal: - valid_from: 2026-01-23T10:30:00Z - recorded_at: 2026-01-23T10:30:00Z -provenance: - source_type: migration - agent: manual - confidence: 0.9 ---- - -# Use JWT for Authentication - -[Your original content here] -EOF -``` - -### Method 3: Incremental Migration - -Migrate files as you use them. - -1. **Keep both systems running**: -```bash -# Mnemonic for new memories -${MNEMONIC_ROOT}/ - -# Original for reference -~/your-memory-bank/ -``` - -2. **When you reference an old memory, migrate it**: -```bash -# Read old memory -cat ~/your-memory-bank/auth-decision.md - -# Create new mnemonic version -/mnemonic:capture decisions "Use JWT for Authentication" - -# Add your content to the new file -``` - -3. **Mark migrated files**: -```bash -# Add "MIGRATED" prefix to migrated files -mv ~/your-memory-bank/auth-decision.md \ - ~/your-memory-bank/MIGRATED-auth-decision.md -``` - ---- - -## Handling Common Patterns - -### Pattern: Single Large Context File - -**Before**: One `memory-bank.md` or `context.md` with everything - -**Migration approach**: - -1. Read the file and identify sections -2. Create separate memories for each logical unit -3. Use appropriate namespaces - -```bash -# Split by headers -grep -n "^## " ~/your-memory-bank/memory-bank.md - -# Create individual memories for each section -``` - -### Pattern: Cursor Rules/Memory Files - -**Before**: `.cursor/rules` or `.cursorrules` - -**Migration**: - -1. Keep Cursor files for Cursor-specific settings -2. Migrate reusable knowledge to mnemonic -3. Mnemonic can sync back to Cursor format - -```bash -# Patterns and decisions go to mnemonic -/mnemonic:capture patterns "Error handling convention" - -# IDE-specific settings stay in Cursor -# .cursor/rules (keep as-is) -``` - -### Pattern: Windsurf Memory/Rules - -**Before**: `.windsurf/memories/` or `.windsurfrules` - -**Migration**: - -1. Convert memories to MIF format -2. Keep Windsurf-specific rules -3. Link mnemonic to Windsurf via integration - -```bash -# See Windsurf integration guide -cat docs/integrations/windsurf.md -``` - -### Pattern: Date-Based Session Logs - -**Before**: `2025-01-15-session.md`, `2025-01-16-session.md` - -**Migration**: - -```bash -# These are episodic memories -for f in ~/your-memory-bank/20*-session.md; do - # Extract date from filename - DATE=$(basename "$f" .md | sed 's/-session//') - - # Migrate to episodic namespace - UUID=$(uuidgen | tr '[:upper:]' '[:lower:]') - ./tools/convert-to-mif "$f" \ - --namespace episodic/user \ - --type episodic \ - --valid-from "${DATE}T00:00:00Z" -done -``` - ---- - -## Post-Migration Validation - -### Validate All Memories - -```bash -# Run validation -./tools/mnemonic-validate - -# Check for errors -./tools/mnemonic-validate --format json | jq '.summary' -``` - -### Fix Common Issues - -**Missing required fields**: -```bash -# Find memories missing provenance -rg -L "provenance:" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# Add provenance to each -``` - -**Invalid timestamps**: -```bash -# Find non-ISO timestamps -rg "created:.*[^Z]$" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -``` - -**Duplicate UUIDs**: -```bash -# Check for duplicates -rg "^id:" ${MNEMONIC_ROOT}/ --glob "*.memory.md" | \ - cut -d: -f2 | sort | uniq -d -``` - ---- - -## Integration Setup - -After migration, set up integrations for other tools: - -### Claude Code (Native) - -Already configured by plugin installation. - -### Cursor - -```bash -# Generate Cursor rules from memories -./tools/mnemonic-export --format cursor > .cursor/rules -``` - -### Windsurf - -```bash -# Generate Windsurf memories -./tools/mnemonic-export --format windsurf > .windsurf/memories/mnemonic.md -``` - -### GitHub Copilot - -```bash -# Generate Copilot instructions -./tools/mnemonic-export --format copilot > .github/copilot-instructions.md -``` - -See [Integration Guides](../integrations/README.md) for complete setup. - ---- - -## Rollback - -If you need to revert: - -```bash -# Restore from backup -tar -xzf memory-bank-backup-*.tar.gz -C ~/ - -# Or git restore -cd ~/your-memory-bank -git checkout HEAD~1 -- . - -# Remove mnemonic memories -rm -rf ${MNEMONIC_ROOT}/ -``` - ---- - -## FAQ - -### Can I keep using both systems? - -Yes. Mnemonic doesn't require exclusive use. You can: -- Use mnemonic for new memories -- Keep old system for reference -- Gradually migrate - -### Will my old memories still work? - -Your original markdown files remain unchanged. Mnemonic creates new files in its own directory. - -### What about tool-specific features? - -Mnemonic focuses on portable memory. Tool-specific settings (Cursor rules, Windsurf configuration) should stay in their respective locations. - -### How do I sync changes back? - -Use the export tools to generate tool-specific formats: -```bash -# After adding memories in mnemonic -./tools/mnemonic-export --format cursor > .cursor/rules -``` - ---- - -## Next Steps - -- [Quick Start](./quickstart-memory-bank.md) - 5-minute overview -- [Comparison](./mnemonic-vs-memory-bank.md) - Feature differences -- [Integration Guides](../integrations/README.md) - Tool-specific setup -- [Main Documentation](../../README.md) - Complete reference - -[← Back to Community](./README.md) diff --git a/docs/archive/community/mnemonic-vs-memory-bank.md b/docs/archive/community/mnemonic-vs-memory-bank.md deleted file mode 100644 index a9dc919..0000000 --- a/docs/archive/community/mnemonic-vs-memory-bank.md +++ /dev/null @@ -1,428 +0,0 @@ -# Mnemonic vs Memory Bank: Comparison - -Side-by-side comparison of mnemonic with typical Memory Bank setups. - ---- - -## Overview - -Memory Bank is a community pattern—markdown files used to give AI coding assistants persistent memory. Mnemonic formalizes this approach with standards, validation, and multi-tool support. - -**Key insight**: Memory Bank proved filesystem-based memory works. Mnemonic adds structure without losing simplicity. - ---- - -## Feature Comparison - -| Feature | Memory Bank | Mnemonic | -|---------|-------------|----------| -| **Storage** | Markdown files | Markdown files | -| **Format** | Ad-hoc | MIF Level 3 standard | -| **Validation** | None | Schema validation tool | -| **Memory types** | Implicit | semantic/episodic/procedural | -| **Decay model** | None | Exponential decay | -| **Cross-tool** | Manual per tool | 9+ tools supported | -| **Research backing** | Community intuition | 74% benchmark accuracy | -| **Version control** | Optional | Git-native | -| **Metadata** | Varies | Structured YAML | -| **Provenance** | None | Full tracking | -| **Bi-temporal** | No | Yes (valid_from/recorded_at) | - ---- - -## Format Comparison - -### Memory Bank (Typical) - -```markdown -# Project Memory Bank - -## Context -We're building a REST API with Node.js. - -## Decisions -- Use PostgreSQL for storage -- JWT for authentication -- Rate limiting at API gateway - -## Patterns -- All errors return JSON with `error` key -- Use snake_case for API fields - -## Recent Sessions -### 2025-01-15 -Fixed the N+1 query bug in user dashboard. -``` - -### Mnemonic (MIF Level 3) - -**Decision memory** (`decisions/user/abc123-use-postgresql.memory.md`): -```yaml ---- -id: abc12345-1234-1234-1234-123456789abc -type: semantic -namespace: decisions/user -created: 2026-01-15T10:30:00Z -modified: 2026-01-15T10:30:00Z -title: "Use PostgreSQL for Storage" -tags: - - database - - architecture -temporal: - valid_from: 2026-01-15T10:30:00Z - recorded_at: 2026-01-15T10:30:00Z -provenance: - source_type: conversation - agent: claude-opus-4 - confidence: 0.95 ---- - -# Use PostgreSQL for Storage - -We decided to use PostgreSQL because: -- Strong ACID compliance for transaction integrity -- Excellent JSON support for flexible schemas -- Mature ecosystem with great tooling - -## Alternatives Considered -- MongoDB: Rejected due to consistency requirements -- MySQL: Less rich JSON support -``` - -**Episodic memory** (`episodic/user/def456-n1-query-fix.memory.md`): -```yaml ---- -id: def45678-5678-5678-5678-567890123def -type: episodic -namespace: episodic/user -created: 2026-01-15T14:00:00Z -title: "Fixed N+1 Query in User Dashboard" -tags: - - debugging - - performance -temporal: - valid_from: 2026-01-15T14:00:00Z - recorded_at: 2026-01-15T16:00:00Z - decay: - model: exponential - half_life: P7D -provenance: - source_type: observation - agent: claude-opus-4 - confidence: 0.9 ---- - -# Fixed N+1 Query in User Dashboard - -## Problem -Dashboard taking 5+ seconds to load. - -## Investigation -Found N+1 pattern in UserDashboard component. -Each user row triggered separate query for posts. - -## Solution -Added `.includes(:posts, :comments)` to ActiveRecord query. - -## Result -Load time: 5s → 200ms -``` - ---- - -## Structural Comparison - -### Memory Bank Organization - -``` -~/memory-bank/ -├── memory-bank.md # Everything in one file -├── decisions.md # Or split by topic -├── patterns.md -└── sessions/ - ├── 2025-01-15.md - └── 2025-01-16.md -``` - -### Mnemonic Organization - -``` -${MNEMONIC_ROOT}/ -├── default/ # Organization -│ ├── decisions/ -│ │ ├── user/ # Personal decisions -│ │ ├── project/ # Project-level -│ │ └── shared/ # Team-shared -│ ├── learnings/user/ -│ ├── patterns/user/ -│ ├── blockers/user/ -│ ├── context/user/ -│ ├── apis/user/ -│ ├── security/user/ -│ ├── testing/user/ -│ └── episodic/user/ -└── .blackboard/ # Session coordination - ├── active-tasks.md - ├── session-notes.md - └── shared-context.md -``` - ---- - -## Capability Comparison - -### Search - -**Memory Bank**: -```bash -# Basic grep -grep -r "authentication" ~/memory-bank/ -``` - -**Mnemonic**: -```bash -# Structured search -/mnemonic:search "authentication" - -# Namespace-specific -rg -i "authentication" ${MNEMONIC_ROOT}/*/decisions/ - -# By memory type -rg "^type: episodic" ${MNEMONIC_ROOT}/ -l -``` - -### Capture - -**Memory Bank**: -```bash -# Manual edit -vim ~/memory-bank/memory-bank.md -# Add to appropriate section -``` - -**Mnemonic**: -```bash -# Typed capture -/mnemonic:capture decisions "Use JWT for auth" -/mnemonic:capture learnings "PostgreSQL JSONB indexing" -/mnemonic:capture patterns "Error handling convention" -``` - -### Validation - -**Memory Bank**: -- No validation -- Format drift over time -- No schema enforcement - -**Mnemonic**: -```bash -# Full validation -./tools/mnemonic-validate - -# CI integration -./tools/mnemonic-validate --format json | jq '.summary' - -# Pre-commit hook -./tools/mnemonic-validate --changed --fast-fail -``` - -### Multi-Tool Support - -**Memory Bank**: -- Each tool needs manual configuration -- Different formats per tool -- No portability - -**Mnemonic**: -- 9+ tools supported natively -- Single format, multiple exports -- Switch tools without losing memory - -| Tool | Memory Bank Setup | Mnemonic Setup | -|------|------------------|----------------| -| Cursor | Custom .cursor/rules | Native + export | -| Windsurf | Custom .windsurfrules | Native + export | -| Copilot | Custom instructions | Native + export | -| Aider | CONVENTIONS.md | Native + export | -| Continue | config.yaml | Native + export | - ---- - -## Memory Types - -### Memory Bank Approach - -Typically implicit or section-based: -```markdown -## Decisions <- Type implied by header -## Learnings <- Type implied by header -## Sessions <- Type implied by header -``` - -### Mnemonic Approach - -Explicit typing with cognitive science foundation: - -| Type | Use Case | Decay Rate | Example | -|------|----------|------------|---------| -| `semantic` | Facts, decisions, specs | Slow (30d) | "We use PostgreSQL" | -| `episodic` | Events, sessions, incidents | Fast (7d) | "Fixed bug on Jan 15" | -| `procedural` | Patterns, workflows | Medium (14d) | "Deploy via GitHub Actions" | - ---- - -## Decay Model - -### Memory Bank - -No decay—all memories treated equally regardless of age or relevance. - -### Mnemonic - -Exponential decay based on memory type: - -```yaml -temporal: - decay: - model: exponential - half_life: P7D # Episodic: halves every 7 days - strength: 0.85 # Current relevance (0.0-1.0) -``` - -**Benefits**: -- Recent memories prioritized -- Old memories naturally fade -- Important memories can override decay -- Automatic relevance ranking - ---- - -## Provenance Tracking - -### Memory Bank - -No tracking—unknown origin for memories. - -### Mnemonic - -Full provenance for every memory: - -```yaml -provenance: - source_type: conversation # How it was captured - agent: claude-opus-4 # Which AI created it - confidence: 0.95 # How confident - references: # Supporting evidence - - type: documentation - url: https://docs.example.com -``` - -**Benefits**: -- Audit trail for compliance -- Confidence-weighted retrieval -- Source verification -- Citation support - ---- - -## Bi-Temporal Tracking - -### Memory Bank - -Single timestamp (if any). - -### Mnemonic - -Two time dimensions per SQL:2011 standard: - -```yaml -temporal: - valid_from: 2026-01-10T00:00:00Z # When this became true - recorded_at: 2026-01-15T10:30:00Z # When we recorded it -``` - -**Use cases**: -- "When was this decision made?" (valid_from) -- "When did we learn this?" (recorded_at) -- Backfilling historical decisions -- Compliance auditing - ---- - -## Research Validation - -### Memory Bank - -Community intuition—no formal benchmarks. - -### Mnemonic - -Research-validated approach: - -| Benchmark | Filesystem (Mnemonic) | Graph-Based (Mem0) | -|-----------|----------------------|-------------------| -| LoCoMo Accuracy | **74.0%** | 68.5% | - -**Academic foundation**: -- Unix philosophy (arXiv:2601.11672) -- Cognitive memory types (arXiv:2411.00489) -- Bi-temporal theory (SQL:2011) - ---- - -## Migration Path - -Memory Bank → Mnemonic is additive, not replacement: - -1. **Keep existing files** - No need to delete -2. **Install mnemonic** - Adds structure on top -3. **Migrate incrementally** - Convert as you use -4. **Validate** - Ensure format compliance - -See [Migration Guide](./migration-from-memory-bank.md) for details. - ---- - -## When to Use Each - -### Stick with Memory Bank if: - -- Simple, single-project setup -- No need for cross-tool support -- Minimal compliance requirements -- Prefer complete flexibility - -### Move to Mnemonic if: - -- Multiple AI tools in your workflow -- Team collaboration needed -- Compliance or audit requirements -- Want research-backed approach -- Value validation and structure - ---- - -## Summary - -| Aspect | Memory Bank | Mnemonic | -|--------|-------------|----------| -| Philosophy | DIY flexibility | Structured standards | -| Learning curve | Lower | Slightly higher | -| Validation | None | Built-in | -| Multi-tool | Manual | Native | -| Research backing | Community | Academic | -| Best for | Simple setups | Professional use | - -**Bottom line**: Mnemonic validates what Memory Bank proved while adding the structure needed for professional and team use. - ---- - -## Related Documentation - -- [Quick Start](./quickstart-memory-bank.md) - 5-minute setup -- [Migration Guide](./migration-from-memory-bank.md) - Full walkthrough -- [Research Validation](../enterprise/research-validation.md) - Academic backing -- [Main Documentation](../../README.md) - Complete reference - -[← Back to Community](./README.md) diff --git a/docs/archive/community/quickstart-memory-bank.md b/docs/archive/community/quickstart-memory-bank.md deleted file mode 100644 index b43edf9..0000000 --- a/docs/archive/community/quickstart-memory-bank.md +++ /dev/null @@ -1,237 +0,0 @@ -# Quick Start for Memory Bank Users - -Already using markdown files for AI memory? You're 5 minutes away from mnemonic. - ---- - -## What You Already Know - -If you've been using Memory Bank patterns, you've already discovered: - -- Markdown files work for AI memory -- Filesystem storage is reliable -- Your AI assistant can read and write context -- Version control with git is valuable - -**Mnemonic validates your approach** and adds standardization. - ---- - -## The 5-Minute Setup - -### Step 1: Install the Plugin - -```bash -# Clone mnemonic -git clone https://github.com/zircote/mnemonic.git ~/tools/mnemonic - -# Register with Claude Code -claude settings plugins add ~/tools/mnemonic -``` - -### Step 2: Initialize - -```bash -# Start Claude Code and run setup -/mnemonic:setup -``` - -This creates: -``` -${MNEMONIC_ROOT}/ -├── default/ -│ ├── decisions/user/ -│ ├── learnings/user/ -│ ├── patterns/user/ -│ ├── blockers/user/ -│ ├── context/user/ -│ ├── apis/user/ -│ ├── security/user/ -│ ├── testing/user/ -│ └── episodic/user/ -└── .blackboard/ -``` - -### Step 3: Migrate Your Existing Files - -```bash -# Quick migration - copy your existing memory files -cp ~/your-memory-bank/*.md ${MNEMONIC_ROOT}/default/context/user/ - -# Or use the migration tool for proper conversion -./tools/migrate-memory-bank \ - --source ~/your-memory-bank \ - --target ${MNEMONIC_ROOT}/default -``` - -### Step 4: Start Using It - -```bash -# Capture a new decision -/mnemonic:capture decisions "Use PostgreSQL for storage" - -# Search your memories -/mnemonic:search "authentication" - -# Check status -/mnemonic:status -``` - ---- - -## What Changes (And What Doesn't) - -### What Stays the Same - -| Your Approach | With Mnemonic | -|---------------|---------------| -| Plain markdown files | Still plain markdown | -| Stored on filesystem | Still on filesystem | -| Human-readable | Still human-readable | -| Git-versioned | Still git-versioned | -| Your editor works | Your editor still works | - -### What You Gain - -| Feature | Before | After | -|---------|--------|-------| -| **Structure** | Ad-hoc | Standardized (MIF Level 3) | -| **Validation** | None | Schema validation tool | -| **Cross-tool** | Manual setup per tool | Works with 9+ tools | -| **Decay model** | Static | Automatic relevance decay | -| **Research backing** | Your intuition | 74% benchmark accuracy | - ---- - -## Format Comparison - -### Your Current Format (Typical) - -```markdown -# Project Context - -We're building an API gateway. - -## Decisions -- Use JWT for auth -- PostgreSQL for storage - -## Notes -- Fixed the N+1 bug on 2025-01-15 -``` - -### Mnemonic Format (MIF Level 3) - -```yaml ---- -id: 550e8400-e29b-41d4-a716-446655440000 -type: semantic -namespace: decisions/user -created: 2026-01-23T10:30:00Z -title: "Use JWT for Authentication" -tags: - - authentication - - security -temporal: - valid_from: 2026-01-23T10:30:00Z - recorded_at: 2026-01-23T10:30:00Z -provenance: - source_type: conversation - agent: claude-opus-4 - confidence: 0.95 ---- - -# Use JWT for Authentication - -We decided to use JWT tokens because: -- Stateless authentication fits our microservices architecture -- Standard library support in all our languages -- Easy integration with API gateway -``` - -**Key difference**: Structured metadata in YAML frontmatter. - ---- - -## Common Migration Patterns - -### Pattern 1: Single Context File → Multiple Memories - -**Before**: One large `context.md` with everything - -**After**: Separate files by type -```bash -# Create separate memories for each decision -/mnemonic:capture decisions "Use JWT for auth" -/mnemonic:capture decisions "Use PostgreSQL for storage" -/mnemonic:capture patterns "Error handling pattern" -``` - -### Pattern 2: Project-Specific → Namespaced - -**Before**: `~/project-a/memory-bank/` - -**After**: `${MNEMONIC_ROOT}/project-a/decisions/user/` - -```bash -# Create project-specific namespace -mkdir -p ${MNEMONIC_ROOT}/project-a/{decisions,patterns,learnings}/user -``` - -### Pattern 3: Unstructured Notes → Typed Memories - -**Before**: Generic notes mixed together - -**After**: Typed by memory category -- `semantic` - Facts, decisions, specifications -- `episodic` - Events, debugging sessions -- `procedural` - Workflows, patterns - ---- - -## Keep Your Existing Setup - -You don't have to choose. Mnemonic can coexist with your current approach: - -``` -${MNEMONIC_ROOT}/ # Mnemonic memories -~/your-memory-bank/ # Keep your existing setup - -# Mnemonic reads both if you configure it -``` - -Or gradually migrate: -1. Start capturing new memories in mnemonic format -2. Migrate old memories when you touch them -3. Eventually consolidate - ---- - -## Validation - -Check your migrated memories: - -```bash -# Validate all memories -./tools/mnemonic-validate - -# See any format issues -./tools/mnemonic-validate --format json | jq '.errors' -``` - ---- - -## Next Steps - -- [Full Migration Guide](./migration-from-memory-bank.md) - Detailed walkthrough -- [Comparison](./mnemonic-vs-memory-bank.md) - Side-by-side differences -- [Main Documentation](../../README.md) - Complete reference - ---- - -## Questions? - -- **GitHub Issues**: [Report problems](https://github.com/zircote/mnemonic/issues) -- **Discussions**: [Ask questions](https://github.com/zircote/mnemonic/discussions) - -[← Back to Community](./README.md) diff --git a/docs/archive/integrations/README.md b/docs/archive/integrations/README.md deleted file mode 100644 index b9bf373..0000000 --- a/docs/archive/integrations/README.md +++ /dev/null @@ -1,122 +0,0 @@ -# Mnemonic Integrations - -Mnemonic integrates with popular AI coding assistants through their native configuration mechanisms. - -## Supported Tools - -| Tool | Integration Method | Guide | -|------|-------------------|-------| -| [Claude Code](https://claude.ai/code) | Native Plugin | Built-in | -| [GitHub Copilot](https://github.com/features/copilot) | `.github/copilot-instructions.md` | [Guide](./github-copilot.md) | -| [OpenAI Codex CLI](https://github.com/openai/codex) | `AGENTS.md` + Skills | [Guide](./codex-cli.md) | -| [Google Gemini CLI](https://github.com/google-gemini/gemini-cli) | MCP Server / Instructions | [Guide](./gemini-cli.md) | -| [OpenCode](https://opencode.ai) | Skills | [Guide](./opencode.md) | -| [Cursor](https://cursor.com) | Rules | [Guide](./cursor.md) | -| [Windsurf/Codeium](https://windsurf.ai) | Memories/Rules | [Guide](./windsurf.md) | -| [Aider](https://aider.chat) | `CONVENTIONS.md` | [Guide](./aider.md) | -| [Continue Dev](https://continue.dev) | `config.yaml` rules | [Guide](./continue.md) | - -## Quick Start - -### 1. Choose Your Tool - -Select the integration guide for your AI coding assistant from the table above. - -### 2. Copy Templates - -All integrations use templates from the [`templates/`](../../templates/) directory: - -```bash -# GitHub Copilot -cp templates/copilot-instructions.md .github/copilot-instructions.md - -# Codex CLI / OpenCode -cp -r templates/codex-skill ~/.codex/skills/mnemonic - -# Cursor -cp templates/cursor-rule.mdc .cursor/rules/mnemonic.mdc - -# Aider -cp templates/CONVENTIONS.md ./CONVENTIONS.md - -# Universal (many tools support this) -cp templates/AGENTS.md ./AGENTS.md -``` - -### 3. Verify - -Follow the verification steps in each integration guide to confirm the setup works. - -## Universal Memory Format - -All integrations use the same MIF Level 3 memory format: - -```yaml ---- -id: -type: semantic|episodic|procedural -namespace: {namespace}/user -created: -modified: -title: "Descriptive title" -tags: [tag1, tag2] -temporal: - valid_from: - recorded_at: -provenance: - source_type: conversation - agent: - confidence: 0.9 ---- - -# Title - -Content in markdown... -``` - -## Memory Storage - -All memories are stored at `${MNEMONIC_ROOT}/` with this structure: - -``` -${MNEMONIC_ROOT}/ -└── {org}/ # Organization from git remote (or "default") - ├── apis/user/ # API documentation - ├── blockers/user/ # Issues encountered - ├── context/user/ # General context - ├── decisions/user/ # Architectural choices - ├── learnings/user/ # Insights discovered - ├── patterns/user/ # Code conventions - ├── security/user/ # Security policies - ├── testing/user/ # Test strategies - └── episodic/user/ # Events, experiences -``` - -**Note:** The `{org}` directory is derived from your git remote (e.g., `zircote` for `github.com/zircote/repo`). Falls back to `default` if no git remote is configured. - -## Templates - -| Template | Purpose | Location | -|----------|---------|----------| -| `copilot-instructions.md` | GitHub Copilot | `.github/` | -| `codex-skill/SKILL.md` | Codex CLI, OpenCode | `~/.codex/skills/mnemonic/` | -| `cursor-rule.mdc` | Cursor | `.cursor/rules/` | -| `CONVENTIONS.md` | Aider | Project root | -| `AGENTS.md` | Multiple tools | Project root or `~/.codex/` | - -## Migrating from Memory Bank - -Already using a Memory Bank pattern in Cursor, Windsurf, or another tool? - -- [Quick Start for Memory Bank Users](../community/quickstart-memory-bank.md) - 5-minute setup -- [Full Migration Guide](../community/migration-from-memory-bank.md) - Complete walkthrough -- [Comparison](../community/mnemonic-vs-memory-bank.md) - Side-by-side differences - -## Contributing - -To add support for a new tool: - -1. Create a guide in `docs/integrations/.md` -2. Add templates to `templates/` if needed -3. Update this README with the new tool -4. Submit a pull request diff --git a/docs/archive/integrations/aider.md b/docs/archive/integrations/aider.md deleted file mode 100644 index 79bd401..0000000 --- a/docs/archive/integrations/aider.md +++ /dev/null @@ -1,119 +0,0 @@ -# Aider Integration - -Integrate Mnemonic with Aider using CONVENTIONS.md. - -## Overview - -Aider supports a CONVENTIONS.md file that provides project-specific instructions. This integration configures Aider to use Mnemonic for persistent memory. - -## Setup - -### Create CONVENTIONS.md - -Create `CONVENTIONS.md` in your project root: - -```bash -cp /path/to/mnemonic/templates/CONVENTIONS.md ./CONVENTIONS.md -``` - -### Configure Auto-Loading - -Add to `.aider.conf.yml`: - -```yaml -read: CONVENTIONS.md -``` - -Or pass explicitly: - -```bash -aider --read CONVENTIONS.md -``` - -## CONVENTIONS.md Content - -```markdown -# Mnemonic Memory Integration - -## Memory System -This project uses Mnemonic for persistent memories at `${MNEMONIC_ROOT}/`. - -## Before Implementing -Always search for relevant memories: -```bash -rg -i "" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -``` - -## Capture Requirements - -### When to Capture -- Decision made: Save to `decisions/user/` -- Lesson learned: Save to `learnings/user/` -- Pattern established: Save to `patterns/user/` -- Blocker found: Save to `blockers/user/` - -### Memory Format (MIF Level 3) -Files must have `.memory.md` extension with YAML frontmatter: - -```yaml ---- -id: -type: semantic|episodic|procedural -namespace: {namespace}/user -created: -title: "Descriptive title" -tags: [tag1, tag2] ---- - -# Title - -Content... -``` -``` - -## Usage - -### Start Aider with Conventions - -```bash -aider --read CONVENTIONS.md -``` - -### Commands During Session - -``` -/read CONVENTIONS.md # Re-read conventions -/add file.md # Add files to context -``` - -### Memory Operations - -Ask Aider naturally: -- "What decisions have been made about the API?" -- "Remember that we're using TypeScript strict mode" -- "Search for patterns related to error handling" - -## Best Practices - -1. Keep CONVENTIONS.md in version control -2. Update conventions as project evolves -3. Use `.aider.conf.yml` for consistent loading -4. Combine with `.aider.watch` for auto-context - -## Verification - -```bash -# Start aider with conventions -aider --read CONVENTIONS.md - -# Ask about memories -> What do we know about this project? - -# Create a memory -> Remember that we decided to use PostgreSQL -``` - -## Sources - -- [Aider CONVENTIONS.md](https://aider.chat/docs/usage/conventions.html) -- [Aider Configuration](https://aider.chat/docs/config.html) diff --git a/docs/archive/integrations/codex-cli.md b/docs/archive/integrations/codex-cli.md deleted file mode 100644 index 06f1e7e..0000000 --- a/docs/archive/integrations/codex-cli.md +++ /dev/null @@ -1,83 +0,0 @@ -# OpenAI Codex CLI Integration - -Integrate Mnemonic with OpenAI Codex CLI using AGENTS.md and Skills. - -## Overview - -Codex CLI supports two integration methods: -1. **AGENTS.md**: Global instructions for all sessions -2. **Skills**: Reusable commands invokable with `$mnemonic` - -## Setup - -### Method 1: AGENTS.md (Global Instructions) - -Create `~/.codex/AGENTS.md`: - -```bash -mkdir -p ~/.codex -cp /path/to/mnemonic/templates/AGENTS.md ~/.codex/ -``` - -### Method 2: Mnemonic Skill - -Create the skill directory and file: - -```bash -mkdir -p ~/.codex/skills/mnemonic -cp /path/to/mnemonic/templates/codex-skill/SKILL.md ~/.codex/skills/mnemonic/ -``` - -## Skill Usage - -Once installed, invoke the skill: - -``` -$mnemonic search authentication -$mnemonic capture decision "Use JWT for auth" -``` - -## AGENTS.md Content - -The AGENTS.md file instructs Codex to: - -1. Search memories before implementing features -2. Capture decisions, learnings, and patterns -3. Use MIF Level 3 format for all memories - -See [templates/AGENTS.md](../../templates/AGENTS.md) for the full template. - -## Skill Content - -The skill provides: - -1. `search` - Find relevant memories -2. `capture` - Create new memories -3. `list` - View memories by namespace - -See [templates/codex-skill/SKILL.md](../../templates/codex-skill/SKILL.md) for the full template. - -## Verification - -```bash -# Verify AGENTS.md is loaded -codex --show-agents - -# List available skills -codex /skills - -# Test skill invocation -$mnemonic search test -``` - -## Best Practices - -1. Use both AGENTS.md and Skills for complete integration -2. Place project-specific agents in repository root -3. Use global agents for cross-project memory access - -## Sources - -- [Codex AGENTS.md Guide](https://developers.openai.com/codex/guides/agents-md) -- [Codex Skills Documentation](https://developers.openai.com/codex/skills/) -- [Create Skills](https://developers.openai.com/codex/skills/create-skill/) diff --git a/docs/archive/integrations/continue.md b/docs/archive/integrations/continue.md deleted file mode 100644 index fa13335..0000000 --- a/docs/archive/integrations/continue.md +++ /dev/null @@ -1,120 +0,0 @@ -# Continue Dev Integration - -Integrate Mnemonic with Continue Dev using config.yaml rules and custom commands. - -## Overview - -Continue Dev supports system messages and custom commands. This integration adds mnemonic memory capabilities to your Continue configuration. - -## Setup - -### Edit Configuration - -Add to `~/.continue/config.yaml`: - -```yaml -models: - - provider: anthropic - name: claude-sonnet-4-20250514 - -chatOptions: - baseSystemMessage: | - You have access to a Mnemonic memory system at ${MNEMONIC_ROOT}/. - - BEFORE implementing anything: - - Search: rg -i "" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - - CAPTURE immediately when: - - Decision made → decisions/user/ - - Lesson learned → learnings/user/ - - Pattern established → patterns/user/ - - Memory format: .memory.md files with MIF Level 3 YAML frontmatter - (id, type, namespace, created, title, tags) - -customCommands: - - name: mnemonic-search - description: Search mnemonic memories - prompt: | - Search for memories related to: {{input}} - Use: rg -i "{{input}}" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - - - name: mnemonic-capture - description: Capture a new memory - prompt: | - Create a memory in ${MNEMONIC_ROOT}/default/{{namespace}}/user/ - with MIF Level 3 format for: {{input}} - - - name: mnemonic-list - description: List memories by namespace - prompt: | - List memories in namespace: {{input}} - Use: ls ${MNEMONIC_ROOT}/default/{{input}}/user/ -``` - -## Custom Commands - -### Search Memories - -``` -/mnemonic-search authentication -``` - -### Capture Memory - -``` -/mnemonic-capture decisions Use JWT for authentication -``` - -### List by Namespace - -``` -/mnemonic-list decisions -``` - -## Context Provider (Advanced) - -Add a custom context provider for deeper integration: - -```yaml -contextProviders: - - name: mnemonic - params: - path: ${MNEMONIC_ROOT} - pattern: "*.memory.md" -``` - -## Usage - -### In Chat - -``` -What memories exist about the database schema? -Remember that we decided to use PostgreSQL -Search for patterns related to API design -``` - -### With Commands - -``` -/mnemonic-search database -/mnemonic-capture patterns Always validate input at API boundaries -``` - -## Verification - -1. Open Continue in your IDE -2. Run `/mnemonic-search test` -3. Verify the search command is executed -4. Create a test memory with `/mnemonic-capture` - -## Best Practices - -1. Use `baseSystemMessage` for always-on instructions -2. Create custom commands for frequent operations -3. Consider context providers for large memory sets - -## Sources - -- [Continue Dev Documentation](https://docs.continue.dev/) -- [Continue Configuration](https://docs.continue.dev/reference/config) diff --git a/docs/archive/integrations/cursor.md b/docs/archive/integrations/cursor.md deleted file mode 100644 index 00848de..0000000 --- a/docs/archive/integrations/cursor.md +++ /dev/null @@ -1,295 +0,0 @@ -# Cursor Integration - -Integrate Mnemonic with Cursor using the Rules system. - -## Overview - -Cursor supports rules that apply to all AI interactions. The mnemonic rule configures Cursor to use the memory system. - -## Setup - -### Create Cursor Rule - -Create `.cursor/rules/mnemonic.mdc`: - -```bash -mkdir -p .cursor/rules -cp /path/to/mnemonic/templates/cursor-rule.mdc .cursor/rules/mnemonic.mdc -``` - -### Alternative: AGENTS.md - -Cursor also supports `AGENTS.md` in the project root: - -```bash -cp /path/to/mnemonic/templates/AGENTS.md ./AGENTS.md -``` - -## Rule Content - -```markdown ---- -description: "Mnemonic memory system for persistent context across sessions" -alwaysApply: true ---- - -# Mnemonic Memory System - -## Memory Storage -All memories stored at `${MNEMONIC_ROOT}/` as `.memory.md` files. - -## Required Behavior - -### Before Implementing -Search for relevant memories: -```bash -rg -i "" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -``` - -### Capture Triggers -- Decision made → Create in `decisions/user/` -- Lesson learned → Create in `learnings/user/` -- Pattern established → Create in `patterns/user/` -- Blocker encountered → Create in `blockers/user/` - -## Memory Types -- **semantic**: Facts, decisions, specifications -- **episodic**: Events, debug sessions, incidents -- **procedural**: Workflows, patterns, how-tos -``` - -## Usage - -Once the rule is in place: - -1. **Recall**: Ask Cursor "What do we know about X?" -2. **Capture**: Tell Cursor "Remember that we decided Y" -3. **Reference**: Use `@mnemonic` in Cursor Chat - -## Verification - -1. Open a file in Cursor -2. Check Settings > Features > Rules for the mnemonic rule -3. Ask in Composer: "Search for memories about this project" - -## Rule Options - -| Option | Description | -|--------|-------------| -| `alwaysApply: true` | Apply to all interactions | -| `alwaysApply: false` | Only apply when explicitly referenced | -| `description` | Shown in rule list | - ---- - -## Common Workflows - -### Daily Development - -``` -Morning: -1. Open project in Cursor -2. Ask: "What decisions have we made about this project?" -3. Continue where you left off - -During Development: -1. Before implementing: "Search memories for [feature]" -2. After decisions: "Remember that we're using [approach]" -3. After debugging: "Capture this fix as a learning" - -End of Day: -1. Review: "What did we learn today?" -2. Verify memories captured -``` - -### Feature Implementation - -``` -1. "What patterns do we use for [component type]?" - → Cursor searches patterns/user/ - -2. "What decisions affect [feature]?" - → Cursor searches decisions/user/ - -3. Implement feature following established patterns - -4. "Remember this pattern: [description]" - → Creates new pattern memory -``` - -### Debugging Session - -``` -1. Encounter bug -2. "Search memories for similar issues" -3. Investigate and fix -4. "Capture this debugging session as a learning" - → Creates episodic memory with: - - Problem description - - Investigation steps - - Solution -``` - ---- - -## Advanced Patterns - -### Memory-Aware Code Review - -Add to your Cursor rule: - -```markdown -When reviewing code: -1. Check patterns/user/ for established conventions -2. Reference decisions/user/ for architectural context -3. Flag violations of documented patterns -``` - -### Context Switching - -When switching between projects: - -```bash -# Each project can have its own namespace -${MNEMONIC_ROOT}/project-a/decisions/user/ -${MNEMONIC_ROOT}/project-b/decisions/user/ -``` - -Configure rule to use project-specific paths: - -```markdown -Memory path for this project: ${MNEMONIC_ROOT}/project-a/ -``` - -### Team Patterns - -Share patterns across team: - -```bash -# Clone shared patterns -git clone git@github.com:team/patterns.git ${MNEMONIC_ROOT}/shared - -# Rule references both personal and shared -Memory paths: -- Personal: ${MNEMONIC_ROOT}/default/ -- Shared: ${MNEMONIC_ROOT}/shared/ -``` - ---- - -## Migrating from Cursor Memory Bank - -If you've been using a Memory Bank pattern in Cursor: - -### Step 1: Export Current Memories - -Your Memory Bank files are typically in: -- `.cursor/memory-bank/` -- `.cursorrules` (memory section) -- Project-specific markdown files - -### Step 2: Convert to MIF Format - -```bash -# Use migration tool -./tools/migrate-memory-bank \ - --source .cursor/memory-bank \ - --target ${MNEMONIC_ROOT}/default \ - --namespace context -``` - -### Step 3: Update Cursor Rules - -Replace old memory references with mnemonic paths: - -**Before:** -```markdown -Check .cursor/memory-bank/ for context -``` - -**After:** -```markdown -Check ${MNEMONIC_ROOT}/default/ for context -Use MIF Level 3 format for new memories -``` - -### Step 4: Verify Migration - -```bash -# Validate converted memories -./tools/mnemonic-validate ${MNEMONIC_ROOT}/default/ - -# Test in Cursor -"What do we know about [topic from old memory bank]?" -``` - -See [Migration Guide](../community/migration-from-memory-bank.md) for complete details. - ---- - -## Troubleshooting - -### Rules Not Loading - -**Symptom**: Cursor doesn't follow mnemonic instructions - -**Solutions**: -1. Check rule location: `.cursor/rules/mnemonic.mdc` -2. Verify `alwaysApply: true` is set -3. Restart Cursor after adding rules -4. Check Settings > Features > Rules to confirm loading - -### Memory Files Not Found - -**Symptom**: "No memories found for [topic]" - -**Solutions**: -1. Verify memory directory exists: - ```bash - ls -la ${MNEMONIC_ROOT}/ - ``` -2. Check file permissions -3. Ensure `.memory.md` extension -4. Try explicit path in query - -### Format Errors - -**Symptom**: Cursor creates invalid memory files - -**Solutions**: -1. Add format examples to rule -2. Run validation after capture: - ```bash - ./tools/mnemonic-validate --changed - ``` -3. Include YAML template in rule - -### Search Not Working - -**Symptom**: ripgrep commands fail - -**Solutions**: -1. Verify ripgrep installed: - ```bash - which rg || brew install ripgrep - ``` -2. Check path in rule matches actual location -3. Try broader search pattern - -### Rule Conflicts - -**Symptom**: Multiple rules interfering - -**Solutions**: -1. Use unique description for mnemonic rule -2. Set priority with rule ordering -3. Check for conflicting `alwaysApply` rules - ---- - -## Sources - -- [Cursor Rules Documentation](https://cursor.com/docs/context/rules) -- [awesome-cursorrules](https://github.com/PatrickJS/awesome-cursorrules) -- [Memory Bank Migration](../community/migration-from-memory-bank.md) -- [MIF Level 3 Specification](../../skills/mnemonic-format/SKILL.md) diff --git a/docs/archive/integrations/gemini-cli.md b/docs/archive/integrations/gemini-cli.md deleted file mode 100644 index 6dfc26c..0000000 --- a/docs/archive/integrations/gemini-cli.md +++ /dev/null @@ -1,102 +0,0 @@ -# Google Gemini CLI Integration - -Integrate Mnemonic with Google Gemini CLI using instructions or MCP servers. - -## Overview - -Gemini CLI supports: -1. **Instructions file**: Simple text-based instructions -2. **MCP Servers**: Full tool integration (advanced) - -## Setup - -### Method 1: Instructions File (Recommended) - -Create `~/.gemini/instructions.md`: - -```bash -mkdir -p ~/.gemini -cat > ~/.gemini/instructions.md << 'EOF' -# Mnemonic Memory System - -## Memory Location -All memories are stored at `${MNEMONIC_ROOT}/` as `.memory.md` files. - -## Required Behavior -1. Search memories before implementing: `rg -i "" ${MNEMONIC_ROOT}/` -2. Capture decisions, learnings, patterns immediately -3. Use MIF Level 3 format with YAML frontmatter - -## Namespaces -- decisions/ - Architectural choices -- learnings/ - Insights and discoveries -- patterns/ - Code conventions -- blockers/ - Issues and impediments - -## Memory Format -```yaml ---- -id: -type: semantic|episodic|procedural -namespace: {namespace}/user -created: -title: "Title" -tags: [tag1, tag2] ---- - -# Title - -Content... -``` -EOF -``` - -### Method 2: MCP Server (Advanced) - -Add to `~/.gemini/settings.json`: - -```json -{ - "mcpServers": { - "mnemonic": { - "command": "/path/to/mnemonic-mcp-server", - "args": ["--memory-path", "${MNEMONIC_ROOT}"], - "timeout": 30000, - "trust": true - } - } -} -``` - -Note: MCP server implementation requires additional development. - -## Verification - -```bash -# Check MCP servers (if using Method 2) -gemini mcp list - -# Test memory search -gemini "search for memories about authentication" -``` - -## Usage Examples - -```bash -# Ask Gemini to recall -gemini "What decisions have been made about the database schema?" - -# Ask Gemini to capture -gemini "Remember that we decided to use PostgreSQL for the main database" -``` - -## Limitations - -- Instructions file is advisory only -- MCP server requires custom implementation -- Shell command execution depends on Gemini CLI configuration - -## Sources - -- [Gemini CLI MCP Servers](https://geminicli.com/docs/tools/mcp-server/) -- [GitHub - gemini-cli MCP docs](https://github.com/google-gemini/gemini-cli/blob/main/docs/tools/mcp-server.md) diff --git a/docs/archive/integrations/github-copilot.md b/docs/archive/integrations/github-copilot.md deleted file mode 100644 index dbc8f92..0000000 --- a/docs/archive/integrations/github-copilot.md +++ /dev/null @@ -1,306 +0,0 @@ -# GitHub Copilot Integration - -Integrate Mnemonic with GitHub Copilot to provide persistent memory context in your repositories. - -## Overview - -GitHub Copilot supports custom instructions through `.github/copilot-instructions.md` files. This integration configures Copilot to reference and create Mnemonic memories. - -## Setup - -### 1. Create Instructions File - -Create `.github/copilot-instructions.md` in your repository: - -```bash -mkdir -p .github -# From mnemonic repository root: -cp templates/copilot-instructions.md .github/ -``` - -Or copy from the [template](../../templates/copilot-instructions.md). - -### 2. Configure Path-Specific Instructions (Optional) - -For memory file editing support, create `.github/instructions/memory.instructions.md`: - -```markdown ---- -applyTo: ["**/*.memory.md"] ---- - -This is a Mnemonic memory file using MIF Level 3 format. -Preserve the YAML frontmatter structure when editing. -Required fields: id, type, namespace, created, title, tags. -``` - -## How It Works - -1. **Recall**: Copilot searches `${MNEMONIC_ROOT}/` before implementing features -2. **Capture**: Copilot creates memory files when decisions are made -3. **Format**: All memories use MIF Level 3 format with YAML frontmatter - -## Verification - -1. Open a file in your repository with Copilot enabled -2. Ask Copilot Chat: "What memories exist about this project?" -3. Verify it references the mnemonic search command - -## Limitations - -- GitHub Copilot cannot directly execute shell commands -- Instructions are advisory; Copilot may not always follow them -- Works best with Copilot Chat rather than inline completions - -## Template - -See [templates/copilot-instructions.md](../../templates/copilot-instructions.md) for the full template. - ---- - -## Common Workflows - -### Daily Development - -``` -Morning: -1. Open repository in VS Code/IDE -2. Copilot Chat: "What decisions have been made for this project?" -3. Review relevant memories before starting - -During Development: -1. Before implementing: "What patterns exist for [component]?" -2. After decisions: "Document this decision about [topic]" -3. After debugging: "Record this fix for future reference" - -Code Review: -1. "What patterns should I look for in this code?" -2. Reference memories in PR comments -``` - -### Feature Implementation - -``` -1. Copilot Chat: "Search for patterns related to [feature]" - -2. "What architectural decisions affect [area]?" - -3. Implement following established patterns - -4. "Create a memory documenting our approach to [feature]" -``` - -### Debugging Session - -``` -1. Encounter issue -2. "Have we seen similar issues before?" -3. Investigate and resolve -4. "Document this debugging session as a learning" -``` - ---- - -## Advanced Patterns - -### Repository-Level Context - -Add project context to instructions: - -```markdown -# .github/copilot-instructions.md - -## Project Context -This is a [type] project using [stack]. - -## Memory References -Before implementing features, check: -- ${MNEMONIC_ROOT}/this-project/decisions/ -- ${MNEMONIC_ROOT}/this-project/patterns/ - -## Capture Requirements -Document all: -- Architectural decisions -- API design choices -- Performance optimizations -``` - -### Path-Specific Memory Rules - -Create specialized rules for different file types: - -```markdown -# .github/instructions/api.instructions.md ---- -applyTo: ["**/api/**/*.ts"] ---- - -Check API decisions before implementing: -- ${MNEMONIC_ROOT}/default/apis/ - -Document new endpoints in apis/ namespace. -``` - -```markdown -# .github/instructions/tests.instructions.md ---- -applyTo: ["**/*.test.ts", "**/*.spec.ts"] ---- - -Reference testing patterns: -- ${MNEMONIC_ROOT}/default/testing/ - -Document testing strategies discovered. -``` - -### Multi-Repository Sharing - -Share memories across repositories: - -```markdown -# .github/copilot-instructions.md - -## Shared Memories (Organization-wide) -Also check: ~/shared-memories/org/ - -## Team Memories -Check: ~/shared-memories/team-platform/ - -## Project-Specific -Primary: ${MNEMONIC_ROOT}/this-project/ -``` - -### Copilot Workspace Integration - -For Copilot Workspace: - -```markdown -# .github/copilot-instructions.md - -## Workspace Context -When planning implementations: -1. Check decisions/ for architectural constraints -2. Reference patterns/ for code conventions -3. Review apis/ for integration points - -## Multi-file Changes -When modifying multiple files: -1. Verify consistency with patterns/ -2. Update affected memories if patterns change -``` - ---- - -## Migrating from Other Systems - -### From Copilot Memory (Cloud) - -If using GitHub Copilot's built-in memory features: - -1. **Export current context** from Copilot settings -2. **Convert to MIF format**: - ```bash - # Create memory file from exported content - ./tools/convert-to-mif exported-memory.txt \ - --namespace context/user \ - --type semantic - ``` -3. **Update instructions** to reference local files - -### From Repository Memory Files - -If you have existing markdown memory files: - -```bash -# Migrate existing files -./tools/migrate-memory-bank \ - --source ./docs/memory/ \ - --target ${MNEMONIC_ROOT}/default \ - --namespace context - -# Update copilot-instructions.md with new paths -``` - -### From Memory Bank Pattern - -See [Migration Guide](../community/migration-from-memory-bank.md) for detailed steps. - ---- - -## Troubleshooting - -### Instructions Not Loading - -**Symptom**: Copilot ignores custom instructions - -**Solutions**: -1. Verify file location: `.github/copilot-instructions.md` -2. Check repository settings enable custom instructions -3. Ensure file is committed to repository -4. Try refreshing Copilot Chat - -### Memory Commands Fail - -**Symptom**: Copilot can't execute shell commands - -**Note**: GitHub Copilot cannot directly execute shell commands. Instead: - -1. Ask Copilot to **show** the command: - ``` - "What command would search memories for authentication?" - ``` -2. Execute command manually in terminal -3. Share results with Copilot if needed - -### Chat vs Inline Completions - -**Best practices**: -- Use Copilot Chat for memory-related queries -- Inline completions work best for code generation -- Reference memories in Chat, apply in code - -### Path Issues - -**Symptom**: Wrong memory paths referenced - -**Solutions**: -1. Use absolute paths in instructions -2. Verify `~` expands correctly in your environment -3. Consider project-relative paths: - ```markdown - For this project: ./mnemonic/ - For personal: ${MNEMONIC_ROOT}/ - ``` - -### Format Inconsistencies - -**Symptom**: Created memories don't match MIF spec - -**Solutions**: -1. Include full template in path-specific instructions -2. Add validation reminder to instructions: - ```markdown - After creating memories, validate format matches MIF Level 3. - ``` -3. Run validation periodically: - ```bash - ./tools/mnemonic-validate - ``` - -### Stale Instructions - -**Symptom**: Old instructions still being used - -**Solutions**: -1. Refresh Copilot Chat session -2. Verify latest instructions are committed -3. Check for cached versions in IDE - ---- - -## Sources - -- [GitHub Docs - Custom Instructions](https://docs.github.com/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot) -- [Path-Specific Instructions](https://docs.github.com/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot#creating-a-file-to-define-path-specific-instructions) -- [Memory Bank Migration](../community/migration-from-memory-bank.md) -- [MIF Level 3 Specification](../../skills/mnemonic-format/SKILL.md) diff --git a/docs/archive/integrations/opencode.md b/docs/archive/integrations/opencode.md deleted file mode 100644 index a2c492a..0000000 --- a/docs/archive/integrations/opencode.md +++ /dev/null @@ -1,82 +0,0 @@ -# OpenCode Integration - -Integrate Mnemonic with OpenCode using the Skills system. - -## Overview - -OpenCode supports skills that can be invoked during coding sessions. The mnemonic skill provides memory capture and recall functionality. - -## Setup - -### Project-Level Skill - -Create `.opencode/skills/mnemonic/SKILL.md`: - -```bash -mkdir -p .opencode/skills/mnemonic -cp /path/to/mnemonic/templates/codex-skill/SKILL.md .opencode/skills/mnemonic/ -``` - -### Global Skill - -Create `~/.config/opencode/skills/mnemonic/SKILL.md`: - -```bash -mkdir -p ~/.config/opencode/skills/mnemonic -cp /path/to/mnemonic/templates/codex-skill/SKILL.md ~/.config/opencode/skills/mnemonic/ -``` - -## Skill Content - -```yaml ---- -name: mnemonic -description: Capture and recall memories using the MIF Level 3 filesystem memory system. ---- - -# Mnemonic Memory Skill - -## Memory Locations -- Global: `${MNEMONIC_ROOT}/{org}/{namespace}/` -- Project: `${MNEMONIC_ROOT}/{namespace}/` - -## Commands - -### Recall Memories -```bash -rg -i "" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -``` - -### Capture Memory -Write to `${MNEMONIC_ROOT}/default/{namespace}/user/{slug}.memory.md` - -## Capture Triggers -- "let's use X" → decisions/ -- "learned that" → learnings/ -- "the pattern is" → patterns/ -- "blocked by" → blockers/ -``` - -## Usage - -Once installed, the skill is automatically available: - -``` -@mnemonic search authentication -@mnemonic capture "Decided to use OAuth 2.0" -``` - -## Verification - -1. List available skills in OpenCode -2. Invoke `@mnemonic` to verify it's recognized -3. Test search and capture operations - -## Compatibility - -OpenCode also supports `.claude/skills/` paths, making it compatible with Claude Code skills. The same skill file works in both environments. - -## Sources - -- [OpenCode Agent Skills](https://opencode.ai/docs/skills) -- [GitHub - opencode-skills](https://github.com/malhashemi/opencode-skills) diff --git a/docs/archive/integrations/windsurf.md b/docs/archive/integrations/windsurf.md deleted file mode 100644 index 23473e6..0000000 --- a/docs/archive/integrations/windsurf.md +++ /dev/null @@ -1,311 +0,0 @@ -# Windsurf (Codeium) Integration - -Integrate Mnemonic with Windsurf's Cascade AI using Rules and Memories. - -## Overview - -Windsurf's Cascade has built-in memory capabilities. This integration configures it to use Mnemonic's filesystem-based memory format for portability across tools. - -## Setup - -### Configure Rules - -1. Open Windsurf -2. Navigate to **Settings > Cascade > Rules** -3. Add the following rules: - -``` -When I ask you to remember something, create a memory file at: -${MNEMONIC_ROOT}/default/{namespace}/user/ - -Use MIF Level 3 format with YAML frontmatter: -- id: UUID -- type: semantic|episodic|procedural -- namespace: {namespace}/user -- created: ISO8601 timestamp -- title: Descriptive title -- tags: array - -Before implementing features, search for relevant memories: -rg -i "" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -Capture decisions to decisions/, learnings to learnings/, patterns to patterns/. -``` - -### Memory Namespace Mapping - -Map Cascade's built-in memories to Mnemonic namespaces: - -| Cascade Memory Type | Mnemonic Namespace | -|--------------------|--------------------| -| Preferences | context/ | -| Decisions | decisions/ | -| Learnings | learnings/ | -| Patterns | patterns/ | - -## Usage - -### Natural Language - -``` -"Remember that we're using PostgreSQL for the database" -"What do we know about authentication?" -"Capture this as a pattern: always use dependency injection" -``` - -### Explicit Commands - -``` -"Create a mnemonic memory about using REST over GraphQL" -"Search mnemonic for database decisions" -``` - -## Syncing with Built-in Memories - -Windsurf Cascade generates memories automatically. To sync these with Mnemonic: - -1. Export Cascade memories periodically -2. Convert to MIF Level 3 format -3. Store in appropriate Mnemonic namespace - -## Verification - -1. Create a test memory: "Remember that this is a test" -2. Check `${MNEMONIC_ROOT}/default/context/user/` for the file -3. Ask Cascade: "What do you remember about tests?" - -## Limitations - -- UI-based configuration only -- No direct file system access in some modes -- Automatic memory sync requires manual intervention - ---- - -## Common Workflows - -### Daily Development - -``` -Morning: -1. Open project in Windsurf -2. Ask Cascade: "What context do we have about this project?" -3. Continue where you left off - -During Development: -1. Before implementing: "Check memories for [feature] patterns" -2. After decisions: "Remember we decided to use [approach]" -3. After debugging: "Store this fix as a learning" - -End of Day: -1. Review Cascade's memory panel -2. Export significant memories to mnemonic format -``` - -### Feature Implementation - -``` -1. "What patterns exist for [component type]?" - → Cascade references patterns/ - -2. "Any decisions about [feature]?" - → Searches decisions/ - -3. Implement following established patterns - -4. "Remember this pattern for future reference" - → Creates memory file -``` - -### Code Review with Memory - -``` -1. Review PR changes -2. "What patterns should this code follow?" -3. "Any prior decisions about this area?" -4. Reference memories in review comments -``` - ---- - -## Advanced Patterns - -### Bidirectional Sync - -Sync between Cascade's built-in memories and mnemonic files: - -```bash -# Export mnemonic to Cascade-readable format -./tools/mnemonic-export --format windsurf > .windsurf/memories/project.md - -# Import Cascade memories to mnemonic -./tools/import-cascade-memories \ - --source ~/.windsurf/memories/ \ - --target ${MNEMONIC_ROOT}/default/ -``` - -### Project-Specific Configuration - -Create project-level rules in `.windsurfrules`: - -```markdown -# Project Memory Configuration - -Memory storage: ${MNEMONIC_ROOT}/this-project/ - -## Namespaces -- decisions/ - Architectural decisions -- patterns/ - Code patterns and conventions -- apis/ - API documentation -- testing/ - Testing strategies - -## Capture Triggers -- "we decided" → decisions/ -- "use this pattern" → patterns/ -- "learned that" → learnings/ -``` - -### Team Collaboration - -Share memories via git: - -```bash -# Team patterns repository -git clone git@github.com:team/memories.git ${MNEMONIC_ROOT}/team - -# Reference in Windsurf rules -Also check ${MNEMONIC_ROOT}/team/ for shared patterns -``` - ---- - -## Migrating from Windsurf Memories - -If you're using Windsurf's built-in memory system: - -### Step 1: Export Current Memories - -Windsurf stores memories in: -- `.windsurf/memories/` -- Cascade's internal storage - -Export via: -1. Open Cascade settings -2. Navigate to Memory section -3. Export to markdown - -### Step 2: Convert to MIF Format - -```bash -# Manual conversion for each memory -UUID=$(uuidgen | tr '[:upper:]' '[:lower:]') -DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") - -cat > ${MNEMONIC_ROOT}/default/context/user/${UUID}-migrated.memory.md << EOF ---- -id: ${UUID} -type: semantic -namespace: context/user -created: ${DATE} -title: "Migrated from Windsurf" -tags: - - migrated - - windsurf -temporal: - valid_from: ${DATE} - recorded_at: ${DATE} -provenance: - source_type: migration - agent: windsurf-cascade - confidence: 0.9 ---- - -# [Title] - -[Your content here] -EOF -``` - -### Step 3: Update Windsurf Rules - -Add mnemonic paths to your rules: - -```markdown -Memory sources (in priority order): -1. ${MNEMONIC_ROOT}/default/ (mnemonic format) -2. .windsurf/memories/ (legacy) - -For new memories, always use mnemonic format. -``` - -### Step 4: Validate - -```bash -./tools/mnemonic-validate ${MNEMONIC_ROOT}/default/ -``` - -See [Migration Guide](../community/migration-from-memory-bank.md) for complete details. - ---- - -## Troubleshooting - -### Rules Not Applied - -**Symptom**: Cascade ignores mnemonic instructions - -**Solutions**: -1. Check Settings > Cascade > Rules -2. Ensure rules are enabled -3. Restart Windsurf after changes -4. Try explicit memory commands - -### Memory Files Not Created - -**Symptom**: "Remember X" doesn't create files - -**Solutions**: -1. Cascade may store internally first -2. Add explicit instruction: "Create a .memory.md file" -3. Check filesystem access permissions -4. Verify directory exists: - ```bash - mkdir -p ${MNEMONIC_ROOT}/default/context/user/ - ``` - -### Search Not Finding Memories - -**Symptom**: "What do we know about X?" returns nothing - -**Solutions**: -1. Verify memory path in rules -2. Check file permissions -3. Ensure `.memory.md` extension -4. Try: "Search files in ${MNEMONIC_ROOT}/ for X" - -### Sync Issues - -**Symptom**: Cascade memories don't match mnemonic files - -**Solutions**: -1. Export and convert regularly -2. Use explicit file-based storage -3. Set mnemonic as primary source in rules - -### Format Inconsistencies - -**Symptom**: Created memories don't match MIF spec - -**Solutions**: -1. Include full template in rules -2. Run validation after capture -3. Add format example to rules - ---- - -## Sources - -- [Windsurf Cascade Documentation](https://docs.windsurf.com/windsurf/cascade/cascade) -- [Codeium Documentation](https://codeium.com/documentation) -- [Memory Bank Migration](../community/migration-from-memory-bank.md) -- [MIF Level 3 Specification](../../skills/mnemonic-format/SKILL.md) diff --git a/docs/archive/templates/AGENTS.md b/docs/archive/templates/AGENTS.md deleted file mode 100644 index f1eba56..0000000 --- a/docs/archive/templates/AGENTS.md +++ /dev/null @@ -1,126 +0,0 @@ -# Global Agent Instructions - -## Mnemonic Memory System - -You have access to a persistent memory system at `${MNEMONIC_ROOT}/`. This system stores memories as `.memory.md` files with YAML frontmatter (MIF Level 3 format). - -## Required Behavior - -### Before Starting Any Task - -Search for relevant memories: - -```bash -# Search by topic -rg -i "" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# Check specific namespaces -rg -i "" ${MNEMONIC_ROOT}/*/decisions/ --glob "*.memory.md" -rg -i "" ${MNEMONIC_ROOT}/*/patterns/ --glob "*.memory.md" -``` - -### Capture Requirements - -Create memories immediately when: - -| Trigger | Namespace | Type | -|---------|-----------|------| -| Decision made ("let's use X") | decisions/ | semantic | -| Lesson learned ("turns out...") | learnings/ | semantic | -| Pattern established | patterns/ | procedural | -| Blocker encountered | blockers/ | episodic | -| Context to remember | context/ | semantic | - -### Memory Format - -Use MIF Level 3 format with YAML frontmatter: - -```yaml ---- -id: -type: semantic|episodic|procedural -namespace: {namespace}/user -created: -modified: -title: "Descriptive title" -tags: - - tag1 - - tag2 -temporal: - valid_from: - recorded_at: -provenance: - source_type: conversation - agent: - confidence: 0.9 ---- - -# Title - -Content here... -``` - -### Memory Types - -- **semantic**: Facts, decisions, specifications - things that ARE true -- **episodic**: Events, debug sessions, incidents - things that HAPPENED -- **procedural**: Workflows, patterns, how-tos - things you DO - -### Capture Script - -```bash -UUID=$(uuidgen | tr '[:upper:]' '[:lower:]') -DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") -NAMESPACE="decisions" # or: learnings, patterns, blockers, context -TITLE="Your descriptive title" -SLUG=$(echo "$TITLE" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | head -c 50) - -cat > ${MNEMONIC_ROOT}/default/${NAMESPACE}/user/${SLUG}.memory.md << EOF ---- -id: ${UUID} -type: semantic -namespace: ${NAMESPACE}/user -created: ${DATE} -modified: ${DATE} -title: "${TITLE}" -tags: [] -temporal: - valid_from: ${DATE} - recorded_at: ${DATE} -provenance: - source_type: conversation - agent: codex-cli - confidence: 0.9 ---- - -# ${TITLE} - -Content... -EOF -``` - -## Namespaces - -| Namespace | Purpose | -|-----------|---------| -| decisions/ | Architectural choices | -| learnings/ | Insights discovered | -| patterns/ | Code conventions | -| blockers/ | Issues encountered | -| context/ | General context | -| apis/ | API documentation | -| security/ | Security considerations | - -## Do Not - -- Skip searching before implementing -- Announce that you're capturing (just do it silently) -- Forget to capture decisions when made -- Create memories without proper frontmatter - -## Memory Locations - -- **Global**: `${MNEMONIC_ROOT}/{org}/{namespace}/` -- **Project**: `${MNEMONIC_ROOT}/{namespace}/` - -Use global for cross-project knowledge, project-local for project-specific context. diff --git a/docs/archive/templates/CONVENTIONS.md b/docs/archive/templates/CONVENTIONS.md deleted file mode 100644 index 5dd604e..0000000 --- a/docs/archive/templates/CONVENTIONS.md +++ /dev/null @@ -1,126 +0,0 @@ -# Mnemonic Memory Integration - -## Overview - -This project uses Mnemonic for persistent memories across coding sessions. Mnemonic stores memories as `.memory.md` files with YAML frontmatter at `${MNEMONIC_ROOT}/`. - -## Before Implementing - -Always search for relevant memories: - -```bash -# Search by topic -rg -i "" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# Check decisions -rg -i "" ${MNEMONIC_ROOT}/*/decisions/ --glob "*.memory.md" - -# Check patterns -rg -i "pattern" ${MNEMONIC_ROOT}/*/patterns/ --glob "*.memory.md" -``` - -## Capture Requirements - -### When to Capture - -| Trigger | Namespace | Memory Type | -|---------|-----------|-------------| -| Decision made ("let's use X") | decisions/user/ | semantic | -| Lesson learned ("turns out...") | learnings/user/ | semantic | -| Pattern established | patterns/user/ | procedural | -| Blocker encountered | blockers/user/ | episodic | -| Context to remember | context/user/ | semantic | - -### Memory File Location - -``` -${MNEMONIC_ROOT}/default/{namespace}/user/{slug}.memory.md -``` - -### Memory Format (MIF Level 3) - -All memory files must have `.memory.md` extension with YAML frontmatter: - -```yaml ---- -id: -type: semantic|episodic|procedural -namespace: {namespace}/user -created: -modified: -title: "Descriptive title" -tags: - - tag1 - - tag2 -temporal: - valid_from: - recorded_at: -provenance: - source_type: conversation - agent: aider - confidence: 0.9 ---- - -# Title - -Content in markdown format... - -## Context - -Why this decision was made or what was learned. - -## Details - -Specific implementation details or notes. -``` - -## Memory Types - -Choose the correct type for each memory: - -- **semantic**: Facts, decisions, specifications - things that ARE true - - Example: "We use PostgreSQL for the main database" - - Example: "API endpoints follow REST conventions" - -- **episodic**: Events, debug sessions, incidents - things that HAPPENED - - Example: "Fixed authentication bug by updating token validation" - - Example: "Deployed v2.0 to production on 2024-01-15" - -- **procedural**: Workflows, patterns, how-tos - things you DO - - Example: "To deploy: run tests, build, push to registry, apply k8s" - - Example: "Error handling pattern: wrap in try-catch, log, return Result" - -## Namespaces - -| Namespace | Purpose | -|-----------|---------| -| decisions/ | Architectural and design decisions | -| learnings/ | Insights and discoveries | -| patterns/ | Code conventions and patterns | -| blockers/ | Issues and impediments | -| context/ | General project context | -| apis/ | API documentation and contracts | -| security/ | Security considerations | - -## Best Practices - -1. **Search first**: Always check existing memories before implementing -2. **Capture immediately**: Don't wait - capture decisions when they're made -3. **Be descriptive**: Use clear titles that are easy to search -4. **Add context**: Include reasoning and background in the content -5. **Use tags**: Add relevant tags for categorization -6. **Update, don't duplicate**: If a memory exists, update it rather than creating a new one - -## Integration - -This conventions file is designed for use with Aider. Load it with: - -```bash -aider --read CONVENTIONS.md -``` - -Or configure in `.aider.conf.yml`: - -```yaml -read: CONVENTIONS.md -``` diff --git a/docs/archive/templates/codex-skill/SKILL.md b/docs/archive/templates/codex-skill/SKILL.md deleted file mode 100644 index e72da97..0000000 --- a/docs/archive/templates/codex-skill/SKILL.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -name: mnemonic -description: Capture and recall memories from the filesystem-based memory system at ${MNEMONIC_ROOT}. Use for decisions, learnings, patterns, and blockers. ---- - -# Mnemonic Memory Skill - -This skill provides access to the Mnemonic memory system for persistent context across coding sessions. - -## Memory Locations - -- **Global**: `${MNEMONIC_ROOT}/{org}/{namespace}/` -- **Project**: `${MNEMONIC_ROOT}/{namespace}/` - -## Commands - -### Search Memories - -```bash -# By topic -rg -i "" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# By namespace -ls ${MNEMONIC_ROOT}/default/{decisions,learnings,patterns}/user/ - -# By tag (in frontmatter) -rg "tags:.*" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# Recent memories -find ${MNEMONIC_ROOT} -name "*.memory.md" -mtime -7 -``` - -### Capture Memory - -Create a new memory file: - -```bash -UUID=$(uuidgen | tr '[:upper:]' '[:lower:]') -DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") -NAMESPACE="decisions" # or: learnings, patterns, blockers, context -TITLE="Your descriptive title" -SLUG=$(echo "$TITLE" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | head -c 50) - -cat > ${MNEMONIC_ROOT}/default/${NAMESPACE}/user/${SLUG}.memory.md << EOF ---- -id: ${UUID} -type: semantic -namespace: ${NAMESPACE}/user -created: ${DATE} -modified: ${DATE} -title: "${TITLE}" -tags: - - tag1 - - tag2 -temporal: - valid_from: ${DATE} - recorded_at: ${DATE} -provenance: - source_type: conversation - agent: codex-cli - confidence: 0.9 ---- - -# ${TITLE} - -Content here... -EOF -``` - -### List Memories - -```bash -# All memories -find ${MNEMONIC_ROOT} -name "*.memory.md" | head -20 - -# By namespace -ls ${MNEMONIC_ROOT}/default/decisions/user/ -ls ${MNEMONIC_ROOT}/default/learnings/user/ -ls ${MNEMONIC_ROOT}/default/patterns/user/ -``` - -## Memory Types - -| Type | Use For | Example | -|------|---------|---------| -| semantic | Facts, decisions, specs | "We use PostgreSQL" | -| episodic | Events, experiences | "Debug session on auth bug" | -| procedural | Workflows, patterns | "How to deploy to prod" | - -## Namespaces - -| Namespace | Purpose | -|-----------|---------| -| decisions/ | Architectural choices | -| learnings/ | Insights discovered | -| patterns/ | Code conventions | -| blockers/ | Issues encountered | -| context/ | General context | -| apis/ | API documentation | -| security/ | Security considerations | - -## Capture Triggers - -Automatically capture when: -- "let's use X" or "we'll go with X" → decisions/ -- "I learned" or "turns out" → learnings/ -- "the pattern is" or "convention" → patterns/ -- "blocked by" or "issue with" → blockers/ - -## Best Practices - -1. Search before implementing to check for existing decisions -2. Capture decisions immediately when made -3. Use descriptive titles for easy searching -4. Add relevant tags for categorization -5. Include context and reasoning in content diff --git a/docs/archive/templates/copilot-instructions.md b/docs/archive/templates/copilot-instructions.md deleted file mode 100644 index 3dc291d..0000000 --- a/docs/archive/templates/copilot-instructions.md +++ /dev/null @@ -1,86 +0,0 @@ -# Project Coding Instructions - -## Mnemonic Memory System - -This project uses Mnemonic for persistent memory across coding sessions. - -### Before Implementing Features - -Always search for existing memories: - -```bash -# Search by topic -rg -i "" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# Check patterns -rg -i "pattern" ${MNEMONIC_ROOT}/*/patterns/ - -# Check decisions -rg -i "" ${MNEMONIC_ROOT}/*/decisions/ -``` - -### Memory Capture Requirements - -When making decisions or learning something new, create a memory file: - -- **Location**: `${MNEMONIC_ROOT}/default/{namespace}/user/` -- **Format**: `.memory.md` with YAML frontmatter -- **Namespaces**: decisions, learnings, patterns, blockers, context - -### When to Capture - -| Trigger | Namespace | -|---------|-----------| -| Decision made ("let's use X") | decisions/ | -| Lesson learned ("turns out...") | learnings/ | -| Pattern established | patterns/ | -| Blocker encountered | blockers/ | -| Context to remember | context/ | - -### Memory File Format - -```yaml ---- -id: -type: semantic|episodic|procedural -namespace: decisions/user -created: -modified: -title: "Descriptive title" -tags: - - tag1 - - tag2 -temporal: - valid_from: - recorded_at: -provenance: - source_type: conversation - agent: github-copilot - confidence: 0.9 ---- - -# Title - -Content here in markdown format... - -## Context - -Why this decision was made or what was learned. - -## Details - -Specific implementation details or notes. -``` - -### Memory Types - -- **semantic**: Facts, decisions, specifications - things that ARE true -- **episodic**: Events, debug sessions, incidents - things that HAPPENED -- **procedural**: Workflows, patterns, how-tos - things you DO - -### Integration Notes - -- Search memories before making architectural decisions -- Capture decisions immediately when made -- Reference existing patterns when implementing new features -- Update memories when information changes (increment version) diff --git a/docs/archive/templates/cursor-rule.mdc b/docs/archive/templates/cursor-rule.mdc deleted file mode 100644 index 91f8a21..0000000 --- a/docs/archive/templates/cursor-rule.mdc +++ /dev/null @@ -1,112 +0,0 @@ ---- -description: "Mnemonic memory system for persistent context across sessions" -alwaysApply: true ---- - -# Mnemonic Memory System - -## Overview - -Mnemonic is a filesystem-based memory system that persists context across coding sessions. All memories are stored as `.memory.md` files with YAML frontmatter (MIF Level 3 format). - -## Memory Storage - -Location: `${MNEMONIC_ROOT}/` - -Structure: -``` -${MNEMONIC_ROOT}/ -└── default/ - ├── decisions/user/ - ├── learnings/user/ - ├── patterns/user/ - ├── blockers/user/ - └── context/user/ -``` - -## Required Behavior - -### Before Implementing - -Always search for relevant memories: - -```bash -rg -i "" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -``` - -### Capture Triggers - -Create memories when: - -| Trigger | Namespace | Type | -|---------|-----------|------| -| Decision made ("let's use X") | decisions/ | semantic | -| Lesson learned ("turns out...") | learnings/ | semantic | -| Pattern established | patterns/ | procedural | -| Blocker encountered | blockers/ | episodic | -| Context to remember | context/ | semantic | - -### Memory Format - -```yaml ---- -id: -type: semantic|episodic|procedural -namespace: {namespace}/user -created: -modified: -title: "Descriptive title" -tags: - - tag1 - - tag2 -temporal: - valid_from: - recorded_at: -provenance: - source_type: conversation - agent: cursor - confidence: 0.9 ---- - -# Title - -Content here... -``` - -## Memory Types - -- **semantic**: Facts, decisions, specifications - things that ARE true -- **episodic**: Events, debug sessions, incidents - things that HAPPENED -- **procedural**: Workflows, patterns, how-tos - things you DO - -## Capture Script - -```bash -UUID=$(uuidgen | tr '[:upper:]' '[:lower:]') -DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") -NAMESPACE="decisions" -TITLE="Your title" -SLUG=$(echo "$TITLE" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | head -c 50) - -cat > ${MNEMONIC_ROOT}/default/${NAMESPACE}/user/${SLUG}.memory.md << 'EOF' ---- -id: ${UUID} -type: semantic -namespace: ${NAMESPACE}/user -created: ${DATE} -title: "${TITLE}" -tags: [] ---- - -# ${TITLE} - -Content... -EOF -``` - -## Do Not - -- Skip searching before implementing -- Forget to capture decisions when made -- Create memories without proper frontmatter -- Use incorrect memory types diff --git a/docs/archive/templates/mnemonic-protocol.md b/docs/archive/templates/mnemonic-protocol.md deleted file mode 100644 index dcb273a..0000000 --- a/docs/archive/templates/mnemonic-protocol.md +++ /dev/null @@ -1,10 +0,0 @@ - -## Memory - -Search first: `/mnemonic:search {relevant_keywords}` -Capture after: `/mnemonic:capture {namespace} "{title}"` - -Run `/mnemonic:list --namespaces` to see available namespaces from loaded ontologies. - -Example: `/mnemonic:capture _semantic/decisions "Use PostgreSQL for data storage"` - diff --git a/docs/archive/templates/plugin-hooks/README.md b/docs/archive/templates/plugin-hooks/README.md deleted file mode 100644 index 319d377..0000000 --- a/docs/archive/templates/plugin-hooks/README.md +++ /dev/null @@ -1,67 +0,0 @@ -# Plugin Hooks Templates - -Templates for integrating mnemonic memory operations into other Claude Code plugins. - -## Files - -### `mnemonic-suggest.py` - -A template Python hook that detects file creation events and suggests mnemonic memory capture. - -**To use:** - -1. Copy to target plugin's `hooks/` directory -2. Customize the `PLUGIN_PATTERNS` dict for your plugin's file patterns -3. Update `PLUGIN_NAME` constant -4. Create or update `hooks.json` to include this hook - -### `hooks.json.template` - -Example hooks.json configuration that triggers the mnemonic-suggest hook on Write tool use. - -**To use:** - -1. Copy as `hooks.json` to target plugin's `hooks/` directory -2. Merge with existing hooks.json if one exists - -## How It Works - -1. Claude uses the Write tool to create a file -2. PostToolUse hook runs `mnemonic-suggest.py` -3. Hook checks if file path matches any plugin patterns -4. If match found, injects `additionalContext` suggesting memory capture -5. Claude sees suggestion and captures memory with full conversation context - -## Customization - -The `PLUGIN_PATTERNS` dict maps regex patterns to capture configurations: - -```python -PLUGIN_PATTERNS = { - r"/adr/.*\.md$": { - "event": "ADR created", - "namespace": "decisions", - "capture_hint": "Capture decision rationale...", - "tags": ["architecture", "adr"], - }, -} -``` - -**Fields:** -- `event`: Human-readable description of what happened -- `namespace`: Target mnemonic namespace (decisions, learnings, patterns, etc.) -- `capture_hint`: Guidance for Claude on what to capture -- `tags`: Suggested tags for the memory - -## Integration with `/mnemonic:plugin-integration` - -The plugin-integration skill can automatically set up these templates for a target plugin. - -```bash -/mnemonic:plugin-integration ~/.claude/plugins/cache/your-org/your-plugin/ -``` - -This will: -1. Analyze the plugin structure -2. Copy and customize these templates -3. Add workflow sections to command/skill markdown files diff --git a/docs/archive/templates/plugin-hooks/hooks.json.template b/docs/archive/templates/plugin-hooks/hooks.json.template deleted file mode 100644 index 83007b5..0000000 --- a/docs/archive/templates/plugin-hooks/hooks.json.template +++ /dev/null @@ -1,15 +0,0 @@ -{ - "hooks": { - "PostToolUse": [ - { - "matcher": "Write", - "hooks": [ - { - "type": "command", - "command": "${CLAUDE_PLUGIN_ROOT}/hooks/mnemonic-suggest.py" - } - ] - } - ] - } -} diff --git a/docs/archive/templates/plugin-hooks/mnemonic-suggest.py b/docs/archive/templates/plugin-hooks/mnemonic-suggest.py deleted file mode 100644 index 3423955..0000000 --- a/docs/archive/templates/plugin-hooks/mnemonic-suggest.py +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env python3 -""" -Mnemonic Integration Hook Template - -This is a template for creating plugin-specific mnemonic integration hooks. -Copy this file to the target plugin's hooks directory and customize the -detection logic for that plugin's file patterns. - -Usage: -1. Copy to {plugin_path}/hooks/mnemonic-suggest.py -2. Add to hooks.json PostToolUse for Write matcher -3. Customize the PLUGIN_PATTERNS dict for your plugin - -Hook Contract: -- Receives CLAUDE_TOOL_INPUT with tool parameters as JSON -- Outputs JSON with continue: true and optional additionalContext -- additionalContext is shown to Claude as context for the current turn -""" - -import json -import os -import re -from pathlib import Path - -# ============================================================================= -# CUSTOMIZE THIS SECTION FOR YOUR PLUGIN -# ============================================================================= - -# Plugin name for context -PLUGIN_NAME = "your-plugin" - -# File pattern detection rules -# Each rule maps a file pattern to capture suggestions -PLUGIN_PATTERNS = { - # Example: ADR files - r"/adr/.*\.md$": { - "event": "ADR created", - "namespace": "decisions", - "capture_hint": "Capture decision rationale including: decision drivers, chosen option, alternatives considered, consequences", - "tags": ["architecture", "adr"], - }, - # Example: Documentation files - r"/docs/.*\.md$": { - "event": "Documentation created", - "namespace": "learnings", - "capture_hint": "Capture key documentation points for future reference", - "tags": ["documentation"], - }, - # Example: Config files - r"\.config\.(js|ts|json)$": { - "event": "Configuration created", - "namespace": "patterns", - "capture_hint": "Capture configuration pattern and rationale", - "tags": ["configuration", "patterns"], - }, - # Add more patterns as needed for your plugin -} - -# Namespaces and their typical content -NAMESPACE_HINTS = { - "decisions": "Architectural choices, technology selections, design decisions", - "learnings": "Insights, discoveries, documentation, TILs", - "patterns": "Coding conventions, best practices, workflows", - "blockers": "Issues, impediments, workarounds", - "context": "Background information, project state", -} - -# ============================================================================= -# HOOK IMPLEMENTATION (Usually no changes needed below) -# ============================================================================= - - -def match_pattern(file_path: str) -> dict | None: - """Match file path against plugin patterns.""" - for pattern, config in PLUGIN_PATTERNS.items(): - if re.search(pattern, file_path, re.IGNORECASE): - return config - return None - - -def get_project_context() -> str: - """Get current project context for the suggestion.""" - try: - cwd = os.getcwd() - project_name = Path(cwd).name - return f"Project: {project_name}" - except Exception: - return "Project: unknown" - - -def format_capture_suggestion(file_path: str, config: dict) -> str: - """Format the mnemonic capture suggestion for Claude.""" - namespace = config.get("namespace", "learnings") - namespace_hint = NAMESPACE_HINTS.get(namespace, "General knowledge") - tags = config.get("tags", []) - tags_str = ", ".join(tags) if tags else "relevant-tag" - - return f""" -**MNEMONIC CAPTURE SUGGESTED:** -- Event: {config.get('event', 'File created')} -- File: {file_path} -- Namespace: {namespace} ({namespace_hint}) -- Suggested tags: {tags_str} - -{config.get('capture_hint', 'Capture key details for future recall.')} - -Use progressive disclosure format: -- **Quick Answer:** 1-3 sentence summary -- **Context:** Why this was created, alternatives considered -- **Full Detail:** Implementation notes, related decisions - -Capture command template: -```bash -UUID=$(uuidgen | tr '[:upper:]' '[:lower:]') -DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") -# Write memory to ${MNEMONIC_ROOT}/default/{namespace}/user/${{UUID}}-slug.memory.md -``` -""" - - -def main(): - """Main hook entry point.""" - # Parse tool input from environment - tool_input_raw = os.environ.get("CLAUDE_TOOL_INPUT", "{}") - try: - tool_input = json.loads(tool_input_raw) - except json.JSONDecodeError: - tool_input = {} - - # Get file path from Write tool input - file_path = tool_input.get("file_path", "") - - if not file_path: - # No file path, nothing to suggest - print(json.dumps({"continue": True})) - return - - # Check if file matches any plugin patterns - config = match_pattern(file_path) - - if config: - # Generate capture suggestion - context = format_capture_suggestion(file_path, config) - project_ctx = get_project_context() - - output = { - "continue": True, - "hookSpecificOutput": { - "hookEventName": "PostToolUse", - "additionalContext": f"{project_ctx}\n{context}" - } - } - print(json.dumps(output)) - else: - # No matching pattern, continue without suggestion - print(json.dumps({"continue": True})) - - -if __name__ == "__main__": - main() diff --git a/docs/enterprise/README.md b/docs/enterprise/README.md deleted file mode 100644 index 21a12ff..0000000 --- a/docs/enterprise/README.md +++ /dev/null @@ -1,136 +0,0 @@ -# Mnemonic for Enterprise - -Enterprise-grade AI memory with complete audit trails, data sovereignty, and research-validated performance. - -## Quick Facts - -| Metric | Value | Source | -|--------|-------|--------| -| **Accuracy** | 74.0% vs 68.5% for competitors | [Letta LoCoMo Benchmark](https://www.letta.com/blog/benchmarking-ai-agent-memory) | -| **Audit Trail** | Complete git history | Every change tracked with who, when, what | -| **Data Sovereignty** | 100% local storage | No cloud, no third-party dependencies | -| **Integration** | Claude Code plugin | Native integration with Claude Code | -| **Format** | MIF Level 3 | Open standard, human-readable | - ---- - -## Research-Validated Performance - -Traditional AI memory systems use vector databases or knowledge graphs. Research shows this adds complexity without improving accuracy. - -**Letta's LoCoMo Benchmark Results:** - -``` -Filesystem approach: ████████████████████████ 74.0% -Mem0 (graph-based): ████████████████████ 68.5% - ───────────────────────────── - 0% 100% -``` - -The reason? LLMs are pretrained on filesystem operations. Simple tools are more reliable than specialized abstractions. - -Read more: ["From Everything is a File to Files Are All You Need"](https://arxiv.org/abs/2601.11672) (arXiv:2601.11672) - ---- - -## For Enterprise Architects - -**You need:** Compliance, governance, audit trails, data sovereignty - -**Mnemonic delivers:** -- Full git history of every memory change (who, when, what, why) -- Local-only storage—no cloud, no third-party dependencies -- Human-readable markdown format for audit reviews -- Bi-temporal tracking (valid time vs recorded time) per SQL:2011 standard -- MIF schema validation for data quality assurance - -[→ Read the Compliance & Governance Guide](./compliance-governance.md) - ---- - -## For Engineering Managers - -**You need:** Team productivity, knowledge retention, tool flexibility - -**Mnemonic delivers:** -- Cross-session memory reduces context switching overhead -- Open format prevents vendor lock-in -- Shared patterns namespace accelerates team onboarding -- Episodic memory reduces repeated debugging efforts -- Zero infrastructure costs—pure filesystem storage - -[→ Read the Productivity & ROI Guide](./productivity-roi.md) - ---- - -## For Individual Developers - -**You need:** Privacy, control, customization - -**Mnemonic delivers:** -- Zero telemetry—your memories stay on your machine -- Git-based, readable format you can edit directly -- Scriptable via standard Unix tools (grep, find, ripgrep) -- Portable MIF Level 3 format works across all tools -- Works offline—no network required - -[→ Read the Developer Experience Guide](./developer-experience.md) - ---- - -## Technical Deep Dive - -For technical decision-makers who need academic validation and competitive analysis: - -[→ Research Validation & Benchmarks](./research-validation.md) - ---- - -## Deployment - -For platform teams and DevOps planning enterprise rollout: - -[→ Enterprise Deployment Guide](./deployment-guide.md) - ---- - -## Enterprise Advantages Summary - -| Capability | Mnemonic | Cloud-Based Alternatives | -|------------|----------|-------------------------| -| **Audit Trail** | Full git history with diffs | Limited or API-only access | -| **Data Sovereignty** | 100% local storage | Data on third-party servers | -| **Offline Access** | Always available | Requires network | -| **Vendor Lock-in** | None (open format) | Proprietary formats | -| **Cost** | Zero (filesystem) | Per-seat or usage fees | -| **Compliance** | Self-hosted, auditable | Depends on vendor | -| **Research Validation** | 74% accuracy benchmark | Varies | - ---- - -## Getting Started - -```bash -# Install the plugin -claude settings plugins add /path/to/mnemonic - -# Initialize for your project -/mnemonic:setup - -# Capture your first memory -/mnemonic:capture decisions "Use PostgreSQL for storage" - -# Recall happens automatically—memories load when relevant -``` - ---- - -## Navigation - -- [Compliance & Governance](./compliance-governance.md) - For architects -- [Productivity & ROI](./productivity-roi.md) - For managers -- [Developer Experience](./developer-experience.md) - For developers -- [Research Validation](./research-validation.md) - Technical deep dive -- [Deployment Guide](./deployment-guide.md) - For operations - -[← Back to Main Documentation](../../README.md) diff --git a/docs/enterprise/compliance-governance.md b/docs/enterprise/compliance-governance.md deleted file mode 100644 index fda24f9..0000000 --- a/docs/enterprise/compliance-governance.md +++ /dev/null @@ -1,378 +0,0 @@ -# Compliance & Governance Guide - -For enterprise architects, compliance officers, and security teams. - -## Overview - -Mnemonic provides enterprise-grade AI memory with complete audit capabilities, data sovereignty, and governance controls—all without external dependencies. - ---- - -## Audit Trail Architecture - -### Git-Based Version Control - -Every memory change is tracked with full git history: - -```bash -# View memory change history -cd ${MNEMONIC_ROOT} -git log --oneline -20 - -# See who changed what -git log --pretty=format:"%h %an %ad %s" --date=short - -# View specific memory evolution -git log -p path/to/memory.memory.md - -# Compare versions -git diff HEAD~5 HEAD -- decisions/user/ -``` - -### What Gets Tracked - -| Event | Git Record | Details | -|-------|------------|---------| -| Memory created | New file commit | Author, timestamp, content | -| Memory modified | File change commit | Diff shows exact changes | -| Memory deleted | File removal commit | Preserved in history | -| Batch operations | Grouped commits | gc, compression, etc. | - -### Audit Query Examples - -```bash -# All changes by a specific user -git log --author="engineer@company.com" --oneline - -# Changes in date range -git log --after="2026-01-01" --before="2026-02-01" --oneline - -# Changes to decision memories -git log --oneline -- decisions/ - -# Search for changes mentioning "authentication" -git log -S "authentication" --oneline -``` - ---- - -## Data Sovereignty - -### Local-Only Storage - -All data stays on your infrastructure: - -``` -${MNEMONIC_ROOT}/ # User-level memories -${MNEMONIC_ROOT}/ # Project-level memories -``` - -**No external dependencies:** -- No cloud services -- No API calls -- No telemetry -- No account required -- No network access needed - -### Data Residency Compliance - -| Requirement | How Mnemonic Complies | -|-------------|----------------------| -| **Data stays in jurisdiction** | Filesystem storage only | -| **No cross-border transfers** | No network communication | -| **Right to deletion** | `rm` or git operations | -| **Data portability** | Standard markdown files | -| **Access control** | Filesystem permissions | - -### Encryption Options - -Mnemonic stores plain-text markdown for human readability. For encryption: - -```bash -# Encrypt at rest with filesystem encryption -# macOS: FileVault -# Linux: LUKS, eCryptfs -# Windows: BitLocker - -# Or use git-crypt for repository encryption -cd ${MNEMONIC_ROOT} -git-crypt init -echo "*.memory.md filter=git-crypt diff=git-crypt" >> .gitattributes -``` - ---- - -## Compliance Framework Alignment - -### SOC 2 - -| Trust Principle | Mnemonic Support | -|-----------------|------------------| -| **Security** | Filesystem permissions, no external access | -| **Availability** | Local storage, no network dependency | -| **Processing Integrity** | Git versioning, validation tool | -| **Confidentiality** | Local-only, encryption-ready | -| **Privacy** | No data collection, no telemetry | - -### ISO 27001 - -| Control Area | Implementation | -|--------------|----------------| -| **A.8 Asset Management** | Memory files are versioned assets | -| **A.9 Access Control** | Filesystem permissions | -| **A.12 Operations Security** | Validation tool, gc commands | -| **A.14 System Acquisition** | Open source, auditable code | -| **A.18 Compliance** | Local storage, audit logs | - -### GDPR Considerations - -| Right | Implementation | -|-------|----------------| -| **Right to Access** | `cat memory.md` - human readable | -| **Right to Rectification** | Direct file editing | -| **Right to Erasure** | `rm` or `git rm` | -| **Right to Portability** | Standard markdown export | -| **Data Minimization** | gc with TTL policies | - ---- - -## Retention & Lifecycle Policies - -### Garbage Collection - -```bash -# Clean up expired memories (TTL-based) -/mnemonic:gc --ttl 90d - -# Archive low-strength memories -/mnemonic:gc --min-strength 0.3 - -# Compress large old memories -/mnemonic:gc --compress - -# Dry run to preview changes -/mnemonic:gc --dry-run -``` - -### Policy Configuration - -Define retention policies in your organization's CLAUDE.md: - -```markdown -## Memory Retention Policy - -- **Decisions**: Retain indefinitely (semantic, slow decay) -- **Learnings**: 1 year retention -- **Episodic**: 90 days retention -- **Blockers**: Archive after resolution + 30 days -``` - -### Bi-Temporal Tracking - -Mnemonic implements SQL:2011 temporal patterns: - -```yaml -temporal: - valid_from: 2026-01-15T00:00:00Z # When this became true - recorded_at: 2026-01-20T10:30:00Z # When we recorded it -``` - -This supports: -- **Corrections**: Update valid_from without losing when you learned it -- **Audit**: Distinguish between truth time and knowledge time -- **Compliance**: Full temporal audit trail - ---- - -## Data Quality Assurance - -### Schema Validation - -```bash -# Validate all memories against MIF Level 3 schema -./tools/mnemonic-validate - -# CI-friendly JSON output -./tools/mnemonic-validate --format json - -# Validate only changed files -./tools/mnemonic-validate --changed -``` - -### Validation Checks - -| Check | Purpose | -|-------|---------| -| **Required fields** | Ensure complete metadata | -| **UUID format** | Unique identification | -| **ISO 8601 timestamps** | Standard date format | -| **Type enumeration** | semantic/episodic/procedural | -| **Provenance** | Track data origin | - -### Automated Validation - -Add to CI/CD pipeline: - -```yaml -# .github/workflows/validate-memories.yml -name: Validate Memories -on: - push: - paths: ['**/*.memory.md'] -jobs: - validate: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Validate memories - run: ./tools/mnemonic-validate --format json -``` - ---- - -## Security Model - -### Access Control - -```bash -# Restrict access to memory directory -chmod 700 ${MNEMONIC_ROOT} - -# Read-only for shared memories -chmod 444 ${MNEMONIC_ROOT}/shared/*.memory.md -``` - -### Threat Model - -| Threat | Mitigation | -|--------|------------| -| **Unauthorized access** | Filesystem permissions | -| **Data exfiltration** | No network access | -| **Tampering** | Git signatures (`git commit -S`) | -| **Data loss** | Git remote backup | -| **Injection attacks** | Markdown sanitization | - -### Git Signing - -For tamper-evident audit trails: - -```bash -cd ${MNEMONIC_ROOT} -git config commit.gpgsign true -git config user.signingkey YOUR_KEY_ID -``` - ---- - -## Enterprise Deployment Patterns - -### Centralized Memory Repository - -``` -Git Server (GitHub Enterprise / GitLab) - │ - ├── org/mnemonic-decisions (shared decisions) - ├── org/mnemonic-patterns (shared patterns) - └── user/* (individual memories) -``` - -### Team Memory Sharing - -```bash -# Clone shared memory repository -git clone git@github.com:org/shared-memories.git ${MNEMONIC_ROOT}/shared - -# Pull latest shared memories -cd ${MNEMONIC_ROOT}/shared && git pull - -# Contribute to shared memories -git add new-pattern.memory.md -git commit -m "Add authentication pattern" -git push -``` - -### Backup Strategy - -```bash -# Automated backup -0 2 * * * tar -czf ~/backups/mnemonic-$(date +%Y%m%d).tar.gz ${MNEMONIC_ROOT}/ - -# Git remote backup -cd ${MNEMONIC_ROOT} -git remote add backup git@backup-server:mnemonic.git -git push backup main -``` - ---- - -## Governance Controls - -### Memory Classification - -Use namespaces for access control: - -| Namespace | Classification | Access | -|-----------|---------------|--------| -| `security/` | Confidential | Security team only | -| `decisions/` | Internal | Engineering team | -| `patterns/` | Public | All developers | -| `personal/` | Private | Individual only | - -### Review Workflows - -Require PR review for shared memories: - -```yaml -# .github/CODEOWNERS -decisions/*.memory.md @engineering-leads -security/*.memory.md @security-team -patterns/*.memory.md @architects -``` - -### Provenance Tracking - -Every memory includes origin information: - -```yaml -provenance: - source_type: conversation # How it was captured - agent: claude-opus-4 # Which model - confidence: 0.95 # Confidence score -``` - ---- - -## Monitoring & Alerting - -### Memory System Health - -```bash -# Count memories by namespace -find ${MNEMONIC_ROOT} -name "*.memory.md" | \ - sed 's|.*/\([^/]*\)/[^/]*/[^/]*$|\1|' | sort | uniq -c - -# Check for validation errors -./tools/mnemonic-validate --format json | jq '.summary.errors' - -# Monitor memory growth -du -sh ${MNEMONIC_ROOT}/ -``` - -### Audit Log Export - -```bash -# Export audit log for compliance review -cd ${MNEMONIC_ROOT} -git log --pretty=format:'%H,%an,%ae,%ad,%s' --date=iso > audit-log.csv -``` - ---- - -## Related Documentation - -- [Research Validation](./research-validation.md) - Academic foundations -- [Deployment Guide](./deployment-guide.md) - Enterprise rollout -- [Validation Tool](../validation.md) - Schema validation details -- [ADR-001](../adrs/adr-001-filesystem-based-storage.md) - Storage architecture decision - -[← Back to Enterprise Overview](./README.md) diff --git a/docs/enterprise/deployment-guide.md b/docs/enterprise/deployment-guide.md deleted file mode 100644 index a78a55c..0000000 --- a/docs/enterprise/deployment-guide.md +++ /dev/null @@ -1,576 +0,0 @@ -# Enterprise Deployment Guide - -For platform teams, DevOps engineers, and IT administrators planning organization-wide rollout. - -## Overview - -Mnemonic is designed for zero-infrastructure deployment. This guide covers enterprise patterns for team coordination, backup, and governance. - ---- - -## Deployment Architectures - -### Individual Deployment (Default) - -Each developer has their own memory store: - -``` -Developer Workstation -└── ${MNEMONIC_ROOT}/ - └── {org}/ - ├── decisions/user/ - ├── learnings/user/ - ├── patterns/user/ - └── ... -``` - -**Pros**: Simple, private, no coordination needed -**Cons**: No team memory sharing - -### Team Shared Repository - -Centralized memories via git: - -``` -Git Server (GitHub Enterprise / GitLab) -└── team-memories.git - ├── decisions/team/ - ├── patterns/team/ - └── context/team/ - -Developer Workstation -└── ${MNEMONIC_ROOT}/ - ├── shared/ # Clone of team-memories.git - │ ├── decisions/team/ - │ └── patterns/team/ - └── {org}/ # Personal memories - └── learnings/user/ -``` - -**Setup:** -```bash -# Each developer -git clone git@github.com:org/team-memories.git ${MNEMONIC_ROOT}/shared - -# Sync daily -cd ${MNEMONIC_ROOT}/shared && git pull -``` - -### Organization Memory Hub - -Multi-team architecture: - -``` -Git Server -├── org-decisions.git # Company-wide decisions -├── security-policies.git # Security team memories -├── team-a-memories.git # Team A -├── team-b-memories.git # Team B -└── ... - -Developer Workstation -└── ${MNEMONIC_ROOT}/ - ├── org/ # Clone of org-decisions - ├── security/ # Clone of security-policies - ├── team/ # Clone of team-X-memories - └── personal/ # Local only -``` - ---- - -## Installation Methods - -### Manual Installation - -```bash -# Clone mnemonic plugin -git clone https://github.com/zircote/mnemonic.git ~/tools/mnemonic - -# Register with Claude Code -claude settings plugins add ~/tools/mnemonic - -# Initialize -/mnemonic:setup -``` - -### Scripted Installation - -```bash -#!/bin/bash -# install-mnemonic.sh - -MNEMONIC_VERSION="1.0.0" -INSTALL_DIR="$HOME/tools/mnemonic" - -# Download -git clone --branch v${MNEMONIC_VERSION} \ - https://github.com/zircote/mnemonic.git "$INSTALL_DIR" - -# Register -claude settings plugins add "$INSTALL_DIR" - -# Initialize directories -mkdir -p ${MNEMONIC_ROOT}/default/{decisions,learnings,patterns,blockers,context,apis,security,testing,episodic}/{user,project,shared} - -# Initialize git -cd ${MNEMONIC_ROOT} -git init -git add . -git commit -m "Initialize mnemonic" - -echo "Mnemonic installed successfully" -``` - -### Configuration Management - -**Ansible Example:** -```yaml -# roles/mnemonic/tasks/main.yml -- name: Clone mnemonic - git: - repo: https://github.com/zircote/mnemonic.git - dest: "{{ ansible_env.HOME }}/tools/mnemonic" - version: "v1.0.0" - -- name: Create memory directories - file: - path: "{{ ansible_env.HOME }}/.claude/mnemonic/default/{{ item }}/user" - state: directory - loop: - - decisions - - learnings - - patterns - - blockers - - context - -- name: Initialize git repository - command: git init - args: - chdir: "{{ ansible_env.HOME }}/.claude/mnemonic" - creates: "{{ ansible_env.HOME }}/.claude/mnemonic/.git" -``` - ---- - -## Git Server Integration - -### GitHub Enterprise - -```bash -# Create organization repository -gh repo create org/shared-memories --private - -# Clone to shared location -git clone git@github.com:org/shared-memories.git ${MNEMONIC_ROOT}/shared - -# Add branch protection -gh api repos/org/shared-memories/branches/main/protection \ - -X PUT \ - -f required_pull_request_reviews.required_approving_review_count=1 -``` - -### GitLab - -```bash -# Create project -glab project create shared-memories --group org --private - -# Clone -git clone git@gitlab.com:org/shared-memories.git ${MNEMONIC_ROOT}/shared - -# Configure merge request approvals -glab mr approval-rule create \ - --name "Memory Review" \ - --approvals-required 1 \ - --project org/shared-memories -``` - -### Self-Hosted Git - -```bash -# Gitea, Gogs, or bare git server -git clone git@git.internal:memories/shared.git ${MNEMONIC_ROOT}/shared -``` - ---- - -## Backup Strategies - -### Local Backup - -```bash -# Cron job for daily backup -# Add to crontab: crontab -e -0 2 * * * tar -czf ~/backups/mnemonic-$(date +\%Y\%m\%d).tar.gz ${MNEMONIC_ROOT}/ - -# Keep last 30 backups -find ~/backups -name "mnemonic-*.tar.gz" -mtime +30 -delete -``` - -### Git Remote Backup - -```bash -# Add backup remote -cd ${MNEMONIC_ROOT} -git remote add backup git@backup-server:mnemonic.git - -# Push to backup (cron job) -0 3 * * * cd ${MNEMONIC_ROOT} && git push backup main - -# Or push to multiple remotes -git remote set-url --add --push origin git@github.com:user/mnemonic.git -git remote set-url --add --push origin git@backup:mnemonic.git -``` - -### Cloud Sync (Optional) - -```bash -# Dropbox/iCloud/OneDrive -ln -s ${MNEMONIC_ROOT} ~/Dropbox/mnemonic-backup - -# Or rsync to cloud storage -rsync -avz ${MNEMONIC_ROOT}/ s3://bucket/mnemonic/ -``` - ---- - -## Disaster Recovery - -### Full Restore - -```bash -# From tar backup -tar -xzf ~/backups/mnemonic-20260124.tar.gz -C ~/ - -# From git remote -git clone git@backup-server:mnemonic.git ${MNEMONIC_ROOT} -``` - -### Point-in-Time Recovery - -```bash -cd ${MNEMONIC_ROOT} - -# Find commit from desired date -git log --before="2026-01-20" --oneline | head -1 - -# Restore to that point -git checkout abc123 -- . - -# Or create branch from that point -git checkout -b recovery-20260120 abc123 -``` - -### Corruption Recovery - -```bash -# If git is corrupted -rm -rf ${MNEMONIC_ROOT}/.git -git init -git add . -git commit -m "Recover from corruption" - -# Re-add remote -git remote add origin git@github.com:user/mnemonic.git -``` - ---- - -## Team Memory Sharing - -### Namespace Strategy - -``` -${MNEMONIC_ROOT}/ -├── org/ # Organization-wide (read-only for most) -│ ├── decisions/shared/ # Company architectural decisions -│ ├── patterns/shared/ # Standard code patterns -│ └── security/shared/ # Security policies -├── team/ # Team-specific (read-write for team) -│ ├── decisions/team/ # Team decisions -│ ├── patterns/team/ # Team patterns -│ └── context/team/ # Project context -└── personal/ # Individual (private) - ├── learnings/user/ # Personal learnings - └── episodic/user/ # Personal experiences -``` - -### Contribution Workflow - -```bash -# Developer wants to share a pattern -cd ${MNEMONIC_ROOT}/team - -# Create memory -cat > patterns/team/uuid-new-pattern.memory.md << 'EOF' ---- -id: uuid-here -type: procedural -namespace: patterns/team -... -EOF - -# Submit for review -git add patterns/team/uuid-new-pattern.memory.md -git commit -m "Add API pagination pattern" -git push origin feature/pagination-pattern - -# Create PR for review -gh pr create --title "Add pagination pattern" --body "..." -``` - -### Access Control - -**CODEOWNERS file:** -``` -# .github/CODEOWNERS -decisions/shared/*.memory.md @org/architects -security/shared/*.memory.md @org/security-team -patterns/shared/*.memory.md @org/tech-leads -``` - -**Branch protection:** -- Require PR reviews for shared memories -- Require specific team approval for security namespace -- Allow direct push for personal namespace - ---- - -## Migration Strategies - -### From Memory Bank - -```bash -# Use migration tool -./tools/migrate-memory-bank \ - --source ~/old-memory-bank \ - --target ${MNEMONIC_ROOT}/default \ - --namespace learnings -``` - -### From Other Systems - -```bash -# Generic markdown migration -for f in ~/old-memories/*.md; do - UUID=$(uuidgen | tr '[:upper:]' '[:lower:]') - DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") - TITLE=$(head -1 "$f" | sed 's/^# //') - - cat > ${MNEMONIC_ROOT}/default/context/user/${UUID}-migrated.memory.md << EOF ---- -id: ${UUID} -type: semantic -namespace: context/user -created: ${DATE} -title: "${TITLE}" -tags: [migrated] ---- - -$(cat "$f") -EOF -done -``` - -### Validation After Migration - -```bash -# Validate all migrated memories -./tools/mnemonic-validate ${MNEMONIC_ROOT}/ - -# Check for errors -./tools/mnemonic-validate --format json | jq '.summary' -``` - ---- - -## Monitoring - -### Memory System Health - -```bash -#!/bin/bash -# health-check.sh - -MEMORY_DIR="$MNEMONIC_ROOT" - -# Count by namespace -echo "=== Memory Counts ===" -find "$MEMORY_DIR" -name "*.memory.md" | \ - sed 's|.*/\([^/]*\)/[^/]*/.*|\1|' | sort | uniq -c - -# Total size -echo -e "\n=== Total Size ===" -du -sh "$MEMORY_DIR" - -# Recent activity -echo -e "\n=== Last 5 Changes ===" -cd "$MEMORY_DIR" && git log --oneline -5 - -# Validation status -echo -e "\n=== Validation ===" -./tools/mnemonic-validate --format json 2>/dev/null | \ - jq -r '"Valid: \(.summary.valid), Errors: \(.summary.errors)"' -``` - -### Alerting - -```bash -# Add to monitoring system -# Alert if validation errors > 0 -./tools/mnemonic-validate --format json | jq -e '.summary.errors == 0' -``` - ---- - -## Security Hardening - -### Filesystem Permissions - -```bash -# Restrict access -chmod 700 ${MNEMONIC_ROOT} -chmod 600 ${MNEMONIC_ROOT}/**/*.memory.md - -# Shared directories (read-only for team members) -chmod 750 ${MNEMONIC_ROOT}/shared -chmod 640 ${MNEMONIC_ROOT}/shared/**/*.memory.md -``` - -### Git Signing - -```bash -cd ${MNEMONIC_ROOT} - -# Configure signing -git config commit.gpgsign true -git config user.signingkey YOUR_GPG_KEY - -# Verify signatures -git log --show-signature -5 -``` - -### Sensitive Data - -```bash -# Add to .gitignore -echo "security/private/*" >> ${MNEMONIC_ROOT}/.gitignore - -# Or use git-crypt for encryption -git-crypt init -echo "security/**/*.memory.md filter=git-crypt" >> .gitattributes -``` - ---- - -## Performance Tuning - -### Large Memory Sets - -```bash -# Use indexed search for 10k+ memories -# Consider organizing by date -mkdir -p ${MNEMONIC_ROOT}/archive/2025 -mv ${MNEMONIC_ROOT}/default/episodic/user/2025-* ${MNEMONIC_ROOT}/archive/2025/ - -# Limit search scope -rg "pattern" ${MNEMONIC_ROOT}/default/ # Not archive -``` - -### Git Performance - -```bash -cd ${MNEMONIC_ROOT} - -# Pack repository -git gc --aggressive - -# Shallow clone for shared repos -git clone --depth 100 git@github.com:org/shared.git shared - -# Sparse checkout for large repos -git sparse-checkout init -git sparse-checkout set decisions patterns -``` - ---- - -## Rollout Checklist - -### Pre-Rollout - -- [ ] Choose deployment architecture (individual/team/org) -- [ ] Set up git server repository (if team/org) -- [ ] Create namespace structure -- [ ] Define access controls (CODEOWNERS) -- [ ] Prepare installation scripts -- [ ] Set up backup automation -- [ ] Create monitoring/alerting - -### Pilot (Week 1) - -- [ ] Install on 3-5 pilot users -- [ ] Capture initial memories -- [ ] Validate format compliance -- [ ] Gather feedback -- [ ] Refine namespace structure - -### Team Rollout (Week 2-3) - -- [ ] Roll out to full team -- [ ] Set up shared repository -- [ ] Establish contribution workflow -- [ ] Configure CI validation -- [ ] Train team on workflows - -### Organization Rollout (Month 2+) - -- [ ] Expand to additional teams -- [ ] Create org-wide decision repository -- [ ] Establish governance policies -- [ ] Set up cross-team sharing -- [ ] Document best practices - ---- - -## Troubleshooting - -### Common Issues - -**Git conflicts on shared memories:** -```bash -cd ${MNEMONIC_ROOT}/shared -git fetch origin -git rebase origin/main -# Resolve conflicts, then: -git rebase --continue -``` - -**Disk space issues:** -```bash -# Compress old memories -/mnemonic:gc --compress - -# Archive old episodic memories -mv ${MNEMONIC_ROOT}/default/episodic/user/old-* ~/archive/ -``` - -**Slow search:** -```bash -# Check ripgrep is installed -which rg || brew install ripgrep - -# Use namespace filtering -rg "pattern" ${MNEMONIC_ROOT}/default/decisions/ # Faster -``` - ---- - -## Related Documentation - -- [Compliance & Governance](./compliance-governance.md) - Security controls -- [Productivity & ROI](./productivity-roi.md) - Team benefits -- [Validation Tool](../validation.md) - Schema validation -- [Integrations](../integrations/README.md) - Tool setup - -[← Back to Enterprise Overview](./README.md) diff --git a/docs/enterprise/developer-experience.md b/docs/enterprise/developer-experience.md deleted file mode 100644 index 01e9696..0000000 --- a/docs/enterprise/developer-experience.md +++ /dev/null @@ -1,405 +0,0 @@ -# Developer Experience Guide - -For individual developers and senior engineers who value privacy, control, and customization. - -## Overview - -Mnemonic puts you in control. Your memories stay local, use standard formats, and work with your existing tools. No accounts, no telemetry, no cloud dependencies. - ---- - -## Privacy-First Design - -### Zero Telemetry - -Mnemonic collects nothing: - -- No usage analytics -- No memory content transmission -- No network calls -- No account required -- No API keys needed - -### Local Storage Only - -``` -${MNEMONIC_ROOT}/ # Your memories -${MNEMONIC_ROOT}/ # Project memories (optional) -``` - -That's it. Plain files on your filesystem. - -### You Own Your Data - -```bash -# See exactly what's stored -ls -la ${MNEMONIC_ROOT}/ - -# Read any memory with cat -cat ${MNEMONIC_ROOT}/default/decisions/user/*.memory.md - -# Delete anything -rm ${MNEMONIC_ROOT}/default/learnings/user/unwanted.memory.md - -# Export everything -tar -czf my-memories.tar.gz ${MNEMONIC_ROOT}/ -``` - ---- - -## Human-Readable Format - -### Standard Markdown - -Every memory is a `.memory.md` file you can read and edit: - -```yaml ---- -id: 550e8400-e29b-41d4-a716-446655440000 -type: semantic -namespace: decisions/user -created: 2026-01-23T10:30:00Z -title: "Use PostgreSQL for storage" -tags: - - database - - architecture ---- - -# Use PostgreSQL for Storage - -We decided to use PostgreSQL because: -- Strong ACID compliance -- Excellent JSON support -- Mature ecosystem with great tooling -``` - -### Version Control Built-in - -```bash -cd ${MNEMONIC_ROOT} -git log --oneline -10 # See recent changes -git diff HEAD~1 # What changed? -git checkout HEAD~1 -- file.md # Restore old version -git blame file.memory.md # Who changed what? -``` - ---- - -## Power User Features - -### Advanced Search - -```bash -# Full-text search with ripgrep -rg -i "authentication" ${MNEMONIC_ROOT}/ - -# Search by namespace -rg -i "pattern" ${MNEMONIC_ROOT}/*/decisions/ - -# Search by memory type -rg "^type: episodic" ${MNEMONIC_ROOT}/ -l - -# Search by tag -rg -l "^ - security" ${MNEMONIC_ROOT}/ - -# Recent memories (last 7 days) -find ${MNEMONIC_ROOT} -name "*.memory.md" -mtime -7 - -# Combine searches -rg -l "authentication" ${MNEMONIC_ROOT}/*/decisions/ | \ - xargs rg "JWT" -``` - -### Custom Scripts - -Create your own memory tools: - -```bash -#!/usr/bin/env bash -# quick-capture.sh - Fast memory capture - -NAMESPACE="${1:-learnings}" -TITLE="$2" -UUID=$(uuidgen | tr '[:upper:]' '[:lower:]') -DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") -SLUG=$(echo "$TITLE" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | head -c 50) - -cat > ${MNEMONIC_ROOT}/default/${NAMESPACE}/user/${SLUG}.memory.md << EOF ---- -id: ${UUID} -type: semantic -namespace: ${NAMESPACE}/user -created: ${DATE} -modified: ${DATE} -title: "${TITLE}" -tags: [] -temporal: - valid_from: ${DATE} - recorded_at: ${DATE} -provenance: - source_type: user_explicit - agent: custom-script - confidence: 1.0 ---- - -# ${TITLE} - -EOF - -echo "Created: ${MNEMONIC_ROOT}/default/${NAMESPACE}/user/${SLUG}.memory.md" -``` - -### Unix Tool Integration - -```bash -# Count memories by namespace -find ${MNEMONIC_ROOT} -name "*.memory.md" | \ - sed 's|.*/\([^/]*\)/[^/]*/.*|\1|' | sort | uniq -c - -# Find largest memories -find ${MNEMONIC_ROOT} -name "*.memory.md" -exec wc -l {} + | sort -n | tail -10 - -# Extract all titles -rg "^title:" ${MNEMONIC_ROOT}/ | sed 's/.*title: "//' | sed 's/"$//' - -# JSON export with yq -for f in ${MNEMONIC_ROOT}/**/*.memory.md; do - yq -f extract '.title, .type, .created' "$f" -done -``` - ---- - -## Offline Capability - -### No Network Required - -Mnemonic works completely offline: - -- No API calls to make -- No authentication to refresh -- No sync to wait for -- No rate limits - -### Travel Mode - -```bash -# On a plane? In a tunnel? Disconnected environment? -# Mnemonic works exactly the same. - -/mnemonic:capture decisions "Use event sourcing for audit log" -/mnemonic:recall authentication -/mnemonic:search "database" - -# All local, all instant -``` - ---- - -## Customization Options - -### Namespace Organization - -```bash -# Default namespaces -decisions/ patterns/ learnings/ blockers/ context/ -apis/ security/ testing/ episodic/ - -# Add your own -mkdir -p ${MNEMONIC_ROOT}/default/research/user -mkdir -p ${MNEMONIC_ROOT}/default/bookmarks/user -``` - -### Memory Types - -| Type | Use For | Decay Rate | -|------|---------|------------| -| **semantic** | Facts, decisions, specs | Slow (30 days) | -| **episodic** | Events, debugging sessions | Fast (7 days) | -| **procedural** | Workflows, how-tos | Medium (14 days) | - -### Decay Model - -Memories naturally fade based on age and access patterns: - -```yaml -temporal: - decay: - model: exponential - half_life: P7D # Halves every 7 days - strength: 0.85 # Current strength (0.0-1.0) -``` - -Override for important memories: - -```yaml -temporal: - decay: - model: none # Never decay -``` - ---- - -## Git Workflows - -### Personal Memory Repository - -```bash -# Initialize git (if not already) -cd ${MNEMONIC_ROOT} -git init - -# Daily backup -git add . -git commit -m "Daily backup $(date +%Y-%m-%d)" - -# Remote backup -git remote add origin git@github.com:yourname/memories.git -git push -u origin main -``` - -### Branch for Experiments - -```bash -cd ${MNEMONIC_ROOT} -git checkout -b experiment/new-architecture - -# Try new patterns, make decisions -# If it works, merge back -git checkout main -git merge experiment/new-architecture - -# If not, discard -git branch -D experiment/new-architecture -``` - -### Time Travel - -```bash -# What did I know last month? -git checkout HEAD~30 -- . - -# Restore specific memory -git checkout HEAD~5 -- decisions/user/important.memory.md - -# Compare memory evolution -git diff HEAD~10 -- patterns/user/auth.memory.md -``` - ---- - -## Performance Tips - -### Fast Search - -```bash -# Use ripgrep (10x faster than grep) -brew install ripgrep # macOS -apt install ripgrep # Ubuntu - -# Limit search scope -rg "pattern" ${MNEMONIC_ROOT}/*/decisions/ # Not all namespaces - -# Use file lists for large sets -rg -l "keyword" ${MNEMONIC_ROOT}/ | head -20 # Preview first -``` - -### Manage Memory Growth - -```bash -# Check size -du -sh ${MNEMONIC_ROOT}/ - -# Archive old memories -/mnemonic:gc --compress --compress-threshold 100 - -# Remove expired TTL memories -/mnemonic:gc --ttl 90d - -# Preview before cleanup -/mnemonic:gc --dry-run -``` - ---- - -## Validation & Quality - -### Schema Validation - -```bash -# Validate all memories -./tools/mnemonic-validate - -# Check specific namespace -./tools/mnemonic-validate ${MNEMONIC_ROOT}/default/decisions/ - -# Capture validation as memory -./tools/mnemonic-validate --capture -``` - -### Pre-commit Hook - -```bash -# .git/hooks/pre-commit -#!/bin/bash -./tools/mnemonic-validate --changed --fast-fail -``` - ---- - -## Comparison with Alternatives - -### vs. Cloud-Based Memory - -| Feature | Cloud Memory | Mnemonic | -|---------|-------------|----------| -| Privacy | Data on servers | 100% local | -| Offline | No | Yes | -| Telemetry | Usually yes | None | -| Lock-in | Vendor format | Open MIF | -| Cost | Subscription | Free | - -### vs. Plain Markdown Files - -| Feature | Plain Markdown | Mnemonic | -|---------|---------------|----------| -| Structure | Ad-hoc | Standardized | -| Validation | None | Schema validation | -| Integration | Manual | Claude Code plugin | -| Search | Basic grep | Intelligent recall | -| Metadata | None | Rich frontmatter | - ---- - -## Quick Reference - -```bash -# Capture -/mnemonic:capture decisions "Title here" - -# Search -rg -i "topic" ${MNEMONIC_ROOT}/ - -# Recall (automatic, but manual option) -/mnemonic:recall --namespace decisions - -# Status -/mnemonic:status - -# Validate -./tools/mnemonic-validate - -# Cleanup -/mnemonic:gc --compress -``` - ---- - -## Related Documentation - -- [Productivity & ROI](./productivity-roi.md) - Team benefits -- [Compliance & Governance](./compliance-governance.md) - Enterprise controls -- [Research Validation](./research-validation.md) - Why it works -- [Main Documentation](../../README.md) - Full reference - -[← Back to Enterprise Overview](./README.md) diff --git a/docs/enterprise/productivity-roi.md b/docs/enterprise/productivity-roi.md deleted file mode 100644 index abaced1..0000000 --- a/docs/enterprise/productivity-roi.md +++ /dev/null @@ -1,339 +0,0 @@ -# Productivity & ROI Guide - -For engineering managers, VPs of Engineering, and CTOs. - -## Overview - -Mnemonic eliminates context-switching overhead, accelerates onboarding, and reduces repeated debugging—all with zero infrastructure costs. - ---- - -## The Context Problem - -AI coding assistants are powerful but stateless. Every session starts fresh: - -``` -Session 1: "We decided to use JWT for auth" -Session 2: "What authentication approach should I use?" - └── Context lost, decision forgotten -``` - -**Impact:** -- Engineers re-explain decisions repeatedly -- New team members lack historical context -- Debugging sessions repeat past investigations -- Architectural knowledge scattered across Slack, docs, code comments - ---- - -## Mnemonic's Solution - -Persistent, cross-session memory that works across all AI coding tools: - -``` -Session 1: "We decided to use JWT for auth" - └── Captured to decisions/user/ - -Session 2: "What authentication approach should I use?" - └── Auto-recalls JWT decision - └── Implements with established pattern -``` - ---- - -## Productivity Metrics - -### Context Switching Reduction - -| Without Mnemonic | With Mnemonic | -|------------------|---------------| -| 5-10 min explaining prior decisions | Instant recall | -| Search Slack/docs for context | In-context memory | -| Re-investigate past bugs | Episodic memory available | -| Onboard new tool = start over | Same memories across tools | - -### Research-Validated Performance - -Filesystem-based memory achieves **74.0% accuracy** on the LoCoMo benchmark vs 68.5% for graph-based alternatives. This means: - -- Fewer incorrect recalls -- More relevant context surfaced -- Less time correcting AI mistakes - ---- - -## Team Benefits - -### Knowledge Retention - -``` -Developer leaves team - │ - └── Without mnemonic: Knowledge walks out the door - └── With mnemonic: Decisions, patterns, learnings preserved -``` - -**Captured knowledge types:** -- Architectural decisions with rationale -- Code patterns and conventions -- Debugging learnings -- API documentation -- Security policies - -### Accelerated Onboarding - -New team member workflow: - -```bash -# Day 1: Explore existing decisions -rg -l "." ${MNEMONIC_ROOT}/default/decisions/user/ | head -20 - -# Read architectural context -cat ${MNEMONIC_ROOT}/default/decisions/user/*postgresql*.memory.md - -# Understand patterns -rg -l "." ${MNEMONIC_ROOT}/default/patterns/user/ -``` - -**Estimated onboarding reduction:** 40-60% faster context acquisition - -### Reduced Debugging Time - -```yaml -# Episodic memory from past debugging session ---- -id: abc123 -type: episodic -namespace: learnings/user -title: "Fixed N+1 query in user dashboard" ---- - -# Investigation -Found N+1 query pattern in UserDashboard component. - -# Solution -Added .includes(:posts, :comments) to ActiveRecord query. - -# Time spent: 3 hours -``` - -Next time similar issue occurs: -- AI recalls past investigation -- Solution applied in minutes, not hours - ---- - -## Multi-Tool Flexibility - -### Open Format - -All memories are plain markdown with YAML frontmatter — no proprietary storage: - -**Benefits:** -- Human-readable and editable with any text editor -- Git-versioned with meaningful diffs -- No vendor lock-in — standard filesystem storage -- Portable MIF Level 3 format - -### Standardized Format (MIF Level 3) - -```yaml ---- -id: uuid -type: semantic|episodic|procedural -namespace: decisions/user -created: ISO-8601 -title: "Decision title" ---- - -Content in markdown... -``` - -All tools read the same format. All memories portable. - ---- - -## Cost Analysis - -### Zero Infrastructure Costs - -| Cost Category | Cloud Alternatives | Mnemonic | -|---------------|-------------------|----------| -| Monthly SaaS fee | $10-50/user/month | $0 | -| Storage costs | Usage-based | Filesystem (free) | -| API calls | Per-request fees | None | -| Integration work | Custom development | Templates provided | -| Maintenance | Vendor-dependent | Git + filesystem | - -### Total Cost of Ownership - -**Year 1 for 20-person team:** - -| Solution | Cost Estimate | -|----------|---------------| -| Cloud-based AI memory | $2,400-12,000/year | -| Mnemonic | $0 + 2 hours setup | - ---- - -## Implementation Effort - -### Quick Start (30 minutes) - -```bash -# Install plugin -claude settings plugins add /path/to/mnemonic - -# Initialize -/mnemonic:setup - -# Done - proactive memory starts working -``` - -### Team Rollout (1-2 days) - -1. **Day 1 Morning:** Install on pilot team (3-5 engineers) -2. **Day 1 Afternoon:** Capture first decisions and patterns -3. **Day 2:** Review captured memories, refine namespaces -4. **Week 1:** Roll out to full team - -### Adoption Strategy - -**Phase 1: Individual Adoption** -- Engineers install personally -- Build personal memory base -- Prove value with reduced context-switching - -**Phase 2: Team Patterns** -- Share common patterns via git -- Establish namespace conventions -- Document architectural decisions - -**Phase 3: Organization Knowledge Base** -- Centralized decision repository -- Onboarding memory packs -- Cross-team pattern sharing - ---- - -## Success Metrics - -### Track These KPIs - -| Metric | How to Measure | Target | -|--------|----------------|--------| -| Context re-explanation | Survey/time tracking | -50% | -| Onboarding time | New hire productivity ramp | -40% | -| Debugging repeat rate | Issue tracking tags | -30% | -| Tool switching friction | Developer feedback | Eliminated | - -### Measurement Commands - -```bash -# Memory usage over time -git log --oneline ${MNEMONIC_ROOT} | wc -l - -# Most accessed namespaces -find ${MNEMONIC_ROOT} -name "*.memory.md" | \ - sed 's|.*/\([^/]*\)/[^/]*/.*|\1|' | sort | uniq -c | sort -rn - -# Memory growth rate -du -sh ${MNEMONIC_ROOT} -``` - ---- - -## Risk Mitigation - -### Low Adoption Risk - -| Concern | Mitigation | -|---------|------------| -| Engineers won't use it | Automatic capture via hooks | -| Too much overhead | Proactive, silent operation | -| Learning curve | Familiar markdown format | -| Tool compatibility | 9+ integrations already | - -### Data Risk - -| Concern | Mitigation | -|---------|------------| -| Data loss | Git versioning, backups | -| Stale information | TTL policies, decay model | -| Incorrect memories | Validation tool, provenance tracking | -| Sensitive data exposure | Local storage, permissions | - ---- - -## Team Coordination Features - -### Shared Memory Patterns - -```bash -# Team shares a patterns repository -git clone git@github.com:team/shared-patterns ${MNEMONIC_ROOT}/shared - -# Individual contributions -cd ${MNEMONIC_ROOT}/shared -git add new-pattern.memory.md -git commit -m "Add API pagination pattern" -git push -``` - -### Namespace Strategy for Teams - -``` -${MNEMONIC_ROOT}/ -├── org/ # Organization-wide -│ ├── decisions/shared/ # Company architectural decisions -│ ├── patterns/shared/ # Standard code patterns -│ └── security/shared/ # Security policies -├── team/ # Team-specific -│ ├── decisions/team/ # Team decisions -│ └── context/team/ # Project context -└── default/ # Individual - ├── learnings/user/ # Personal learnings - └── episodic/user/ # Personal experiences -``` - ---- - -## Comparison with Alternatives - -### vs. Confluence/Notion - -| Aspect | Wiki Tools | Mnemonic | -|--------|-----------|----------| -| AI integration | Manual copy-paste | Automatic | -| Search context | Separate tool | In AI context | -| Update friction | High (manual) | Low (automatic) | -| Format | Proprietary | Standard markdown | - -### vs. Custom Solutions - -| Aspect | Build Your Own | Mnemonic | -|--------|---------------|----------| -| Development time | Weeks-months | Hours | -| Maintenance | Ongoing | Minimal | -| Multi-tool support | Custom per tool | Built-in | -| Research validation | Unknown | 74% accuracy benchmark | - -### vs. Cloud AI Memory - -| Aspect | Cloud Solutions | Mnemonic | -|--------|----------------|----------| -| Data sovereignty | Third-party servers | Local only | -| Offline access | Requires network | Always available | -| Cost | Per-user fees | Free | -| Lock-in | Vendor-specific | Open format | - ---- - -## Related Documentation - -- [Developer Experience](./developer-experience.md) - Individual benefits -- [Compliance & Governance](./compliance-governance.md) - Enterprise controls -- [Deployment Guide](./deployment-guide.md) - Rollout planning -- [Integrations](../integrations/README.md) - Tool-specific setup - -[← Back to Enterprise Overview](./README.md) diff --git a/docs/enterprise/research-validation.md b/docs/enterprise/research-validation.md deleted file mode 100644 index 5da6aa8..0000000 --- a/docs/enterprise/research-validation.md +++ /dev/null @@ -1,348 +0,0 @@ -# Research Validation - -Technical deep dive into the academic foundations and benchmark results that validate mnemonic's approach. - -## Overview - -Mnemonic's filesystem-based architecture is not just pragmatic—it's research-validated. This document presents the empirical evidence and theoretical foundations. - ---- - -## Letta LoCoMo Benchmark - -### Results Summary - -| Approach | Accuracy | Difference | -|----------|----------|------------| -| **Filesystem-based** | 74.0% | Baseline | -| Mem0 (graph-based) | 68.5% | -5.5% | - -Source: [Letta Research Blog](https://www.letta.com/blog/benchmarking-ai-agent-memory) - -### Why Filesystem Wins - -The benchmark reveals a counterintuitive finding: simpler approaches outperform complex ones. - -**Key Insight**: LLMs are extensively pretrained on filesystem operations. They understand: -- File paths and directory structures -- grep, find, cat command patterns -- Markdown and text processing -- Version control concepts - -This pretraining makes filesystem operations more reliable than specialized abstractions like: -- Vector databases -- Knowledge graphs -- Custom query languages - -### Methodology - -The LoCoMo (Long-Context Memory) benchmark measures: - -1. **Memory Recall Accuracy**: Can the system retrieve relevant information? -2. **Context Coherence**: Does retrieved context help the task? -3. **Temporal Reasoning**: Can the system reason about when things happened? - -Mnemonic's filesystem approach excels because: -- Direct file access = no abstraction overhead -- Human-readable format = debuggable -- Git history = temporal tracking built-in - ---- - -## Unix Philosophy Foundation - -### The Paper - -**Title**: "From Everything is a File to Files Are All You Need" -**Source**: [arXiv:2601.11672](https://arxiv.org/abs/2601.11672) - -### Core Argument - -The Unix philosophy of uniform interfaces (everything is a file) applies directly to AI agent design: - -> "Agents interacting with REST APIs, SQL databases, vector stores, and file systems benefit from file-like abstractions where complexity is encapsulated, not eliminated." - -### Application to Mnemonic - -| Unix Principle | Mnemonic Implementation | -|----------------|------------------------| -| Everything is a file | Memories are markdown files | -| Plain text | Human-readable content | -| Small tools, composable | grep, find, git integration | -| Simplicity | No databases, no cloud | - -### Why This Matters - -Vector databases and knowledge graphs add complexity that: -- Increases failure modes -- Reduces debuggability -- Requires specialized tooling -- Creates vendor dependencies - -File-based approaches: -- Use battle-tested filesystem semantics -- Work with any Unix tool -- Remain human-inspectable -- Scale with standard infrastructure - ---- - -## Cognitive Science Foundations - -### Memory Type Classification - -Mnemonic's type system derives from cognitive psychology: - -| Mnemonic Type | Cognitive Equivalent | Description | -|---------------|---------------------|-------------| -| **semantic** | Semantic Memory | Facts, concepts, general knowledge | -| **episodic** | Episodic Memory | Personal experiences, events | -| **procedural** | Procedural Memory | Skills, how-to knowledge | - -Source: [Human-inspired Perspectives: A Survey on AI Long-term Memory](https://arxiv.org/abs/2411.00489) - -### Why This Classification Works - -AI agent frameworks are adopting these cognitive patterns because they map naturally to: - -- **Semantic**: API documentation, architectural decisions, specifications -- **Episodic**: Debugging sessions, incidents, conversations -- **Procedural**: Deployment workflows, coding patterns, runbooks - -### Decay Model - -Human memory fades over time. Mnemonic implements exponential decay: - -``` -strength(t) = initial_strength × e^(-λt) -``` - -Where: -- `λ = ln(2) / half_life` -- Default half-lives: semantic (30d), episodic (7d), procedural (14d) - -This ensures: -- Recent memories are prioritized -- Old memories naturally fade -- Important memories can override decay - ---- - -## Bi-Temporal Database Theory - -### SQL:2011 Standard - -Mnemonic implements bi-temporal tracking per the SQL:2011 standard: - -```yaml -temporal: - valid_from: 2026-01-15T00:00:00Z # When this became true in reality - recorded_at: 2026-01-20T10:30:00Z # When we recorded this knowledge -``` - -### Two Time Dimensions - -| Dimension | Question Answered | Use Case | -|-----------|-------------------|----------| -| **valid_from** | When was this true? | Backfilling historical decisions | -| **recorded_at** | When did we learn this? | Audit trail, knowledge discovery | - -### Practical Benefits - -1. **Corrections**: Record that a decision was made last week, today -2. **Audit**: Distinguish between fact time and knowledge time -3. **Debugging**: "When did we know about this bug?" -4. **Compliance**: Full temporal provenance - -Reference: [Martin Fowler's Bitemporal History](https://martinfowler.com/articles/bitemporal-history.html) - ---- - -## Competitive Analysis - -### Market Positioning - -``` - Simple ◄─────────────────► Complex - │ │ - Private/Local [MNEMONIC] [Mem0] - │ │ │ - │ [Basic Memory] [Zep Cloud] - │ │ │ - Cloud/Hosted [Copilot Memory] [LangChain Memory] -``` - -### Feature Comparison - -| Feature | Mnemonic | Mem0 | Zep | LangChain | -|---------|----------|------|-----|-----------| -| Storage | Filesystem | Graph DB | Vector+Graph | Configurable | -| Dependencies | None | External DB | Cloud service | External DB | -| Accuracy (LoCoMo) | 74.0% | 68.5% | N/A | N/A | -| Human-readable | Yes | No | No | Varies | -| Offline | Yes | No | No | Depends | -| Git versioning | Yes | No | No | No | -| Cost | Free | Freemium | Paid | Depends | - -### Competitive Advantages - -1. **Research-validated accuracy**: 5.5% higher than leading alternative -2. **Zero dependencies**: No cloud, no databases, no accounts -3. **Human-readable**: Direct file inspection and editing -4. **Git integration**: Full version control with meaningful diffs -5. **Multi-tool support**: 9+ AI coding assistants -6. **Open format**: MIF Level 3 prevents lock-in - ---- - -## Performance Characteristics - -### Search Performance - -Mnemonic uses ripgrep for fast full-text search: - -| Memory Count | ripgrep Time | Traditional grep | -|--------------|--------------|------------------| -| 100 | 5ms | 50ms | -| 1,000 | 20ms | 400ms | -| 10,000 | 100ms | 4,000ms | - -Source: [ripgrep benchmarks](https://burntsushi.net/ripgrep/) - -### Scaling Considerations - -| Scale | Recommendation | -|-------|----------------| -| < 1,000 memories | Default configuration | -| 1,000 - 10,000 | Use namespace filtering | -| 10,000+ | Consider memory archival | - -### Memory Size - -Average memory file: 500 bytes - 5 KB -Typical installation: 100-1,000 memories = 0.5 - 5 MB - ---- - -## Validation Methodology - -### Schema Validation - -Mnemonic includes a validation tool that checks: - -| Check | Purpose | -|-------|---------| -| UUID format | Unique identification | -| ISO 8601 timestamps | Standard date format | -| Type enumeration | Valid memory types | -| Required fields | Complete metadata | -| Provenance | Track data origin | - -### Quality Assurance - -```bash -# Validate all memories -./tools/mnemonic-validate - -# CI integration -./tools/mnemonic-validate --format json - -# Capture validation as memory -./tools/mnemonic-validate --capture -``` - ---- - -## Comparison with Industry Trends - -### Context Engineering - -Anthropic's research on [Effective Context Engineering for AI Agents](https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents) aligns with mnemonic's approach: - -- Structured context formats -- Relevant information retrieval -- Context window optimization - -### GitHub Copilot Memory - -GitHub Copilot's [Agentic Memory System](https://github.blog/ai-and-ml/github-copilot/building-an-agentic-memory-system-for-github-copilot/) uses citation-based validation—similar to mnemonic's provenance tracking: - -```yaml -provenance: - source_type: conversation - agent: claude-opus-4 - confidence: 0.95 -citations: - - type: documentation - title: "PostgreSQL Docs" - url: https://www.postgresql.org/docs/ - relevance: 0.90 -``` - -### MCP Ecosystem - -While mnemonic doesn't implement MCP (Model Context Protocol), its filesystem approach is compatible with MCP-style tool use: - -- Memories exposed as file resources -- Search as tool operations -- Standard Unix tools as primitives - ---- - -## Academic References - -### Primary Sources - -1. **Letta LoCoMo Benchmark** - - Source: [letta.com/blog/benchmarking-ai-agent-memory](https://www.letta.com/blog/benchmarking-ai-agent-memory) - - Finding: Filesystem 74.0% vs Graph 68.5% - -2. **Unix Philosophy for AI** - - Source: [arXiv:2601.11672](https://arxiv.org/abs/2601.11672) - - Finding: File abstractions work for agents - -3. **AI Long-term Memory Survey** - - Source: [arXiv:2411.00489](https://arxiv.org/abs/2411.00489) - - Finding: Cognitive memory types apply to AI - -### Supporting Sources - -4. **Martin Fowler - Bitemporal History** - - Source: [martinfowler.com/articles/bitemporal-history.html](https://martinfowler.com/articles/bitemporal-history.html) - - Application: Bi-temporal tracking design - -5. **ripgrep Benchmarks** - - Source: [burntsushi.net/ripgrep](https://burntsushi.net/ripgrep/) - - Finding: 5-10x faster than grep - -6. **Anthropic - Context Engineering** - - Source: [anthropic.com/engineering/effective-context-engineering](https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents) - - Application: Context formatting patterns - -7. **GitHub Copilot Memory** - - Source: [github.blog/ai-and-ml/github-copilot/building-an-agentic-memory-system](https://github.blog/ai-and-ml/github-copilot/building-an-agentic-memory-system-for-github-copilot/) - - Application: Citation-based validation - ---- - -## Conclusion - -Mnemonic's design choices are not arbitrary—they're backed by: - -1. **Empirical evidence**: 74% accuracy in rigorous benchmarks -2. **Theoretical foundation**: Unix philosophy, cognitive science -3. **Industry alignment**: Matches trends from GitHub, Anthropic -4. **Practical benefits**: Zero dependencies, full auditability - -The research is clear: for AI memory systems, simplicity wins. - ---- - -## Related Documentation - -- [Compliance & Governance](./compliance-governance.md) - Enterprise controls -- [Developer Experience](./developer-experience.md) - User benefits -- [ADR-001](../adrs/adr-001-filesystem-based-storage.md) - Architecture decision -- [Original Research](../../reports/ai-memory-filesystem-research/2026-01-24-research.md) - Full market research - -[← Back to Enterprise Overview](./README.md) diff --git a/docs/library-reference.md b/docs/library-reference.md index aa83d76..f2c1af9 100644 --- a/docs/library-reference.md +++ b/docs/library-reference.md @@ -30,7 +30,7 @@ The `lib/` directory contains shared Python utilities used across mnemonic's hoo ### paths -**File**: `lib/paths.py` | **Documentation**: [lib/README.md](../lib/README.md) +**File**: `lib/paths.py` Centralized path resolution for all mnemonic memory operations. Provides single source of truth for memory directories, search paths, and blackboard locations. @@ -644,7 +644,7 @@ Validate memory conforms to loaded ontology. --- -**See Also**: +**See Also**: - [Ontologies Guide](ontologies.md) - [ADR-008: Custom Ontologies](adrs/adr-008-custom-ontologies.md) - [Ontology Skill](../skills/ontology/SKILL.md) diff --git a/docs/ontologies.md b/docs/ontologies.md index 5eaa875..002cac7 100644 --- a/docs/ontologies.md +++ b/docs/ontologies.md @@ -465,7 +465,6 @@ entity: |---------|-------------| | `/mnemonic:list` | List loaded ontologies and namespaces | | `/mnemonic:validate ` | Validate ontology file | -| `/mnemonic:discover ` | Discover entities in files | ### Library API diff --git a/docs/ontology-implementation-plan.md b/docs/ontology-implementation-plan.md deleted file mode 100644 index fabd201..0000000 --- a/docs/ontology-implementation-plan.md +++ /dev/null @@ -1,1008 +0,0 @@ -# Ontology Support Implementation Plan - -**Status**: Awaiting Approval -**Target**: Mnemonic v2.0 -**Timeline**: 5 weeks - -## Executive Summary - -This plan details the implementation of custom ontology support for mnemonic, enabling: -- Domain-specific knowledge management -- Entity types with mixin-based inheritance -- Agent-driven entity discovery -- URL-referenced shared ontologies -- Rich entity linking and relationships - -## Architecture Overview - -``` -┌─────────────────────────────────────────────────────────────┐ -│ Claude Code CLI │ -├─────────────────────────────────────────────────────────────┤ -│ Plugin Layer │ -│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │ -│ │ Commands │ │ Skills │ │ Agents │ │ -│ │ • capture │ │ • mnemonic- │ │ • ontology- │ │ -│ │ • ontology │ │ ontology │ │ discovery │ │ -│ └────────┬────────┘ └────────┬────────┘ └──────┬──────┘ │ -│ │ │ │ │ -│ └──────────────┬─────┴───────────────────┘ │ -│ │ │ -├──────────────────────────┼──────────────────────────────────┤ -│ Ontology Layer (NEW) │ │ -│ ┌───────────────────────▼───────────────────────────────┐ │ -│ │ OntologyRegistry │ │ -│ │ • Load ontology definitions │ │ -│ │ • Merge base + user + project ontologies │ │ -│ │ • Resolve namespace → ontology mappings │ │ -│ └─────────────────────┬─────────────────────────────────┘ │ -│ │ │ -│ ┌─────────────────────▼─────────────────────────────────┐ │ -│ │ OntologyValidator │ │ -│ │ • Validate ontology YAML against meta-schema │ │ -│ │ • Check entity type completeness │ │ -│ │ • Verify trait compatibility │ │ -│ └─────────────────────┬─────────────────────────────────┘ │ -│ │ │ -│ ┌─────────────────────▼─────────────────────────────────┐ │ -│ │ EntityResolver │ │ -│ │ • Link entities across memories │ │ -│ │ • Index entities for fast lookup │ │ -│ │ • Resolve @[[entity]] references │ │ -│ └───────────────────────────────────────────────────────┘ │ -│ │ -├────────────────────────────────────────────────────────────┤ -│ Storage Layer │ -│ ┌────────────────────────────────────────────────────────┐│ -│ │ Filesystem (.memory.md + .ontology.yaml) ││ -│ │ ┌─────────────────────┐ ┌─────────────────────────┐ ││ -│ │ │ ~/.claude/ │ │ $MNEMONIC_ROOT/ │ ││ -│ │ │ mnemonic/{org}/ │ │ │ ││ -│ │ │ ├── ontology.yaml │ │ ├── ontology.yaml │ ││ -│ │ │ └── {namespace}/ │ │ └── {namespace}/ │ ││ -│ │ └─────────────────────┘ └─────────────────────────┘ ││ -│ └────────────────────────────────────────────────────────┘│ -└────────────────────────────────────────────────────────────┘ -``` - -## Phase 1: Core Infrastructure (Week 1-2) - -### 1.1 Create Python Library Structure - -**Files to create:** - -``` -lib/ -├── __init__.py -├── ontology_registry.py -├── ontology_validator.py -└── entity_resolver.py -``` - -**lib/ontology_registry.py** (~400 lines): -```python -from dataclasses import dataclass, field -from pathlib import Path -from typing import Dict, List, Optional -import yaml - -@dataclass -class EntityType: - name: str - description: str - base: str # semantic | episodic | procedural - traits: List[str] = field(default_factory=list) - schema: Dict = field(default_factory=dict) - -@dataclass -class Trait: - name: str - fields: Dict - -@dataclass -class Namespace: - name: str - description: str - type_hint: str = "semantic" - replaces: Optional[str] = None - -@dataclass -class Ontology: - id: str - version: str - description: str - namespaces: Dict[str, Namespace] = field(default_factory=dict) - entity_types: List[EntityType] = field(default_factory=list) - traits: Dict[str, Trait] = field(default_factory=dict) - relationships: Dict = field(default_factory=dict) - discovery: Dict = field(default_factory=dict) - schema_url: Optional[str] = None - -class OntologyRegistry: - def __init__(self): - self._ontologies: Dict[str, Ontology] = {} - self._namespace_map: Dict[str, str] = {} # namespace -> ontology_id - self._base_namespaces = [ - "apis", "blockers", "context", "decisions", - "learnings", "patterns", "security", "testing", "episodic" - ] - - def load_ontologies(self, paths: List[Path]) -> None: - """Load ontologies from multiple paths with precedence.""" - for path in paths: - self._load_from_path(path) - - def get_ontology(self, ontology_id: str) -> Optional[Ontology]: - """Get ontology by ID.""" - return self._ontologies.get(ontology_id) - - def get_ontology_for_namespace(self, namespace: str) -> Optional[Ontology]: - """Get ontology that defines a namespace.""" - ontology_id = self._namespace_map.get(namespace) - return self._ontologies.get(ontology_id) if ontology_id else None - - def get_all_namespaces(self) -> List[str]: - """Get all valid namespaces (base + custom).""" - custom = list(self._namespace_map.keys()) - return list(set(self._base_namespaces + custom)) - - def get_entity_type(self, namespace: str, type_name: str) -> Optional[EntityType]: - """Get entity type definition.""" - ontology = self.get_ontology_for_namespace(namespace) - if ontology: - for et in ontology.entity_types: - if et.name == type_name: - return et - return None - - def is_custom_namespace(self, namespace: str) -> bool: - """Check if namespace is custom (not base).""" - return namespace not in self._base_namespaces - - def _load_from_path(self, path: Path) -> None: - """Load ontology from a path.""" - ontology_file = path / "ontology.yaml" - if ontology_file.exists(): - with open(ontology_file) as f: - data = yaml.safe_load(f) - ontology = self._parse_ontology(data) - self._register_ontology(ontology) - - def _parse_ontology(self, data: dict) -> Ontology: - """Parse ontology from YAML data.""" - # Implementation details... - pass - - def _register_ontology(self, ontology: Ontology) -> None: - """Register ontology and update mappings.""" - self._ontologies[ontology.id] = ontology - for ns_name in ontology.namespaces: - self._namespace_map[ns_name] = ontology.id -``` - -### 1.2 Create Ontology Meta-Schema - -**ontologies/schemas/ontology-meta-schema.json** (~200 lines): -```json -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://mnemonic.org/schemas/ontology/v1", - "title": "Mnemonic Ontology Schema", - "type": "object", - "required": ["ontology"], - "properties": { - "ontology": { - "type": "object", - "required": ["id", "version"], - "properties": { - "id": {"type": "string", "pattern": "^[a-z][a-z0-9-]*$"}, - "version": {"type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$"}, - "description": {"type": "string"}, - "schema_url": {"type": "string", "format": "uri"} - } - }, - "namespaces": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "description": {"type": "string"}, - "type_hint": {"enum": ["semantic", "episodic", "procedural"]}, - "replaces": {"type": "string"} - } - } - }, - "entity_types": { - "type": "array", - "items": { - "type": "object", - "required": ["name", "base"], - "properties": { - "name": {"type": "string"}, - "description": {"type": "string"}, - "base": {"enum": ["semantic", "episodic", "procedural"]}, - "traits": {"type": "array", "items": {"type": "string"}}, - "schema": {"$ref": "#/$defs/entitySchema"} - } - } - }, - "traits": { - "type": "object", - "additionalProperties": { - "type": "object", - "required": ["fields"], - "properties": { - "fields": {"type": "object"} - } - } - }, - "relationships": { - "type": "object" - }, - "discovery": { - "type": "object", - "properties": { - "enabled": {"type": "boolean"}, - "patterns": {"type": "array"}, - "confidence_threshold": {"type": "number", "minimum": 0, "maximum": 1} - } - } - }, - "$defs": { - "entitySchema": { - "type": "object", - "properties": { - "required": {"type": "array", "items": {"type": "string"}}, - "properties": {"type": "object"} - } - } - } -} -``` - -### 1.3 Create Base Ontology - -**ontologies/base.ontology.yaml** (~100 lines): -```yaml -ontology: - id: mnemonic-base - version: "1.0.0" - description: "Base mnemonic namespaces (backward compatibility)" - -namespaces: - apis: - description: "API documentation, contracts, endpoints" - type_hint: semantic - - blockers: - description: "Issues, impediments, incidents" - type_hint: episodic - - context: - description: "Background information, environment state" - type_hint: semantic - - decisions: - description: "Architectural choices with rationale" - type_hint: semantic - - learnings: - description: "Insights, discoveries, TILs" - type_hint: semantic - - patterns: - description: "Code conventions, best practices" - type_hint: procedural - - security: - description: "Security policies, vulnerabilities" - type_hint: semantic - - testing: - description: "Test strategies, edge cases" - type_hint: procedural - - episodic: - description: "General events, experiences" - type_hint: episodic - -# No custom entity types in base ontology -# No traits in base ontology -# No discovery patterns in base ontology -``` - -### 1.4 Modify Session Start Hook - -**hooks/session_start.py** (add ~30 lines): -```python -# Add to imports -import sys -sys.path.insert(0, str(Path(__file__).parent.parent / "lib")) -from ontology_registry import OntologyRegistry - -# Add to startup -def load_ontologies() -> OntologyRegistry: - """Load ontologies from user and project directories.""" - registry = OntologyRegistry() - - # Load paths in precedence order (later overrides earlier) - paths = [ - Path(__file__).parent.parent / "ontologies", # Base ontologies - Path.home() / ".claude" / "mnemonic", # User ontologies - Path.cwd() / ".claude" / "mnemonic", # Project ontologies - ] - - registry.load_ontologies(paths) - return registry - -# Use in context generation -def get_ontology_context() -> str: - """Generate ontology context for additionalContext.""" - registry = load_ontologies() - namespaces = registry.get_all_namespaces() - custom = [ns for ns in namespaces if registry.is_custom_namespace(ns)] - - if custom: - return f"**Custom ontology namespaces:** {', '.join(custom)}" - return "" -``` - -### 1.5 Unit Tests - -**tests/test_ontology_registry.py** (~200 lines): -```python -import pytest -from pathlib import Path -from lib.ontology_registry import OntologyRegistry, Ontology, EntityType - -def test_load_base_ontology(): - """Test loading base ontology.""" - registry = OntologyRegistry() - registry.load_ontologies([Path("ontologies")]) - - assert "apis" in registry.get_all_namespaces() - assert "decisions" in registry.get_all_namespaces() - assert registry.is_custom_namespace("apis") == False - -def test_load_custom_ontology(tmp_path): - """Test loading custom ontology.""" - ontology_yaml = tmp_path / "ontology.yaml" - ontology_yaml.write_text(""" -ontology: - id: test-ontology - version: "1.0.0" - -namespaces: - custom-ns: - description: "Custom namespace" - type_hint: semantic -""") - - registry = OntologyRegistry() - registry.load_ontologies([tmp_path]) - - assert "custom-ns" in registry.get_all_namespaces() - assert registry.is_custom_namespace("custom-ns") == True - -def test_namespace_precedence(tmp_path): - """Test that project ontology overrides user ontology.""" - # Create user ontology - user_dir = tmp_path / "user" - user_dir.mkdir() - (user_dir / "ontology.yaml").write_text(""" -ontology: - id: user-ontology - version: "1.0.0" - -namespaces: - shared-ns: - description: "User version" -""") - - # Create project ontology - project_dir = tmp_path / "project" - project_dir.mkdir() - (project_dir / "ontology.yaml").write_text(""" -ontology: - id: project-ontology - version: "1.0.0" - -namespaces: - shared-ns: - description: "Project version" -""") - - registry = OntologyRegistry() - registry.load_ontologies([user_dir, project_dir]) - - ontology = registry.get_ontology_for_namespace("shared-ns") - assert ontology.id == "project-ontology" # Project wins - -def test_entity_type_lookup(): - """Test entity type lookup.""" - # Test implementation... - pass -``` - ---- - -## Phase 2: Entity Management (Week 2-3) - -### 2.1 Create Entity Resolver - -**lib/entity_resolver.py** (~300 lines): -```python -from dataclasses import dataclass -from pathlib import Path -from typing import Dict, List, Optional -import subprocess -import re - -@dataclass -class Entity: - id: str - type: str - name: str - memory_path: Path - ontology_id: str - -@dataclass -class EntityLink: - from_entity: str - to_entity: str - relationship: str - -class EntityResolver: - def __init__(self, registry: 'OntologyRegistry'): - self.registry = registry - self._index: Dict[str, Entity] = {} - self._links: List[EntityLink] = [] - - def resolve_entity(self, entity_ref: str) -> Optional[Entity]: - """Resolve @[[entity]] or [[type:id]] reference.""" - # Parse reference format - if entity_ref.startswith("@[["): - # Simple entity reference: @[[PostgreSQL]] - name = entity_ref[3:-2] - return self._find_by_name(name) - elif ":" in entity_ref: - # Typed reference: [[component:stripe-integration]] - type_name, entity_id = entity_ref.split(":", 1) - return self._find_by_type_and_id(type_name, entity_id) - return None - - def index_memory(self, memory_path: Path) -> List[Entity]: - """Index entities from a memory file.""" - # Parse frontmatter for entity fields - # Return list of discovered entities - pass - - def find_entities_by_type(self, entity_type: str) -> List[Entity]: - """Find all entities of a specific type.""" - return [e for e in self._index.values() if e.type == entity_type] - - def get_relationships(self, entity_id: str) -> List[EntityLink]: - """Get relationships for an entity.""" - return [l for l in self._links - if l.from_entity == entity_id or l.to_entity == entity_id] - - def search_entities(self, query: str) -> List[Entity]: - """Search entities using ripgrep.""" - try: - result = subprocess.run( - ["rg", "-i", "-l", f"entity_id:.*{query}", "--glob", "*.memory.md"], - capture_output=True, - text=True, - cwd=str(Path.home() / ".claude" / "mnemonic"), - timeout=5 - ) - # Parse results... - except Exception: - return [] - - def _find_by_name(self, name: str) -> Optional[Entity]: - """Find entity by name (case-insensitive).""" - for entity in self._index.values(): - if entity.name.lower() == name.lower(): - return entity - return None - - def _find_by_type_and_id(self, type_name: str, entity_id: str) -> Optional[Entity]: - """Find entity by type and ID.""" - key = f"{type_name}:{entity_id}" - return self._index.get(key) -``` - -### 2.2 Update Validator for Ontology - -**tools/mnemonic-validate** (add ~150 lines): -```python -# Add import -from lib.ontology_registry import OntologyRegistry - -# Modify validate_memory function -def validate_memory_with_ontology( - file_path: Path, - schema: MIFSchema, - registry: OntologyRegistry = None, - ... -) -> ValidationResult: - """Validate memory with ontology support.""" - result = ValidationResult(file_path=file_path) - - # ... existing validation ... - - # NEW: Ontology validation - if registry and "ontology" in frontmatter: - ontology_data = frontmatter["ontology"] - ontology_id = ontology_data.get("id") - entity_type = ontology_data.get("entity_type") - - ontology = registry.get_ontology(ontology_id) - if not ontology: - result.warnings.append(ValidationWarning( - field="ontology.id", - message=f"Unknown ontology: {ontology_id}" - )) - else: - # Validate entity type - et = registry.get_entity_type( - frontmatter.get("namespace", "").split("/")[0], - entity_type - ) - if et: - # Validate required fields from entity schema - entity_data = frontmatter.get("entity", {}) - for required in et.schema.get("required", []): - if required not in entity_data: - result.errors.append(ValidationError( - field=f"entity.{required}", - message=f"Required field missing for {entity_type}" - )) - - # Validate trait fields - for trait_name in et.traits: - trait = ontology.traits.get(trait_name) - if trait: - for field_name in trait.fields: - if field_name not in entity_data: - result.warnings.append(ValidationWarning( - field=f"entity.{field_name}", - message=f"Trait '{trait_name}' field missing" - )) - - return result -``` - ---- - -## Phase 3: Commands and Discovery (Week 3-4) - -### 3.1 Create Ontology Command - -**commands/ontology.md** (~200 lines): -```markdown ---- -description: Manage ontologies -argument-hint: " [options]" -allowed-tools: - - Bash - - Read - - Write ---- - -# /mnemonic:ontology - -Manage custom ontologies for mnemonic. - -## Subcommands - -### list -List active ontologies and their namespaces. - -```bash -python3 "$CLAUDE_PLUGIN_ROOT/lib/ontology_registry.py" --list -``` - -### validate -Validate an ontology definition file. - -```bash -python3 "$CLAUDE_PLUGIN_ROOT/lib/ontology_validator.py" \ - --file "${1:-$MNEMONIC_ROOT/ontology.yaml}" -``` - -### add -Add an ontology from a URL. - -```bash -URL="$1" -CACHE_DIR="$MNEMONIC_ROOT/.ontologies/.cache" -mkdir -p "$CACHE_DIR" -curl -sL "$URL" -o "$CACHE_DIR/$(basename $URL)" -echo "Ontology cached. Add to registry to activate." -``` - -### init -Initialize an ontology template. - -```bash -TEMPLATE="${1:-minimal}" -cp "$CLAUDE_PLUGIN_ROOT/ontologies/templates/${TEMPLATE}.yaml" \ - "$MNEMONIC_ROOT/ontology.yaml" -echo "Created $MNEMONIC_ROOT/ontology.yaml from $TEMPLATE template" -``` - -### namespaces -List all valid namespaces. - -```bash -python3 -c " -from lib.ontology_registry import OntologyRegistry -from pathlib import Path - -registry = OntologyRegistry() -registry.load_ontologies([ - Path('$CLAUDE_PLUGIN_ROOT/ontologies'), - Path.home() / '.claude' / 'mnemonic', - Path.cwd() / '.claude' / 'mnemonic' -]) - -for ns in sorted(registry.get_all_namespaces()): - custom = '(custom)' if registry.is_custom_namespace(ns) else '' - print(f' {ns} {custom}') -" -``` -``` - -### 3.2 Modify Capture Command - -**commands/capture.md** (modify ~50 lines): -```markdown -### Step 2: Validate Namespace (MODIFIED) - -```bash -# Load namespaces from ontology registry -VALID_NS=$(python3 -c " -import sys -sys.path.insert(0, '$CLAUDE_PLUGIN_ROOT/lib') -from ontology_registry import OntologyRegistry -from pathlib import Path - -registry = OntologyRegistry() -registry.load_ontologies([ - Path('$CLAUDE_PLUGIN_ROOT/ontologies'), - Path.home() / '.claude' / 'mnemonic', - Path.cwd() / '.claude' / 'mnemonic' -]) -print(' '.join(registry.get_all_namespaces())) -") - -if ! echo "$VALID_NS" | grep -qw "$NAMESPACE"; then - echo "Error: Invalid namespace '$NAMESPACE'" - echo "Valid namespaces: $VALID_NS" - echo "" - echo "To add custom namespaces, create $MNEMONIC_ROOT/ontology.yaml" - exit 1 -fi -``` - -### Step 6b: Entity Type Validation (NEW) - -```bash -# If namespace is custom, check for entity type -IS_CUSTOM=$(python3 -c " -from lib.ontology_registry import OntologyRegistry -# ... check if namespace is custom and requires entity type -") - -if [ "$IS_CUSTOM" = "true" ] && [ -n "$ENTITY_TYPE" ]; then - # Get entity schema and validate required fields - ENTITY_SCHEMA=$(python3 -c " -from lib.ontology_registry import OntologyRegistry -# ... get entity type schema -") - - # Prompt for required entity fields - for FIELD in $REQUIRED_FIELDS; do - read -p "$FIELD: " VALUE - ENTITY_FIELDS="$ENTITY_FIELDS - $FIELD: $VALUE" - done -fi -``` - -### Step 7: Create Memory File (MODIFIED) - -Add ontology section to frontmatter: - -```yaml ---- -id: {UUID} -type: {TYPE} -namespace: {NAMESPACE}/{SCOPE} -created: {DATE} -title: "{TITLE}" - -# NEW: Ontology metadata (if custom namespace) -ontology: - id: {ONTOLOGY_ID} - entity_type: {ENTITY_TYPE} - entity_id: {ENTITY_ID} - -# NEW: Entity-specific fields (if entity type) -entity: -{ENTITY_FIELDS} - -tags: -{TAGS_YAML} ---- -``` -``` - -### 3.3 Create Discovery Agent - -**agents/ontology-discovery.md** (~250 lines): -```markdown ---- -description: Discover and suggest entities from memory content -model: haiku -allowed-tools: - - Bash - - Grep - - Read - - Write ---- - -# Ontology Discovery Agent - -Autonomous agent for discovering and suggesting entities from memory content. - -## Purpose - -Analyze memory content to identify potential entities based on ontology patterns. -Suggest entities to user for confirmation. Create entity memories when confirmed. - -## Workflow - -### 1. Load Discovery Patterns - -```bash -# Get patterns from active ontologies -PATTERNS=$(python3 -c " -from lib.ontology_registry import OntologyRegistry -from pathlib import Path -import json - -registry = OntologyRegistry() -registry.load_ontologies([ - Path('$CLAUDE_PLUGIN_ROOT/ontologies'), - Path.home() / '.claude' / 'mnemonic', - Path.cwd() / '.claude' / 'mnemonic' -]) - -patterns = {} -for ontology_id, ontology in registry._ontologies.items(): - if ontology.discovery.get('enabled'): - for pattern in ontology.discovery.get('patterns', []): - patterns[pattern['suggest_entity']] = pattern['content_pattern'] - -print(json.dumps(patterns)) -") -``` - -### 2. Scan Memory Content - -```bash -# For each pattern, search memories -for ENTITY_TYPE in $(echo $PATTERNS | jq -r 'keys[]'); do - PATTERN=$(echo $PATTERNS | jq -r ".[\"$ENTITY_TYPE\"]") - - # Find matches using ripgrep - MATCHES=$(rg -i "$PATTERN" ${MNEMONIC_ROOT}/ $MNEMONIC_ROOT/ \ - --glob "*.memory.md" -o | sort | uniq -c | sort -rn | head -10) - - echo "Potential $ENTITY_TYPE entities:" - echo "$MATCHES" -done -``` - -### 3. Suggest to User - -For each discovered entity with confidence above threshold: - -```markdown -**Entity Discovery Results** - -I found the following potential entities: - -| Entity | Type | Mentions | Confidence | -|--------|------|----------|------------| -| PostgreSQL | technology | 12 | 0.95 | -| Repository Pattern | pattern | 8 | 0.88 | -| Redis | technology | 5 | 0.75 | - -Would you like me to create entity memories for any of these? -Reply with entity names to confirm (e.g., "PostgreSQL, Repository Pattern") -``` - -### 4. Create Entity Memories - -When user confirms: - -```bash -# Create entity memory -/mnemonic:capture apis "$ENTITY_NAME" \ - --type semantic \ - --tags entity,$ENTITY_TYPE \ - --scope user -``` - -### 5. Update Source Memories with Links - -```bash -# Find memories mentioning the entity -MEMORIES=$(rg -l "$ENTITY_NAME" ${MNEMONIC_ROOT}/ --glob "*.memory.md") - -for MEMORY in $MEMORIES; do - # Add entity_links to frontmatter - # This is done by reading and rewriting the memory -done -``` - -## Trigger Conditions - -- Manual: `/mnemonic:ontology discover` -- Automatic: After session with 5+ new captures -- Scheduled: Weekly curation via memory-curator agent - -## Output - -Reports discovered entities and actions taken: - -```json -{ - "discovered": [ - {"entity": "PostgreSQL", "type": "technology", "mentions": 12, "action": "created"}, - {"entity": "Repository Pattern", "type": "pattern", "mentions": 8, "action": "linked"}, - {"entity": "Redis", "type": "technology", "mentions": 5, "action": "skipped"} - ], - "memories_updated": 15, - "new_entities_created": 2 -} -``` -``` - ---- - -## Phase 4: Documentation (Week 4-5) - -### 4.1 User Guide - -**docs/ontologies.md** (~800 lines): -- Introduction to custom ontologies -- Ontology definition format reference -- Step-by-step guide for creating ontologies -- Entity types and traits explained -- Discovery configuration -- Example ontologies for common domains -- Migration from hardcoded namespaces -- Troubleshooting guide - -### 4.2 Ontology Skill - -**skills/mnemonic-ontology/SKILL.md** (~300 lines): -- Trigger phrases -- Available operations -- Ontology management workflow -- Entity linking syntax -- Best practices - -### 4.3 Example Ontologies - -**ontologies/examples/software-engineering.yaml** (~150 lines): -```yaml -ontology: - id: software-engineering - version: "1.0.0" - description: "Software engineering domain ontology" - -namespaces: - architecture: - description: "System architecture decisions" - type_hint: semantic - - components: - description: "Software components and modules" - type_hint: semantic - - incidents: - description: "Production incidents" - type_hint: episodic - -entity_types: - - name: component - base: semantic - traits: [versioned, documented] - schema: - required: [name, responsibility] - properties: - name: {type: string} - responsibility: {type: string} - dependencies: {type: array} - interfaces: {type: array} - - - name: architectural-decision - base: semantic - traits: [dated, cited] - schema: - required: [decision, rationale] - properties: - decision: {type: string} - rationale: {type: string} - alternatives: {type: array} - consequences: {type: object} - -traits: - versioned: - fields: - version: {type: string} - changelog: {type: array} - - documented: - fields: - documentation_url: {type: string, format: uri} - - dated: - fields: - decision_date: {type: string, format: date} - - cited: - requires: [citations] - -relationships: - depends_on: - from: [component] - to: [component] - implements: - from: [component] - to: [architectural-decision] - -discovery: - enabled: true - patterns: - - content_pattern: "\\b(PostgreSQL|MySQL|Redis|MongoDB|Elasticsearch)\\b" - suggest_entity: technology - - content_pattern: "\\b(Factory|Singleton|Observer|Repository|Adapter)\\s+Pattern\\b" - suggest_entity: pattern - confidence_threshold: 0.8 -``` - ---- - -## Success Criteria - -- [ ] Custom namespaces work in capture command -- [ ] Entity types with traits validate correctly -- [ ] Entity linking syntax (`@[[entity]]`) resolves -- [ ] Discovery agent suggests entities from code/docs -- [ ] URL-referenced ontologies load and cache -- [ ] Existing memories continue to validate -- [ ] Performance: <100ms ontology load, <50ms entity resolution - -## Testing Plan - -1. **Unit Tests**: Registry, validator, resolver -2. **Integration Tests**: Full capture flow with custom ontology -3. **Fixture Ontologies**: Test YAML files in CI/CD -4. **Backward Compatibility**: Existing memories still valid -5. **Performance**: Benchmark with 1000+ memories - -## Risks and Mitigations - -| Risk | Mitigation | -|------|------------| -| Ontology conflicts | Clear precedence rules (project > user > base) | -| Schema complexity | Start simple, progressive disclosure | -| Discovery false positives | User confirmation required, confidence threshold | -| Performance degradation | Lazy loading, caching, ripgrep | diff --git a/docs/semantic-search.md b/docs/semantic-search.md index 1fc6aa0..40d9bdd 100644 --- a/docs/semantic-search.md +++ b/docs/semantic-search.md @@ -255,12 +255,12 @@ qmd query "database schema patterns" /mnemonic:recall --id 550e8400-e29b-41d4-a716-446655440000 ``` -### Enhanced Search Skill +### Enhanced Search -The `/mnemonic:search-enhanced` skill can optionally use qmd for initial search: +The `/mnemonic:search` skill includes enhanced iterative search with synthesis, which can use qmd for initial search: ```bash -/mnemonic:search-enhanced "comprehensive guide to our authentication system" +/mnemonic:search "comprehensive guide to our authentication system" ``` ## Troubleshooting @@ -337,5 +337,4 @@ qmd search "term" -c mnemonic-project - [@tobilu/qmd Documentation](https://github.com/tobil4sk/qmd) - [BM25 Algorithm](https://en.wikipedia.org/wiki/Okapi_BM25) - [Vector Embeddings Explained](https://platform.openai.com/docs/guides/embeddings) -- [Mnemonic Search Skill](../skills/mnemonic-search/SKILL.md) -- [Enhanced Search Skill](../skills/mnemonic-search-enhanced/SKILL.md) +- [Mnemonic Search Skill](../skills/search/SKILL.md) diff --git a/docs/tutorials/README.md b/docs/tutorials/README.md deleted file mode 100644 index 1f7c15d..0000000 --- a/docs/tutorials/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# Tutorials - -Step-by-step guides for learning Mnemonic. - -## Getting Started - -New to Mnemonic? Start here: - -1. **[First Project Setup](getting-started.md)** - Set up Mnemonic in your first project (15 min) - -## Intermediate - -Build your skills with additional tutorials (coming soon): - -- Creating Your First Memory - Capture and recall memories -- Understanding Memory Types - Learn semantic, episodic, and procedural memories -- Building a Knowledge Base - Create a project knowledge base -- Custom Ontologies - Define domain-specific entities and relationships -- Multi-Project Workflows - Share memories across projects - -## Advanced - -Master Mnemonic with advanced tutorials (coming soon): - -- Agent Coordination - Use the blackboard for complex workflows -- Memory Maintenance - Curate and optimize your memory system -- Custom Skills - Extend Mnemonic with custom skills - -## Quick Reference - -- [CLI Cheat Sheet](../cli-usage.md) -- [API Reference](../api-reference.md) -- [Troubleshooting](../troubleshooting.md) - -## Learning Path - -### For Developers - -**Goal:** Build project documentation memory system - -1. First Project Setup -2. Additional tutorials coming soon - -**Time:** ~15 min (currently available) - -### For Teams - -**Goal:** Shared organizational memory across projects - -1. First Project Setup -2. Additional tutorials coming soon - -**Time:** ~15 min (currently available) - -### For Power Users - -**Goal:** Full system customization and extension - -1. First Project Setup + review architecture docs -2. Additional tutorials coming soon - -**Time:** ~30 min (currently available) - -## Tutorial Format - -Each tutorial follows this structure: - -1. **Learning Objectives** - What you'll learn -2. **Prerequisites** - What you need to know -3. **Time Required** - Estimated completion time -4. **Step-by-Step Instructions** - Hands-on exercises -5. **Verification** - Check your work -6. **Next Steps** - Where to go next - -## Contributing Tutorials - -See [CONTRIBUTING.md](../../CONTRIBUTING.md) for guidelines on adding tutorials. diff --git a/docs/validation.md b/docs/validation.md index 1675439..8471597 100644 --- a/docs/validation.md +++ b/docs/validation.md @@ -253,4 +253,4 @@ If frontmatter fails to parse: ## Schema Source -The validation rules are parsed from `skills/mnemonic-format/SKILL.md`, ensuring a single source of truth between documentation and validation (see ADR-004). +The validation rules are parsed from `skills/format/SKILL.md`, ensuring a single source of truth between documentation and validation (see ADR-004). diff --git a/lib/README.md b/lib/README.md deleted file mode 100644 index 7ea0129..0000000 --- a/lib/README.md +++ /dev/null @@ -1,572 +0,0 @@ -# Mnemonic Library Modules - -Shared Python utilities for the mnemonic memory system. - -## Overview - -The `lib/` directory contains core utilities used across mnemonic's hooks, commands, and tools. This README focuses on the **path resolution** module. For comprehensive documentation of all library modules, see: - -📚 **[Complete Library Reference](../docs/library-reference.md)** - -Includes detailed API documentation for: -- **paths.py** - Path resolution (this file) -- **config.py** - Configuration management -- **memory_reader.py** - Memory file parsing -- **search.py** - Memory search and ranking -- **relationships.py** - Relationship types and linking -- **ontology.py** - Custom ontology support - ---- - -# Path Resolution Library - -Centralized path resolution for all mnemonic memory operations. - -## Overview - -This library provides a single source of truth for path construction in the mnemonic memory system. It eliminates scattered path logic across 30+ files and enables smooth migration between different path schemes. - -## Key Features - -- **Single Source of Truth**: All path construction in one place -- **Multiple Scheme Support**: LEGACY and V2 path structures -- **Testable**: Dependency injection for isolated testing -- **Type Safe**: Full Python type hints -- **Well Documented**: Comprehensive docstrings and examples - -## Quick Start - -### Basic Usage - -```python -from lib.paths import PathResolver, Scope - -# Create resolver (auto-detects context) -resolver = PathResolver() - -# Get memory directory -memory_dir = resolver.get_memory_dir("_semantic/decisions", Scope.PROJECT) -# => /path/to/project/.claude/mnemonic/_semantic/decisions - -# Get full memory path -memory_path = resolver.get_memory_path( - "_semantic/decisions", - "slug.memory.md", - Scope.PROJECT -) - -# Get search paths (returns list in priority order) -search_paths = resolver.get_search_paths("_semantic/decisions") -# => [project_path, org_path, default_path] - -# Get blackboard directory -blackboard = resolver.get_blackboard_dir(Scope.PROJECT) -``` - -### Convenience Functions - -For simple use cases, use convenience functions: - -```python -from lib.paths import get_memory_dir, get_search_paths, get_blackboard_dir - -# Get memory directory (string scope) -memory_dir = get_memory_dir("_semantic/decisions", scope="project") - -# Get search paths -paths = get_search_paths("_semantic/decisions", include_user=True, include_project=True) - -# Get blackboard -blackboard = get_blackboard_dir(scope="project") -``` - -## Architecture - -### PathResolver - -Central class that computes paths based on context and scheme. - -**Key Methods:** - -- `get_memory_dir(namespace, scope)` - Directory for storing memories -- `get_memory_path(namespace, filename, scope)` - Full file path -- `get_search_paths(namespace, filters)` - Ordered search paths -- `get_blackboard_dir(scope)` - Blackboard directory -- `get_ontology_paths()` - Ontology files in precedence order -- `get_all_memory_roots()` - All memory root directories - -### PathContext - -Dataclass holding environment context: - -```python -@dataclass -class PathContext: - org: str # Organization (from git remote) - project: str # Project name (from git remote) - home_dir: Path # User home directory - project_dir: Path # Current project directory - scheme: PathScheme # Path scheme to use -``` - -Auto-detection: - -```python -# Auto-detect context -context = PathContext.detect() - -# Or specify scheme -context = PathContext.detect(scheme=PathScheme.V2) -``` - -### PathScheme - -Enum defining supported path schemes: - -- `LEGACY` - Current dual-location structure -- `V2` - Target unified structure - -### Scope - -Enum defining memory scope: - -- `USER` - Cross-project memories -- `PROJECT` - Project-specific memories -- `ORG` - Organization-wide memories (V2 only) - -## Path Schemes - -### LEGACY Scheme (Current) - -**User memories**: -``` -${MNEMONIC_ROOT}/{org}/{namespace}/ -``` - -**Project memories**: -``` -./.claude/mnemonic/{namespace}/ -``` - -**Example**: -``` -${MNEMONIC_ROOT}/myorg/_semantic/decisions/ -./.claude/mnemonic/_semantic/decisions/ -``` - -### V2 Scheme (Target) - -**Project memories**: -``` -${MNEMONIC_ROOT}/{org}/{project}/{namespace}/ -``` - -**Org-wide memories**: -``` -${MNEMONIC_ROOT}/{org}/{namespace}/ -``` - -**Example**: -``` -${MNEMONIC_ROOT}/myorg/myproject/_semantic/decisions/ -${MNEMONIC_ROOT}/myorg/_semantic/decisions/ -``` - -## Testing - -### Unit Tests - -Create isolated test contexts: - -```python -import pytest -from pathlib import Path -from lib.paths import PathResolver, PathContext, PathScheme, Scope - -@pytest.fixture -def test_resolver(tmp_path): - """Create test resolver with isolated paths.""" - context = PathContext( - org="testorg", - project="testproject", - home_dir=tmp_path / "home", - project_dir=tmp_path / "project", - scheme=PathScheme.LEGACY, - ) - return PathResolver(context) - -def test_memory_operations(test_resolver, tmp_path): - """Test with isolated file system.""" - memory_dir = test_resolver.get_memory_dir("_semantic/decisions", Scope.PROJECT) - memory_dir.mkdir(parents=True) - - # Test operations... - assert memory_dir.exists() -``` - -### Integration Tests - -Test with both schemes: - -```python -@pytest.fixture(params=[PathScheme.LEGACY, PathScheme.V2]) -def resolver_both_schemes(request, tmp_path): - """Test with both path schemes.""" - context = PathContext( - org="testorg", - project="testproject", - home_dir=tmp_path / "home", - project_dir=tmp_path / "project", - scheme=request.param, - ) - return PathResolver(context) - -def test_path_resolution(resolver_both_schemes): - """Test that works with both schemes.""" - memory_dir = resolver_both_schemes.get_memory_dir("semantic", Scope.PROJECT) - # Assertions... -``` - -## Integration Examples - -### Hooks - -```python -from lib.paths import PathResolver - -def count_memories(resolver: PathResolver) -> dict: - """Count memories using resolver.""" - counts = {} - - for root in resolver.get_all_memory_roots(): - for memory_file in root.rglob("*.memory.md"): - # Count logic... - pass - - return counts - -def main(): - resolver = PathResolver() - counts = count_memories(resolver) - print(f"Total: {sum(counts.values())}") -``` - -### Commands - -```python -from lib.paths import PathResolver, Scope - -def capture_memory(namespace: str, title: str, scope: str = "project"): - """Capture a new memory.""" - resolver = PathResolver() - scope_enum = Scope.PROJECT if scope == "project" else Scope.USER - - # Get memory directory - memory_dir = resolver.get_memory_dir(namespace, scope_enum) - memory_dir.mkdir(parents=True, exist_ok=True) - - # Create memory file - memory_path = resolver.get_memory_path( - namespace, - f"{slug}.memory.md", - scope_enum - ) - - # Write content... -``` - -### Ontology System - -```python -from lib.paths import PathResolver - -class OntologyRegistry: - def __init__(self, resolver: PathResolver = None): - self.resolver = resolver or PathResolver() - - def load_ontologies(self): - """Load all ontologies in precedence order.""" - for ontology_path in self.resolver.get_ontology_paths(): - if ontology_path.exists(): - yield self._load_ontology_file(ontology_path) -``` - -## Dependency Injection - -Components should accept resolver as optional parameter: - -```python -from lib.paths import PathResolver - -class MemoryManager: - def __init__(self, resolver: PathResolver = None): - """Initialize with optional resolver (for testing).""" - self.resolver = resolver or PathResolver() - - def save_memory(self, namespace: str, content: str): - memory_dir = self.resolver.get_memory_dir(namespace) - # Save logic... -``` - -This enables easy testing: - -```python -def test_memory_manager(test_resolver): - """Test with isolated paths.""" - manager = MemoryManager(resolver=test_resolver) - manager.save_memory("_semantic/decisions", "test") - # Assertions... -``` - -## Migration - -### Analyzing Current Structure - -```python -from lib.paths import PathResolver, PathScheme, PathContext - -# Get legacy paths -legacy_resolver = PathResolver() # defaults to LEGACY -legacy_roots = legacy_resolver.get_all_memory_roots() - -# Get V2 paths -v2_context = PathContext.detect(scheme=PathScheme.V2) -v2_resolver = PathResolver(v2_context) -v2_root = v2_resolver.get_all_memory_roots()[0] - -print(f"Migrating from {len(legacy_roots)} roots to {v2_root}") -``` - -### Migration Script - -See `scripts/migrate_to_v2_paths.py` for complete example: - -```python -# Run migration -python scripts/migrate_to_v2_paths.py --dry-run # preview -python scripts/migrate_to_v2_paths.py # execute - -# Rollback if needed -python scripts/migrate_to_v2_paths.py --rollback /path/to/backup -``` - -## Performance - -### Caching - -For hot paths, add caching: - -```python -from functools import lru_cache - -class PathResolver: - @lru_cache(maxsize=128) - def get_memory_dir(self, namespace: str, scope: Scope) -> Path: - # Implementation... -``` - -### Lazy Evaluation - -Don't create resolvers at module level: - -```python -# BAD - creates on import -_resolver = PathResolver() - -# GOOD - create when needed -def get_resolver() -> PathResolver: - return PathResolver() -``` - -## Design Principles - -### 1. Pure Functions - -Path resolution is pure computation - no I/O operations: - -```python -# Resolver just computes paths -path = resolver.get_memory_dir("semantic") # No mkdir - -# Caller handles I/O -path.mkdir(parents=True, exist_ok=True) -``` - -### 2. Explicit Over Implicit - -Be explicit about scope and scheme: - -```python -# Clear and explicit -resolver.get_memory_dir("semantic", Scope.PROJECT) - -# Not implicit defaults -resolver.get_memory_dir("semantic") # would need default -``` - -### 3. Fail Fast - -Invalid inputs should raise early: - -```python -# Type system catches errors -resolver.get_memory_dir("semantic", "invalid") # Type error! -resolver.get_memory_dir("semantic", Scope.PROJECT) # OK -``` - -### 4. Testability First - -Design for testing with dependency injection: - -```python -class Component: - def __init__(self, resolver: PathResolver = None): - self.resolver = resolver or PathResolver() -``` - -## Common Patterns - -### Pattern: Search Across All Scopes - -```python -# Get all search paths in priority order -search_paths = resolver.get_search_paths( - namespace="_semantic/decisions", - include_user=True, - include_project=True, - include_org=True # V2 only -) - -# Search with ripgrep -for path in search_paths: - subprocess.run(["rg", pattern, str(path)]) -``` - -### Pattern: Create Memory - -```python -def create_memory(namespace: str, content: str, scope: Scope): - resolver = PathResolver() - - # Get directory and create if needed - memory_dir = resolver.get_memory_dir(namespace, scope) - memory_dir.mkdir(parents=True, exist_ok=True) - - # Get full path - filename = f"{slug}.memory.md" - memory_path = resolver.get_memory_path(namespace, filename, scope) - - # Write content - memory_path.write_text(content) -``` - -### Pattern: Load Ontology - -```python -def load_ontology(): - resolver = PathResolver() - - # Try paths in precedence order - for ontology_path in resolver.get_ontology_paths(): - if ontology_path.exists(): - return yaml.safe_load(ontology_path.read_text()) - - # Use default - return get_default_ontology() -``` - -### Pattern: Health Check - -```python -def health_check(): - resolver = PathResolver() - stats = {"total": 0, "by_root": {}} - - for root in resolver.get_all_memory_roots(): - count = len(list(root.rglob("*.memory.md"))) - stats["total"] += count - stats["by_root"][str(root)] = count - - return stats -``` - -## Troubleshooting - -### Import Errors - -Add lib to Python path: - -```python -import sys -from pathlib import Path - -# Add lib directory to path -lib_dir = Path(__file__).parent.parent / "lib" -sys.path.insert(0, str(lib_dir)) - -from lib.paths import PathResolver -``` - -### Path Not Found - -Resolver computes paths, doesn't check existence: - -```python -# This always succeeds (just computation) -path = resolver.get_memory_dir("semantic") - -# Check existence when needed -if not path.exists(): - path.mkdir(parents=True) -``` - -### Wrong Scheme - -Explicitly specify scheme if auto-detection wrong: - -```python -from lib.paths import PathContext, PathScheme - -context = PathContext.detect(scheme=PathScheme.V2) -resolver = PathResolver(context) -``` - -## API Reference - -See inline docstrings in `lib/paths.py` for complete API documentation. - -### PathResolver Methods - -- `get_memory_dir(namespace, scope)` - Memory directory path -- `get_memory_path(namespace, filename, scope)` - Full memory file path -- `get_search_paths(namespace, filters)` - Search paths in priority order -- `get_blackboard_dir(scope)` - Blackboard directory -- `get_ontology_paths()` - Ontology paths in precedence order -- `get_all_memory_roots()` - All memory root directories - -### Convenience Functions - -- `get_default_resolver()` - Get resolver with auto-detected context -- `get_memory_dir(namespace, scope)` - Shortcut for get_memory_dir -- `get_search_paths(namespace, filters)` - Shortcut for get_search_paths -- `get_blackboard_dir(scope)` - Shortcut for get_blackboard_dir - -## Related Documentation - -- [ADR-009: Unified Path Resolution](../docs/adrs/adr-009-unified-path-resolution.md) - Architecture decision -- [Integration Guide](../docs/architecture/path-resolution-integration.md) - Component integration -- [Migration Script](../scripts/migrate_to_v2_paths.py) - V2 migration tool -- [Unit Tests](../tests/unit/test_paths.py) - Test examples - -## Contributing - -When adding new path-related functionality: - -1. Add method to `PathResolver` class -2. Add unit tests for new method -3. Update this README with examples -4. Document in ADR if significant change - -## License - -MIT - Same as mnemonic project diff --git a/lib/__init__.py b/lib/__init__.py index 58e2bbf..afe9ed9 100644 --- a/lib/__init__.py +++ b/lib/__init__.py @@ -1,138 +1 @@ -""" -Mnemonic Library Package - -Core utilities and shared libraries for the mnemonic memory system. -""" - -# Make paths module easily importable -from .memory_reader import ( - get_memory_metadata, - get_memory_summary, -) -from .ontology import ( - get_fallback_content_patterns, - get_fallback_file_patterns, - get_ontology_file, - get_ontology_info, - load_content_patterns, - load_file_patterns, - load_ontology_data, - load_ontology_namespaces, - validate_memory_against_ontology, -) -from .paths import ( - PathContext, - PathResolver, - PathScheme, - Scope, - get_all_memory_roots_with_legacy, - get_blackboard_dir, - get_default_resolver, - get_handoff_dir, - get_memory_dir, - get_search_paths, - get_session_blackboard_dir, - get_v2_resolver, - migrate_blackboard_to_session_scoped, -) -from .relationships import ( - RECIPROCAL_TYPES, - REL_DERIVED_FROM, - REL_RELATES_TO, - REL_SUPERSEDES, - RELATIONSHIP_TYPES, - add_bidirectional_relationship, - add_relationship, - get_all_valid_types, - get_inverse, - is_symmetric, - is_valid_type, - to_pascal, - to_snake, -) -from .search import ( - SCORE_CONTENT_KEYWORD, - SCORE_MIN_THRESHOLD, - SCORE_NAMESPACE_EXACT, - SCORE_NAMESPACE_TYPE, - SCORE_TAG_OVERLAP, - SCORE_TITLE_KEYWORD, - detect_file_context, - detect_namespace_for_file, - extract_keywords_from_path, - extract_topic, - find_duplicates, - find_memories_for_context, - find_related_memories, - find_related_memories_scored, - infer_relationship_type, - search_memories, -) - -__all__ = [ - # Core classes - "PathResolver", - "PathContext", - "PathScheme", - "Scope", - # Path convenience functions - "get_default_resolver", - "get_memory_dir", - "get_search_paths", - "get_blackboard_dir", - "get_session_blackboard_dir", - "get_handoff_dir", - "get_v2_resolver", - "get_all_memory_roots_with_legacy", - "migrate_blackboard_to_session_scoped", - # Ontology functions - "get_ontology_file", - "load_ontology_data", - "load_file_patterns", - "load_content_patterns", - "load_ontology_namespaces", - "get_fallback_file_patterns", - "get_fallback_content_patterns", - "get_ontology_info", - "validate_memory_against_ontology", - # Search functions - "search_memories", - "find_related_memories", - "find_related_memories_scored", - "find_memories_for_context", - "find_duplicates", - "detect_file_context", - "detect_namespace_for_file", - "extract_keywords_from_path", - "extract_topic", - "infer_relationship_type", - # Relationship type constants - "REL_RELATES_TO", - "REL_SUPERSEDES", - "REL_DERIVED_FROM", - # Scoring weight constants - "SCORE_NAMESPACE_TYPE", - "SCORE_NAMESPACE_EXACT", - "SCORE_TAG_OVERLAP", - "SCORE_TITLE_KEYWORD", - "SCORE_CONTENT_KEYWORD", - "SCORE_MIN_THRESHOLD", - # Memory reader functions - "get_memory_summary", - "get_memory_metadata", - # Relationship type registry - "RELATIONSHIP_TYPES", - "RECIPROCAL_TYPES", - # Relationship writer functions - "add_relationship", - "add_bidirectional_relationship", - # Relationship type helpers - "to_pascal", - "to_snake", - "get_inverse", - "is_valid_type", - "is_symmetric", - "get_all_valid_types", -] - -__version__ = "1.1.0" +"""Mnemonic core library modules.""" diff --git a/reports/README.md b/reports/README.md deleted file mode 100644 index 05b506d..0000000 --- a/reports/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Research Index - -All market research conducted for the mnemonic project. - -| Topic | Status | Created | Last Updated | Summary | -|-------|--------|---------|--------------|---------| -| [AI Memory Systems with Filesystem-Based Interfaces](./ai-memory-filesystem-research/) | complete | 2026-01-24 | 2026-01-24 | Academic validation and competitive analysis of filesystem-based AI memory approaches | - -## Quick Links - -### Completed Research - -- [AI Memory Systems Research](./ai-memory-filesystem-research/) - Comprehensive analysis validating filesystem-based memory approaches, MCP ecosystem trends, cognitive science foundations, and competitive landscape - ---- - -*Generated by [sigint](https://github.com/zircote/sigint)* diff --git a/reports/ai-memory-filesystem-research/2026-01-24-executive-summary.md b/reports/ai-memory-filesystem-research/2026-01-24-executive-summary.md deleted file mode 100644 index 977413e..0000000 --- a/reports/ai-memory-filesystem-research/2026-01-24-executive-summary.md +++ /dev/null @@ -1,102 +0,0 @@ -# AI Memory Systems: Executive Brief -## Strategic Assessment for Mnemonic - -**Date**: 2026-01-24 | **Classification**: Strategic Planning | **Audience**: Executive Leadership - ---- - -## The Opportunity - -The AI agents market will grow from **$5.25B (2024) to $52.62B (2030)** at 46.3% CAGR. Persistent memory is now **table stakes** for AI assistants. Mnemonic is positioned to capture the underserved "simple + private" market segment. - ---- - -## Key Findings - -| Finding | Implication | -|---------|-------------| -| **Filesystem beats vector databases**: Letta benchmark shows 74.0% vs 68.5% accuracy | Mnemonic's approach is validated empirically | -| **GitHub Copilot validates approach**: 7% PR merge improvement with citation-based memory | Industry leader confirms mnemonic's design direction | -| **Market gap exists**: Cursor/Windsurf lack native memory; Mem0/Zep deprecated community editions | Clear opportunity for simple, private solution | -| **Simplicity correlates with reliability**: LLMs perform better with familiar filesystem tools | Complexity is liability, not feature | - ---- - -## Competitive Position - -``` - Simple <----------------> Complex - | | - Private/Local [MNEMONIC] [Mem0] - | | | - | [Basic Memory] [Zep Cloud] - | | | - Cloud/Hosted [Copilot Memory] [LangChain Memory] -``` - -**Mnemonic owns the "Simple + Private" quadrant** - underserved by market leaders focused on complex cloud solutions. - ---- - -## Strategic Recommendation - -**Pursue organic growth through filesystem simplicity.** - -| Factor | Assessment | -|--------|------------| -| Investment Required | LOW - Documentation and community engagement | -| Timeline to Validation | 6-12 months | -| Risk Level | LOW | -| Success Probability | 60% (Niche Success scenario) | - -AI assistants with Bash access can use mnemonic immediately. No protocol integration required. - ---- - -## Differentiation - -| Mnemonic Advantage | Why It Matters | -|--------------------|----------------| -| Zero dependencies | No databases, cloud, or accounts | -| Git integration | Full audit trail; offline; conflict resolution | -| Human-readable | Developers inspect/edit memories directly | -| POSIX composable | Works with any Unix tool | -| Benchmark validated | Empirical proof of superiority | - ---- - -## Risk Assessment - -| Risk | Likelihood | Impact | Mitigation | -|------|------------|--------|------------| -| AI assistants build native memory | Medium | High | Emphasize portability | -| Scale limitations | Medium | Medium | Performance benchmarking | -| Protocol dominance (MCP) | Low | Medium | Filesystem always works | - ---- - -## Key Metrics to Track - -- GitHub stars growth (target: 1K+ in 12 months) -- Memory Bank community migration rate -- Enterprise pilot opportunities -- AI assistant native memory announcements - ---- - -## Decision Required - -**Approve organic growth strategy** focused on: -1. Documentation and integration guides (DONE) -2. Community engagement with Memory Bank users (DONE) -3. Enterprise positioning around data sovereignty (DONE) - -**Investment**: Minimal (documentation effort) -**Timeline**: Already underway -**Next Review**: Q2 2026 - ---- - -*Full report available: [2026-01-24-report.md](./2026-01-24-report.md)* - -*Generated by sigint market research agent | 2026-01-24* diff --git a/reports/ai-memory-filesystem-research/2026-01-24-report-metadata.json b/reports/ai-memory-filesystem-research/2026-01-24-report-metadata.json deleted file mode 100644 index f6dfa8e..0000000 --- a/reports/ai-memory-filesystem-research/2026-01-24-report-metadata.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "report_id": "ai-memory-filesystem-research-2026-01-24", - "research_id": "ai-memory-filesystem-research", - "generated": "2026-01-24T15:30:00Z", - "version": "1.0", - "status": "final", - "formats": { - "markdown": { - "file": "2026-01-24-report.md", - "generated": true - }, - "html": { - "file": "2026-01-24-report.html", - "generated": true - }, - "executive_brief": { - "file": "2026-01-24-executive-summary.md", - "generated": true - } - }, - "sections": { - "executive_summary": true, - "market_overview": true, - "market_sizing": true, - "competitive_landscape": true, - "trend_analysis": { - "macro": true, - "micro": true, - "transitional_scenarios": true, - "terminal_scenarios": true - }, - "swot_analysis": true, - "recommendations": true, - "risk_assessment": true, - "appendix": true - }, - "visualizations": { - "mermaid_charts": [ - "pie: AI Memory Market Segments", - "pie: Market Sizing Breakdown", - "quadrantChart: Competitive Positioning", - "stateDiagram: Transitional Scenarios", - "quadrantChart: Scenario Trade-offs", - "quadrantChart: SWOT Analysis Overview", - "quadrantChart: Risk Assessment Matrix" - ], - "total_count": 7 - }, - "audience_tailoring": { - "executives": { - "included": true, - "section": "Decision Support - For Executives" - }, - "product_managers": { - "included": true, - "section": "Decision Support - For Product Managers" - }, - "investors": { - "included": true, - "section": "Decision Support - For Investors" - }, - "developers": { - "included": true, - "section": "Decision Support - For Developers" - } - }, - "elicitation_alignment": { - "decision_context": "Academic validation, strategic planning, and feature roadmap for mnemonic", - "hypotheses_validated": true, - "anti_patterns_avoided": true, - "success_criteria_addressed": true - }, - "quality_checks": { - "executive_summary_captures_key_points": true, - "claims_have_cited_sources": true, - "numbers_consistent": true, - "diagrams_render": true, - "recommendations_actionable": true, - "risks_addressed": true, - "audience_appropriate_language": true - }, - "findings_count": 18, - "sources_count": 12, - "recommendations_count": 5, - "risks_identified": 7, - "word_count_estimate": 5500 -} diff --git a/reports/ai-memory-filesystem-research/2026-01-24-report.html b/reports/ai-memory-filesystem-research/2026-01-24-report.html deleted file mode 100644 index 79bbe12..0000000 --- a/reports/ai-memory-filesystem-research/2026-01-24-report.html +++ /dev/null @@ -1,1303 +0,0 @@ - - - - - - AI Memory Systems with Filesystem-Based Interfaces - Market Research Report - - - - -

-

AI Memory Systems with Filesystem-Based Interfaces

-

Comprehensive Market Research Report

- -
- - - -
-

Research Brief Alignment

-

This report addresses the decision context of academic validation, strategic planning, and feature roadmap for mnemonic. All recommendations preserve filesystem simplicity. MCP integration is explicitly out of scope per project decision.

-
- -
-

1. Executive Summary

- -
-

Key Findings

- -
-
1
-
-

Filesystem approaches outperform specialized tools

-

Letta's LoCoMo benchmark demonstrates filesystem-based memory achieves 74.0% accuracy compared to Mem0's graph-based approach at 68.5%.

-
-
- -
-
2
-
-

Unix philosophy is academically validated for AI

-

A recent arxiv paper ("From Everything is a File to Files Are All You Need") explicitly validates Unix's "everything is a file" principle for modern agentic AI design.

-
-
- -
-
3
-
-

Market gap in simple, private memory

-

While MCP-based solutions grow in complexity (97M+ monthly SDK downloads), mnemonic occupies a unique position: zero dependencies, full data sovereignty, human-readable format.

-
-
- -
-
4
-
-

Industry validation from GitHub

-

Copilot's agentic memory system (public preview Jan 15, 2026) demonstrates 7% PR merge rate improvement using citation-based validation.

-
-
- -
-
5
-
-

Agentic memory is now table stakes

-

VentureBeats 2026 predictions identify persistent memory as essential capability for AI assistants.

-
-
-
- -

Primary Strategic Recommendation

-
-

Pursue organic growth through filesystem simplicity. AI assistants with native Bash/filesystem access (Claude Code, Cursor, Windsurf, Copilot) can use mnemonic directly without protocol overhead. This approach is validated by Letta's benchmark finding that LLMs perform better with familiar tools.

-
- -

Market Opportunity Statement

-

The AI memory systems market represents a $52.62B opportunity by 2030 (46.3% CAGR), with mnemonic positioned to capture the underserved "simple + private/local" segment that enterprise and privacy-conscious developers increasingly demand.

-
- -
-

2. Market Overview

- -

Market Definition and Boundaries

-

The AI memory systems market encompasses technologies enabling persistent context and knowledge retention for AI agents and coding assistants, including:

-
    -
  • Memory infrastructure: Storage, retrieval, and management of AI agent memories
  • -
  • Context engineering: Tools for managing and optimizing context windows
  • -
  • Knowledge management for AI: Structured knowledge bases accessible to AI systems
  • -
- -

Total Market Size

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Market Segment2024 Size2030 ProjectionCAGR
AI Agents Market$5.25B$52.62B46.3%
Knowledge Management$773.6B$3.5T (2034)16.3%
Multi-Agent SystemsFastest growing segment
- -

Key Segments and Characteristics

-
-
-pie title AI Memory Market Segments - "Enterprise AI Assistants" : 35 - "Individual Developers" : 30 - "Open Source Projects" : 20 - "Multi-Agent Systems" : 15 -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SegmentCharacteristicsKey Needs
Enterprise AI AssistantsCompliance-driven, security-focusedAudit trails, data sovereignty, offline access
Individual DevelopersValue simplicity, portabilityEasy setup, no vendor lock-in, human-readable
Open Source ProjectsVendor-neutral requirementsSelf-hosted, transparent, community-driven
Multi-Agent SystemsCoordination-focusedShared memory, cross-agent communication
- -

Market Maturity Stage

-

Early Growth Phase: The market is transitioning from experimental to production deployments. GitHub Copilot's public preview of agentic memory (Jan 2026) signals mainstream adoption is imminent.

-
- -
-

3. Market Sizing (TAM/SAM/SOM)

- -

Total Addressable Market (TAM)

-

$52.62B by 2030 - Global AI agents market

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MetricValueTrend
2024 Market Size$5.25B-
2030 Projection$52.62BINC
CAGR46.3%INC
Growth DriverMulti-agent systems, enterprise adoptionINC
- -

Serviceable Addressable Market (SAM)

-

$8B by 2030 - Developer tools and AI coding assistant memory segment

- - - - - - - - - - - - - - - - - - - - - - - - - -
MetricValueTrend
Target SegmentAI coding assistants + developer knowledge toolsINC
Geographic ConstraintsGlobal (English-first documentation)CONST
Estimated SAM~15% of TAMINC
- -

Serviceable Obtainable Market (SOM)

-

$50M-100M by 2028 - Privacy-focused, filesystem-based memory solutions

- - - - - - - - - - - - - - - - - - - - - - - - - -
MetricValueTrend
Realistic Market Share0.5-1% of SAMINC
Timeline24-36 months-
Growth MechanismOrganic community adoption, enterprise pilotsINC
- -
-
-pie title Market Sizing Breakdown - "TAM (Global AI Agents)" : 100 - "SAM (Dev Tools)" : 15 - "SOM (Filesystem-based)" : 2 -
-
-
- -
-

4. Competitive Landscape

- -

Competitor Matrix

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CompanyMarket ShareStrengthsWeaknessesTrend
Mem025%26% accuracy claims; temporal graph; fundingComplex; cloud-dependent; CE deprecatedCONST
Zep20%LangChain integration; session managementCloud-focused; CE deprecatedDEC
LangChain Memory30%Framework integration; flexibilityRequires external DBs; complexCONST
GitHub Copilot Memory15%Native integration; citation validationCopilot-only; cloud; 28-day expiryINC
Filesystem Solutions10%Simple; private; git-integratedLimited awareness; fragmentedINC
- -

Porter's 5 Forces Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ForceLevelAnalysis
Competitive RivalryMediumFragmented market; open source reduces barriers
Supplier PowerLowCommodity infrastructure (filesystems, git)
Buyer PowerHighEasy switching; low costs for simple solutions
Threat of SubstitutionMediumNative AI memory features could substitute
Threat of New EntryHighLow barriers; any developer can build
- -

Competitive Positioning Map

-
-
-quadrantChart - title Competitive Positioning: Simplicity vs Privacy - x-axis Simple --> Complex - y-axis Cloud/Hosted --> Private/Local - quadrant-1 Complex + Private - quadrant-2 Simple + Private - quadrant-3 Simple + Cloud - quadrant-4 Complex + Cloud - Mnemonic: [0.15, 0.9] - Basic Memory: [0.3, 0.7] - Memory Bank: [0.2, 0.8] - Copilot Memory: [0.4, 0.2] - Mem0: [0.8, 0.25] - Zep: [0.75, 0.15] - LangChain: [0.7, 0.5] -
-
- -

Competitive Position Summary

-
Simple <----------------> Complex - | | - Private/Local [MNEMONIC] [Mem0] - | | | - | [Basic Memory] [Zep Cloud] - | | | - Cloud/Hosted [Copilot Memory] [LangChain Memory]
-

Mnemonic's Position: Occupies the "Simple + Private" quadrant - currently underserved by major players who focus on complex cloud solutions.

-
- -
-

5. Trend Analysis

- -

Macro Trends

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TrendDirectionEvidenceImpact on Mnemonic
Agentic AI maturationINCMulti-agent protocols (MCP, ACP, A2A, ANP)Opportunity for multi-agent coordination
Context engineering emergenceINCAnthropic's context engineering guideValidates context management importance
Privacy and data sovereigntyINCEnterprise concerns about cloud AIPositions mnemonic as compliant solution
Agentic memory as table stakesINCVentureBeats 2026 predictionsValidates market timing
Native tool proficiencyINCLetta benchmark findingsConfirms filesystem approach superiority
- -

Micro Trends

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TrendDirectionEvidenceTimeframe
Vector DB fatigueINCLetta benchmark; complexity complaints6-12 months
Citation-based validationINC++GitHub Copilot public previewProduction-ready
Filesystem-based AI toolsINCArxiv paper; Letta research12 months
Context compressionINC6:1 compression at 90% fidelity6-12 months
Cognitive memory modelsCONSTAlready adopted; stabilizingOngoing
Cloud-only solutionsDECPrivacy concerns; data sovereignty12-24 months
- -

Transitional Scenario Graph

-
-
-stateDiagram-v2 - [*] --> CurrentState: Mnemonic v1.0 - - CurrentState --> OrganicGrowth: Community adoption (60%) - CurrentState --> EnterpriseAdoption: Data sovereignty appeal (25%) - CurrentState --> Stagnation: No marketing effort (5%) - - OrganicGrowth --> NicheSuccess: Memory Bank migration - OrganicGrowth --> PlatformPlay: Multi-agent features - - EnterpriseAdoption --> PlatformPlay: Team features - EnterpriseAdoption --> NicheSuccess: Compliance focus - - NicheSuccess --> SteadyState: Sustainable OSS - PlatformPlay --> MarketLeader: Cross-tool dominance - - Stagnation --> Obsolete: Market moves on - - SteadyState --> [*]: Niche success - MarketLeader --> [*]: Market leadership - Obsolete --> [*]: Project archived -
-
- -

Terminal Scenarios

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ScenarioProbabilityPathTrade-offs
Niche Success60%Organic growth -> Steady communityLimited scale but sustainable
Platform Play10%Multi-agent + Enterprise -> Market leaderRequires significant investment
Enterprise Adoption25%Data sovereignty focus -> Compliance nicheMay limit developer appeal
Stagnation5%No action -> Obsolescence-
-
- -
-

6. SWOT Analysis

- -
-
-

Strengths

-
    -
  • Benchmark validation: 74.0% vs 68.5% on LoCoMo
  • -
  • Zero dependencies: No databases, cloud, accounts
  • -
  • Git integration: Version history, conflict resolution
  • -
  • Human readability: Markdown + YAML frontmatter
  • -
  • POSIX composability: Works with any Unix tool
  • -
  • Cognitive types: Academically grounded
  • -
-
- -
-

Weaknesses

-
    -
  • Scale untested: Unknown at 10K+ files
  • -
  • Limited awareness: Low adoption
  • -
  • No cloud offering: Enterprise friction
  • -
  • Single maintainer: Bus factor risk
  • -
-
- -
-

Opportunities

-
    -
  • Market gap: Simple + private underserved
  • -
  • Memory Bank migration: Cursor/Windsurf users
  • -
  • GitHub validation: Citation approach confirmed
  • -
  • Enterprise sovereignty: Privacy regulations
  • -
  • Multi-agent coordination: 4 protocols emerging
  • -
-
- -
-

Threats

-
    -
  • Native AI memory: Assistants build their own
  • -
  • Protocol standardization: MCP dominance
  • -
  • Vector DB simplification: Easier alternatives
  • -
  • Enterprise competitors: Well-funded entrants
  • -
-
-
-
- -
-

7. Recommendations

- -

Strategic Recommendations (Prioritized)

- -
-

Priority 1 Focus on Documentation and Integration Guides

- - - - - -
StatementCreate comprehensive integration guides for Cursor, Windsurf, Claude Code, and Copilot showing Bash-native access patterns
RationaleLLMs perform best with filesystem tools they were trained on
Expected Outcome3x increase in GitHub stars within 6 months
StatusIMPLEMENTED
-
- -
-

Priority 2 Position for Enterprise Data Sovereignty

- - - - - -
StatementEmphasize audit trails, offline access, and data sovereignty
RationaleCloud-only competitors create opportunity for on-premise
Expected OutcomeEnterprise pilot opportunities
StatusIMPLEMENTED
-
- -
-

Priority 3 Engage Memory Bank Community

- - - - - -
StatementActively participate in Memory Bank communities as potential adopters
RationaleExisting workarounds validate need; mnemonic offers superior solution
Expected OutcomeMigration of Memory Bank users
StatusIMPLEMENTED
-
- -
-

Priority 4 Implement Citation Validation

- - - - - -
StatementAdd optional citation fields for code references; create validation tool
RationaleGitHub Copilot's success (7% PR improvement)
Expected OutcomeReduced stale memory usage
StatusIMPLEMENTED
-
- -
-

Priority 5 Implement Memory Compression

- - - - - -
StatementAdd auto-summarization for context window efficiency
RationaleResearch shows 6:1 compression achievable
Expected OutcomeBetter context window utilization
StatusIMPLEMENTED (gc --compress)
-
-
- -
-

8. Risk Assessment

- -

Risk Matrix

-
-
-quadrantChart - title Risk Assessment Matrix - x-axis Low Impact --> High Impact - y-axis Low Probability --> High Probability - quadrant-1 Critical Risks - quadrant-2 Monitor Closely - quadrant-3 Low Priority - quadrant-4 Contingency Plan - Native AI Memory: [0.85, 0.5] - Scale Limitations: [0.5, 0.5] - Memory Sprawl: [0.4, 0.6] - Format Lock-in: [0.2, 0.2] - Protocol Dominance: [0.6, 0.3] - Cross-project Leak: [0.3, 0.4] -
-
- -

Detailed Risk Table

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
RiskCategoryProbabilityImpactMitigation
AI assistants build native memoryMarketMedium (50%)HighEmphasize portability; multi-tool design
Scale limitations at 10K+ filesTechnicalMedium (40%)MediumPerformance benchmarking; optimize ripgrep
Memory sprawlTechnicalHigh (60%)LowDecay modeling; GC tooling ✓
Protocol-based solutions dominateMarketLow (30%)MediumFilesystem always works with Bash
Format lock-in concernsTechnicalLow (20%)LowMIF is open standard
- -

Monitoring Indicators

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IndicatorSourceThresholdAction
GitHub stars growthGitHub API<10% monthlyIncrease community engagement
AI assistant native memory announcementsTech newsAny majorAssess portability positioning
Competitor open source movesGitHub, BlogsCE returnsRe-evaluate competitive position
ripgrep performance at scaleInternal testing>100ms queriesOptimize or add indexing
-
- -
-

9. Appendix

- -

A. Complete Data Sources

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SourceTypeReliability
Letta AI Research - Benchmarking AI Agent MemoryResearchHigh
arxiv - Unix Philosophy for Agentic AIAcademicHigh
GitHub - Copilot Agentic MemoryIndustryHigh
Anthropic - Context EngineeringIndustryHigh
ripgrep BenchmarksDocumentationHigh
Martin Fowler - Bitemporal HistoryDocumentationHigh
AI Long-term Memory SurveyAcademicHigh
Mem0 ResearchResearchMedium
- -

B. Glossary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TermDefinition
MIFMemory Interchange Format - mnemonic's open standard for memory files
MCPModel Context Protocol - Anthropic's protocol for AI-tool communication
LoCoMoLong Context Memory benchmark used by Letta
TAM/SAM/SOMTotal/Serviceable/Obtainable Addressable Market
Bi-temporalData modeling tracking both valid time and transaction time
POSIXPortable Operating System Interface - Unix standards
-
- -
-

Report generated by sigint market research agent

-

Generated: 2026-01-24 | Research ID: ai-memory-filesystem-research

-
- - - - diff --git a/reports/ai-memory-filesystem-research/2026-01-24-report.md b/reports/ai-memory-filesystem-research/2026-01-24-report.md deleted file mode 100644 index 11cfbdb..0000000 --- a/reports/ai-memory-filesystem-research/2026-01-24-report.md +++ /dev/null @@ -1,678 +0,0 @@ -# AI Memory Systems with Filesystem-Based Interfaces -## Comprehensive Market Research Report - -**Report Date**: 2026-01-24 -**Report Version**: 1.0 -**Status**: Final -**Classification**: Strategic Planning - ---- - -## Research Brief Alignment - -This report addresses the decision context of **academic validation, strategic planning, and feature roadmap for mnemonic**. The analysis is structured for multiple audiences: - -| Audience | Focus Areas | -|----------|-------------| -| Executives | Strategic positioning, market opportunity, competitive moat | -| Product Managers | Feature roadmap, competitive features, customer insights | -| Investors | Market size, growth metrics, risk assessment | -| Developers | Technical feasibility, architecture implications, integration patterns | - -**Anti-Pattern Compliance**: All recommendations preserve filesystem simplicity. MCP integration is explicitly out of scope per project decision. No recommendations require departing from POSIX tool compatibility. - ---- - -## 1. Executive Summary - -### Key Findings - -1. **Filesystem approaches outperform specialized tools**: Letta's LoCoMo benchmark demonstrates filesystem-based memory achieves **74.0% accuracy** compared to Mem0's graph-based approach at **68.5%**. - -2. **Unix philosophy is academically validated for AI**: A recent arxiv paper ("From Everything is a File to Files Are All You Need") explicitly validates Unix's "everything is a file" principle for modern agentic AI design. - -3. **Market gap in simple, private memory**: While MCP-based solutions grow in complexity (97M+ monthly SDK downloads), mnemonic occupies a unique position: zero dependencies, full data sovereignty, human-readable format. - -4. **Industry validation from GitHub**: Copilot's agentic memory system (public preview Jan 15, 2026) demonstrates **7% PR merge rate improvement** using citation-based validation - aligning with mnemonic's provenance approach. - -5. **Agentic memory is now table stakes**: VentureBeats 2026 predictions identify persistent memory as essential capability for AI assistants. - -### Primary Strategic Recommendation - -**Pursue organic growth through filesystem simplicity.** AI assistants with native Bash/filesystem access (Claude Code, Cursor, Windsurf, Copilot) can use mnemonic directly without protocol overhead. This approach is validated by Letta's benchmark finding that LLMs perform better with familiar tools. - -### Critical Risks - -- AI coding assistants may build native memory (Medium likelihood, High impact) -- Scale limitations at 10K+ memory files (requires validation) -- Memory sprawl without decay management - -### Market Opportunity Statement - -The AI memory systems market represents a **$52.62B opportunity by 2030** (46.3% CAGR), with mnemonic positioned to capture the underserved "simple + private/local" segment that enterprise and privacy-conscious developers increasingly demand. - ---- - -## 2. Market Overview - -### Market Definition and Boundaries - -The AI memory systems market encompasses technologies enabling persistent context and knowledge retention for AI agents and coding assistants. This includes: - -- **Memory infrastructure**: Storage, retrieval, and management of AI agent memories -- **Context engineering**: Tools for managing and optimizing context windows -- **Knowledge management for AI**: Structured knowledge bases accessible to AI systems - -### Total Market Size - -| Market Segment | 2024 Size | 2030 Projection | CAGR | -|----------------|-----------|-----------------|------| -| AI Agents Market | $5.25B | $52.62B | 46.3% | -| Knowledge Management | $773.6B | $3.5T (2034) | 16.3% | -| Multi-Agent Systems | Fastest growing segment | - | - | - -### Key Segments and Characteristics - -```mermaid -pie title AI Memory Market Segments - "Enterprise AI Assistants" : 35 - "Individual Developers" : 30 - "Open Source Projects" : 20 - "Multi-Agent Systems" : 15 -``` - -| Segment | Characteristics | Key Needs | -|---------|-----------------|-----------| -| Enterprise AI Assistants | Compliance-driven, security-focused | Audit trails, data sovereignty, offline access | -| Individual Developers | Value simplicity, portability | Easy setup, no vendor lock-in, human-readable | -| Open Source Projects | Vendor-neutral requirements | Self-hosted, transparent, community-driven | -| Multi-Agent Systems | Coordination-focused | Shared memory, cross-agent communication | - -### Market Maturity Stage - -**Early Growth Phase**: The market is transitioning from experimental to production deployments. GitHub Copilot's public preview of agentic memory (Jan 2026) signals mainstream adoption is imminent. - ---- - -## 3. Market Sizing (TAM/SAM/SOM) - -### Total Addressable Market (TAM) - -**$52.62B by 2030** - Global AI agents market - -| Metric | Value | Trend | -|--------|-------|-------| -| 2024 Market Size | $5.25B | - | -| 2030 Projection | $52.62B | INC | -| CAGR | 46.3% | INC | -| Growth Driver | Multi-agent systems, enterprise adoption | INC | - -**Calculation Methodology**: Based on AI agents market projections which include infrastructure components for agent memory, coordination, and context management. - -**Data Sources**: Industry analyst reports, venture funding trends, enterprise adoption surveys. - -### Serviceable Addressable Market (SAM) - -**$8B by 2030** - Developer tools and AI coding assistant memory segment - -| Metric | Value | Trend | -|--------|-------|-------| -| Target Segment | AI coding assistants + developer knowledge tools | INC | -| Geographic Constraints | Global (English-first documentation) | CONST | -| Estimated SAM | ~15% of TAM | INC | - -**Segment Characteristics**: -- Developers using AI coding assistants (Cursor, Windsurf, Copilot, Claude Code) -- Teams requiring persistent context across sessions -- Projects needing audit trails and version control - -### Serviceable Obtainable Market (SOM) - -**$50M-100M by 2028** - Privacy-focused, filesystem-based memory solutions - -| Metric | Value | Trend | -|--------|-------|-------| -| Realistic Market Share | 0.5-1% of SAM | INC | -| Timeline | 24-36 months | - | -| Growth Mechanism | Organic community adoption, enterprise pilots | INC | - -**Key Assumptions**: -- Open source adoption follows typical 2-5% active user conversion -- Enterprise segment values data sovereignty at premium -- Memory Bank community migration captures 10-20% of users - -```mermaid -pie title Market Sizing Breakdown - "TAM (Global AI Agents)" : 100 - "SAM (Dev Tools)" : 15 - "SOM (Filesystem-based)" : 2 -``` - ---- - -## 4. Competitive Landscape - -### Competitor Matrix - -| Company | Market Share | Strengths | Weaknesses | Trend | -|---------|--------------|-----------|------------|-------| -| **Mem0** | 25% | 26% accuracy improvement claims; temporal graph; strong funding | Complex infrastructure; cloud-dependent; Community Edition deprecated | CONST | -| **Zep** | 20% | LangChain integration; session management; enterprise focus | Cloud-focused; Community Edition deprecated; complex setup | DEC | -| **LangChain Memory** | 30% | Framework integration; flexibility; developer mindshare | Requires external databases; configuration complexity | CONST | -| **GitHub Copilot Memory** | 15% | Native integration; citation validation; 7% PR improvement | Copilot-only; cloud-dependent; 28-day auto-expiry | INC | -| **Filesystem Solutions** | 10% | Simple; private; human-readable; git-integrated | Limited market awareness; fragmented ecosystem | INC | - -### Porter's 5 Forces Summary - -| Force | Level | Analysis | -|-------|-------|----------| -| **Competitive Rivalry** | Medium | Fragmented market with no dominant player; open source reduces barriers | -| **Supplier Power** | Low | Commodity infrastructure (filesystems, git, text editors) | -| **Buyer Power** | High | Developers can easily switch; low switching costs for simple solutions | -| **Threat of Substitution** | Medium | Native AI assistant memory features could substitute third-party solutions | -| **Threat of New Entry** | High | Low barriers; any developer can build memory system | - -### Competitive Positioning Map - -```mermaid -quadrantChart - title Competitive Positioning: Simplicity vs Privacy - x-axis Simple --> Complex - y-axis Cloud/Hosted --> Private/Local - quadrant-1 Complex + Private - quadrant-2 Simple + Private - quadrant-3 Simple + Cloud - quadrant-4 Complex + Cloud - Mnemonic: [0.15, 0.9] - Basic Memory: [0.3, 0.7] - Memory Bank: [0.2, 0.8] - Copilot Memory: [0.4, 0.2] - Mem0: [0.8, 0.25] - Zep: [0.75, 0.15] - LangChain: [0.7, 0.5] -``` - -**Mnemonic's Position**: Occupies the "Simple + Private" quadrant - currently underserved by major players who focus on complex cloud solutions. - -### Detailed Competitor Profiles - -#### Mem0 - -| Attribute | Detail | -|-----------|--------| -| **Approach** | Vector DB + Knowledge Graph hybrid | -| **Pricing** | Cloud-based subscription; Community Edition deprecated | -| **Key Feature** | 26% accuracy improvement over full-context; 90% token reduction | -| **Weakness** | Requires cloud infrastructure; not self-hostable long-term | -| **Threat Level** | Medium - different target market (enterprise cloud) | - -#### Zep - -| Attribute | Detail | -|-----------|--------| -| **Approach** | Vector + Graph with LangChain integration | -| **Pricing** | Cloud-based; Community Edition deprecated | -| **Key Feature** | Session management; temporal context | -| **Weakness** | Cloud-dependent; complex configuration | -| **Threat Level** | Low - moving away from open source | - -#### GitHub Copilot Memory - -| Attribute | Detail | -|-----------|--------| -| **Approach** | Citation-based validation; cross-agent sharing | -| **Pricing** | Included with Copilot subscription | -| **Key Feature** | 7% PR merge rate improvement; automatic code citations | -| **Weakness** | Copilot-only; 28-day auto-expiry; cloud-dependent | -| **Threat Level** | High for Copilot users; validates mnemonic's approach | - -#### Memory Bank (Community) - -| Attribute | Detail | -|-----------|--------| -| **Approach** | Markdown files with structured sections | -| **Pricing** | Free (community project) | -| **Key Feature** | Works with Cursor/Windsurf rules; simple setup | -| **Weakness** | No versioning; no search optimization; fragmented | -| **Threat Level** | Low - validates need; potential migration target | - ---- - -## 5. Trend Analysis - -### Macro Trends - -| Trend | Direction | Evidence | Impact on Mnemonic | -|-------|-----------|----------|-------------------| -| Agentic AI maturation | INC | Multi-agent protocols (MCP, ACP, A2A, ANP) | Opportunity for multi-agent memory coordination | -| Context engineering emergence | INC | Anthropic's context engineering guide | Validates context management importance | -| Privacy and data sovereignty | INC | Enterprise concerns about cloud AI | Positions mnemonic as compliant solution | -| Agentic memory as table stakes | INC | VentureBeats 2026 predictions | Validates market timing | -| Native tool proficiency | INC | Letta benchmark findings | Confirms filesystem approach superiority | - -### Micro Trends - -| Trend | Direction | Evidence | Timeframe | -|-------|-----------|----------|-----------| -| Vector DB fatigue | INC | Letta benchmark; complexity complaints | 6-12 months | -| Citation-based validation | INC++ | GitHub Copilot public preview | Production-ready | -| Filesystem-based AI tools | INC | Arxiv paper; Letta research | 12 months | -| Context compression | INC | 6:1 compression at 90% fidelity research | 6-12 months | -| Cognitive memory models | CONST | Already adopted; stabilizing | Ongoing | -| Cloud-only solutions | DEC | Privacy concerns; data sovereignty | 12-24 months | - -### Transitional Scenario Graph - -```mermaid -stateDiagram-v2 - [*] --> CurrentState: Mnemonic v1.0 - - CurrentState --> OrganicGrowth: Community adoption (60%) - CurrentState --> EnterpriseAdoption: Data sovereignty appeal (25%) - CurrentState --> Stagnation: No marketing effort (5%) - - OrganicGrowth --> NicheSuccess: Memory Bank migration - OrganicGrowth --> PlatformPlay: Multi-agent features - - EnterpriseAdoption --> PlatformPlay: Team features - EnterpriseAdoption --> NicheSuccess: Compliance focus - - NicheSuccess --> SteadyState: Sustainable OSS - PlatformPlay --> MarketLeader: Cross-tool dominance - - Stagnation --> Obsolete: Market moves on - - SteadyState --> [*]: Niche success - MarketLeader --> [*]: Market leadership - Obsolete --> [*]: Project archived -``` - -### Terminal Scenarios - -| Scenario | Probability | Path | Trade-offs | -|----------|-------------|------|------------| -| **Niche Success** | 60% | Organic growth -> Steady community | Limited scale but sustainable | -| **Platform Play** | 10% | Multi-agent + Enterprise -> Market leader | Requires significant investment | -| **Enterprise Adoption** | 25% | Data sovereignty focus -> Compliance niche | May limit developer appeal | -| **Stagnation** | 5% | No action -> Obsolescence | - | - -### Scenario Trade-off Analysis - -```mermaid -quadrantChart - title Scenario Trade-offs: Investment vs Risk - x-axis Low Investment --> High Investment - y-axis Low Risk --> High Risk - quadrant-1 High Risk / High Investment - quadrant-2 Low Risk / High Investment - quadrant-3 Low Risk / Low Investment - quadrant-4 High Risk / Low Investment - Niche Success: [0.3, 0.2] - Enterprise Adoption: [0.5, 0.4] - Platform Play: [0.8, 0.6] - Stagnation: [0.1, 0.7] -``` - ---- - -## 6. SWOT Analysis - -### SWOT Quadrant Visualization - -```mermaid -quadrantChart - title SWOT Analysis Overview - x-axis Internal --> External - y-axis Harmful --> Helpful - quadrant-1 Opportunities - quadrant-2 Strengths - quadrant-3 Weaknesses - quadrant-4 Threats - Benchmark Validation: [0.2, 0.9] - Zero Dependencies: [0.2, 0.8] - Git Integration: [0.2, 0.7] - Market Gap: [0.8, 0.85] - Industry Validation: [0.8, 0.75] - Scale Untested: [0.2, 0.3] - Limited Awareness: [0.2, 0.2] - Native AI Memory: [0.8, 0.25] - Protocol Dominance: [0.8, 0.15] -``` - -### Strengths (Internal + Helpful) - -| Strength | Evidence | Strategic Value | -|----------|----------|-----------------| -| **Benchmark validation** | 74.0% accuracy vs 68.5% Mem0 on LoCoMo | Empirical proof of approach superiority | -| **Zero dependencies** | No databases, cloud, or accounts required | Reduced complexity; easier adoption | -| **Git integration** | Full version history, conflict resolution | Unique differentiator in market | -| **Human readability** | Markdown + YAML frontmatter | Developer trust; debugging ease | -| **POSIX composability** | Works with any Unix tool | No lock-in; ecosystem compatibility | -| **Cognitive types** | Semantic, episodic, procedural mapping | Academically grounded; industry aligned | -| **Bi-temporal tracking** | SQL:2011 standard compliance | Audit trail; temporal queries | - -### Weaknesses (Internal + Harmful) - -| Weakness | Impact | Mitigation | -|----------|--------|------------| -| **Scale untested** | Unknown performance at 10K+ files | Benchmark and optimize ripgrep usage | -| **Limited market awareness** | Low adoption despite strong foundation | Documentation and community engagement | -| **No cloud offering** | Enterprise procurement friction | Position as feature (data sovereignty) | -| **Single maintainer** | Bus factor risk | Build community contributor base | - -### Opportunities (External + Helpful) - -| Opportunity | Evidence | Action Required | -|-------------|----------|-----------------| -| **Market gap in simple + private** | Mem0/Zep deprecated Community editions | Clear positioning and messaging | -| **Memory Bank migration** | Community workarounds for Cursor/Windsurf | Integration guides; migration tools | -| **GitHub Copilot validation** | Citation-based validation now mainstream | Emphasize mnemonic's provenance features | -| **Enterprise data sovereignty** | Increasing privacy regulation | Compliance documentation | -| **Multi-agent coordination** | 4 protocols emerging (MCP, ACP, A2A, ANP) | Blackboard pattern extension | - -### Threats (External + Harmful) - -| Threat | Likelihood | Impact | Response | -|--------|------------|--------|----------| -| **Native AI assistant memory** | Medium | High | Emphasize portability and tool-agnostic design | -| **Protocol standardization on MCP** | Medium | Medium | Filesystem always works with Bash-capable assistants | -| **Vector DB simplification** | Low | Medium | Filesystem advantages remain (git, offline, readable) | -| **Enterprise competitor entry** | Medium | Medium | Build community moat; first-mover in niche | - ---- - -## 7. Recommendations - -### Strategic Recommendations (Prioritized) - -#### Recommendation 1: Focus on Documentation and Integration Guides - -| Aspect | Detail | -|--------|--------| -| **Statement** | Create comprehensive integration guides for Cursor, Windsurf, Claude Code, and Copilot showing Bash-native access patterns | -| **Rationale** | LLMs perform best with filesystem tools they were trained on; documentation enables immediate adoption | -| **Expected Outcome** | 3x increase in GitHub stars within 6 months; Memory Bank community migration | -| **Resource Requirements** | Low - documentation effort only | -| **Risk Level** | Low | -| **Priority** | 1 - Immediate | -| **Status** | IMPLEMENTED (2026-01-24) | - -#### Recommendation 2: Position for Enterprise Data Sovereignty - -| Aspect | Detail | -|--------|--------| -| **Statement** | Emphasize audit trails, offline access, and data sovereignty in marketing materials | -| **Rationale** | Cloud-only competitors (Mem0, Zep) create opportunity for on-premise solutions | -| **Expected Outcome** | Enterprise pilot opportunities; compliance-driven adoption | -| **Resource Requirements** | Low - messaging and documentation | -| **Risk Level** | Low | -| **Priority** | 2 - Short-term | -| **Status** | IMPLEMENTED (2026-01-24) | - -#### Recommendation 3: Engage Memory Bank Community - -| Aspect | Detail | -|--------|--------| -| **Statement** | Actively participate in Memory Bank project communities as potential adopters | -| **Rationale** | Existing workarounds validate need; mnemonic offers superior solution | -| **Expected Outcome** | Migration of Memory Bank users to mnemonic | -| **Resource Requirements** | Medium - community engagement time | -| **Risk Level** | Low | -| **Priority** | 3 - Short-term | -| **Status** | IMPLEMENTED (2026-01-24) | - -#### Recommendation 4: Implement Citation Validation - -| Aspect | Detail | -|--------|--------| -| **Statement** | Add optional citation fields in MIF format for code references; create validation tool | -| **Rationale** | GitHub Copilot's success with citation-based validation (7% PR improvement) | -| **Expected Outcome** | Reduced stale memory usage; improved memory reliability | -| **Resource Requirements** | Medium - development effort | -| **Risk Level** | Low | -| **Priority** | 4 - Medium-term | -| **Status** | IMPLEMENTED (2026-01-24) | - -#### Recommendation 5: Implement Memory Compression - -| Aspect | Detail | -|--------|--------| -| **Statement** | Add auto-summarization capability for context window efficiency | -| **Rationale** | Research shows 6:1 compression with >90% semantic fidelity achievable | -| **Expected Outcome** | Better context window utilization; larger effective memory | -| **Resource Requirements** | Medium - development effort | -| **Risk Level** | Medium - quality assurance needed | -| **Priority** | 5 - Medium-term | -| **Status** | IMPLEMENTED (gc --compress) | - -### Tactical Next Steps (Next 30 Days) - -| Action | Owner | Due Date | Status | -|--------|-------|----------|--------| -| Update README with Letta benchmark reference | - | 2026-01-31 | DONE | -| Add arxiv Unix philosophy paper to docs | - | 2026-01-31 | DONE | -| Create Cursor integration guide | - | 2026-02-07 | DONE | -| Create Windsurf integration guide | - | 2026-02-07 | DONE | -| Post on Memory Bank community forums | - | 2026-02-14 | DONE | - ---- - -## 8. Risk Assessment - -### Risk Matrix - -```mermaid -quadrantChart - title Risk Assessment Matrix - x-axis Low Impact --> High Impact - y-axis Low Probability --> High Probability - quadrant-1 Critical Risks - quadrant-2 Monitor Closely - quadrant-3 Low Priority - quadrant-4 Contingency Plan - Native AI Memory: [0.85, 0.5] - Scale Limitations: [0.5, 0.5] - Memory Sprawl: [0.4, 0.6] - Format Lock-in: [0.2, 0.2] - Protocol Dominance: [0.6, 0.3] - Cross-project Leak: [0.3, 0.4] -``` - -### Detailed Risk Table - -| Risk | Category | Probability | Impact | Mitigation | Contingency | -|------|----------|-------------|--------|------------|-------------| -| **AI assistants build native memory** | Market | Medium (50%) | High | Emphasize portability; multi-tool design | Pivot to export/integration layer | -| **Scale limitations at 10K+ files** | Technical | Medium (40%) | Medium | Performance benchmarking; optimize ripgrep | Add indexing layer if needed | -| **Memory sprawl** | Technical | High (60%) | Low | Decay modeling; GC tooling ✓ | Manual cleanup guides | -| **Protocol-based solutions dominate** | Market | Low (30%) | Medium | Filesystem always works with Bash | Document protocol-agnostic benefits | -| **Format lock-in concerns** | Technical | Low (20%) | Low | MIF is open standard | Migration tool development | -| **Cross-project contamination** | Technical | Medium (40%) | Low | Namespace isolation; clear scoping | Project-level memory separation | -| **Agent misuse of stale memories** | Technical | Medium (50%) | Medium | Citation validation ✓ | TTL expiry via gc ✓ | - -### Monitoring Indicators - -| Indicator | Source | Threshold | Action | -|-----------|--------|-----------|--------| -| GitHub stars growth | GitHub API | <10% monthly | Increase community engagement | -| AI assistant native memory announcements | Tech news | Any major | Assess portability positioning | -| Competitor open source moves | GitHub, Blogs | Community editions return | Re-evaluate competitive position | -| ripgrep performance at scale | Internal testing | >100ms queries | Optimize or add indexing | -| Memory file count growth | User reports | >5K files common | Tune gc thresholds (already implemented) | - ---- - -## 9. Appendix - -### A. Complete Data Sources - -| Source | URL | Type | Reliability | -|--------|-----|------|-------------| -| Letta AI Research | https://www.letta.com/blog/benchmarking-ai-agent-memory | Research | High | -| arxiv Unix Philosophy Paper | https://arxiv.org/html/2601.11672 | Academic | High | -| GitHub Copilot Memory Blog | https://github.blog/ai-and-ml/github-copilot/building-an-agentic-memory-system-for-github-copilot/ | Industry | High | -| Anthropic Context Engineering | https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents | Industry | High | -| ripgrep Benchmarks | https://github.com/BurntSushi/ripgrep | Documentation | High | -| Martin Fowler Bitemporal | https://martinfowler.com/articles/bitemporal-history.html | Documentation | High | -| AI Long-term Memory Survey | https://arxiv.org/html/2411.00489v1 | Academic | High | -| Windsurf Cascade Docs | https://docs.windsurf.com/windsurf/cascade/memories | Documentation | High | -| Mem0 Research | https://mem0.ai/research | Research | Medium | -| Royal Society Wiki Paper | https://royalsocietypublishing.org/doi/10.1098/rsos.240275 | Academic | High | -| Unix Philosophy Wikipedia | https://en.wikipedia.org/wiki/Unix_philosophy | Reference | High | - -### B. Methodology Notes - -**Research Approach**: Exploratory research focused on three priority areas: -1. Filesystem memory patterns (Priority 1) -2. Emerging trends in AI memory (Priority 2) -3. Academic foundations (Priority 3) - -**Data Collection**: Web research, academic paper analysis, competitor documentation review, community forum analysis. - -**Confidence Scoring**: Each finding rated 0.0-1.0 based on source reliability and corroboration. - -**Trend Indicators**: -- INC: Increasing trend with strong evidence -- INC++: Rapidly accelerating with production validation -- DEC: Declining trend -- CONST: Stable/constant - -### C. Research Timeline - -| Date | Activity | Findings | -|------|----------|----------| -| 2026-01-24 02:15 | Research initiated | Elicitation context captured | -| 2026-01-24 04:00 | Filesystem patterns research | Letta benchmark discovered | -| 2026-01-24 06:00 | Academic foundations | arxiv paper validated approach | -| 2026-01-24 08:00 | Competitive analysis | Memory Bank projects identified | -| 2026-01-24 10:00 | Trend analysis | Multi-agent protocols emerging | -| 2026-01-24 12:30 | Update | GitHub Copilot public preview | -| 2026-01-24 13:00 | Strategic decision | MCP out of scope | - -### D. Full Scenario Analysis - -#### Scenario 1: Organic Niche Success (60% probability) - -**Path**: Community adoption -> Memory Bank migration -> Steady OSS project - -**Dependencies**: -- Strong documentation and integration guides -- Active community engagement -- Regular maintenance and updates - -**Trade-offs**: -- (+) Sustainable with minimal resources -- (+) Clear market position -- (-) Limited scale and revenue potential -- (-) May miss larger market opportunity - -**Key Metrics**: -- GitHub stars: 1K+ within 12 months -- Active users: 500+ monthly -- Community contributors: 10+ - -#### Scenario 2: Enterprise Adoption (25% probability) - -**Path**: Data sovereignty messaging -> Compliance pilots -> Enterprise sales - -**Dependencies**: -- Compliance documentation (SOC2, GDPR) -- Enterprise support options -- Team collaboration features - -**Trade-offs**: -- (+) Higher revenue potential -- (+) Sustainable funding model -- (-) May require commercial entity -- (-) Could reduce open source focus - -**Key Metrics**: -- Enterprise pilots: 5+ within 12 months -- Paid support contracts: Revenue target TBD - -#### Scenario 3: Platform Play (10% probability) - -**Path**: Multi-agent features + Enterprise adoption -> Cross-tool dominance - -**Dependencies**: -- Significant development investment -- Multi-agent coordination features -- Strong enterprise traction -- Possible venture funding - -**Trade-offs**: -- (+) Market leadership potential -- (+) Significant revenue -- (-) High investment required -- (-) Execution risk - -**Key Metrics**: -- Multi-tool integration: 5+ AI assistants -- Market share: 5%+ of SAM - -#### Scenario 4: Stagnation (5% probability) - -**Path**: No action -> Reduced relevance -> Project archived - -**Dependencies**: -- No documentation updates -- No community engagement -- No response to market changes - -**Outcome**: Project becomes unmaintained; users migrate to alternatives - -### E. Glossary - -| Term | Definition | -|------|------------| -| **MIF** | Memory Interchange Format - mnemonic's open standard for memory files | -| **MCP** | Model Context Protocol - Anthropic's protocol for AI-tool communication | -| **LoCoMo** | Long Context Memory benchmark used by Letta | -| **TAM/SAM/SOM** | Total/Serviceable/Obtainable Addressable Market | -| **Bi-temporal** | Data modeling tracking both valid time and transaction time | -| **POSIX** | Portable Operating System Interface - Unix standards | -| **Semantic memory** | Facts and knowledge (things that ARE true) | -| **Episodic memory** | Events and experiences (things that HAPPENED) | -| **Procedural memory** | Workflows and skills (things you DO) | - ---- - -## Decision Support - -### For Executives - -**The Bottom Line**: Mnemonic's filesystem-based approach is empirically validated to outperform complex alternatives. The market is moving toward data sovereignty and simplicity. Recommended strategy: organic growth through community and documentation with enterprise positioning. - -**Investment Required**: Minimal (documentation and community engagement) -**Timeline to Validation**: 6-12 months -**Risk Level**: Low - -### For Product Managers - -**Feature Priority Stack**: -1. Integration guides (DONE) -2. Citation validation (DONE) -3. Memory compression (DONE) -4. Enhanced search (DONE) -5. Multi-agent coordination (DONE) - -**Competitive Moat**: Git integration + human readability + zero dependencies - -### For Investors - -**Market Opportunity**: $52.62B TAM by 2030 (46.3% CAGR) -**Differentiation**: Only filesystem-based solution with benchmark validation -**Growth Path**: Organic -> Enterprise -> Platform -**Key Risk**: Native AI assistant memory - -### For Developers - -**Architecture Validation**: Letta benchmark confirms filesystem > vector DB -**Integration Path**: Bash-native access; no protocol overhead -**Scale Considerations**: Test at 10K+ files; optimize ripgrep patterns - ---- - -*Report generated by sigint market research agent* -*Generated: 2026-01-24* -*Research ID: ai-memory-filesystem-research* diff --git a/reports/ai-memory-filesystem-research/2026-01-24-research.md b/reports/ai-memory-filesystem-research/2026-01-24-research.md deleted file mode 100644 index 0fcb816..0000000 --- a/reports/ai-memory-filesystem-research/2026-01-24-research.md +++ /dev/null @@ -1,346 +0,0 @@ -# AI Memory Systems with Filesystem-Based Interfaces - -**Research Date**: 2026-01-24 -**Last Updated**: 2026-01-24T12:30:00Z -**Status**: Complete -**Researcher**: sigint market research agent - ---- - -## Change Log - -### 2026-01-24T13:00:00Z - Strategic Decision: MCP Out of Scope - -**Project decision**: MCP integration is explicitly out of scope for mnemonic. The project will pursue organic growth through: -- Strong documentation and integration guides -- Community engagement with Memory Bank users -- Direct tool-specific integrations (Cursor rules, Windsurf rules, etc.) -- Enterprise positioning around data sovereignty and simplicity - -This aligns with mnemonic's core philosophy of zero external dependencies. - -### 2026-01-24T12:30:00Z - January 2026 Market Update - -**Significant developments since initial research:** - -- **MCP adoption accelerated**: Now under Linux Foundation AAIF with 97M monthly SDK downloads -- **GitHub Copilot agentic memory public preview** (Jan 15, 2026): Cross-agent memory sharing with 7% PR merge rate improvement, 28-day auto-expiry, citation-based validation -- **Industry consensus**: VentureBeats 2026 predictions identify agentic memory as "table stakes" for AI assistants - -**Impact on mnemonic strategy**: GitHub Copilot's public preview validates mnemonic's citation-based approach. Focus remains on filesystem simplicity and tool-agnostic design. - ---- - -## Research Brief Alignment - -This research addresses the decision context of **academic validation, strategic planning, and feature roadmap for mnemonic**. The findings are structured for a technical audience across product, engineering, and open-source community stakeholders who understand filesystem-based storage, YAML frontmatter, and POSIX tool ecosystems. - ---- - -## Executive Summary - -### Top 5 Findings (Priority-Ranked) - -1. **Filesystem approaches outperform specialized tools**: Letta's LoCoMo benchmark demonstrates that filesystem-based memory achieves 74.0% accuracy compared to Mem0's graph-based approach at 68.5%. This validates mnemonic's core architectural decision. - -2. **Unix philosophy is academically validated for AI**: A recent arxiv paper explicitly connects Unix's "everything is a file" principle to modern agentic AI design, providing theoretical backing for mnemonic's approach. - -3. **Market gap in simple, private memory**: While MCP-based solutions grow in complexity, mnemonic occupies a unique position: zero dependencies, full data sovereignty, human-readable format. This differentiation strengthens as alternatives become more complex. - -4. **Market gap exists in AI coding assistants**: Both Cursor and Windsurf lack native persistent memory; community workarounds using markdown files validate mnemonic's approach and represent adoption opportunity. - -5. **Cognitive memory types are becoming standard**: Semantic, episodic, and procedural memory classification from cognitive science is being directly applied in AI agent architectures, validating mnemonic's memory type taxonomy. - -### Success Criteria Assessment - -| Criterion | Status | Evidence | -|-----------|--------|----------| -| Academic backing for approach | ACHIEVED | Letta benchmark, arxiv Unix philosophy paper | -| Differentiation clarity | ACHIEVED | Simplicity as feature, git integration, POSIX composability | -| Surprising insights | ACHIEVED | Simplicity correlates with reliability; iterative querying advantage | -| Feature opportunities | ACHIEVED | ~~citation validation~~, ~~memory compression~~, ~~validation tool~~, ~~multi-agent coordination~~ *(implemented 2026-01-24)*; MCP out of scope | - ---- - -## Hypothesis Validation - -No explicit hypotheses were stated in the elicitation. However, implicit hypotheses derived from mnemonic's design decisions can be assessed: - -| Implicit Hypothesis | Verdict | Evidence | -|---------------------|---------|----------| -| Filesystem storage can be effective for AI memory | **SUPPORTED** | Letta benchmark: 74.0% vs 68.5% (Mem0) | -| POSIX tools are sufficient for search/retrieval | **SUPPORTED** | ripgrep 5-10x faster than grep; LLMs pretrained on filesystem ops | -| Git versioning adds value | **SUPPORTED** | Only solution offering full audit trail, offline access, conflict resolution | -| Cognitive memory types are appropriate | **SUPPORTED** | Direct mapping to emerging AI agent architectures | -| Bi-temporal tracking is valuable | **SUPPORTED** | SQL:2011 standard; GitHub Copilot using similar validation approach | - ---- - -## Market Overview - -### Market Scope - -The AI memory systems market sits at the intersection of: -- **AI coding assistants** (Cursor, Windsurf, Copilot, Continue, Aider) -- **Agentic AI infrastructure** (LangChain, AutoGen, CrewAI) -- **Developer tools and knowledge management** - -### Market Size Indicators - -- Global knowledge management market: $773.6B (2024), projected $3.5T by 2034 -- AI agents market: $5.25B (2024), projected $52.62B by 2030 (46.3% CAGR) -- Multi-agent systems: fastest-growing segment -- GitHub Copilot agentic memory: **7% PR merge rate improvement** in public preview *(New Jan 2026)* - -### Key Segments - -1. **Enterprise AI assistants**: Need audit trails, compliance, data sovereignty -2. **Individual developers**: Value simplicity, portability, offline access -3. **Open source projects**: Require vendor-neutral, self-hosted solutions -4. **Multi-agent systems**: Need shared memory coordination - ---- - -## Competitive Landscape - -### Direct Competitors - -| Competitor | Approach | Strengths | Weaknesses | -|------------|----------|-----------|------------| -| **Mem0** | Vector DB + Knowledge Graph | 26% accuracy improvement claims; temporal graph | Complex infrastructure; cloud-dependent; Community Edition deprecated | -| **Zep** | Vector + Graph hybrid | LangChain integration; session management | Cloud-focused; Community Edition deprecated | -| **LangChain Memory** | Multiple backends | Framework integration; flexibility | Requires external databases; configuration complexity | - -### Adjacent Solutions - -| Solution | Approach | Relationship to Mnemonic | -|----------|----------|--------------------------| -| **Cursor Memory Bank** | Community-built markdown files | Validates mnemonic's approach; potential adoption target | -| **Windsurf Memories** | Auto-generated + rules | Proprietary; validates need for persistent memory | -| **GitHub Copilot Memory** | Citation-based validation (public preview Jan 2026) | 7% PR merge improvement; cross-agent memory sharing; validates mnemonic's approach | -| **Basic Memory** | MCP-based local memory | Similar philosophy; different integration approach | - -### Competitive Position Analysis - -``` - Simple <----------------> Complex - | | - Private/Local [MNEMONIC] [Mem0] - | | | - | [Basic Memory] [Zep Cloud] - | | | - Cloud/Hosted [Copilot Memory] [LangChain Memory] -``` - -**Mnemonic's Position**: Simple + Private/Local quadrant - underserved by current market leaders. - -### Differentiation Summary - -| Mnemonic Advantage | Why It Matters | -|--------------------|----------------| -| Zero dependencies | No databases, no cloud, no accounts | -| Git integration | Full version history, conflict resolution, offline | -| POSIX composability | Works with any Unix tool; no lock-in | -| Human-readable | Developers can read/edit memories directly | -| MIF compliance | Portable, standardized format | -| Cognitive types | Academically grounded classification | - ---- - -## Trends and Projections - -### Trend Analysis with Direction Indicators - -| Trend | Direction | Evidence | Timeframe | -|-------|-----------|----------|-----------| -| Vector DB fatigue | INC | Letta benchmark; simplicity preference | 6-12 months | -| Multi-agent memory sharing | INC | Multiple protocols emerging | 12-24 months | -| Citation-based validation | **INC++** | GitHub Copilot public preview (Jan 2026); 7% PR merge improvement | **Production-ready** | -| Filesystem-based AI tools | INC | Arxiv paper; Letta research | 12 months | -| Context compression | INC | 6:1 compression at 90% fidelity | 6-12 months | -| Cognitive memory models in AI | CONST | Already adopted; stabilizing | Ongoing | -| Cloud-only solutions | DEC | Privacy concerns; data sovereignty | 12-24 months | - -### Macro Trends - -1. **Agentic AI maturation**: From single agents to coordinated multi-agent systems -2. **Context engineering emergence**: Recognized as critical discipline -3. **Privacy and data sovereignty**: Increasing enterprise concern about cloud AI -4. **Agentic memory as table stakes** *(New Jan 2026)*: VentureBeats 2026 predictions identify memory as essential capability for AI assistants -5. **Native tool proficiency**: LLMs perform best with tools they were trained on (Bash, filesystem ops); specialized protocols add latency and complexity - ---- - -## Scenario Analysis - -```mermaid -stateDiagram-v2 - [*] --> CurrentState: Mnemonic v1.0 - - CurrentState --> OrganicGrowth: Community adoption - - OrganicGrowth --> NicheSuccess: Developer-focused community - - NicheSuccess --> SteadyState: Sustainable open source - - SteadyState --> [*]: Niche success -``` - -> **Strategic Position**: Mnemonic pursues organic growth via filesystem simplicity. AI assistants with native Bash/filesystem access (Claude Code, Cursor, Windsurf, Copilot) can use mnemonic directly without protocol overhead. This aligns with Letta's benchmark finding that LLMs perform better with familiar tools. - -### Scenario Probabilities - -| Scenario | Probability | Key Dependencies | -|----------|-------------|------------------| -| Organic Niche Success | 60% | Strong documentation, community engagement, Memory Bank migration | -| Enterprise Adoption | 25% | Audit trails, data sovereignty messaging, compliance documentation | -| Platform Play | 10% | Multi-agent coordination + enterprise adoption | -| Stagnation | 5% | No action on documentation or community | - -**Strategic rationale**: Filesystem-based approach requires no protocol adoption. Any AI assistant with Bash access can use mnemonic immediately. This is a feature, not a limitation. - ---- - -## Key Insights - -### Academic Validation - -1. **Letta benchmark is definitive**: Filesystem-based memory achieving 74.0% accuracy vs Mem0's 68.5% on the LoCoMo benchmark is strong empirical validation that simplicity can outperform complexity. - -2. **Unix philosophy paper provides theoretical foundation**: The arxiv paper "From Everything is a File to Files Are All You Need" explicitly validates the strategy of collapsing diverse interfaces into uniform file abstraction. - -3. **Cognitive science mapping is correct**: Semantic, episodic, and procedural memory types from cognitive science are being directly adopted by AI agent frameworks, validating mnemonic's classification. - -4. **Bi-temporal modeling has standards backing**: SQL:2011 standard for temporal databases validates mnemonic's valid_time vs recorded_at approach. - -### Differentiation Clarity - -5. **Simplicity is a feature, not a limitation**: LLMs are extensively pretrained on filesystem operations, making simple tools more reliable than specialized knowledge graphs or vector databases. - -6. **Git integration is unique differentiator**: No competing solution offers full version control with meaningful diffs, offline access, and conflict resolution. - -7. **Human readability enables inspection**: Markdown with YAML frontmatter can be directly read and edited, unlike binary vector stores. - -### Surprising Insights - -8. ~~**Iterative querying changes retrieval paradigm**: Rather than single-shot retrieval, agents can generate their own queries and continue searching until finding the right data. This suggests mnemonic could support agent-driven search refinement.~~ *(Implemented: `/mnemonic:search-enhanced` with `mnemonic-search-subcall` agent provides agent-driven iterative search with synthesis)* - -9. **GitHub Copilot validates provenance approach**: Copilot's new memory system uses citation-based validation with code references. Mnemonic's provenance metadata aligns with this industry direction. - -10. **Community workarounds validate market need**: The existence of community-built "Memory Bank" projects for Cursor and Windsurf using markdown files validates both the market need and mnemonic's approach. - -### Feature Opportunities - -11. **Bash-native access is sufficient**: AI assistants with filesystem access (Claude Code, Cursor, Windsurf, Copilot) can use mnemonic directly via Bash. Letta's benchmark validates that LLMs perform better with familiar filesystem tools than specialized protocols. No additional integration layer needed. - -12. ~~**Citation validation could prevent stale memories**: Adding optional code citations that can be verified against the current codebase (like Copilot) could improve memory reliability.~~ *(Implemented: `tools/mnemonic-validate` validates code_refs and citations)* - -13. ~~**Memory compression addresses context limits**: Research shows 6:1 compression with >90% semantic fidelity is achievable. Auto-summarization could help with context window management.~~ *(Implemented: `gc --compress` with compression-worker agent)* - ---- - -## Recommendations - -### Immediate (1-2 weeks) - -1. ~~**Document benchmark validation**: Reference Letta's LoCoMo benchmark results in README and marketing materials~~ *(Implemented 2026-01-24)* -2. ~~**Cite academic foundations**: Link to arxiv Unix philosophy paper in architecture documentation~~ *(Implemented 2026-01-24)* - -### Short-term (1-2 months) - -3. ~~**Expand integration guides**: Detailed setup guides for Cursor, Windsurf, Copilot showing Bash-native access patterns~~ *(Implemented 2026-01-24)* -4. ~~**Add citation fields**: Optional `citations` array in MIF format for code references~~ *(Implemented 2026-01-24)* -5. ~~**Enhance search skill**: Support agent-driven iterative query refinement~~ *(Implemented: `/mnemonic:search-enhanced`)* - -### Medium-term (3-6 months) - -6. ~~**Memory compression**: Implement auto-summarization for large memories~~ *(Implemented: `gc --compress`)* -7. ~~**Multi-agent coordination**: Extend blackboard pattern for agent-to-agent sharing~~ *(Implemented: `mnemonic-agent-coordination` skill)* -8. ~~**Validation tool**: Script to verify memory citations against current codebase~~ *(Implemented: `tools/mnemonic-validate`)* - -### Strategic - -9. ~~**Position for enterprise**: Emphasize audit trails, data sovereignty, offline access~~ *(Implemented 2026-01-24)* -10. ~~**Build integrations**: Create specific guides for Cursor, Windsurf, Copilot users~~ *(Implemented 2026-01-24)* -11. ~~**Community engagement**: Engage Memory Bank project communities as potential adopters~~ *(Implemented 2026-01-24)* - ---- - -## Risks and Considerations - -### Technical Risks - -| Risk | Likelihood | Impact | Mitigation | -|------|------------|--------|------------| -| Scale limitations | Medium | Medium | Monitor performance; consider indexing layer | -| Format lock-in concerns | Low | Low | MIF is open standard; migrations possible | - -### Market Risks - -| Risk | Likelihood | Impact | Mitigation | -|------|------------|--------|------------| -| AI assistants build native memory | Medium | High | Multi-tool integration guides; emphasize data portability | -| Vector DBs improve simplicity | Low | Medium | Filesystem advantages remain (git, offline, human-readable) | -| Protocol-based solutions dominate | Low | Medium | Filesystem always works with any Bash-capable assistant | - -### Risks They Had Not Considered - -1. **Memory sprawl**: Without decay management, memory collections could grow unbounded -2. **Cross-project contamination**: User-level memories could leak context between projects -3. **Agent misuse of memories**: Agents might cite outdated memories without validation - ---- - -## Sources - -### Primary Sources (High Reliability) - -- [Benchmarking AI Agent Memory: Is a Filesystem All You Need?](https://www.letta.com/blog/benchmarking-ai-agent-memory) - Letta Research -- [From Everything is a File to Files Are All You Need](https://arxiv.org/html/2601.11672) - arxiv -- [Building an Agentic Memory System for GitHub Copilot](https://github.blog/ai-and-ml/github-copilot/building-an-agentic-memory-system-for-github-copilot/) - GitHub -- [Effective Context Engineering for AI Agents](https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents) - Anthropic -- [GitHub Changelog: Copilot Agentic Memory Public Preview](https://github.blog/changelog/) - GitHub *(Added Jan 2026)* - -### Secondary Sources (High Reliability) - -- [ripgrep benchmarks](https://burntsushi.net/ripgrep/) - Andrew Gallant -- [Bitemporal History](https://martinfowler.com/articles/bitemporal-history.html) - Martin Fowler -- [Human-inspired Perspectives: A Survey on AI Long-term Memory](https://arxiv.org/html/2411.00489v1) - arxiv -- [Unix Philosophy](https://en.wikipedia.org/wiki/Unix_philosophy) - Wikipedia -- [Co-designing a wiki-based community knowledge management system](https://royalsocietypublishing.org/doi/10.1098/rsos.240275) - Royal Society - -### Industry Sources (Medium Reliability) - -- [Windsurf Cascade Memories Documentation](https://docs.windsurf.com/windsurf/cascade/memories) -- [Cursor Forum - Memory Bank discussions](https://forum.cursor.com/) -- [Mem0 AI Memory Research](https://mem0.ai/research) -- [VentureBeats 2026 AI Predictions: Agentic Memory](https://venturebeat.com/) *(Added Jan 2026)* - ---- - -## Further Research Needed - -1. **Performance benchmarks at scale**: Test ripgrep performance with 10K+ memory files -2. **User studies**: How developers interact with memory files manually vs via agents -3. **Decay model optimization**: Research optimal half-life values for different memory types -4. **Multi-agent coordination patterns**: Detailed analysis of blackboard vs other sharing mechanisms -5. **Cross-agent memory sharing**: Learn from GitHub Copilot's 7% PR merge improvement metrics - ---- - -## Anti-Pattern Check - -This research explicitly avoids: - -- Recommendations requiring databases or cloud services -- Suggestions that compromise human readability -- Features that break POSIX tool compatibility -- Complexity that undermines the core value proposition -- **Protocol dependencies** (MCP, etc.) that add abstraction layers - -All recommendations preserve filesystem simplicity. AI assistants with Bash access can use mnemonic directly without additional integration layers. - ---- - -*Generated by [sigint](https://github.com/zircote/sigint) on 2026-01-24* -*Last updated: 2026-01-24T13:00:00Z* diff --git a/reports/ai-memory-filesystem-research/README.md b/reports/ai-memory-filesystem-research/README.md deleted file mode 100644 index eca7856..0000000 --- a/reports/ai-memory-filesystem-research/README.md +++ /dev/null @@ -1,86 +0,0 @@ -# AI Memory Systems with Filesystem-Based Interfaces - Research Summary - -**Research ID**: ai-memory-filesystem-research -**Created**: 2026-01-24 -**Last Updated**: 2026-01-24 -**Status**: complete - -## Research Query - -> Academic validation, strategic planning, and feature roadmap research for mnemonic - a filesystem-based memory system for AI coding assistants. - -## Configuration - -| Setting | Value | -|---------|-------| -| Decision Context | Academic validation, strategic planning, and feature roadmap for mnemonic | -| Target Audience | Product team, technical team, open source community, executives | -| Geographic Scope | Global | -| Time Horizon | Near-term | -| Priority Areas | Filesystem-based approaches, emerging trends, academic foundations | - -## Artifacts - -### Reports -- [Full Report (Markdown)](./2026-01-24-report.md) - Comprehensive analysis with all sections -- [Full Report (HTML)](./2026-01-24-report.html) - Styled HTML with rendered Mermaid diagrams -- [Executive Summary](./2026-01-24-executive-summary.md) - One-page strategic brief -- [Research Findings](./2026-01-24-research.md) - Detailed research findings - -### Data -- [Research State](./state.json) - Elicitation context, findings, and sources -- [Report Metadata](./2026-01-24-report-metadata.json) - Generation details and quality checks - -## Key Findings - -1. **Filesystem approaches outperform specialized tools**: Letta benchmark shows 74.0% accuracy vs Mem0's 68.5% on LoCoMo benchmark -2. **Unix philosophy is academically validated for AI**: Arxiv paper confirms file abstraction is proven strategy for managing complexity -3. **Market gap in simple + private memory**: Mnemonic occupies underserved quadrant as competitors focus on complex cloud solutions -4. **GitHub Copilot validates approach**: Citation-based memory in public preview (Jan 2026) with 7% PR merge improvement -5. **Agentic memory is now table stakes**: VentureBeats 2026 predictions identify memory as essential AI capability - -## Surprising Insights - -- Simplicity correlates with reliability: LLMs use filesystem tools more effectively than novel retrieval mechanisms -- Iterative querying transforms retrieval into exploration - agents generate own queries and refine searches -- Memory Bank community workarounds for Cursor/Windsurf validate both market need and mnemonic's approach - -## Strategic Recommendation - -**Pursue organic growth through filesystem simplicity.** AI assistants with Bash access can use mnemonic directly without protocol overhead. This is validated by Letta's benchmark finding that LLMs perform better with familiar tools. - -## Feature Opportunities (All Implemented) - -1. **Documentation and Integration Guides** - Bash-native access for Cursor, Windsurf, Copilot -2. **Citation Validation** - Optional code citations with validation tool (`tools/mnemonic-validate`) -3. **Memory Compression** - Auto-compress memories for context efficiency (`gc --compress`) -4. **Enhanced Search** - Agent-driven iterative search (`/mnemonic:search-enhanced`) -5. **Multi-Agent Coordination** - Blackboard pattern extension (`mnemonic-agent-coordination`) - -## Report Contents - -| Section | Description | -|---------|-------------| -| Executive Summary | Key findings, strategic recommendation, market opportunity | -| Market Overview | Definition, size indicators, segments, maturity | -| Market Sizing | TAM ($52.62B), SAM ($8B), SOM ($50-100M) with trend indicators | -| Competitive Landscape | Competitor matrix, Porter's 5 Forces, positioning map | -| Trend Analysis | Macro/micro trends, transitional scenarios, terminal scenarios | -| SWOT Analysis | Strengths, weaknesses, opportunities, threats | -| Recommendations | 5 prioritized recommendations (all implemented) | -| Risk Assessment | Risk matrix, detailed risks, monitoring indicators | -| Appendix | Sources, methodology, timeline, glossary | - -## Visualizations Included - -- Market segment pie chart -- Market sizing breakdown -- Competitive positioning quadrant chart -- Transitional scenario state diagram -- Scenario trade-offs quadrant -- SWOT analysis overview -- Risk assessment matrix - ---- - -*Generated by [sigint](https://github.com/zircote/sigint)* diff --git a/reports/ai-memory-filesystem-research/state.json b/reports/ai-memory-filesystem-research/state.json deleted file mode 100644 index 0796510..0000000 --- a/reports/ai-memory-filesystem-research/state.json +++ /dev/null @@ -1,310 +0,0 @@ -{ - "topic": "AI Memory Systems with Filesystem-Based Interfaces", - "slug": "ai-memory-filesystem-research", - "started": "2026-01-24T02:15:00Z", - "updated": "2026-01-24T13:00:00Z", - "status": "complete", - "phase": "synthesis", - "change_log": [ - { - "date": "2026-01-24T13:00:00Z", - "type": "strategic_decision", - "summary": "MCP integration explicitly out of scope", - "changes": [ - "Removed all MCP integration recommendations", - "Updated strategy to focus on Bash-native access patterns", - "Emphasized that LLMs perform best with filesystem tools they were trained on", - "Positioned organic growth via documentation and community engagement" - ] - }, - { - "date": "2026-01-24T12:30:00Z", - "type": "update", - "summary": "Updated with January 2026 developments", - "changes": [ - "GitHub Copilot agentic memory in public preview (Jan 15)", - "VentureBeats 2026 predictions: agentic memory now table stakes" - ] - } - ], - "elicitation": { - "decision_context": "Academic validation, strategic planning, and feature roadmap for mnemonic", - "audience": [ - "product_team", - "technical_team", - "open_source_community", - "executive_strategic" - ], - "audience_expertise": "technical", - "prior_knowledge": "Mnemonic uses filesystem-based storage with MIF Level 3 format, YAML frontmatter, markdown content, git integration", - "hypotheses": [], - "research_style": "exploratory", - "scope": { - "geography": "global", - "segments": ["developer_tools", "ai_coding_assistants"], - "time_horizon": "near_term" - }, - "competitive_position": "new_entrant_simple_open_private", - "known_competitors": [ - "mem0", - "zep", - "langchain_memory", - "vector_databases", - "cursor_memories", - "windsurf_memories" - ], - "priorities": [ - "filesystem_based_approaches", - "emerging_trends", - "academic_foundations" - ], - "success_criteria": [ - "academic_backing_for_approach", - "differentiation_clarity", - "surprising_insights", - "feature_opportunities" - ], - "anti_patterns": "Recommendations that require departing from filesystem simplicity", - "timeline": "this_week", - "budget_context": "open_source" - }, - "research_areas": [ - { - "area": "filesystem_memory_patterns", - "focus": "POSIX tools, plain text storage, git integration, ripgrep search", - "priority": 1 - }, - { - "area": "emerging_trends", - "focus": "MCP ecosystem, multi-agent memory, context management standards", - "priority": 2 - }, - { - "area": "academic_foundations", - "focus": "Cognitive science memory models, temporal reasoning, decay functions", - "priority": 3 - } - ], - "findings": [ - { - "area": "filesystem_memory_patterns", - "finding": "Letta benchmark proves filesystem-based memory outperforms specialized tools: 74.0% accuracy vs Mem0's 68.5% on LoCoMo benchmark", - "source": "Letta AI Research - Benchmarking AI Agent Memory", - "implications": "Strong validation that mnemonic's filesystem approach is not just simpler but potentially more effective than vector/graph alternatives", - "confidence": 0.95 - }, - { - "area": "filesystem_memory_patterns", - "finding": "LLMs have extensive pretraining on filesystem operations, making simple tools more reliable than specialized knowledge graphs", - "source": "Letta AI Research", - "implications": "Agents using familiar tools (read, write, grep) are more reliable than those using novel retrieval mechanisms", - "confidence": 0.9 - }, - { - "area": "filesystem_memory_patterns", - "finding": "Arxiv paper 'From Everything is a File to Files Are All You Need' validates Unix philosophy for agentic AI systems", - "source": "arxiv.org/html/2601.11672", - "implications": "Academic validation that collapsing diverse interfaces into uniform file abstraction is a proven strategy for managing complexity", - "confidence": 0.9 - }, - { - "area": "filesystem_memory_patterns", - "finding": "ripgrep provides 5-10x performance improvement over GNU grep, particularly with line numbers enabled", - "source": "BurntSushi ripgrep benchmarks", - "implications": "mnemonic's reliance on ripgrep is well-founded; can confidently scale to large memory collections", - "confidence": 0.95 - }, - { - "area": "filesystem_memory_patterns", - "finding": "Git-based knowledge management provides version control, conflict resolution, and offline access that databases cannot match", - "source": "DEV Community, GitLab documentation", - "implications": "Git integration is a genuine differentiator for audit trails and collaboration", - "confidence": 0.85 - }, - { - "area": "emerging_trends", - "finding": "Bash-native access is sufficient for AI assistant integration; LLMs perform best with filesystem tools they were trained on", - "source": "Letta AI Research - LoCoMo benchmark", - "implications": "Mnemonic requires no protocol integration; any Bash-capable AI assistant can use it directly", - "confidence": 0.95, - "updated": "2026-01-24T13:00:00Z", - "note": "MCP integration explicitly out of scope per project decision" - }, - { - "area": "emerging_trends", - "finding": "Cursor and Windsurf both lack native persistent memory; community has built 'Memory Bank' workarounds using markdown files", - "source": "Cursor Forum, Windsurf Docs, GitHub memory-bank projects", - "implications": "Market gap exists that mnemonic can fill; existing workarounds validate the markdown-file approach", - "confidence": 0.9 - }, - { - "area": "emerging_trends", - "finding": "GitHub Copilot agentic memory now in public preview (Jan 15, 2026): cross-agent memory sharing with 7% PR merge rate improvement, 28-day auto-expiry, citation-based validation", - "source": "GitHub Changelog Jan 15 2026, GitHub Blog", - "implications": "Cross-agent memory is production-ready at GitHub scale; mnemonic's approach validated by industry leader", - "confidence": 0.95, - "updated": "2026-01-24T12:30:00Z", - "previous_value": "citation-based validation pattern (early access)" - }, - { - "area": "emerging_trends", - "finding": "Multi-agent memory sharing is emerging pattern with 4 major protocols: MCP, ACP, A2A, ANP", - "source": "Multiple industry sources, LinkedIn, MachineLearningMastery", - "implications": "mnemonic's blackboard pattern for cross-session coordination is ahead of curve; extend to multi-agent", - "confidence": 0.8 - }, - { - "area": "emerging_trends", - "finding": "Mem0 claims 26% accuracy improvement and 90% lower token usage vs full-context approaches", - "source": "Mem0 Research, mem0.ai", - "implications": "Memory layer approach is validated; mnemonic can achieve similar benefits with simpler implementation", - "confidence": 0.75 - }, - { - "area": "academic_foundations", - "finding": "Cognitive science memory types (semantic, episodic, procedural) are being directly applied in AI agent architectures", - "source": "Medium articles, arxiv papers on AI memory surveys", - "implications": "mnemonic's three memory types are academically grounded and align with emerging standards", - "confidence": 0.9 - }, - { - "area": "academic_foundations", - "finding": "Bi-temporal data modeling (valid time vs transaction time) has SQL:2011 standard backing", - "source": "Wikipedia, Martin Fowler, XTDB Docs", - "implications": "mnemonic's temporal model follows established database theory; opportunity to enhance temporal queries", - "confidence": 0.9 - }, - { - "area": "academic_foundations", - "finding": "Ebbinghaus forgetting curve research being applied to neural networks; decay modeling shown to enhance training efficiency", - "source": "arxiv paper on human-like forgetting curves in DNNs", - "implications": "mnemonic's decay modeling has academic foundation; could enhance with smarter decay scheduling", - "confidence": 0.8 - }, - { - "area": "academic_foundations", - "finding": "Context compression research shows 6:1 compression with >90% semantic fidelity is achievable", - "source": "Medium article on Context Extension Protocol", - "implications": "Opportunity for mnemonic to implement context compression for memory summaries", - "confidence": 0.7 - }, - { - "area": "surprising_insights", - "finding": "Simplicity correlates with reliability: simpler tools in LLM training data are used more effectively by agents", - "source": "Letta Research", - "implications": "mnemonic's POSIX tool approach is a feature not a limitation; complexity is actually a liability", - "confidence": 0.9 - }, - { - "area": "surprising_insights", - "finding": "Iterative querying advantage: agents can generate own queries and continue searching, transforming retrieval into exploration", - "source": "Letta Research", - "implications": "mnemonic could enhance search with agent-driven iterative refinement capabilities", - "confidence": 0.85 - }, - { - "area": "surprising_insights", - "finding": "Personal science wiki research shows structured documentation in shared repos improves consensus knowledge building", - "source": "Royal Society Open Science paper", - "implications": "mnemonic could position for team/org knowledge sharing beyond individual AI assistant use", - "confidence": 0.75 - }, - { - "area": "feature_opportunities", - "finding": "Integration guides for Cursor, Windsurf, Copilot using Bash-native access patterns", - "source": "Integration documentation analysis", - "implications": "Focus on documentation and rules files that leverage native filesystem access", - "confidence": 0.95, - "updated": "2026-01-24T13:00:00Z", - "note": "MCP integration explicitly out of scope" - }, - { - "area": "feature_opportunities", - "finding": "Citation-based memory validation (like GitHub Copilot) could prevent stale memory usage", - "source": "GitHub Copilot Memory documentation", - "implications": "Add optional citation fields that can be validated against current codebase", - "confidence": 0.8 - }, - { - "area": "feature_opportunities", - "finding": "Memory compression/summarization for context window efficiency is emerging pattern", - "source": "Context window management research", - "implications": "Add auto-summarization capability that preserves semantic content while reducing tokens", - "confidence": 0.75 - } - ], - "sources": [ - { - "url": "https://www.letta.com/blog/benchmarking-ai-agent-memory", - "title": "Benchmarking AI Agent Memory: Is a Filesystem All You Need?", - "type": "research", - "reliability": "high" - }, - { - "url": "https://arxiv.org/html/2601.11672", - "title": "From Everything is a File to Files Are All You Need: Unix Philosophy for Agentic AI", - "type": "academic", - "reliability": "high" - }, - { - "url": "https://github.com/BurntSushi/ripgrep", - "title": "ripgrep - Fast grep alternative", - "type": "documentation", - "reliability": "high" - }, - { - "url": "https://modelcontextprotocol.io/specification/2025-11-25", - "title": "Model Context Protocol Specification", - "type": "specification", - "reliability": "high" - }, - { - "url": "https://github.blog/ai-and-ml/github-copilot/building-an-agentic-memory-system-for-github-copilot/", - "title": "Building an Agentic Memory System for GitHub Copilot", - "type": "industry", - "reliability": "high" - }, - { - "url": "https://docs.windsurf.com/windsurf/cascade/memories", - "title": "Windsurf Cascade Memories Documentation", - "type": "documentation", - "reliability": "high" - }, - { - "url": "https://mem0.ai/research", - "title": "Mem0 AI Memory Research", - "type": "research", - "reliability": "medium" - }, - { - "url": "https://arxiv.org/html/2411.00489v1", - "title": "Human-inspired Perspectives: A Survey on AI Long-term Memory", - "type": "academic", - "reliability": "high" - }, - { - "url": "https://martinfowler.com/articles/bitemporal-history.html", - "title": "Bitemporal History - Martin Fowler", - "type": "documentation", - "reliability": "high" - }, - { - "url": "https://en.wikipedia.org/wiki/Unix_philosophy", - "title": "Unix Philosophy - Wikipedia", - "type": "reference", - "reliability": "high" - }, - { - "url": "https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents", - "title": "Effective Context Engineering for AI Agents - Anthropic", - "type": "industry", - "reliability": "high" - }, - { - "url": "https://royalsocietypublishing.org/doi/10.1098/rsos.240275", - "title": "Co-designing a wiki-based community knowledge management system", - "type": "academic", - "reliability": "high" - } - ] -} diff --git a/scripts/cleanup_memory_paths.py b/scripts/cleanup_memory_paths.py deleted file mode 100644 index 17a58e3..0000000 --- a/scripts/cleanup_memory_paths.py +++ /dev/null @@ -1,244 +0,0 @@ -#!/usr/bin/env python3 -""" -Cleanup Memory Paths Script - -Fixes the messed up directory structure in ${MNEMONIC_ROOT}: -1. Removes double-nested paths (semantic/semantic/decisions → semantic/decisions) -2. Cleans up stray root-level directories that should be under an org -3. Removes empty files and directories -4. Properly structures org/project/namespace hierarchy - -Usage: - python scripts/cleanup_memory_paths.py --dry-run # Preview changes - python scripts/cleanup_memory_paths.py --commit # Execute and commit -""" - -import argparse -import os -import shutil -import subprocess -from pathlib import Path -from typing import List, Tuple - -# Valid org directories (everything else at root should be removed or moved) -VALID_ROOT_ITEMS = { - ".git", - ".gitignore", - ".blackboard", - ".obsidian", - # Known orgs - "zircote", - "default", - "HMH-ProdOps", -} - -# Valid cognitive namespaces -VALID_NAMESPACES = { - "semantic", - "episodic", - "procedural", -} - -# Valid sub-namespaces -VALID_SUB_NAMESPACES = { - "semantic": {"decisions", "knowledge", "entities"}, - "episodic": {"incidents", "sessions", "blockers"}, - "procedural": {"runbooks", "patterns", "migrations"}, -} - - -def find_double_nested_paths(base_path: Path) -> List[Tuple[Path, Path]]: - """Find paths with double nesting like semantic/semantic/decisions.""" - moves = [] - - for ns in VALID_NAMESPACES: - # Look for patterns like semantic/semantic/ or episodic/episodic/ - double_path = base_path / ns / ns - if double_path.exists(): - for item in double_path.iterdir(): - if item.is_dir(): - correct_path = base_path / ns / item.name - moves.append((item, correct_path)) - - # Also check procedural/procedural/patterns -> procedural/patterns - for org in base_path.iterdir(): - if org.name in VALID_ROOT_ITEMS and org.name not in {"zircote", "default", "HMH-ProdOps"}: - continue - if not org.is_dir(): - continue - - for ns in VALID_NAMESPACES: - double_path = org / ns / ns - if double_path.exists(): - for item in double_path.iterdir(): - if item.is_dir(): - correct_path = org / ns / item.name - moves.append((item, correct_path)) - - # Check for procedural/procedural/patterns pattern - triple_path = org / "procedural" / "procedural" / "patterns" - if triple_path.exists(): - correct_path = org / "procedural" / "patterns" - moves.append((triple_path, correct_path)) - - return moves - - -def find_stray_root_items(base_path: Path) -> List[Path]: - """Find items at root that shouldn't be there.""" - strays = [] - - for item in base_path.iterdir(): - if item.name.startswith("."): - continue - if item.name in VALID_ROOT_ITEMS: - continue - # Check if it's an old namespace at root - if item.name in {"apis", "blockers", "context", "decisions", "learnings", - "patterns", "security", "testing", "episodic", "bridge", - "semantic", "procedural", "_test_debug"}: - strays.append(item) - # Check for stray files - if item.is_file(): - strays.append(item) - - return strays - - -def merge_directories(src: Path, dst: Path, dry_run: bool = True) -> int: - """Merge source directory into destination.""" - if not src.exists(): - return 0 - - count = 0 - - for item in src.rglob("*"): - if item.is_file(): - rel_path = item.relative_to(src) - dest_file = dst / rel_path - - if dry_run: - print(f" Would move: {item.name} → {dest_file}") - else: - dest_file.parent.mkdir(parents=True, exist_ok=True) - if dest_file.exists(): - print(f" Skipping (exists): {dest_file}") - else: - shutil.move(str(item), str(dest_file)) - print(f" Moved: {item.name}") - count += 1 - - return count - - -def cleanup_empty_dirs(base_path: Path): - """Remove empty directories recursively.""" - for dirpath, _, _ in os.walk(str(base_path), topdown=False): - path = Path(dirpath) - if path.name.startswith("."): - continue - try: - if not any(path.iterdir()): - path.rmdir() - print(f" Removed empty: {path}") - except OSError: - pass - - -def main(): - parser = argparse.ArgumentParser(description="Cleanup mnemonic memory paths") - parser.add_argument("--dry-run", action="store_true", help="Preview changes") - parser.add_argument("--commit", action="store_true", help="Execute and commit") - parser.add_argument("--path", type=Path, default=Path.home() / ".claude" / "mnemonic") - - args = parser.parse_args() - base_path = args.path - dry_run = args.dry_run or not args.commit - - if not base_path.exists(): - print(f"Path does not exist: {base_path}") - return - - print(f"Cleaning up: {base_path}\n") - - # Step 1: Fix double-nested paths - print("Step 1: Fixing double-nested paths...") - double_nested = find_double_nested_paths(base_path) - for src, dst in double_nested: - if dry_run: - print(f" Would merge: {src} → {dst}") - else: - count = merge_directories(src, dst, dry_run=False) - if count > 0: - # Remove empty source - try: - shutil.rmtree(str(src)) - except Exception as e: - print(f" Error removing {src}: {e}") - - # Step 2: Handle stray root items - print("\nStep 2: Handling stray root items...") - strays = find_stray_root_items(base_path) - for stray in strays: - if stray.is_file(): - if dry_run: - print(f" Would remove file: {stray.name}") - else: - stray.unlink() - print(f" Removed file: {stray.name}") - elif stray.is_dir(): - # Check if it has memory files that should be migrated - memory_files = list(stray.rglob("*.memory.md")) - if memory_files: - print(f" Found {len(memory_files)} memories in stray dir: {stray.name}") - if not dry_run: - # Move to default org - default_dir = base_path / "default" - merge_directories(stray, default_dir, dry_run=False) - - if dry_run: - print(f" Would remove dir: {stray.name}") - else: - try: - shutil.rmtree(str(stray)) - print(f" Removed dir: {stray.name}") - except Exception as e: - print(f" Error removing {stray}: {e}") - - # Step 3: Clean up empty directories - if not dry_run: - print("\nStep 3: Cleaning up empty directories...") - cleanup_empty_dirs(base_path) - - # Step 4: Show final structure - print("\nFinal structure:") - for item in sorted(base_path.iterdir()): - if item.name.startswith(".") and item.name != ".blackboard": - continue - if item.is_dir(): - count = len(list(item.rglob("*.memory.md"))) - print(f" {item.name}/ ({count} memories)") - - if dry_run: - print("\n(Dry run - no changes made)") - print("Run with --commit to execute changes") - elif args.commit: - # Git commit - os.chdir(base_path) - subprocess.run(["git", "add", "-A"], check=True) - result = subprocess.run(["git", "status", "--porcelain"], capture_output=True, text=True) - if result.stdout.strip(): - subprocess.run([ - "git", "commit", "-m", - "chore: cleanup memory directory structure\n\n" - "- Fixed double-nested paths (semantic/semantic → semantic)\n" - "- Removed stray root-level directories\n" - "- Cleaned up empty directories" - ], check=True) - print("\nCreated git commit") - else: - print("\nNo changes to commit") - - -if __name__ == "__main__": - main() diff --git a/scripts/fix_malformed_memories.py b/scripts/fix_malformed_memories.py deleted file mode 100755 index eb8f6b1..0000000 --- a/scripts/fix_malformed_memories.py +++ /dev/null @@ -1,340 +0,0 @@ -#!/usr/bin/env python3 -""" -Fix Malformed Memory Files - -Repairs common issues in memory files: -1. Missing frontmatter delimiter (---) -2. Missing required fields (id, type, namespace, title, created) -3. Invalid UUID format in id field - -Usage: - python scripts/fix_malformed_memories.py --dry-run # Preview changes - python scripts/fix_malformed_memories.py # Execute fixes - python scripts/fix_malformed_memories.py --delete # Delete unfixable files -""" - -import argparse -import re -import uuid -from datetime import datetime, timezone -from pathlib import Path - - -def detect_type_from_namespace(namespace: str) -> str: - """Infer memory type from namespace.""" - if namespace.startswith("semantic") or namespace in [ - "decisions", - "knowledge", - "apis", - "context", - "learnings", - "security", - ]: - return "semantic" - elif namespace.startswith("episodic") or namespace in ["blockers", "incidents", "sessions"]: - return "episodic" - elif namespace.startswith("procedural") or namespace in ["patterns", "runbooks", "migrations", "testing"]: - return "procedural" - return "semantic" - - -def detect_namespace_from_path(file_path: Path) -> str: - """Extract namespace from file path.""" - parts = file_path.parts - - # Look for known namespace patterns - for i, part in enumerate(parts): - if part in ["semantic", "episodic", "procedural"]: - if i + 1 < len(parts) and parts[i + 1] in [ - "decisions", - "knowledge", - "entities", - "incidents", - "sessions", - "blockers", - "runbooks", - "patterns", - "migrations", - ]: - return f"{part}/{parts[i + 1]}" - return part - if part in ["decisions", "learnings", "patterns", "blockers", "apis", "context", "security", "testing"]: - return part - - return "_semantic/knowledge" - - -def is_valid_uuid(value: str) -> bool: - """Check if string is valid UUID.""" - try: - uuid.UUID(value) - return True - except (ValueError, AttributeError): - return False - - -def extract_frontmatter(content: str) -> tuple: - """Extract frontmatter and body from content.""" - if not content.startswith("---"): - return None, content - - match = re.match(r"^---\n(.*?)\n---\n?(.*)", content, re.DOTALL) - if match: - return match.group(1), match.group(2) - return None, content - - -def parse_yaml_frontmatter(frontmatter: str) -> dict: - """Simple YAML frontmatter parser.""" - result = {} - current_key = None - current_list = None - - for line in frontmatter.split("\n"): - if not line.strip(): - continue - - # Check for list item - if line.startswith(" - "): - if current_list is not None: - current_list.append(line[4:].strip().strip('"').strip("'")) - continue - - # Check for key: value - if ":" in line and not line.startswith(" "): - key, _, value = line.partition(":") - key = key.strip() - value = value.strip().strip('"').strip("'") - - if value: - result[key] = value - else: - # Might be a list - result[key] = [] - current_list = result[key] - current_key = key # noqa: F841 — retained for parser state tracking - - return result - - -def generate_frontmatter(data: dict) -> str: - """Generate YAML frontmatter from dict.""" - lines = ["---"] - - # Order fields properly - field_order = ["id", "type", "namespace", "title", "created", "modified", "confidence", "tags"] - - for field in field_order: - if field in data: - value = data[field] - if isinstance(value, list): - lines.append(f"{field}:") - for item in value: - lines.append(f" - {item}") - elif " " in str(value) or ":" in str(value): - lines.append(f'{field}: "{value}"') - else: - lines.append(f"{field}: {value}") - - # Add any remaining fields - for key, value in data.items(): - if key not in field_order: - if isinstance(value, list): - lines.append(f"{key}:") - for item in value: - lines.append(f" - {item}") - elif " " in str(value) or ":" in str(value): - lines.append(f'{key}: "{value}"') - else: - lines.append(f"{key}: {value}") - - lines.append("---") - return "\n".join(lines) - - -def fix_memory_file(file_path: Path, dry_run: bool = True) -> dict: - """Fix a malformed memory file. Returns dict with fix details.""" - result = { - "path": str(file_path), - "fixes": [], - "errors": [], - "fixed": False, - "content": None, - } - - try: - content = file_path.read_text() - except Exception as e: - result["errors"].append(f"Cannot read file: {e}") - return result - - # Check for frontmatter - frontmatter, body = extract_frontmatter(content) - - if frontmatter is None: - # Try to find frontmatter without proper start - if "---" in content: - # Find first --- and assume it ends frontmatter - parts = content.split("---", 2) - if len(parts) >= 2: - frontmatter = parts[1].strip() - body = parts[2] if len(parts) > 2 else "" - result["fixes"].append("Added missing frontmatter start delimiter") - else: - # No frontmatter at all - create minimal one - frontmatter = "" - body = content - result["fixes"].append("Created new frontmatter") - - # Parse frontmatter - data = parse_yaml_frontmatter(frontmatter) if frontmatter else {} - - # Detect namespace from path - namespace = detect_namespace_from_path(file_path) - - # Fix missing id - if "id" not in data or not data["id"]: - # Try to extract from filename - filename = file_path.stem - uuid_match = re.search(r"([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})", filename) - if uuid_match: - data["id"] = uuid_match.group(1) - result["fixes"].append(f"Extracted id from filename: {data['id']}") - else: - data["id"] = str(uuid.uuid4()) - result["fixes"].append(f"Generated new id: {data['id']}") - elif not is_valid_uuid(data["id"]): - old_id = data["id"] - data["id"] = str(uuid.uuid4()) - result["fixes"].append(f"Replaced invalid id '{old_id}' with: {data['id']}") - - # Fix missing type - if "type" not in data or not data["type"]: - data["type"] = detect_type_from_namespace(namespace) - result["fixes"].append(f"Added type: {data['type']}") - - # Fix missing namespace - if "namespace" not in data or not data["namespace"]: - data["namespace"] = namespace - result["fixes"].append(f"Added namespace: {namespace}") - - # Fix missing title - if "title" not in data or not data["title"]: - # Try to extract from filename or first heading - filename = file_path.stem - # Remove UUID prefix if present - title = re.sub(r"^[a-f0-9-]{36}-", "", filename) - title = title.replace("-", " ").replace("_", " ").title() - data["title"] = title - result["fixes"].append(f"Generated title: {title}") - - # Fix missing created - if "created" not in data or not data["created"]: - # Use file modification time - mtime = file_path.stat().st_mtime - created = datetime.fromtimestamp(mtime, tz=timezone.utc).isoformat() - data["created"] = created - result["fixes"].append(f"Added created from file mtime: {created}") - - # Add default confidence if missing - if "confidence" not in data: - data["confidence"] = "0.9" - result["fixes"].append("Added default confidence: 0.9") - - if result["fixes"]: - # Generate new content - new_frontmatter = generate_frontmatter(data) - new_content = f"{new_frontmatter}\n\n{body.strip()}\n" - result["content"] = new_content - result["fixed"] = True - - if not dry_run: - try: - file_path.write_text(new_content) - except Exception as e: - result["errors"].append(f"Cannot write file: {e}") - result["fixed"] = False - - return result - - -def find_memory_files(base_paths: list) -> list: - """Find all memory files in given paths.""" - files = [] - for base_path in base_paths: - if base_path.exists(): - files.extend(base_path.rglob("*.memory.md")) - return files - - -def main(): - parser = argparse.ArgumentParser(description="Fix malformed memory files") - parser.add_argument( - "--dry-run", - action="store_true", - help="Preview changes without executing", - ) - parser.add_argument( - "--delete", - action="store_true", - help="Delete files that cannot be fixed", - ) - parser.add_argument( - "--path", - type=Path, - default=None, - help="Specific path to scan", - ) - parser.add_argument( - "--verbose", - "-v", - action="store_true", - help="Show details for each file", - ) - - args = parser.parse_args() - - # Paths to scan - if args.path: - paths = [args.path] - else: - paths = [ - Path.home() / ".claude" / "mnemonic", - Path.cwd() / ".claude" / "mnemonic", - ] - - print("Scanning for malformed memory files...") - files = find_memory_files(paths) - print(f"Found {len(files)} memory files\n") - - fixed_count = 0 - error_count = 0 - - for file_path in files: - result = fix_memory_file(file_path, dry_run=args.dry_run) - - if result["fixes"]: - fixed_count += 1 - print(f"{'[DRY RUN] ' if args.dry_run else ''}Fixed: {file_path.name}") - if args.verbose: - for fix in result["fixes"]: - print(f" - {fix}") - - if result["errors"]: - error_count += 1 - print(f"Error: {file_path.name}") - for err in result["errors"]: - print(f" ! {err}") - - print(f"\n{'=' * 50}") - print(f"Total files scanned: {len(files)}") - print(f"Files fixed: {fixed_count}") - print(f"Files with errors: {error_count}") - - if args.dry_run and fixed_count > 0: - print("\n(Dry run - no changes made)") - print("Run without --dry-run to apply fixes") - - -if __name__ == "__main__": - main() diff --git a/scripts/migrate_namespaces.py b/scripts/migrate_namespaces.py deleted file mode 100755 index 762448f..0000000 --- a/scripts/migrate_namespaces.py +++ /dev/null @@ -1,277 +0,0 @@ -#!/usr/bin/env python3 -""" -Namespace Migration Script - -Migrates existing mnemonic memories from the v1.0 flat namespace model -to the v2.0 cognitive triad hierarchy. - -Migration mapping: -- apis → semantic/knowledge -- blockers → episodic/blockers -- context → semantic/knowledge -- decisions → semantic/decisions -- learnings → semantic/knowledge -- patterns → procedural/patterns -- security → semantic/knowledge -- testing → procedural/patterns -- episodic → episodic/sessions - -Usage: - python scripts/migrate_namespaces.py --dry-run # Preview changes - python scripts/migrate_namespaces.py # Execute migration - python scripts/migrate_namespaces.py --commit # Execute and commit -""" - -import argparse -import re -import subprocess -from datetime import datetime -from pathlib import Path -from typing import Dict, List, Tuple - -# Migration mapping: old namespace → new namespace path -NAMESPACE_MIGRATION = { - "apis": "_semantic/knowledge", - "blockers": "_episodic/blockers", - "context": "_semantic/knowledge", - "decisions": "_semantic/decisions", - "learnings": "_semantic/knowledge", - "patterns": "_procedural/patterns", - "security": "_semantic/knowledge", - "testing": "_procedural/patterns", - "episodic": "_episodic/sessions", -} - - -def find_memory_files(base_path: Path) -> List[Path]: - """Find all memory files in the given path.""" - if not base_path.exists(): - return [] - return list(base_path.rglob("*.memory.md")) - - -def detect_namespace(file_path: Path) -> str: - """Detect the namespace from file path or content.""" - # Check path for namespace - for old_ns in NAMESPACE_MIGRATION: - if f"/{old_ns}/" in str(file_path): - return old_ns - - # Check frontmatter - try: - with open(file_path) as f: - content = f.read(2000) - match = re.search(r"namespace:\s*['\"]?(\w+)", content) - if match: - return match.group(1) - except Exception: - pass - - return "" - - -def update_frontmatter(content: str, old_ns: str, new_ns: str) -> str: - """Update namespace in frontmatter.""" - # Replace namespace field - content = re.sub( - rf"(namespace:\s*['\"]?){old_ns}(['\"]?)", - rf"\g<1>{new_ns}\g<2>", - content, - ) - - # Add migration note if not present - if "migration:" not in content: - # Find end of frontmatter - match = re.search(r"^---\n(.*?)^---", content, re.MULTILINE | re.DOTALL) - if match: - frontmatter = match.group(1) - migration_note = f"migration:\n from: {old_ns}\n date: {datetime.now().isoformat()}\n" - new_frontmatter = frontmatter.rstrip() + "\n" + migration_note - content = content.replace(frontmatter, new_frontmatter) - - return content - - -def get_new_path(old_path: Path, old_ns: str, new_ns: str) -> Path: - """Calculate the new path for a memory file.""" - path_str = str(old_path) - - # Replace namespace in path - # Handle both /{namespace}/ and /{namespace}/project/ patterns - new_path_str = path_str.replace(f"/{old_ns}/", f"/{new_ns}/") - - return Path(new_path_str) - - -def migrate_file( - file_path: Path, - old_ns: str, - new_ns: str, - dry_run: bool = True, -) -> Tuple[Path, bool]: - """Migrate a single file to new namespace.""" - new_path = get_new_path(file_path, old_ns, new_ns) - - if dry_run: - return new_path, True - - try: - # Read and update content - with open(file_path) as f: - content = f.read() - - updated_content = update_frontmatter(content, old_ns, new_ns) - - # Create destination directory - new_path.parent.mkdir(parents=True, exist_ok=True) - - # Write to new location - with open(new_path, "w") as f: - f.write(updated_content) - - # Remove old file - file_path.unlink() - - # Remove empty directories - try: - file_path.parent.rmdir() - except OSError: - pass # Directory not empty - - return new_path, True - - except Exception as e: - print(f"Error migrating {file_path}: {e}") - return file_path, False - - -def migrate_directory( - base_path: Path, - dry_run: bool = True, -) -> Dict[str, List[Tuple[Path, Path]]]: - """Migrate all memories in a directory.""" - migrations = {} - - for file_path in find_memory_files(base_path): - old_ns = detect_namespace(file_path) - - if old_ns not in NAMESPACE_MIGRATION: - continue - - new_ns = NAMESPACE_MIGRATION[old_ns] - - if old_ns not in migrations: - migrations[old_ns] = [] - - new_path, success = migrate_file(file_path, old_ns, new_ns, dry_run) - - if success: - migrations[old_ns].append((file_path, new_path)) - - return migrations - - -def print_migration_summary(migrations: Dict[str, List[Tuple[Path, Path]]]): - """Print summary of migrations.""" - total = sum(len(files) for files in migrations.values()) - - if total == 0: - print("No files to migrate") - return - - print(f"\nMigration Summary: {total} files\n") - - for old_ns, files in sorted(migrations.items()): - new_ns = NAMESPACE_MIGRATION[old_ns] - print(f"{old_ns} → {new_ns}: {len(files)} files") - for old_path, _new_path in files[:3]: # Show first 3 - print(f" {old_path.name}") - if len(files) > 3: - print(f" ... and {len(files) - 3} more") - - -def create_git_commit(migrations: Dict[str, List[Tuple[Path, Path]]]): - """Create a git commit for the migration.""" - total = sum(len(files) for files in migrations.values()) - - if total == 0: - return - - # Stage all changes - subprocess.run(["git", "add", "-A"], check=True) - - # Create commit message - ns_summary = ", ".join(f"{old}→{NAMESPACE_MIGRATION[old]}" for old in sorted(migrations.keys())) - - message = f"""chore: migrate {total} memories to cognitive triad namespaces - -Migrated namespaces: {ns_summary} - -This migration moves memories from the v1.0 flat namespace model -to the v2.0 cognitive triad hierarchy (semantic/episodic/procedural). -""" - - subprocess.run(["git", "commit", "-m", message], check=True) - print("\nCreated git commit for migration") - - -def main(): - parser = argparse.ArgumentParser(description="Migrate mnemonic memories to new namespace hierarchy") - parser.add_argument( - "--dry-run", - action="store_true", - help="Preview changes without executing", - ) - parser.add_argument( - "--commit", - action="store_true", - help="Create git commit after migration", - ) - parser.add_argument( - "--path", - type=Path, - default=None, - help="Path to migrate (default: ${MNEMONIC_ROOT} and ./.claude/mnemonic)", - ) - - args = parser.parse_args() - - # Determine paths to migrate - if args.path: - paths = [args.path] - else: - paths = [ - Path.home() / ".claude" / "mnemonic", - Path.cwd() / ".claude" / "mnemonic", - ] - - dry_run = args.dry_run or not args.commit - - if dry_run and not args.dry_run: - print("Note: Use --commit to execute migration with git commit") - print() - - all_migrations = {} - - for path in paths: - if not path.exists(): - continue - - print(f"Scanning: {path}") - migrations = migrate_directory(path, dry_run=dry_run) - - for ns, files in migrations.items(): - if ns not in all_migrations: - all_migrations[ns] = [] - all_migrations[ns].extend(files) - - print_migration_summary(all_migrations) - - if dry_run: - print("\n(Dry run - no changes made)") - elif args.commit and all_migrations: - create_git_commit(all_migrations) - - -if __name__ == "__main__": - main() diff --git a/scripts/migrate_scope_paths.py b/scripts/migrate_scope_paths.py deleted file mode 100755 index 9728739..0000000 --- a/scripts/migrate_scope_paths.py +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env python3 -""" -Scope Path Migration Script - -Migrates memories from redundant /user/ and /project/ subdirectories -to the parent namespace directory. - -Before: ${MNEMONIC_ROOT}/{org}/{namespace}/user/*.memory.md -After: ${MNEMONIC_ROOT}/{org}/{namespace}/*.memory.md - -Before: ./.claude/mnemonic/{namespace}/project/*.memory.md -After: ./.claude/mnemonic/{namespace}/*.memory.md - -Usage: - python scripts/migrate_scope_paths.py --dry-run # Preview changes - python scripts/migrate_scope_paths.py # Execute migration -""" - -import argparse -import shutil -from pathlib import Path - - -def find_scope_dirs(base_path: Path) -> list: - """Find all /user/ and /project/ directories.""" - scope_dirs = [] - for scope_name in ["user", "project"]: - for scope_dir in base_path.rglob(scope_name): - if scope_dir.is_dir(): - # Check if it contains memory files - memories = list(scope_dir.glob("*.memory.md")) - if memories: - scope_dirs.append(scope_dir) - return scope_dirs - - -def migrate_scope_dir(scope_dir: Path, dry_run: bool = True) -> list: - """Move all memories from scope dir to parent namespace dir.""" - migrations = [] - parent_dir = scope_dir.parent - - for memory_file in scope_dir.glob("*.memory.md"): - new_path = parent_dir / memory_file.name - - if dry_run: - migrations.append((memory_file, new_path)) - else: - try: - shutil.move(str(memory_file), str(new_path)) - migrations.append((memory_file, new_path)) - except Exception as e: - print(f"Error moving {memory_file}: {e}") - - # Remove empty scope directory - if not dry_run and not any(scope_dir.iterdir()): - try: - scope_dir.rmdir() - except Exception: - pass - - return migrations - - -def main(): - parser = argparse.ArgumentParser( - description="Migrate memories from /user/ and /project/ subdirectories" - ) - parser.add_argument( - "--dry-run", - action="store_true", - help="Preview changes without executing", - ) - - args = parser.parse_args() - - # Paths to check - paths = [ - Path.home() / ".claude" / "mnemonic", - Path.cwd() / ".claude" / "mnemonic", - ] - - total_migrations = [] - - for base_path in paths: - if not base_path.exists(): - continue - - print(f"Scanning: {base_path}") - scope_dirs = find_scope_dirs(base_path) - - for scope_dir in scope_dirs: - migrations = migrate_scope_dir(scope_dir, dry_run=args.dry_run) - total_migrations.extend(migrations) - - if migrations: - scope_type = scope_dir.name - print(f" {scope_dir.parent.name}/{scope_type}/: {len(migrations)} files") - - if total_migrations: - print(f"\nTotal: {len(total_migrations)} files migrated") - if args.dry_run: - print("\n(Dry run - no changes made)") - print("Run without --dry-run to execute migration") - else: - print("\nNo files to migrate") - - -if __name__ == "__main__": - main() diff --git a/scripts/migrate_to_v2_paths.py b/scripts/migrate_to_v2_paths.py deleted file mode 100644 index 023959e..0000000 --- a/scripts/migrate_to_v2_paths.py +++ /dev/null @@ -1,526 +0,0 @@ -#!/usr/bin/env python3 -""" -Migrate Mnemonic Memories from Legacy to V2 Path Scheme - -Migrates memories from the legacy dual-location structure to the unified -V2 path structure where everything is stored under ${MNEMONIC_ROOT}. - -Legacy Structure: - ${MNEMONIC_ROOT}/{org}/{namespace}/ - ./.claude/mnemonic/{namespace}/ - -V2 Structure: - ${MNEMONIC_ROOT}/{org}/{project}/{namespace}/ - ${MNEMONIC_ROOT}/{org}/{namespace}/ # org-wide - -Usage: - python scripts/migrate_to_v2_paths.py --dry-run # Preview changes - python scripts/migrate_to_v2_paths.py # Execute migration - python scripts/migrate_to_v2_paths.py --rollback # Revert migration - -Features: - - Automatic backup before migration - - Rollback capability - - Progress tracking - - Git commit of changes -""" - -import argparse -import json -import shutil -import subprocess -import sys -from dataclasses import asdict, dataclass -from datetime import datetime, timezone -from pathlib import Path -from typing import Dict, List - -# Add lib to path for imports -sys.path.insert(0, str(Path(__file__).parent.parent)) - -from lib.paths import PathContext, PathResolver, PathScheme, Scope - - -@dataclass -class MigrationRecord: - """Record of a single file migration.""" - source: str - destination: str - namespace: str - scope: str - timestamp: str - success: bool - error: str = "" - - -@dataclass -class MigrationPlan: - """Complete migration plan.""" - legacy_roots: List[str] - v2_root: str - total_memories: int - total_size_bytes: int - migrations: List[MigrationRecord] - created: str - - -class MigrationManager: - """Manages the migration from legacy to V2 path scheme.""" - - def __init__(self, dry_run: bool = True, verbose: bool = False): - self.dry_run = dry_run - self.verbose = verbose - - # Create resolvers for both schemes - self.legacy_context = PathContext.detect(scheme=PathScheme.LEGACY) - self.v2_context = PathContext.detect(scheme=PathScheme.V2) - - self.legacy_resolver = PathResolver(self.legacy_context) - self.v2_resolver = PathResolver(self.v2_context) - - # Track migration state - self.plan: MigrationPlan | None = None - self.backup_dir: Path | None = None - - def analyze(self) -> MigrationPlan: - """ - Analyze current structure and create migration plan. - - Returns: - MigrationPlan with all files to migrate - """ - if self.verbose: - print("Analyzing current memory structure...") - - migrations = [] - total_size = 0 - - # Get all legacy memory roots - legacy_roots = self.legacy_resolver.get_all_memory_roots() - - for legacy_root in legacy_roots: - if not legacy_root.exists(): - continue - - if self.verbose: - print(f" Scanning: {legacy_root}") - - # Find all memory files - for memory_file in legacy_root.rglob("*.memory.md"): - # Determine namespace from path - namespace = self._extract_namespace(memory_file, legacy_root) - - # Determine scope (project if under .claude in cwd, else user) - if self._is_project_memory(memory_file): - scope = Scope.PROJECT - else: - scope = Scope.USER - - # Calculate V2 destination - v2_path = self._compute_v2_path(memory_file, namespace, scope) - - # Get file size - file_size = memory_file.stat().st_size - total_size += file_size - - migrations.append(MigrationRecord( - source=str(memory_file), - destination=str(v2_path), - namespace=namespace, - scope=scope.value, - timestamp=datetime.now(timezone.utc).isoformat(), - success=False, - )) - - plan = MigrationPlan( - legacy_roots=[str(r) for r in legacy_roots], - v2_root=str(self.v2_resolver.context.home_dir / ".claude" / "mnemonic"), - total_memories=len(migrations), - total_size_bytes=total_size, - migrations=migrations, - created=datetime.now(timezone.utc).isoformat(), - ) - - self.plan = plan - return plan - - def _extract_namespace(self, file_path: Path, root: Path) -> str: - """Extract namespace from file path relative to root.""" - relative = file_path.parent.relative_to(root) - return str(relative) if str(relative) != "." else "" - - def _is_project_memory(self, file_path: Path) -> bool: - """Check if memory is in project directory.""" - try: - file_path.relative_to(self.legacy_context.project_dir) - return True - except ValueError: - return False - - def _compute_v2_path( - self, - source: Path, - namespace: str, - scope: Scope - ) -> Path: - """Compute V2 destination path for a memory file.""" - filename = source.name - - # Get V2 directory - v2_dir = self.v2_resolver.get_memory_dir(namespace, scope) - - return v2_dir / filename - - def create_backup(self) -> Path: - """ - Create backup of all legacy memories. - - Returns: - Path to backup directory - """ - timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S") - backup_dir = ( - self.legacy_context.home_dir / ".claude" / "mnemonic_backups" - / f"legacy_backup_{timestamp}" - ) - - if self.dry_run: - print(f"[DRY RUN] Would create backup at: {backup_dir}") - self.backup_dir = backup_dir - return backup_dir - - print(f"Creating backup at: {backup_dir}") - backup_dir.mkdir(parents=True, exist_ok=True) - - user_base = self.legacy_context.home_dir / ".claude" / "mnemonic" - - # Copy all legacy roots - for root in self.legacy_resolver.get_all_memory_roots(): - if not root.exists(): - continue - - # Preserve directory structure in backup - try: - # Try user-level path first - relative = root.relative_to(user_base) - backup_target = backup_dir / relative - except ValueError: - # Project-level path - use "project" prefix - backup_target = backup_dir / "project" / root.name - - print(f" Backing up: {root} -> {backup_target}") - shutil.copytree(root, backup_target, dirs_exist_ok=True) - - # Save migration plan - plan_file = backup_dir / "migration_plan.json" - with open(plan_file, 'w') as f: - json.dump(asdict(self.plan), f, indent=2) - - self.backup_dir = backup_dir - print(f"Backup complete: {backup_dir}") - return backup_dir - - def execute(self) -> Dict[str, int]: - """ - Execute the migration plan. - - Returns: - Dict with success/failure counts - """ - if not self.plan: - raise ValueError("Must call analyze() before execute()") - - stats = {"success": 0, "failed": 0, "skipped": 0} - - print(f"\nMigrating {self.plan.total_memories} memories...") - - for i, migration in enumerate(self.plan.migrations, 1): - if self.verbose or i % 10 == 0: - print(f" [{i}/{self.plan.total_memories}] {Path(migration.source).name}") - - try: - source = Path(migration.source) - dest = Path(migration.destination) - - # Skip if already migrated - if dest.exists() and not self.dry_run: - if self._files_identical(source, dest): - stats["skipped"] += 1 - migration.success = True - continue - - if self.dry_run: - print(f" [DRY RUN] {source} -> {dest}") - else: - # Create destination directory - dest.parent.mkdir(parents=True, exist_ok=True) - - # Copy file (don't move yet, in case of failure) - shutil.copy2(source, dest) - - migration.success = True - stats["success"] += 1 - - except Exception as e: - migration.error = str(e) - stats["failed"] += 1 - print(f" ERROR: {e}") - - return stats - - def _files_identical(self, file1: Path, file2: Path) -> bool: - """Check if two files are identical.""" - if file1.stat().st_size != file2.stat().st_size: - return False - return file1.read_bytes() == file2.read_bytes() - - def cleanup_legacy(self) -> int: - """ - Remove legacy directories after successful migration. - - Returns: - Number of files removed - """ - if self.dry_run: - print("\n[DRY RUN] Would remove legacy directories:") - for root in self.legacy_resolver.get_all_memory_roots(): - print(f" - {root}") - return 0 - - removed = 0 - print("\nCleaning up legacy directories...") - - for root in self.legacy_resolver.get_all_memory_roots(): - if not root.exists(): - continue - - # Only remove if empty or only contains migrated files - for memory_file in root.rglob("*.memory.md"): - try: - memory_file.unlink() - removed += 1 - except Exception as e: - print(f" Warning: Could not remove {memory_file}: {e}") - - # Remove empty directories - self._remove_empty_dirs(root) - - return removed - - def _remove_empty_dirs(self, root: Path): - """Recursively remove empty directories.""" - for dirpath in sorted(root.rglob("*"), reverse=True): - if dirpath.is_dir() and not any(dirpath.iterdir()): - try: - dirpath.rmdir() - except Exception: - pass - - def commit_changes(self, message: str = None): - """Commit changes to git.""" - if self.dry_run: - print("\n[DRY RUN] Would commit changes to git") - return - - git_dir = self.v2_context.home_dir / ".claude" / "mnemonic" - if not (git_dir / ".git").exists(): - print("\nNo git repository found, skipping commit") - return - - print("\nCommitting changes to git...") - - try: - subprocess.run( - ["git", "add", "-A"], - cwd=git_dir, - check=True, - ) - - commit_msg = message or f"migrate: Legacy to V2 path scheme ({self.plan.total_memories} memories)" - - subprocess.run( - ["git", "commit", "-m", commit_msg], - cwd=git_dir, - check=True, - ) - - print("Changes committed successfully") - - except subprocess.CalledProcessError as e: - print(f"Warning: Git commit failed: {e}") - - def rollback(self, backup_dir: Path): - """ - Rollback migration using backup. - - Args: - backup_dir: Path to backup directory - """ - if not backup_dir.exists(): - raise ValueError(f"Backup directory not found: {backup_dir}") - - print(f"Rolling back from backup: {backup_dir}") - - # Load migration plan - plan_file = backup_dir / "migration_plan.json" - if not plan_file.exists(): - raise ValueError(f"Migration plan not found in backup: {plan_file}") - - with open(plan_file) as f: - plan_data = json.load(f) - - # Restore each file - for migration in plan_data["migrations"]: - dest = Path(migration["destination"]) - - if dest.exists(): - print(f" Removing: {dest}") - dest.unlink() - - # Restore from backup - user_base = self.legacy_context.home_dir / ".claude" / "mnemonic" - for root_str in plan_data["legacy_roots"]: - root = Path(root_str) - try: - relative = root.relative_to(user_base) - backup_source = backup_dir / relative - except ValueError: - # Project-level path - backup_source = backup_dir / "project" / root.name - - if backup_source.exists(): - print(f" Restoring: {backup_source} -> {root}") - shutil.copytree(backup_source, root, dirs_exist_ok=True) - - print("Rollback complete") - - # Commit rollback - self.commit_changes("rollback: Revert V2 migration to legacy paths") - - def print_summary(self, stats: Dict[str, int]): - """Print migration summary.""" - if not self.plan: - print("No migration plan available.") - return - - print("\n" + "=" * 60) - print("MIGRATION SUMMARY") - print("=" * 60) - print(f"Total memories: {self.plan.total_memories}") - print(f"Successfully moved: {stats['success']}") - print(f"Already migrated: {stats['skipped']}") - print(f"Failed: {stats['failed']}") - print(f"Total size: {self._format_bytes(self.plan.total_size_bytes)}") - print(f"Backup location: {self.backup_dir}") - print("=" * 60) - - if stats['failed'] > 0: - print("\nWARNING: Some migrations failed. Check errors above.") - print("Your backup is safe and you can rollback if needed.") - - def _format_bytes(self, size_bytes: int) -> str: - """Format bytes as human-readable size.""" - size = float(size_bytes) - for unit in ['B', 'KB', 'MB', 'GB']: - if size < 1024.0: - return f"{size:.1f} {unit}" - size /= 1024.0 - return f"{size:.1f} TB" - - -def main(): - parser = argparse.ArgumentParser( - description="Migrate mnemonic memories from legacy to V2 path scheme" - ) - parser.add_argument( - "--dry-run", - action="store_true", - help="Preview changes without executing", - ) - parser.add_argument( - "--verbose", - "-v", - action="store_true", - help="Verbose output", - ) - parser.add_argument( - "--no-backup", - action="store_true", - help="Skip backup creation (not recommended)", - ) - parser.add_argument( - "--rollback", - type=Path, - metavar="BACKUP_DIR", - help="Rollback migration using specified backup directory", - ) - - args = parser.parse_args() - - # Handle rollback - if args.rollback: - manager = MigrationManager(dry_run=False, verbose=args.verbose) - manager.rollback(args.rollback) - return - - # Create migration manager - manager = MigrationManager(dry_run=args.dry_run, verbose=args.verbose) - - # Analyze current structure - print("Analyzing memory structure...") - plan = manager.analyze() - - if plan.total_memories == 0: - print("\nNo memories found to migrate.") - print("Either migration already complete or no memories exist.") - return - - print(f"\nFound {plan.total_memories} memories to migrate") - print(f"Total size: {manager._format_bytes(plan.total_size_bytes)}") - - if args.dry_run: - print("\n[DRY RUN MODE] - No changes will be made") - - # Confirm with user - if not args.dry_run: - print("\nThis will migrate all memories to the new V2 path structure.") - print("A backup will be created before migration.") - confirm = input("\nProceed? [y/N]: ") - if confirm.lower() != 'y': - print("Migration cancelled") - return - - # Create backup - backup_dir: Path | None = None - if not args.no_backup: - backup_dir = manager.create_backup() - print(f"\nBackup created: {backup_dir}") - else: - print("\nWARNING: Skipping backup (--no-backup specified)") - - # Execute migration - print("\nExecuting migration...") - stats = manager.execute() - - # Print summary - manager.print_summary(stats) - - # Cleanup legacy directories - if stats["failed"] == 0 and not args.dry_run: - confirm_cleanup = input("\nRemove legacy directories? [y/N]: ") - if confirm_cleanup.lower() == 'y': - removed = manager.cleanup_legacy() - print(f"Removed {removed} files from legacy locations") - - # Commit changes - if not args.dry_run: - manager.commit_changes() - - print("\nMigration complete!") - if not args.dry_run and backup_dir: - print(f"Backup saved at: {backup_dir}") - print(f"To rollback: python scripts/migrate_to_v2_paths.py --rollback {backup_dir}") - - -if __name__ == "__main__": - main() diff --git a/skills/blackboard/SKILL.md b/skills/blackboard/SKILL.md new file mode 100644 index 0000000..91cd028 --- /dev/null +++ b/skills/blackboard/SKILL.md @@ -0,0 +1,137 @@ +--- +name: blackboard +description: Cross-session handoff, persistent context via blackboard, and agent coordination patterns +user-invocable: true +allowed-tools: + - Bash + - Read + - Write + - Glob + - Grep +--- + + +## Memory + +Search first: `/mnemonic:search {relevant_keywords}` +Capture after: `/mnemonic:capture {namespace} "{title}"` + +Run `/mnemonic:list --namespaces` to see available namespaces from loaded ontologies. + + +# Mnemonic Blackboard Skill + +Cross-session handoff, persistent context, and agent coordination. + +## Trigger Phrases + +- "blackboard", "cross-session", "session handoff", "shared context" + +## Coordination Overview + +| Scope | Mechanism | Tools | +|-------|-----------|-------| +| **In-session** | Claude Code native swarm | TeamCreate, SendMessage, TaskCreate, TaskUpdate | +| **Cross-session** | Mnemonic blackboard handoff | `handoff/latest-handoff.md` via hooks | +| **Persistent knowledge** | Mnemonic memories | `*.memory.md` files | + +--- + +## Path Resolution + +```bash +MNEMONIC_ROOT=$(tools/mnemonic-paths root) +BLACKBOARD=$(tools/mnemonic-paths blackboard) +HANDOFF_DIR=${BLACKBOARD}/handoff +``` + +--- + +## Directory Structure + +``` +${BLACKBOARD}/ +├── _legacy/ # Pre-migration files (frozen) +├── sessions/ +│ └── {session_id}/ +│ ├── session-notes.md # Session activity log +│ └── _meta.json # Session lifecycle metadata +├── handoff/ +│ ├── latest-handoff.md # Cross-session context (overwritten each session end) +│ └── handoff-{session_id}.md # Archived per-session handoffs +└── .archive/ # Archived entries +``` + +--- + +## Cross-Session Handoff + +### How It Works + +1. **Session end** (`hooks/stop.py`): Writes summary to `handoff/latest-handoff.md` +2. **Session start** (`hooks/session_start.py`): Reads `handoff/latest-handoff.md` to restore context + +This is automatic via hooks. + +### Handoff Format + +```markdown +# Session Handoff + +**Session:** {session_id} +**Ended:** {timestamp} +**Project:** {org}/{project} + +## What Was Accomplished +- Completed items + +## In Progress +- Ongoing work with current state + +## Blocked +- Blocker: reason + +## Next Steps +- [ ] Action item 1 +- [ ] Action item 2 + +## Important Context +- Key context for next session +``` + +--- + +## Mnemonic Agents + +| Agent | Purpose | Invocation | +|-------|---------|------------| +| `memory-curator` | Maintenance, deduplication, decay | Standalone or native swarm | +| `mnemonic-search-subcall` | Iterative memory search | Spawned via Task tool | +| `compression-worker` | Memory summarization | Spawned via Task tool | +| `ontology-discovery` | Entity discovery from codebase | Spawned via Task tool | + +--- + +## Session Metadata + +Each session creates `_meta.json`: + +```json +{ + "session_id": "abc-123", + "started": "2026-01-15T10:00:00Z", + "ended": "2026-01-15T11:30:00Z", + "project": "zircote/mnemonic", + "org": "zircote", + "status": "ended" +} +``` + +--- + +## Best Practices + +- **Native swarm for in-session work** — don't write coordination state to blackboard +- **Let hooks handle handoff** — session lifecycle hooks manage cross-session context automatically +- **Memories for persistence** — if something should survive beyond the next session, capture it as a memory +- **Keep handoffs actionable** — focus on what the next session needs to continue work diff --git a/skills/mnemonic-core/SKILL.md b/skills/core/SKILL.md similarity index 99% rename from skills/mnemonic-core/SKILL.md rename to skills/core/SKILL.md index 190e403..e4c3792 100644 --- a/skills/mnemonic-core/SKILL.md +++ b/skills/core/SKILL.md @@ -1,5 +1,5 @@ --- -name: mnemonic-core +name: core description: > This skill should be used when the user says "capture memory", "save to memory", "remember this", or trigger phrases like: "I've decided", "let's use", "we're going with", diff --git a/skills/mnemonic-core/references/capture.md b/skills/core/references/capture.md similarity index 100% rename from skills/mnemonic-core/references/capture.md rename to skills/core/references/capture.md diff --git a/skills/mnemonic-core/references/examples.md b/skills/core/references/examples.md similarity index 100% rename from skills/mnemonic-core/references/examples.md rename to skills/core/references/examples.md diff --git a/skills/mnemonic-core/references/recall.md b/skills/core/references/recall.md similarity index 100% rename from skills/mnemonic-core/references/recall.md rename to skills/core/references/recall.md diff --git a/skills/mnemonic-core/references/schema.md b/skills/core/references/schema.md similarity index 100% rename from skills/mnemonic-core/references/schema.md rename to skills/core/references/schema.md diff --git a/skills/format/SKILL.md b/skills/format/SKILL.md new file mode 100644 index 0000000..b73a3d6 --- /dev/null +++ b/skills/format/SKILL.md @@ -0,0 +1,191 @@ +--- +allowed-tools: +- Read +- Write +- Glob +- Bash +- Grep +description: MIF Level 3 specification, memory templates, and formatting guidelines +name: format +user-invocable: true +--- + +## Memory + +Search first: `/mnemonic:search {relevant_keywords}` +Capture after: `/mnemonic:capture {namespace} "{title}"` + +Run `/mnemonic:list --namespaces` to see available namespaces from loaded ontologies. + + +# Mnemonic Format Skill + +MIF Level 3 specification, templates, and formatting guidelines. + +## Trigger Phrases + +- "memory format", "MIF format", "frontmatter template", "memory template", "mnemonic schema" + +--- + +## Quick Start: Minimal Memory + +Only 4 fields are required. Everything else is optional. + +```yaml +--- +id: 550e8400-e29b-41d4-a716-446655440000 +title: "Human-readable title" +type: semantic +created: 2026-01-23T10:30:00Z +--- + +# Title + +Content here. +``` + +**That's it.** Add optional fields only when you need them. + +--- + +## File Naming + +``` +{slug}.memory.md +``` + +- **slug**: URL-safe title, lowercase, max 50 chars +- UUID is stored only in the frontmatter `id:` field +- If a file with the same slug already exists, content is merged + +--- + +## Full Optional Fields Reference + +```yaml +--- +# REQUIRED (always include these 4) +id: 550e8400-e29b-41d4-a716-446655440000 +title: "Human-readable title" +type: semantic +created: 2026-01-23T10:30:00Z + +# COMMON +modified: 2026-01-23T14:22:00Z +namespace: _semantic/decisions/project +tags: + - architecture + - database + +# BI-TEMPORAL TRACKING +temporal: + valid_from: 2026-01-23T00:00:00Z + valid_until: null + recorded_at: 2026-01-23T10:30:00Z + ttl: P90D + decay: + model: exponential + half_life: P7D + strength: 0.85 + access_count: 5 + last_accessed: 2026-01-23T14:22:00Z + +# PROVENANCE +provenance: + source_type: conversation # user_explicit | inferred | conversation + source_ref: file:///path/to/source.ts:42 + agent: claude-opus-4 + confidence: 0.95 + session_id: abc123 + +# CODE REFERENCES +code_refs: + - file: src/auth/handler.ts + line: 42 + symbol: authenticateUser + type: function # function | class | method | variable | type + +# CITATIONS +citations: + - type: documentation # paper | documentation | blog | github | stackoverflow | article + title: "Source Title" + url: https://example.com/source + author: "Author Name" + date: 2026-01-23 + accessed: 2026-01-23T10:30:00Z + relevance: 0.90 + note: "Brief description" + +# COMPRESSION (auto-generated by gc --compress) +summary: "Concise 2-3 sentence summary (max 500 chars)" +compressed_at: 2026-01-24T10:00:00Z +--- + +# Memory Title + +Content in markdown format. + +## Relationships + +- relates-to [[other-memory-id]] +- supersedes [[old-memory-id]] +- derived-from [[source-memory-id]] +``` + +--- + +## Cognitive Memory Types + +| Type | Use For | Namespace Pattern | +|------|---------|-------------------| +| `semantic` | Facts, specs, configs, definitions | `_semantic/{subtype}/project` | +| `episodic` | Debug sessions, incidents, discoveries | `_episodic/{subtype}/project` | +| `procedural` | Runbooks, how-to guides, workflows | `_procedural/{subtype}/project` | + +--- + +## Relationship Syntax + +Add a `## Relationships` section at the end of any memory body using `- {type} [[{memory-id}]]` syntax. + +| Type | Meaning | +|------|---------| +| `relates-to` | General association | +| `supersedes` | Replaces older memory | +| `derived-from` | Built upon another memory | +| `contradicts` | Conflicts with another memory | +| `implements` | Realizes a design/decision | + +--- + +## Quick Templates + +**Generate REAL values for ids and timestamps. Run `uuidgen | tr '[:upper:]' '[:lower:]'` and `date -u +"%Y-%m-%dT%H:%M:%SZ"` before creating any memory. NEVER leave placeholders.** + +See [Quick Start](#quick-start-minimal-memory) above for the minimal template. Below are additional templates for common memory types. + +### Decision Memory + +```yaml +--- +id: +type: semantic +namespace: _semantic/decisions/project +created: +title: "Decision: {what}" +tags: [architecture] +provenance: + confidence: 0.95 +--- + +# Decision: {What} + +## Quick Answer +{What} was chosen for {primary reason}. + +## Context +- **Alternatives:** {Option A}, {Option B} +- **Key drivers:** {Driver 1}, {Driver 2} +- **Trade-offs:** {What was sacrificed} +``` diff --git a/skills/integrate/SKILL.md b/skills/integrate/SKILL.md index 6031c14..399d2ed 100644 --- a/skills/integrate/SKILL.md +++ b/skills/integrate/SKILL.md @@ -28,7 +28,7 @@ Use this skill when you want to: - **Migrate legacy integrations** - Convert old marker-less integrations to the new format **Don't use this skill if:** -- You're building a new plugin from scratch (use mnemonic-core directly) +- You're building a new plugin from scratch (use the core skill directly) - You only need to search/capture memories (use `/mnemonic:search` and `/mnemonic:capture`) ## Overview diff --git a/skills/mnemonic-agent-coordination/SKILL.md b/skills/mnemonic-agent-coordination/SKILL.md deleted file mode 100644 index 8787f4b..0000000 --- a/skills/mnemonic-agent-coordination/SKILL.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -name: mnemonic-agent-coordination -description: Agent coordination patterns - native swarm for in-session, blackboard for cross-session handoff -user-invocable: false -allowed-tools: - - Bash - - Read - - Write - - Glob - - Grep ---- - - - -## Memory - -Search first: `/mnemonic:search {relevant_keywords}` -Capture after: `/mnemonic:capture {namespace} "{title}"` - -Run `/mnemonic:list --namespaces` to see available namespaces from loaded ontologies. - - -# Mnemonic Agent Coordination Skill - -Agent coordination patterns for the mnemonic system. - -## Overview - -Agent coordination is split between two mechanisms: - -| Scope | Mechanism | Tools | -|-------|-----------|-------| -| **In-session** | Claude Code native swarm | TeamCreate, SendMessage, TaskCreate, TaskUpdate, TaskList | -| **Cross-session** | Mnemonic blackboard handoff | `handoff/latest-handoff.md` via hooks | - -### In-Session Coordination (Native Swarm) - -For agents working together within a single session, use Claude Code's built-in tools: - -- **TeamCreate**: Create a team with shared task list -- **TaskCreate / TaskUpdate / TaskList**: Track and assign work items -- **SendMessage**: Direct messages between agents -- **Task tool**: Spawn specialized subagents - -These tools provide real-time coordination, task dependencies, and message delivery. Do **not** duplicate this functionality with blackboard writes. - -### Cross-Session Handoff (Blackboard) - -For context that must survive across sessions: - -```bash -BLACKBOARD=$(tools/mnemonic-paths blackboard) -``` - -The handoff mechanism is automatic: -1. `hooks/stop.py` writes session summary to `${BLACKBOARD}/handoff/latest-handoff.md` -2. `hooks/session_start.py` reads this file to provide context to the new session - ---- - -## Mnemonic Agents - -| Agent | Purpose | Coordination | -|-------|---------|-------------| -| `memory-curator` | Maintenance, deduplication, decay | Standalone or native swarm | -| `mnemonic-search-subcall` | Iterative memory search | Spawned via Task tool | -| `compression-worker` | Memory summarization | Spawned via Task tool | -| `search-enhanced` (orchestrator) | Multi-round search | Uses Task tool to spawn subcalls | - ---- - -## Cross-Session Handoff Format - -When ending a session with important context for the next session, the stop hook writes: - -```markdown -# Session Handoff - -**Session:** {session_id} -**Ended:** {timestamp} -**Project:** {org}/{project} - -## What Was Accomplished -- Completed items - -## In Progress -- Ongoing work with current state - -## Next Steps -- [ ] What the next session should do -``` - ---- - -## Best Practices - -1. **Use native swarm for in-session work** - Don't write coordination state to blackboard files -2. **Let hooks handle handoff** - The session lifecycle hooks manage cross-session context automatically -3. **Capture persistent knowledge as memories** - If insights should last beyond the next session, use `/mnemonic:capture` -4. **Keep handoffs actionable** - Focus on what the next session needs to continue work - ---- - -## Related - -- `mnemonic-blackboard` skill - Blackboard patterns and handoff format -- ADR-003 - Agent Coordination via Blackboard Extension -- ADR-011 - Session-Scoped Blackboard diff --git a/skills/mnemonic-blackboard/SKILL.md b/skills/mnemonic-blackboard/SKILL.md deleted file mode 100644 index a609f16..0000000 --- a/skills/mnemonic-blackboard/SKILL.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -name: mnemonic-blackboard -description: Cross-session handoff and persistent context via blackboard -user-invocable: true -allowed-tools: - - Bash - - Read - - Write - - Glob - - Grep ---- - - - -## Memory - -Search first: `/mnemonic:search {relevant_keywords}` -Capture after: `/mnemonic:capture {namespace} "{title}"` - -Run `/mnemonic:list --namespaces` to see available namespaces from loaded ontologies. - - -# Mnemonic Blackboard Skill - -Cross-session handoff and persistent context. - -## Trigger Phrases - -- "blackboard" -- "cross-session" -- "session handoff" -- "shared context" - -## Overview - -The blackboard provides **cross-session persistence** - the ability to hand off context from one Claude Code session to the next. It is not used for in-session agent coordination, which is handled by Claude Code's native swarm tools (TeamCreate, SendMessage, TaskCreate/TaskUpdate). - -### Scope - -| Concern | Mechanism | -|---------|-----------| -| In-session agent coordination | Native swarm (TeamCreate, SendMessage, TaskCreate) | -| Cross-session context handoff | Blackboard `handoff/latest-handoff.md` | -| Persistent knowledge | Mnemonic memories (`*.memory.md`) | - ---- - -## Path Resolution - -```bash -MNEMONIC_ROOT=$(tools/mnemonic-paths root) -BLACKBOARD=$(tools/mnemonic-paths blackboard) -HANDOFF_DIR=${BLACKBOARD}/handoff -``` - ---- - -## Directory Structure - -``` -${BLACKBOARD}/ -├── _legacy/ # Pre-migration files (frozen) -├── sessions/ -│ └── {session_id}/ -│ ├── session-notes.md # Session activity log -│ └── _meta.json # Session lifecycle metadata -├── handoff/ -│ ├── latest-handoff.md # Cross-session context (overwritten each session end) -│ └── handoff-{session_id}.md # Archived per-session handoffs -└── .archive/ # Archived entries -``` - -The `sessions/` directory provides an audit trail. The `handoff/` directory is the active coordination surface. - ---- - -## Cross-Session Handoff - -### How It Works - -1. **Session end** (`hooks/stop.py`): Writes a handoff summary to `handoff/latest-handoff.md` -2. **Session start** (`hooks/session_start.py`): Reads `handoff/latest-handoff.md` to restore context - -This is automatic - hooks handle the lifecycle. - -### Handoff Entry Format - -```markdown -# Session Handoff - -**Session:** {session_id} -**Ended:** {timestamp} -**Project:** {org}/{project} - -## What Was Accomplished -- Item 1 -- Item 2 - -## In Progress -- Item 3: current state - -## Blocked -- Blocker: reason - -## Next Steps -- [ ] Action item 1 -- [ ] Action item 2 - -## Important Context -- Key context for next session -``` - -### Manual Handoff - -To explicitly write handoff context for the next session: - -```bash -BLACKBOARD=$(tools/mnemonic-paths blackboard) -# Write to handoff/latest-handoff.md -``` - ---- - -## Session Metadata - -Each session creates `_meta.json` with lifecycle tracking: - -```json -{ - "session_id": "abc-123", - "started": "2026-01-15T10:00:00Z", - "ended": "2026-01-15T11:30:00Z", - "project": "zircote/mnemonic", - "org": "zircote", - "status": "ended" -} -``` - -Status values: `active` (session running), `ended` (session completed). - ---- - -## Best Practices - -1. **Let hooks handle it** - Handoff is automatic via session_start and stop hooks -2. **Keep handoffs concise** - Focus on what the next session needs to know -3. **Use memories for persistence** - If something should survive beyond the next session, capture it as a memory -4. **Don't use blackboard for in-session coordination** - Use native swarm tools instead - ---- - -## Related - -- ADR-003 - Agent Coordination via Blackboard Extension -- ADR-011 - Session-Scoped Blackboard diff --git a/skills/mnemonic-format/SKILL.md b/skills/mnemonic-format/SKILL.md deleted file mode 100644 index a8f80e9..0000000 --- a/skills/mnemonic-format/SKILL.md +++ /dev/null @@ -1,745 +0,0 @@ ---- -allowed-tools: -- Read -- Write -- Glob -- Bash -- Grep -description: MIF Level 3 specification, memory templates, and formatting guidelines -name: mnemonic-format -user-invocable: true ---- - -## Memory - -Search first: `/mnemonic:search {relevant_keywords}` -Capture after: `/mnemonic:capture {namespace} "{title}"` - -Run `/mnemonic:list --namespaces` to see available namespaces from loaded ontologies. - - -# Mnemonic Format Skill - -MIF Level 3 specification, templates, and formatting guidelines. - -## Trigger Phrases - -- "memory format" -- "MIF format" -- "frontmatter template" -- "memory template" -- "mnemonic schema" - -## Overview - -MIF Level 3 specification. **Start minimal, add fields as needed.** - ---- - -## Quick Start: Minimal Memory - -Only 4 fields are required. Everything else is optional. - -```yaml ---- -id: 550e8400-e29b-41d4-a716-446655440000 -title: "Human-readable title" -type: semantic -created: 2026-01-23T10:30:00Z ---- - -# Title - -Content here. -``` - -**That's it.** Add optional fields only when you need them. - ---- - -## File Naming - -``` -{slug}.memory.md -``` - -- **slug**: URL-safe title, lowercase, max 50 chars -- UUID is stored only in the frontmatter `id:` field -- If a file with the same slug already exists, content is merged - ---- - -## Optional Fields Reference - -Add these when relevant: - -```yaml ---- -# REQUIRED (always include these 4) -id: 550e8400-e29b-41d4-a716-446655440000 -title: "Human-readable title" -type: semantic -created: 2026-01-23T10:30:00Z - -# COMMON (add when useful) -modified: 2026-01-23T14:22:00Z -namespace: _semantic/decisions/project -tags: - - architecture - - database - -# === PROGRESSIVE DISCLOSURE === -summary: "PostgreSQL chosen for ACID compliance and JSON support" -detail_level: comprehensive # minimal | standard | comprehensive -related_memories: [] # UUIDs of related memories -supersedes: [] # UUIDs of memories this one replaces - -# === BI-TEMPORAL TRACKING === -temporal: - valid_from: 2026-01-23T00:00:00Z # When fact became true - valid_until: null # When fact expired (null = current) - recorded_at: 2026-01-23T10:30:00Z # When captured in system - ttl: P90D # ISO 8601 duration until expiry - decay: - model: exponential # Decay algorithm - half_life: P7D # Time to 50% relevance - strength: 0.85 # Current relevance score 0-1 - access_count: 5 # Times recalled - last_accessed: 2026-01-23T14:22:00Z # Last recall timestamp - -# === PROVENANCE === -provenance: - source_type: conversation # user_explicit | inferred | conversation - source_ref: file:///path/to/source.ts:42 - agent: claude-opus-4 # Capturing agent - confidence: 0.95 # Certainty score 0-1 - session_id: abc123 # Claude session ID - -# === CODE STRUCTURE AWARENESS === -code_refs: - - file: src/auth/handler.ts - line: 42 - symbol: authenticateUser - type: function # function | class | method | variable | type - -# === CITATIONS === -citations: - - type: documentation # paper | documentation | blog | github | stackoverflow | article - title: "Source Title" - url: https://example.com/source - author: "Author Name" # optional - date: 2026-01-23 # publication date, optional - accessed: 2026-01-23T10:30:00Z # when accessed, optional - relevance: 0.90 # how relevant to memory 0.0-1.0, optional - note: "Brief description" # optional context - -# === CONFLICT TRACKING === -conflicts: - - memory_id: xyz789 - resolution: merged # merged | invalidated | skipped - resolved_at: 2026-01-23T12:00:00Z - -# === COMPRESSION (Auto-generated) === -summary: "Concise 2-3 sentence summary (max 500 chars)" # Auto-generated by gc --compress -compressed_at: 2026-01-24T10:00:00Z # When compression occurred ---- - -# Memory Title - -Main content in markdown format. - -## Section 1 - -Detailed information... - -## Rationale - -Why this decision/pattern/learning matters. - -## Relationships - -- relates-to [[other-memory-id]] -- supersedes [[old-memory-id]] -- derived-from [[source-memory-id]] - -## Entities - -- mentions @[[PostgreSQL]] -- uses @[[JWT Authentication]] -``` - ---- - -## Field Reference - -### Required Fields - -| Field | Type | Description | -|-------|------|-------------| -| `id` | UUID | Unique identifier (v4, lowercase) | -| `type` | enum | Cognitive type: `semantic`, `episodic`, `procedural` | -| `namespace` | string | Category/scope: `_semantic/decisions`, `_semantic/knowledge`, `_procedural/patterns`, etc. | -| `created` | ISO 8601 | Creation timestamp with timezone | -| `title` | string | Human-readable title in quotes | - -### Recommended Fields - -| Field | Type | Description | -|-------|------|-------------| -| `modified` | ISO 8601 | Last modification timestamp | -| `tags` | list | Categorization tags (lowercase, hyphenated) | - -### Progressive Disclosure Fields - -| Field | Type | Description | -|-------|------|-------------| -| `summary` | string | 1-2 sentence summary for Level 1 recall (max 200 chars) | -| `detail_level` | enum | `minimal`, `standard`, `comprehensive` | -| `related_memories` | list | UUIDs of related memories for cross-reference | -| `supersedes` | list | UUIDs of memories this one replaces | - -### Temporal Fields - -| Field | Type | Description | -|-------|------|-------------| -| `valid_from` | ISO 8601 | When the fact actually became true | -| `valid_until` | ISO 8601 | When the fact became outdated (null if current) | -| `recorded_at` | ISO 8601 | When captured in the system | -| `ttl` | ISO 8601 duration | Time-to-live (e.g., P90D = 90 days) | -| `decay.model` | string | `exponential`, `linear`, `step` | -| `decay.half_life` | ISO 8601 duration | Time to 50% relevance | -| `decay.strength` | float | Current relevance 0.0-1.0 | -| `access_count` | integer | Number of recalls | -| `last_accessed` | ISO 8601 | Most recent recall | - -### Provenance Fields - -| Field | Type | Description | -|-------|------|-------------| -| `source_type` | enum | `user_explicit`, `inferred`, `conversation` | -| `source_ref` | URI | Source location (file, URL, etc.) | -| `agent` | string | Agent that captured (e.g., `claude-opus-4`) | -| `confidence` | float | Certainty score 0.0-1.0 | -| `session_id` | string | Session identifier | - -### Code Reference Fields - -| Field | Type | Description | -|-------|------|-------------| -| `file` | string | Relative file path | -| `line` | integer | Line number | -| `symbol` | string | Symbol name | -| `type` | enum | `function`, `class`, `method`, `variable`, `type`, `module` | - -### Citation Fields - -| Field | Type | Description | -|-------|------|-------------| -| `type` | enum | `paper`, `documentation`, `blog`, `github`, `stackoverflow`, `article` (required) | -| `title` | string | Human-readable title of source (required) | -| `url` | string | Full URL to source material (required) | -| `author` | string | Author name (optional) | -| `date` | date | Publication date YYYY-MM-DD (optional) | -| `accessed` | ISO 8601 | When source was accessed (optional) | -| `relevance` | float | How relevant to memory 0.0-1.0 (optional) | -| `note` | string | Brief description of what this citation provides (optional) | - -### Compression Fields (Auto-generated) - -These fields are added automatically by `/mnemonic:gc --compress`: - -| Field | Type | Description | -|-------|------|-------------| -| `summary` | string | Concise 2-3 sentence summary (max 500 chars) | -| `compressed_at` | ISO 8601 | When compression was performed | - -Compression is applied to memories that: -- Are older than 30 days AND have > 100 lines, OR -- Have strength < 0.3 AND have > 100 lines - -The summary field enables quick scanning without reading full content. Original content is preserved. - ---- - -## Cognitive Memory Types - -### Semantic (Facts & Concepts) - -**Use for:** API documentation, technical specifications, definitions, configurations - -**Indicators:** -- "X is Y" -- Definitions -- Documentation -- Specifications -- Configuration values - -**Example:** -```yaml ---- -id: abc123 -type: semantic -namespace: _semantic/knowledge/project -title: "REST API Authentication Endpoint" -tags: - - api - - authentication ---- - -# REST API Authentication Endpoint - -POST /api/v1/auth/login - -## Request -- email: string (required) -- password: string (required) - -## Response -- token: JWT access token -- expires_in: seconds until expiry -``` - -### Episodic (Events & Experiences) - -**Use for:** Debug sessions, incidents, deployments, meetings, discoveries - -**Indicators:** -- "On [date], we..." -- "When we tried..." -- Timestamps -- Narratives -- Incident reports - -**Example:** -```yaml ---- -id: def456 -type: episodic -namespace: _episodic/sessions/blockers/project -title: "Database connection timeout incident" -tags: - - incident - - database - - resolved -temporal: - valid_from: 2026-01-20T14:30:00Z - recorded_at: 2026-01-20T16:00:00Z ---- - -# Database Connection Timeout Incident - -## What Happened -On 2026-01-20 at 14:30 UTC, production database connections started timing out. - -## Root Cause -Connection pool exhaustion due to unclosed connections in the batch processor. - -## Resolution -Added connection.close() in finally block. Deployed fix at 15:45 UTC. - -## Prevention -- Added connection pool monitoring -- Set max connection lifetime to 5 minutes -``` - -### Procedural (Processes & Workflows) - -**Use for:** Deployment steps, configuration procedures, how-to guides, workflows - -**Indicators:** -- "To do X, first..." -- Step-by-step instructions -- Sequences -- Procedures -- Runbooks - -**Example:** -```yaml ---- -id: ghi789 -type: procedural -namespace: _procedural/patterns/project -title: "Database migration procedure" -tags: - - database - - deployment - - procedure ---- - -# Database Migration Procedure - -## Prerequisites -- Database backup completed -- Maintenance window scheduled -- Rollback script prepared - -## Steps - -1. Enable maintenance mode - ```bash - ./scripts/maintenance.sh enable - ``` - -2. Run migrations - ```bash - npm run db:migrate - ``` - -3. Verify migrations - ```bash - npm run db:verify - ``` - -4. Disable maintenance mode - ```bash - ./scripts/maintenance.sh disable - ``` - -## Rollback -If step 3 fails: -```bash -npm run db:rollback -``` -``` - ---- - -## Namespace Reference - -| Namespace | Purpose | Memory Type | -|-----------|---------|-------------| -| `_semantic/decisions/` | Architectural choices, rationale | semantic | -| `_semantic/knowledge/` | APIs, context, learnings, security | semantic | -| `_semantic/entities/` | Entity definitions (technologies, components) | semantic | -| `_episodic/incidents/` | Production issues, postmortems | episodic | -| `_episodic/sessions/` | Debug sessions, work sessions | episodic | -| `_episodic/blockers/` | Impediments, issues | episodic | -| `_procedural/runbooks/` | Operational procedures | procedural | -| `_procedural/patterns/` | Code conventions, testing strategies | procedural | -| `_procedural/migrations/` | Migration steps, upgrade procedures | procedural | - -### Memory Scope - -- **Project**: `{org}/{project}/{namespace}/` - Specific to current codebase -- **Organization**: `{org}/{namespace}/` - Shared across projects in org - ---- - -## Progressive Disclosure Structure - -Every comprehensive memory should include three disclosure levels in the body: - -### Level 1: Quick Answer (Default Recall) - -The `## Quick Answer` section provides a 1-3 sentence summary. This is what Claude returns first when recalling a memory. - -**Triggers for Level 1:** "What is X?", "Which X do we use?", basic recall - -### Level 2: Context (Expanded Recall) - -The `## Context` section provides: -- Decision date/timeframe -- Alternatives considered -- Key decision drivers -- Trade-offs made - -**Triggers for Level 2:** "Why?", "Tell me more", "Explain the reasoning" - -### Level 3: Comprehensive (Full Detail) - -The `## Full Detail` section includes: -- Complete alternatives analysis -- Implementation notes -- Related decisions/patterns -- Code references -- Citations - -**Triggers for Level 3:** "All details", "Full context", implementation work, debugging - -### Progressive Disclosure Template - -```markdown -# {Title} - -## Quick Answer -{1-3 sentence summary answering "what" and "why briefly"} - -## Context -- **Decision date:** {date} -- **Alternatives considered:** {list} -- **Key drivers:** {factors that led to decision} -- **Trade-offs:** {what was sacrificed} - -## Full Detail - -### Alternatives Analysis -1. **{Option 1}**: {pros/cons, why rejected or chosen} -2. **{Option 2}**: {pros/cons, why rejected or chosen} - -### Implementation Notes -- {Specific implementation details} -- {Configuration requirements} -- {File locations} - -### Related Decisions -- See: [[{related-memory-id}]] for {context} - -### Code References -- {file:line} - {description} - -### Citations -- {source title} - {url} -``` - ---- - -## Relationship Syntax - -### Memory Links - -```markdown -## Relationships - -- relates-to [[550e8400-e29b-41d4-a716-446655440000]] -- supersedes [[old-memory-id]] -- derived-from [[source-memory-id]] -- contradicts [[conflicting-memory-id]] -- implements [[design-memory-id]] -``` - -### Relationship Types - -| Type | Meaning | -|------|---------| -| `relates-to` | General association | -| `supersedes` | Replaces older memory | -| `derived-from` | Built upon another memory | -| `contradicts` | Conflicts with another memory | -| `implements` | Realizes a design/decision | -| `blocks` | Dependency relationship | -| `blocked-by` | Inverse dependency | - ---- - -## Entity Syntax - -### Entity Mentions - -```markdown -## Entities - -- mentions @[[PostgreSQL]] -- uses @[[JWT Authentication]] -- authored-by @[[John Smith]] -- located-in @[[src/auth/]] -``` - -### Entity Types - -| Type | Examples | -|------|----------| -| Technology | PostgreSQL, Redis, Kubernetes | -| Pattern | Factory Pattern, Singleton | -| Person | Team members, authors | -| Location | File paths, directories | -| Concept | Microservices, REST, GraphQL | - ---- - -## Validation Rules - -### Required Checks - -1. `id` must be valid UUID v4 format -2. `type` must be one of: `semantic`, `episodic`, `procedural` -3. `namespace` must follow pattern: `{namespace}/{scope}` -4. `created` must be valid ISO 8601 timestamp -5. `title` must be non-empty string - -### Recommended Checks - -1. `confidence` should be between 0.0 and 1.0 -2. `valid_from` should be before or equal to `recorded_at` -3. `tags` should be lowercase with hyphens -4. `code_refs.file` paths should be relative - -### Citation Checks - -**Required if citations array exists:** -1. `citations[].type` must be one of: `paper`, `documentation`, `blog`, `github`, `stackoverflow`, `article` -2. `citations[].title` must be non-empty string -3. `citations[].url` must be valid URL format (https:// or http://) - -**Optional field validations:** -4. `citations[].relevance` if present, should be between 0.0 and 1.0 -5. `citations[].date` if present, should be valid YYYY-MM-DD format -6. `citations[].accessed` if present, should be valid ISO 8601 timestamp - -### File Naming - -```bash -# Generate compliant filename -UUID=$(uuidgen | tr '[:upper:]' '[:lower:]') -TITLE="My Memory Title" -SLUG=$(echo "$TITLE" | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | tr -cd 'a-z0-9-' | head -c 50) -FILENAME="${SLUG}.memory.md" -``` - ---- - -## Quick Templates - -**CRITICAL: When using these templates, generate REAL values for `{uuid}` and `{timestamp}`. Run `uuidgen | tr '[:upper:]' '[:lower:]'` and `date -u +"%Y-%m-%dT%H:%M:%SZ"` first. NEVER write placeholder text like "PLACEHOLDER_UUID" or "PLACEHOLDER_DATE".** - -### Minimal Memory - -```yaml ---- -id: -type: semantic -namespace: _semantic/knowledge/project -created: -title: "{title}" -summary: "{Brief summary for quick recall}" -detail_level: minimal ---- - -# {Title} - -## Quick Answer -{Content - serves as both summary and full content for minimal memories} -``` - -### Detail Level Guidelines - -| Level | When to Use | Typical Content | -|-------|-------------|-----------------| -| `minimal` | Simple facts, quick TILs, single-point learnings | Quick Answer only | -| `standard` | Most decisions, patterns with some rationale | Quick Answer + Context | -| `comprehensive` | Architectural decisions, complex patterns, research | All three levels | - -### Decision Memory (with Progressive Disclosure) - -```yaml ---- -id: {uuid} -type: semantic -namespace: _semantic/decisions/project -created: {timestamp} -title: "Decision: {what}" -tags: - - architecture -summary: "{Brief 1-sentence summary of decision and key reason}" -detail_level: comprehensive -related_memories: [] -supersedes: [] -provenance: - confidence: 0.95 ---- - -# Decision: {What} - -## Quick Answer -{What} was chosen for {primary reason}. This enables {key benefit}. - -## Context -- **Decision date:** {date} -- **Alternatives considered:** {Option A}, {Option B}, {Option C} -- **Key drivers:** - - {Driver 1} - - {Driver 2} -- **Trade-offs:** {What was sacrificed for this choice} - -## Full Detail - -### Alternatives Analysis -1. **{Option A}**: {Description} - - Pros: {pros} - - Cons: {cons} - - Verdict: {Chosen/Rejected because...} - -2. **{Option B}**: {Description} - - Pros: {pros} - - Cons: {cons} - - Verdict: {Rejected because...} - -### Implementation Notes -- {Specific implementation details} -- {Configuration requirements} - -### Related Decisions -- relates-to [[{related-decision-id}]] - -## Relationships -- supersedes [[{old-decision-id}]] (if applicable) -``` - -### Incident Memory - -```yaml ---- -id: {uuid} -type: episodic -namespace: _episodic/sessions/blockers/project -created: {timestamp} -title: "Incident: {summary}" -tags: - - incident -temporal: - valid_from: {when_it_happened} ---- - -# Incident: {Summary} - -## Timeline -- {time}: {event} - -## Root Cause -{Why it happened} - -## Resolution -{How it was fixed} - -## Prevention -{How to prevent recurrence} -``` - -### Research Memory with Citations - -```yaml ---- -id: {uuid} -type: semantic -namespace: _semantic/knowledge/project -created: {timestamp} -title: "Learning: {topic}" -tags: - - research -citations: - - type: paper - title: "Research Paper Title" - url: https://arxiv.org/abs/... - author: "Smith et al." - date: 2025-11-15 - accessed: {timestamp} - relevance: 0.95 - note: "Key finding about X" - - type: documentation - title: "Official Documentation" - url: https://docs.example.com/... - accessed: {timestamp} - relevance: 0.85 ---- - -# Learning: {Topic} - -## Summary -{What you learned} - -## Key Points -- {Point 1 from citation 1} -- {Point 2 from citation 2} - -## Application -{How this applies to our project} -``` diff --git a/skills/mnemonic-organization/SKILL.md b/skills/mnemonic-organization/SKILL.md deleted file mode 100644 index 69cd017..0000000 --- a/skills/mnemonic-organization/SKILL.md +++ /dev/null @@ -1,513 +0,0 @@ ---- -name: mnemonic-organization -description: Memory organization including directory structure, namespaces, and garbage collection -user-invocable: true -allowed-tools: - - Bash - - Read - - Write - - Glob - - Grep ---- - - - -## Memory - -Search first: `/mnemonic:search {relevant_keywords}` -Capture after: `/mnemonic:capture {namespace} "{title}"` - -Run `/mnemonic:list --namespaces` to see available namespaces from loaded ontologies. - - -# Mnemonic Organization Skill - -Directory structure, namespaces, maintenance, and garbage collection. - -## Trigger Phrases - -- "organize memories" -- "memory structure" -- "namespaces" -- "memory cleanup" -- "mnemonic organization" -- "memory maintenance" - -## Overview - -This skill covers the organizational structure of mnemonic, including directory layouts, namespace conventions, org/project detection, and maintenance operations. - ---- - -## Directory Structure - -All memories are stored under `${MNEMONIC_ROOT}/` with a unified path structure. - -### Unified Storage Layout - -``` -${MNEMONIC_ROOT}/ -├── default/ # Fallback when org detection fails -│ └── {namespace}/ # Cognitive namespaces -├── {org}/ # Organization-level -│ ├── _semantic/ # Org-wide facts/knowledge -│ │ ├── decisions/ -│ │ ├── knowledge/ -│ │ └── entities/ -│ ├── _episodic/ # Org-wide events -│ │ ├── incidents/ -│ │ ├── sessions/ -│ │ └── blockers/ -│ ├── _procedural/ # Org-wide procedures -│ │ ├── runbooks/ -│ │ ├── patterns/ -│ │ └── migrations/ -│ └── {project}/ # Project-specific memories -│ ├── _semantic/ -│ │ ├── decisions/ -│ │ ├── knowledge/ -│ │ └── entities/ -│ ├── _episodic/ -│ │ ├── incidents/ -│ │ ├── sessions/ -│ │ └── blockers/ -│ ├── _procedural/ -│ │ ├── runbooks/ -│ │ ├── patterns/ -│ │ └── migrations/ -│ └── .blackboard/ # Project session coordination -└── .git/ # Version control -``` - -### Memory Scope Hierarchy - -| Scope | Path | Use Case | -|-------|------|----------| -| Project | `{org}/{project}/{namespace}/` | Project-specific memories (default) | -| Organization | `{org}/{namespace}/` | Shared across projects in org | -| Default | `default/{namespace}/` | Fallback when org detection fails | - ---- - -## Namespace Reference - -### Cognitive Memory Types - -| Type | Purpose | Examples | -|------|---------|----------| -| **Semantic** | Facts, concepts, specifications | API docs, decisions, config values | -| **Episodic** | Events, experiences, incidents | Debug sessions, deployments | -| **Procedural** | Processes, workflows, how-tos | Deployment steps, runbooks | - -### Core Namespaces - -| Namespace | Purpose | Memory Type | -|-----------|---------|-------------| -| `_semantic/decisions/` | Architectural choices with rationale | Semantic | -| `_semantic/knowledge/` | APIs, context, learnings, security | Semantic | -| `_semantic/entities/` | Entity definitions (technologies, components) | Semantic | -| `_episodic/incidents/` | Production issues, postmortems | Episodic | -| `_episodic/sessions/` | Debug sessions, work sessions | Episodic | -| `_episodic/blockers/` | Impediments, issues | Episodic | -| `_procedural/runbooks/` | Operational procedures | Procedural | -| `_procedural/patterns/` | Code conventions, testing strategies | Procedural | -| `_procedural/migrations/` | Migration steps, upgrade procedures | Procedural | - -### Scope Selection - -| Scope | Path | Use Case | -|-------|------|----------| -| project | `{org}/{project}/{namespace}/` | Project-specific (default) | -| org | `{org}/{namespace}/` | Shared across all projects in organization | - -**Guidelines:** -- Use `project` scope for codebase-specific information (architecture decisions, local patterns) -- Use `org` scope for reusable knowledge (org-wide standards, shared patterns) - ---- - -## Organization Detection - -### Detect Org from Git Remote - -```bash -# Extract org from remote URL -# Handles: git@github.com:org/repo.git, https://github.com/org/repo.git - -ORG=$(git remote get-url origin 2>/dev/null | \ - sed -E 's|.*[:/]([^/]+)/[^/]+\.git$|\1|' | \ - sed 's|\.git$||') - -# Fallback to "default" if no remote -[ -z "$ORG" ] && ORG="default" - -echo "Organization: $ORG" -``` - -### Detect Project from Git Root - -```bash -# Get project name from git root directory -PROJECT=$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null) - -# Fallback to current directory name -[ -z "$PROJECT" ] && PROJECT=$(basename "$PWD") - -echo "Project: $PROJECT" -``` - -### Full Context Detection - -```bash -# Resolve MNEMONIC_ROOT from config -if [ -f "$HOME/.config/mnemonic/config.json" ]; then - RAW_PATH=$(python3 -c "import json; print(json.load(open('$HOME/.config/mnemonic/config.json')).get('memory_store_path', '~/.claude/mnemonic'))") - MNEMONIC_ROOT="${RAW_PATH/#\~/$HOME}" -else - MNEMONIC_ROOT="$HOME/.claude/mnemonic" -fi -#!/bin/bash -# detect_context.sh - Get org, project, and paths - -# Organization -ORG=$(git remote get-url origin 2>/dev/null | \ - sed -E 's|.*[:/]([^/]+)/[^/]+\.git$|\1|' | \ - sed 's|\.git$||') -[ -z "$ORG" ] && ORG="default" - -# Project -PROJECT=$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null) -[ -z "$PROJECT" ] && PROJECT=$(basename "$PWD") - -# Paths -USER_MNEMONIC="$MNEMONIC_ROOT/$ORG" -PROJECT_MNEMONIC="$MNEMONIC_ROOT" - -echo "ORG=$ORG" -echo "PROJECT=$PROJECT" -echo "USER_MNEMONIC=$USER_MNEMONIC" -echo "PROJECT_MNEMONIC=$PROJECT_MNEMONIC" -``` - ---- - -## Blackboard - -The blackboard is a shared coordination space for cross-session communication. - -### Location - -- Project: `${MNEMONIC_ROOT}/{org}/{project}/.blackboard/` -- Organization: `${MNEMONIC_ROOT}/{org}/.blackboard/` - -### Structure - -One markdown file per topic: - -``` -.blackboard/ -├── active-tasks.md -├── pending-decisions.md -├── shared-context.md -└── session-notes.md -``` - -### Write to Blackboard - -```bash -# Append entry with session info -SESSION_ID="${CLAUDE_SESSION_ID:-$(date +%s)-$$}" -TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ") - -cat >> ${MNEMONIC_ROOT}/.blackboard/active-tasks.md << EOF - ---- -## Session: $SESSION_ID -**Time:** $TIMESTAMP - -- Task 1: Description -- Task 2: Description - -EOF -``` - -### Read from Blackboard - -```bash -# Recent entries -tail -50 ${MNEMONIC_ROOT}/.blackboard/active-tasks.md - -# Entries from specific session -grep -A20 "Session: $SESSION_ID" ${MNEMONIC_ROOT}/.blackboard/active-tasks.md -``` - -### Topic Conventions - -| File | Purpose | -|------|---------| -| `active-tasks.md` | Current work items | -| `pending-decisions.md` | Decisions awaiting input | -| `shared-context.md` | Background for all sessions | -| `session-notes.md` | Handoff notes between sessions | -| `blockers.md` | Known impediments | - ---- - -## Git Versioning - -### Initialize Repository - -```bash -cd ${MNEMONIC_ROOT} - -# Initialize if needed -[ ! -d .git ] && git init - -# Configure gitignore -cat > .gitignore << 'EOF' -*.lock -.blackboard/*.tmp -*.swp -*~ -.DS_Store -EOF - -# Initial commit -git add -A -git commit -m "Initialize mnemonic memory system" -``` - -### Commit Changes - -```bash -cd ${MNEMONIC_ROOT} -git add -A -git commit -m "Memory update: $(date +%Y-%m-%d)" -``` - -### View History - -```bash -cd ${MNEMONIC_ROOT} - -# Recent commits -git log --oneline -20 - -# Changes to specific memory -git log --oneline -- "*/_semantic/decisions/*auth*.memory.md" - -# Show specific version -git show HEAD~3:zircote/_semantic/decisions/abc123-use-jwt.memory.md -``` - -### Restore Previous Version - -```bash -cd ${MNEMONIC_ROOT} - -# Restore specific file from history -git checkout HEAD~1 -- zircote/_semantic/decisions/abc123-use-jwt.memory.md - -# Or restore and commit -git checkout -- path/to/memory.memory.md -git commit -m "Restore: memory title" -``` - ---- - -## Garbage Collection - -### Find Expired Memories (TTL) - -```bash -# Current timestamp for comparison -NOW=$(date +%s) - -# Find memories with ttl field -for f in ${MNEMONIC_ROOT}/**/*.memory.md; do - TTL=$(grep "^ ttl:" "$f" 2>/dev/null | sed 's/.*ttl: //') - CREATED=$(grep "^created:" "$f" 2>/dev/null | sed 's/created: //') - - if [ -n "$TTL" ] && [ -n "$CREATED" ]; then - # Parse and check expiry (simplified - real impl needs date math) - echo "Check: $f (TTL: $TTL, Created: $CREATED)" - fi -done -``` - -### Apply Decay Model - -```bash -# Update decay strength based on last access -# strength = initial * (0.5 ^ (days_since_access / half_life_days)) - -for f in ${MNEMONIC_ROOT}/**/*.memory.md; do - LAST_ACCESS=$(grep "last_accessed:" "$f" 2>/dev/null | sed 's/.*last_accessed: //') - HALF_LIFE=$(grep "half_life:" "$f" 2>/dev/null | sed 's/.*half_life: //') - - if [ -n "$LAST_ACCESS" ]; then - echo "Decay check: $f" - # Calculate new strength and update file - fi -done -``` - -### Archive Low-Relevance Memories - -```bash -# Move memories with strength < 0.2 to archive -ARCHIVE_DIR=${MNEMONIC_ROOT}/.archive/$(date +%Y-%m) -mkdir -p "$ARCHIVE_DIR" - -for f in ${MNEMONIC_ROOT}/**/*.memory.md; do - STRENGTH=$(grep "strength:" "$f" 2>/dev/null | sed 's/.*strength: //') - if [ -n "$STRENGTH" ]; then - # Compare strength (bash can't do float comparison easily) - if python3 -c "exit(0 if $STRENGTH < 0.2 else 1)" 2>/dev/null; then - mv "$f" "$ARCHIVE_DIR/" - echo "Archived: $f" - fi - fi -done -``` - -### Delete Expired - -```bash -# Find and delete truly expired memories (past TTL + grace period) -find ${MNEMONIC_ROOT} -name "*.memory.md" -mtime +365 -type f - -# Dry run -find ${MNEMONIC_ROOT} -name "*.memory.md" -mtime +365 -type f -exec echo "Would delete: {}" \; - -# Actual delete (with confirmation) -find ${MNEMONIC_ROOT} -name "*.memory.md" -mtime +365 -type f -exec rm -i {} \; -``` - ---- - -## Conflict Detection - -### Find Similar Memories - -```bash -# Search for memories with similar titles -TITLE="authentication" -rg -i "^title:.*$TITLE" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l -``` - -### Detect Contradictions - -```bash -# Find memories that might conflict -# Look for opposite patterns in same namespace - -# Example: Find all auth decisions -AUTH_DECISIONS=$(rg -l "auth" ${MNEMONIC_ROOT} --path "*/_semantic/decisions/" --glob "*.memory.md" 2>/dev/null) - -echo "Review these for potential conflicts:" -for f in $AUTH_DECISIONS; do - grep "^title:" "$f" -done -``` - -### Mark Conflict in Memory - -```yaml -conflicts: - - memory_id: xyz789 - resolution: merged - resolved_at: 2026-01-23T12:00:00Z -``` - -### Resolution Strategies - -| Strategy | When to Use | -|----------|-------------| -| `merged` | Combined information from both | -| `invalidated` | Marked conflicting memory as outdated | -| `skipped` | Kept existing, ignored new | - ---- - -## Maintenance Commands - -### Health Check - -```bash -#!/bin/bash -echo "=== Mnemonic Health Check ===" - -# Directory exists -test -d ${MNEMONIC_ROOT} && echo "✓ User mnemonic exists" || echo "✗ User mnemonic missing" - -# Git status -cd ${MNEMONIC_ROOT} -git status --short 2>/dev/null || echo "✗ Git not initialized" -cd - > /dev/null - -# Memory counts by cognitive type -echo "" -echo "=== Memory Counts by Type ===" -SEMANTIC=$(find ${MNEMONIC_ROOT} -path "*/_semantic/*" -name "*.memory.md" 2>/dev/null | wc -l | tr -d ' ') -EPISODIC=$(find ${MNEMONIC_ROOT} -path "*/_episodic/*" -name "*.memory.md" 2>/dev/null | wc -l | tr -d ' ') -PROCEDURAL=$(find ${MNEMONIC_ROOT} -path "*/_procedural/*" -name "*.memory.md" 2>/dev/null | wc -l | tr -d ' ') -echo "_semantic: $SEMANTIC" -echo "_episodic: $EPISODIC" -echo "_procedural: $PROCEDURAL" - -# Memory counts by namespace -echo "" -echo "=== Memory Counts by Namespace ===" -for ns in _semantic/decisions _semantic/knowledge _semantic/entities \ - _episodic/incidents _episodic/sessions _episodic/blockers \ - _procedural/runbooks _procedural/patterns _procedural/migrations; do - count=$(find ${MNEMONIC_ROOT} -path "*/$ns/*" -name "*.memory.md" 2>/dev/null | wc -l | tr -d ' ') - [ "$count" -gt 0 ] && echo "$ns: $count" -done - -# Recent activity -echo "" -echo "=== Recent Captures (7 days) ===" -find ${MNEMONIC_ROOT} -name "*.memory.md" -mtime -7 2>/dev/null | wc -l | tr -d ' ' -``` - -### Rebuild Index (if needed) - -```bash -# Generate manifest of all memories -cat > ${MNEMONIC_ROOT}/.manifest.json << 'EOF' -{ - "generated": "$(date -u +%Y-%m-%dT%H:%M:%SZ)", - "memories": [ -EOF - -first=true -for f in ${MNEMONIC_ROOT}/**/*.memory.md; do - id=$(grep "^id:" "$f" | sed 's/id: //') - title=$(grep "^title:" "$f" | sed 's/title: "//' | sed 's/"$//') - ns=$(grep "^namespace:" "$f" | sed 's/namespace: //') - - [ "$first" = true ] && first=false || echo "," >> ${MNEMONIC_ROOT}/.manifest.json - echo " {\"id\": \"$id\", \"title\": \"$title\", \"namespace\": \"$ns\", \"file\": \"$f\"}" >> ${MNEMONIC_ROOT}/.manifest.json -done - -echo " ]" >> ${MNEMONIC_ROOT}/.manifest.json -echo "}" >> ${MNEMONIC_ROOT}/.manifest.json -``` - -### Validate Memories - -```bash -# Check all memories have required fields -for f in ${MNEMONIC_ROOT}/**/*.memory.md; do - VALID=true - grep -q "^id:" "$f" || VALID=false - grep -q "^type:" "$f" || VALID=false - grep -q "^namespace:" "$f" || VALID=false - grep -q "^created:" "$f" || VALID=false - grep -q "^title:" "$f" || VALID=false - - [ "$VALID" = false ] && echo "Invalid: $f" -done -``` diff --git a/skills/mnemonic-progressive-disclosure/SKILL.md b/skills/mnemonic-progressive-disclosure/SKILL.md deleted file mode 100644 index 5dd302e..0000000 --- a/skills/mnemonic-progressive-disclosure/SKILL.md +++ /dev/null @@ -1,234 +0,0 @@ ---- -allowed-tools: -- Read -- Glob -- Grep -- Bash -- Write -description: Protocol for recalling memories at appropriate detail levels -name: mnemonic-progressive-disclosure -user-invocable: true ---- - -## Memory - -Search first: `/mnemonic:search {relevant_keywords}` -Capture after: `/mnemonic:capture {namespace} "{title}"` - -Run `/mnemonic:list --namespaces` to see available namespaces from loaded ontologies. - - -# Mnemonic Progressive Disclosure Skill - -Protocol for recalling memories at the appropriate detail level. - -## Trigger Phrases - -- "progressive disclosure" -- "disclosure levels" -- "memory recall levels" -- "how to recall" -- "expand memory" -- "more detail" - -## Overview - -Progressive disclosure enables efficient memory recall by surfacing only the detail level needed. Start with Level 1 (Quick Answer), expand to Level 2 (Context) or Level 3 (Full Detail) only when required. - ---- - -## Disclosure Levels - -### Level 1: Quick Answer (Default) - -**What to read:** The `## Quick Answer` section only (or `summary` frontmatter field) - -**Content:** 1-3 sentences answering the core question - -**Sufficient for:** -- "What is X?" -- "Which X do we use?" -- "What did we decide about X?" -- Simple recall questions - -**Example response:** -> PostgreSQL was chosen for primary storage due to ACID compliance and native JSON support. - -### Level 2: Context (On Request) - -**What to read:** `## Quick Answer` + `## Context` sections - -**Content:** -- Decision date/timeframe -- Alternatives considered -- Key decision drivers -- Trade-offs made - -**Sufficient for:** -- "Why did we choose X?" -- "What alternatives did we consider?" -- "Tell me more about X" -- Understanding rationale - -**Triggers:** -- User asks "why?" -- User asks for reasoning/rationale -- User says "tell me more" or "explain" - -**Example response:** -> PostgreSQL was chosen for primary storage due to ACID compliance and native JSON support. -> -> **Context:** -> - Decision made: 2026-01-15 -> - Alternatives considered: MySQL, MongoDB, SQLite -> - Key drivers: Need for JSON queries, team familiarity, existing infrastructure -> - Trade-off: Accepted more complex hosting for better query capabilities - -### Level 3: Comprehensive (Deep Dive) - -**What to read:** Full memory content - -**Content:** -- Complete alternatives analysis -- Implementation notes -- Related decisions/patterns -- Code references -- Citations - -**Sufficient for:** -- Implementation work -- Debugging issues related to decision -- Writing documentation -- Making related decisions -- "Give me all the details" - -**Triggers:** -- User is implementing something -- User is debugging -- User asks for "all details" or "full context" -- User needs to make a related decision - -**Example response:** -> [Full memory content including alternatives analysis, implementation notes, code refs, etc.] - ---- - -## Recall Protocol - -### Step 1: Search for Memories - -```bash -# Search by topic -rg -i "{topic}" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l - -# Search in specific namespace -rg -i "{topic}" ${MNEMONIC_ROOT} --path "*/_semantic/decisions/" --glob "*.memory.md" -l -``` - -### Step 2: Determine Required Level - -| User Intent | Start With | -|-------------|------------| -| Quick question | Level 1 | -| Understanding reasoning | Level 2 | -| Implementation work | Level 3 | -| Debugging | Level 3 | -| Related decision-making | Level 2, then 3 | - -### Step 3: Read Appropriate Section - -```bash -# For Level 1: Read just title and Quick Answer -head -30 {memory_file} # Usually enough for frontmatter + Quick Answer - -# For Level 2: Read through Context section -head -60 {memory_file} - -# For Level 3: Read full file -cat {memory_file} -``` - -### Step 4: Respond and Offer Expansion - -After Level 1 or 2 response, offer to expand: -- "Would you like more context on why this was chosen?" -- "I can provide the full implementation details if needed." - ---- - -## Examples - -### Example 1: Simple Question - -**User:** "What database are we using?" - -**Action:** Search, find postgres-decision.memory.md, read Quick Answer - -**Response:** -> PostgreSQL for primary storage, chosen for ACID compliance and JSON support. - -### Example 2: Reasoning Question - -**User:** "Why PostgreSQL instead of MongoDB?" - -**Action:** Search, find memory, read through Context section - -**Response:** -> We chose PostgreSQL over MongoDB because: -> - Team already familiar with SQL -> - Needed ACID transactions for payments -> - JSON support sufficient for our flexible schema needs -> - MongoDB would require new infrastructure and training - -### Example 3: Implementation Work - -**User:** "I'm implementing the new caching layer" - -**Action:** Search for caching memories, read full content - -**Response:** -> [Full memory with implementation notes, configuration details, code references] - ---- - -## Memory Structure Reference - -Comprehensive memories should have this structure: - -```markdown -# {Title} - -## Quick Answer -{1-3 sentences - Level 1 content} - -## Context -{Decision factors, alternatives, trade-offs - Level 2 content} - -## Full Detail -{Implementation notes, code refs, citations - Level 3 content} -``` - -Memories with `detail_level: minimal` may only have Quick Answer. -Memories with `detail_level: standard` should have Quick Answer + Context. -Memories with `detail_level: comprehensive` should have all three sections. - ---- - -## When to Expand Automatically - -Expand to higher detail level automatically when: - -1. **User is implementing** - They need Level 3 for code refs and implementation notes -2. **User mentions debugging** - They need Level 3 for full context -3. **User is making a related decision** - They need Level 2-3 to understand prior reasoning -4. **Memory is marked as superseded** - Include note about newer decision - ---- - -## Best Practices - -1. **Default to Level 1** - Most questions only need the Quick Answer -2. **Offer expansion** - Let user know more detail is available -3. **Cite the memory** - Reference the memory file for traceability -4. **Check for updates** - Note if memory has low confidence or is old -5. **Search multiple namespaces** - _semantic/decisions, _procedural/patterns, and _semantic/knowledge may all be relevant diff --git a/skills/mnemonic-search-enhanced/SKILL.md b/skills/mnemonic-search-enhanced/SKILL.md deleted file mode 100644 index e9e5f1b..0000000 --- a/skills/mnemonic-search-enhanced/SKILL.md +++ /dev/null @@ -1,453 +0,0 @@ ---- -allowed-tools: -- Task -- Bash -- Read -- Grep -- Glob -- Write -description: Agent-driven iterative memory search with synthesis. Uses subcall agents - for query refinement and produces comprehensive answers. -name: mnemonic-search-enhanced -user-invocable: true ---- - -## Memory - -Search first: `/mnemonic:search {relevant_keywords}` -Capture after: `/mnemonic:capture {namespace} "{title}"` - -Run `/mnemonic:list --namespaces` to see available namespaces from loaded ontologies. - - -# Mnemonic Enhanced Search Skill - -Agent-driven iterative memory search with synthesis. Performs multi-round search with query refinement and produces comprehensive, synthesized answers. - -## Trigger Phrases - -- "deep search memories" -- "comprehensive memory search" -- "thorough search for" -- "analyze memories about" -- "synthesize knowledge about" -- "what do we know about" (followed by complex topic) - -## Overview - -This skill orchestrates an iterative search workflow: - -1. **Initial Search**: Execute first search with user's query -2. **Analyze Results**: Identify gaps and refinement opportunities -3. **Iterative Refinement**: Up to 3 rounds of refined searches -4. **Synthesis**: Aggregate all findings into coherent answer -5. **Citation**: Reference source memories in output - -### When to Use - -Use enhanced search instead of basic `/mnemonic:search` when: -- Query is complex or multi-faceted -- User wants comprehensive coverage -- Topic spans multiple namespaces -- Need synthesized answer, not just file matches - ---- - -## Workflow - -### Step 0: Initialize Workflow (Optional) - -For trackable workflows, register in blackboard: - -```bash -# Resolve MNEMONIC_ROOT from config -if [ -f "$HOME/.config/mnemonic/config.json" ]; then - RAW_PATH=$(python3 -c "import json; print(json.load(open('$HOME/.config/mnemonic/config.json')).get('memory_store_path', '~/.claude/mnemonic'))") - MNEMONIC_ROOT="${RAW_PATH/#\~/$HOME}" -else - MNEMONIC_ROOT="$HOME/.claude/mnemonic" -fi -WORKFLOW_ID="search-$(date +%s)" -SESSION_ID="${CLAUDE_SESSION_ID:-$(date +%s)-$$}" -TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ") -BB_DIR="$MNEMONIC_ROOT/.blackboard" -mkdir -p "$BB_DIR" - -# Register orchestrator -cat >> "${BB_DIR}/session-notes.md" << EOF - ---- -**Session:** $SESSION_ID -**Time:** $TIMESTAMP -**Agent:** search-enhanced -**Status:** active -**Capabilities:** [query-parsing, iteration-orchestration, synthesis] - -## Agent Registration - -Enhanced search workflow started: $WORKFLOW_ID - -### Query -$QUERY - ---- -EOF - -# Initialize shared state -cat >> "${BB_DIR}/shared-context.md" << EOF - ---- -**Session:** $SESSION_ID -**Time:** $TIMESTAMP -**Agent:** search-enhanced -**Status:** active - -## Shared State: $WORKFLOW_ID - -### Current State -\`\`\`json -{ - "phase": "initialization", - "query": "$QUERY", - "scope": "$SCOPE", - "max_iterations": $MAX_ITERATIONS, - "iteration": 0, - "total_findings": 0 -} -\`\`\` - ---- -EOF -``` - -### Step 1: Parse User Query - -Extract from user request: -- **Primary topic**: Main subject of search -- **Scope**: user, project, or all (default: all) -- **Max iterations**: 1-3 (default: 3) - -```bash -QUERY="user's search query" -SCOPE="${SCOPE:-all}" -MAX_ITERATIONS="${MAX_ITERATIONS:-3}" -``` - -### Step 2: Generate Initial Search Patterns - -Create search patterns from query: - -```bash -# Primary pattern: exact query -PATTERN_1="$QUERY" - -# Secondary patterns: individual key terms -PATTERN_2=$(echo "$QUERY" | tr ' ' '\n' | head -1) # First word -PATTERN_3=$(echo "$QUERY" | tr ' ' '\n' | tail -1) # Last word -``` - -### Step 3: Execute Iteration Loop - -For each iteration (1 to MAX_ITERATIONS): - -``` -ITERATION 1: - Pattern: Primary query - Namespace: all - → Invoke mnemonic-search-subcall agent - → Collect JSON findings - → Analyze: gaps, coverage, suggestions - -ITERATION 2 (if needed): - Pattern: Based on iteration 1 suggestions - Namespace: Suggested namespace - → Invoke mnemonic-search-subcall agent - → Collect additional findings - → Merge with iteration 1 - -ITERATION 3 (if needed): - Pattern: Based on iteration 2 suggestions or related terms - Namespace: Remaining gaps - → Invoke mnemonic-search-subcall agent - → Collect additional findings - → Merge with previous -``` - -### Step 4: Invoke Search Subcall Agent - -Use Task tool to invoke `mnemonic-search-subcall` agent: - -``` -Task( - subagent_type: "mnemonic:mnemonic-search-subcall", - prompt: "Search mnemonic memories. - Query: {query} - Iteration: {iteration} - Search pattern: {pattern} - Namespace filter: {namespace} - Tag filter: {tag} - Scope: {scope} - - Execute search and return JSON findings.", - model: "haiku" -) -``` - -### Note: Prefer qmd for Complex Queries - -When `@tobilu/qmd` is installed and indexed, prefer `qmd query` over iterative ripgrep for complex or conceptual searches. It combines BM25 keyword matching with semantic vector similarity, often finding relevant memories that exact-match searches miss. - -```bash -# Instead of multiple rg iterations, try: -qmd query "authentication patterns and session handling" -n 10 --json -``` - -Use `/mnemonic:qmd-setup` to install and configure qmd. Use `/mnemonic:qmd-reindex` after adding memories. - -### Step 5: Detect Convergence - -Stop iterating early if: -- New iteration finds < 2 new memories -- > 90% overlap with previous iteration -- All suggested namespaces searched -- Reached MAX_ITERATIONS - -```python -def should_continue(current_findings, previous_findings, suggestions): - new_files = set(current_findings) - set(previous_findings) - if len(new_files) < 2: - return False # Diminishing returns - if not suggestions: - return False # No more suggestions - return True -``` - -### Step 6: Aggregate Findings - -Merge findings from all iterations: -- Deduplicate by file path -- Preserve highest relevance rating per file -- Maintain citation counts -- Sort by relevance (high → low) - -### Step 7: Read Top Memories - -For top 5-10 memories (by relevance): -- Read full content -- Extract key points -- Note citations if present - -```bash -for f in $TOP_MEMORIES; do - echo "=== Reading: $f ===" - cat "$f" -done -``` - -### Step 8: Synthesize Response - -Produce structured markdown output: - -```markdown -## Summary - -[2-3 sentence executive summary answering the query] - -## Key Findings - -### [Category/Namespace 1] - -- **[Memory Title]** (namespace, type) - - Key point from memory - - Evidence: "quote" - - Citations: [if any] - -### [Category/Namespace 2] - -- **[Memory Title]** (namespace, type) - - Key point from memory - -## Analysis - -[Synthesis connecting findings, identifying patterns, explaining relationships] - -## Coverage - -- **Iterations**: {count} -- **Memories examined**: {total} -- **Relevant memories**: {relevant} -- **Namespaces searched**: {list} - -## Source Memories - -- [[uuid-1]] - Title 1 -- [[uuid-2]] - Title 2 -- ... - -## Gaps & Next Steps - -[Areas not fully covered, suggested follow-up searches] -``` - ---- - -## Examples - -### Example 1: Simple Topic Search - -**User**: "What do we know about authentication?" - -**Workflow**: -1. Iteration 1: Pattern "authentication" → 5 memories found -2. Suggestions: Try "OAuth", search apis namespace -3. Iteration 2: Pattern "OAuth" → 2 more memories -4. Iteration 3: Search apis namespace → 1 more memory -5. Synthesize 8 total memories - -**Output**: -```markdown -## Summary - -We have 8 memories about authentication covering JWT tokens, OAuth flow, -and middleware patterns. Key decision: Use JWT with RS256 signing. - -## Key Findings - -### Decisions -- **Use JWT for API Authentication** (decisions/project, semantic) - - RS256 algorithm for signing - - 15-minute access token expiry - - Evidence: "Stateless authentication reduces server load" - -### Patterns -- **Authentication Middleware Pattern** (patterns/project, procedural) - - Always verify signature before trusting claims - - Store refresh tokens in httpOnly cookies - -... - -## Source Memories - -- [[abc123]] - Use JWT for API Authentication -- [[def456]] - Authentication Middleware Pattern -``` - -### Example 2: Complex Multi-Faceted Query - -**User**: "Synthesize everything about our database decisions and performance learnings" - -**Workflow**: -1. Iteration 1: Pattern "database" in decisions → 3 memories -2. Iteration 2: Pattern "performance" in learnings → 4 memories -3. Iteration 3: Pattern "PostgreSQL OR MySQL" in all → 2 more -4. Synthesize 9 total memories with cross-references - ---- - -## Best Practices - -### Query Refinement Strategy - -1. **Start broad**: Use user's exact query first -2. **Narrow by namespace**: Focus on most relevant category -3. **Expand by related terms**: Use terms found in initial results -4. **Check suggestions**: Follow subcall agent's refinement suggestions - -### Performance Optimization - -- Limit to 10 files per iteration (use head -10) -- Read frontmatter + snippet only during search -- Full read only for top 5-10 final memories -- Use haiku model for subcalls (cost-effective) - -### Context Conservation - -- Subcall agents run in isolated context -- Only JSON findings returned to main context -- Full memory content read only during synthesis -- Total context usage: ~3-5k tokens typical - ---- - -## Configuration - -| Parameter | Default | Description | -|-----------|---------|-------------| -| MAX_ITERATIONS | 3 | Maximum search rounds | -| FILES_PER_ITERATION | 10 | Max files to process per round | -| TOP_MEMORIES | 10 | Full memories to read for synthesis | -| MODEL | haiku | Model for subcall agents | - ---- - -## Error Handling - -| Condition | Action | -|-----------|--------| -| No results in iteration 1 | Try broader pattern, check spelling | -| Subcall agent timeout | Skip iteration, continue with current findings | -| Malformed JSON from subcall | Log error, skip that iteration | -| Max iterations reached | Proceed to synthesis with available findings | - ---- - -### Step 9: Complete Workflow (Optional) - -For trackable workflows, update blackboard on completion: - -```bash -TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ") - -# Update shared state -cat >> "${BB_DIR}/shared-context.md" << EOF - ---- -**Session:** $SESSION_ID -**Time:** $TIMESTAMP -**Agent:** search-enhanced -**Status:** idle - -## Shared State: $WORKFLOW_ID - -### Final State -\`\`\`json -{ - "phase": "complete", - "iterations": $ITERATIONS_RUN, - "total_findings": $TOTAL_FINDINGS, - "memories_synthesized": $MEMORIES_READ -} -\`\`\` - ---- -EOF - -# Update agent status -cat >> "${BB_DIR}/session-notes.md" << EOF - ---- -**Session:** $SESSION_ID -**Time:** $TIMESTAMP -**Agent:** search-enhanced -**Status:** idle - -## Workflow Complete - -### Summary -- Workflow: $WORKFLOW_ID -- Iterations: $ITERATIONS_RUN -- Findings: $TOTAL_FINDINGS -- Memories synthesized: $MEMORIES_READ - ---- -EOF -``` - ---- - -## Related - -- `/mnemonic:search` - Basic single-shot search (faster, simpler) -- `mnemonic-search-subcall` agent - Executes individual search rounds -- `mnemonic-search` skill - Advanced search patterns reference -- `mnemonic-agent-coordination` skill - Agent coordination patterns diff --git a/skills/mnemonic-search/SKILL.md b/skills/mnemonic-search/SKILL.md deleted file mode 100644 index a746bac..0000000 --- a/skills/mnemonic-search/SKILL.md +++ /dev/null @@ -1,494 +0,0 @@ ---- -allowed-tools: -- Bash -- Read -- Glob -- Grep -- Write -description: > - This skill should be used when the user says "search memories", "find in memories", - "grep mnemonic", "look for memory", or asks questions like "what do we know about X". - Provides progressive disclosure: Level 1 (titles), Level 2 (frontmatter + summary), - Level 3 (full content). Start at Level 1 and expand only if needed. -name: mnemonic-search -user-invocable: true ---- - -## Memory - -Search first: `/mnemonic:search {relevant_keywords}` -Capture after: `/mnemonic:capture {namespace} "{title}"` - -Run `/mnemonic:list --namespaces` to see available namespaces from loaded ontologies. - - -# Mnemonic Search Skill - -Advanced search and filtering techniques for mnemonic memories. - -## Trigger Phrases - -- "search memories" -- "find in memories" -- "grep memories" -- "ripgrep mnemonic" -- "look for memory" -- "search mnemonic" - -## Overview - -This skill teaches comprehensive search patterns using ripgrep, grep, find, and other Unix tools to locate and filter memories efficiently. - ---- - -## Frontmatter Search - -Memories use YAML frontmatter. Search specific fields: - -### Extract YAML Block - -```bash -# Get just the frontmatter -sed -n '/^---$/,/^---$/p' /path/to/memory.memory.md - -# Or using awk -awk '/^---$/{p=!p; print; next} p' /path/to/memory.memory.md -``` - -### Search by Namespace - -```bash -# Find all decisions -rg "^namespace: _semantic/decisions" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l -rg "^namespace: _semantic/decisions" --glob "*.memory.md" -l - -# Find project-scoped only -rg "^namespace: .*/project" --glob "*.memory.md" -l - -# Find user-scoped only -rg "^namespace: .*/user" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l -``` - -### Search by Tag - -```bash -# Single tag (in YAML list format) -rg -l "^ - architecture" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# Multiple tags (AND - both must exist in file) -rg -l "^ - architecture" ${MNEMONIC_ROOT}/ --glob "*.memory.md" | xargs rg -l "^ - database" - -# Tag containing substring -rg -l "^ - auth" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -``` - -### Search by Type - -```bash -# Find semantic memories (facts, concepts) -rg "^type: semantic" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l - -# Find episodic memories (events, experiences) -rg "^type: episodic" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l - -# Find procedural memories (processes, workflows) -rg "^type: procedural" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l -``` - -### Search by Date - -```bash -# Created in January 2026 -rg "^created: 2026-01" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l - -# Created in specific date range -rg "^created: 2026-01-(1[5-9]|2[0-9]|3[01])" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l - -# Modified recently -rg "^modified: 2026-01-2" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l -``` - -### Search by Title - -```bash -# Exact phrase in title -rg '^title: ".*PostgreSQL.*"' ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l - -# Case-insensitive title search -rg -i '^title: ".*auth.*"' ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l -``` - -### Search by Confidence - -```bash -# High confidence memories (0.9+) -rg "confidence: 0\.9" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l - -# Lower confidence (might need review) -rg "confidence: 0\.[0-7]" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l -``` - -### Search by Citations - -```bash -# Find all memories with citations -rg -l "^citations:" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# Find memories by citation type -rg "type: paper" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l -rg "type: documentation" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l -rg "type: github" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l - -# Find memories citing specific domain -rg "url: https://arxiv.org" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l -rg "url: https://docs.python.org" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l - -# Find memories by citation author -rg "author: \"Smith" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l - -# Find high-relevance citations -rg "relevance: 0\.9" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l -``` - ---- - -## Full-Text Search - -### Basic Search - -```bash -# Simple pattern -rg "pattern" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# Case-insensitive -rg -i "pattern" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# Whole word only -rg -w "pattern" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -``` - -### With Context - -```bash -# 3 lines before and after match -rg -C3 "pattern" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# 5 lines after (useful for finding related content) -rg -A5 "pattern" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# 2 lines before (useful for finding headers) -rg -B2 "pattern" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -``` - -### Regex Patterns - -```bash -# Function names -rg "function\s+\w+" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# URLs -rg "https?://[^\s]+" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# File paths -rg "src/[^\s]+" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# Version numbers -rg "\d+\.\d+\.\d+" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -``` - -### Files Only (No Content) - -```bash -# Just list matching files -rg -l "pattern" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# Count matches per file -rg -c "pattern" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -``` - ---- - -## Combined Filters - -### Namespace + Text - -```bash -# Decisions about databases -rg "database" ${MNEMONIC_ROOT} --path "*/_semantic/decisions/" --glob "*.memory.md" - -# Knowledge about testing -rg "test" ${MNEMONIC_ROOT} --path "*/_semantic/knowledge/" --glob "*.memory.md" - -# Project patterns only -rg "pattern" ${MNEMONIC_ROOT} --path "*/_procedural/patterns/" --glob "*.memory.md" -``` - -### Recent + Text - -```bash -# Files modified in last 7 days containing "api" -find ${MNEMONIC_ROOT} -name "*.memory.md" -mtime -7 -exec rg -l "api" {} \; - -# Files modified today -find ${MNEMONIC_ROOT} -name "*.memory.md" -mtime 0 -exec rg -l "pattern" {} \; -``` - -### Type + Namespace - -```bash -# Episodic memories in blockers (incident reports) -rg -l "^type: episodic" ${MNEMONIC_ROOT} --path "*/_episodic/blockers/" --glob "*.memory.md" - -# Procedural memories in patterns (workflows) -rg -l "^type: procedural" ${MNEMONIC_ROOT} --path "*/_procedural/patterns/" --glob "*.memory.md" -``` - -### Tag + Text - -```bash -# Memories tagged "security" mentioning "password" -for f in $(rg -l "^ - security" ${MNEMONIC_ROOT}/ --glob "*.memory.md"); do - rg -l "password" "$f" 2>/dev/null -done -``` - ---- - -## Progressive Disclosure Levels - -### Level 1: Quick Answer (Titles Only) - -```bash -# List all memory titles -for f in ${MNEMONIC_ROOT}/**/*.memory.md; do - title=$(grep "^title:" "$f" 2>/dev/null | head -1 | sed 's/^title: "//' | sed 's/"$//') - [ -n "$title" ] && echo "$title" -done -``` - -### Level 2: Context (Frontmatter + First Section) - -```bash -# Get frontmatter plus first 10 content lines -head -50 /path/to/memory.memory.md -``` - -### Structured Summary (Key Fields) - -```bash -# Extract key fields for quick review -for f in ${MNEMONIC_ROOT}/**/*.memory.md; do - echo "=== $(basename "$f") ===" - grep -E "^(id|type|namespace|title|created):" "$f" | head -5 - echo "" -done -``` - -### Level 3: Full Detail - -```bash -# Complete memory content -cat /path/to/memory.memory.md -``` - ---- - -## Performance Tips - -### Narrow File Set First - -```bash -# Use find to limit scope, then search -find ${MNEMONIC_ROOT} -path "*/_semantic/decisions/*" -name "*.memory.md" | xargs rg "pattern" - -# Or use directory restriction -rg "pattern" ${MNEMONIC_ROOT} --path "*/_semantic/decisions/" --glob "*.memory.md" -``` - -### Limit Output - -```bash -# First 10 matches only -rg "pattern" ${MNEMONIC_ROOT}/ --glob "*.memory.md" | head -10 - -# First matching file only -rg -l "pattern" ${MNEMONIC_ROOT}/ --glob "*.memory.md" | head -1 -``` - -### Use File List Mode - -```bash -# Get file list first -FILES=$(rg -l "pattern" ${MNEMONIC_ROOT}/ --glob "*.memory.md") - -# Then read specific files -for f in $FILES; do - head -30 "$f" -done -``` - -### Parallel Search - -```bash -# Search multiple namespaces in parallel -rg "pattern" ${MNEMONIC_ROOT} --path "*/_semantic/decisions/" --glob "*.memory.md" & -rg "pattern" ${MNEMONIC_ROOT} --path "*/_semantic/knowledge/" --glob "*.memory.md" & -wait -``` - ---- - -## Examples - -### Find All Decisions About Authentication - -```bash -echo "=== Auth Decisions ===" -rg -i "auth" ${MNEMONIC_ROOT} --path "*/_semantic/decisions/" --glob "*.memory.md" -l -``` - -### Recent Knowledge in Current Project - -```bash -echo "=== Recent Project Knowledge ===" -find ${MNEMONIC_ROOT} -path "*/_semantic/knowledge/*" -name "*.memory.md" -mtime -7 -exec basename {} \; -``` - -### Episodic Memories From Last Week - -```bash -echo "=== Last Week's Events ===" -for f in $(find ${MNEMONIC_ROOT} -path "*/_episodic/*" -name "*.memory.md" -mtime -7 2>/dev/null); do - grep "^title:" "$f" | sed 's/^title: "//' | sed 's/"$//' -done -``` - -### High-Confidence Security Knowledge - -```bash -echo "=== Trusted Security Knowledge ===" -for f in $(rg -l "confidence: 0\.9" ${MNEMONIC_ROOT} --path "*/_semantic/knowledge/" --glob "*.memory.md" 2>/dev/null); do - grep "^title:" "$f" -done -``` - -### Code References in Memories - -```bash -echo "=== Memories With Code Refs ===" -rg -l "^code_refs:" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# Find memories referencing specific file -rg "file: src/auth" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l -``` - -### Memories With Relationships - -```bash -echo "=== Linked Memories ===" -rg "\[\[" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l -``` - ---- - -## Semantic Search (requires qmd) - -If `@tobilu/qmd` is installed and indexed (see `/mnemonic:qmd-setup`), you can use semantic search in addition to ripgrep. - -### Commands - -```bash -# BM25 keyword search (like rg, but ranked) -qmd search "authentication middleware" -n 10 - -# Semantic vector search (meaning-based, not keyword) -qmd vsearch "how do we handle user sessions" -n 10 - -# Hybrid search (BM25 + vector combined) -qmd query "authentication patterns and best practices" -n 10 -``` - -### Useful Flags - -```bash -# Scope to a specific collection -qmd search "auth" -c mnemonic-zircote - -# JSON output for programmatic use -qmd search "auth" --json - -# Minimum relevance score -qmd vsearch "auth" --min-score 0.5 -``` - -### When to Use Each - -| Tool | Best For | Requires | -|------|----------|----------| -| `rg` | Exact strings, regex, frontmatter fields, fastest | Nothing | -| `qmd search` | Ranked keyword search, typo-tolerant | `qmd update` | -| `qmd vsearch` | Conceptual/meaning-based queries | `qmd embed` | -| `qmd query` | Best overall recall, combines both signals | Both | - -**Use `rg` when** you know the exact term or field (e.g., `rg "^namespace: _semantic/decisions"`). -**Use `qmd` when** searching by concept, fuzzy matching, or need ranked results. - -### Important - -Indexing is **not** automatic. After adding memories, run `/mnemonic:qmd-reindex` (or `qmd update && qmd embed`). - ---- - -## Search Cheat Sheet - -| Goal | Command | -|------|---------| -| All decisions | `rg "^namespace: _semantic/decisions" ${MNEMONIC_ROOT}/ -l` | -| By tag | `rg -l "^ - tagname" ${MNEMONIC_ROOT}/` | -| By type | `rg "^type: semantic" ${MNEMONIC_ROOT}/ -l` | -| Full-text | `rg -i "search term" ${MNEMONIC_ROOT}/` | -| Recent files | `find ${MNEMONIC_ROOT} -mtime -7` | -| Titles only | `rg "^title:" ${MNEMONIC_ROOT}/` | -| High confidence | `rg "confidence: 0\.9" ${MNEMONIC_ROOT}/ -l` | -| With code refs | `rg "^code_refs:" ${MNEMONIC_ROOT}/ -l` | -| With citations | `rg "^citations:" ${MNEMONIC_ROOT}/ -l` | -| Citation type | `rg "type: paper" ${MNEMONIC_ROOT}/ -l` | -| Citation domain | `rg "url: https://arxiv.org" ${MNEMONIC_ROOT}/ -l` | -| Project only | `rg "pattern"` | - ---- - -## Progressive Disclosure Protocol - -When searching memories, use progressive disclosure to minimize context usage: - -### Level 1: Quick Answer (Titles Only) - START HERE - -```bash -# List matching files first -rg -l "pattern" ${MNEMONIC_ROOT}/ --glob "*.memory.md" - -# Then get titles -for f in $(rg -l "pattern" ${MNEMONIC_ROOT}/ --glob "*.memory.md"); do - grep "^title:" "$f" | head -1 -done -``` - -### Level 2: Context (Frontmatter + Summary) - -Only expand to Level 2 if Level 1 titles aren't sufficient: - -```bash -# Get frontmatter plus first 10 content lines -head -50 /path/to/memory.memory.md -``` - -### Level 3: Full Detail - -Only use full read when absolutely necessary: - -```bash -cat /path/to/memory.memory.md -``` - -**Always start at Level 1. Expand only if needed.** diff --git a/skills/ontology/ontologies.deprecated/base.ontology.yaml b/skills/ontology/ontologies.deprecated/base.ontology.yaml deleted file mode 100644 index 9f8c8ec..0000000 --- a/skills/ontology/ontologies.deprecated/base.ontology.yaml +++ /dev/null @@ -1,72 +0,0 @@ ---- -# Mnemonic Base Ontology -# -# This ontology defines the standard mnemonic namespaces. -# It provides backward compatibility for existing memories -# and serves as a reference for custom ontology development. -# -# Version: 1.0.0 -# Last Updated: 2026-01-25 - -ontology: - id: mnemonic-base - version: "1.0.0" - description: "Base mnemonic namespaces for backward compatibility" - -# Standard Mnemonic Namespaces -# These are the 9 core namespaces that ship with mnemonic. -# Custom ontologies can extend or replace these. - -namespaces: - apis: - description: "API documentation, contracts, endpoints, specifications" - type_hint: semantic - - blockers: - description: "Issues, impediments, incidents, things blocking progress" - type_hint: episodic - - context: - description: "Background information, environment state, project context" - type_hint: semantic - - decisions: - description: "Architectural choices with rationale, technology selections" - type_hint: semantic - - learnings: - description: "Insights, discoveries, TILs (Today I Learned), gotchas" - type_hint: semantic - - patterns: - description: "Code conventions, best practices, recurring solutions" - type_hint: procedural - - security: - description: "Security policies, vulnerabilities, access controls" - type_hint: semantic - - testing: - description: "Test strategies, edge cases, coverage notes" - type_hint: procedural - - episodic: - description: "General events, experiences, debug sessions, meetings" - type_hint: episodic - -# No custom entity types in base ontology -# Memories use the standard types: semantic, episodic, procedural -entity_types: [] - -# No custom traits in base ontology -traits: {} - -# No relationships defined in base ontology -# Standard relationships like relates-to, supersedes are handled by MIF -relationships: {} - -# No discovery patterns in base ontology -# Discovery is disabled by default -discovery: - enabled: false - patterns: [] diff --git a/skills/ontology/ontologies.deprecated/examples/software-engineering.ontology.yaml b/skills/ontology/ontologies.deprecated/examples/software-engineering.ontology.yaml deleted file mode 100644 index 804a12a..0000000 --- a/skills/ontology/ontologies.deprecated/examples/software-engineering.ontology.yaml +++ /dev/null @@ -1,531 +0,0 @@ ---- -# Software Engineering Ontology -# -# A comprehensive ontology for software development teams. -# Extends mnemonic with architecture, component, and incident types. -# -# Usage: -# Copy to ./.claude/mnemonic/ontology.yaml -# Or reference via URL in your project ontology -# -# Version: 1.0.0 -# Last Updated: 2026-01-25 - -ontology: - id: software-engineering - version: "1.0.0" - description: "Software engineering domain ontology for development teams" - -# Custom Namespaces -# These extend the base mnemonic namespaces -namespaces: - architecture: - description: "System architecture decisions and component designs" - type_hint: semantic - - components: - description: "Software components, modules, services, libraries" - type_hint: semantic - - incidents: - description: "Production incidents, outages, postmortems" - type_hint: episodic - - migrations: - description: "Database migrations, schema changes, data transformations" - type_hint: procedural - - dependencies: - description: "Third-party libraries, packages, services, integrations" - type_hint: semantic - -# Entity Types -# These define structured entity schemas with inheritance -entity_types: - - name: component - description: "A software component, module, or service" - base: semantic - traits: - - versioned - - documented - schema: - required: - - name - - responsibility - properties: - name: - type: string - description: "Component name" - responsibility: - type: string - description: "Single responsibility description" - dependencies: - type: array - description: "List of component dependencies" - items: - type: string - interfaces: - type: array - description: "Public interfaces/APIs" - items: - type: string - owner: - type: string - description: "Team or person owning this component" - - - name: architectural-decision - description: "An architectural decision with full context" - base: semantic - traits: - - dated - - cited - schema: - required: - - decision - - rationale - properties: - decision: - type: string - description: "The decision made" - rationale: - type: string - description: "Why this decision was made" - alternatives: - type: array - description: "Alternatives considered" - items: - type: object - consequences: - type: object - description: "Known consequences and trade-offs" - status: - type: string - description: "Decision status" - enum: - - proposed - - accepted - - deprecated - - superseded - - - name: incident-report - description: "A production incident or outage report" - base: episodic - traits: - - timeline - - stakeholders - schema: - required: - - severity - - impact - - resolution - properties: - severity: - type: string - description: "Incident severity level" - enum: - - critical - - high - - medium - - low - impact: - type: string - description: "Business/user impact description" - resolution: - type: string - description: "How the incident was resolved" - root_cause: - type: string - description: "Root cause analysis" - prevention: - type: array - description: "Prevention measures" - items: - type: string - duration_minutes: - type: integer - description: "Incident duration in minutes" - - - name: technology - description: "A technology, framework, or tool" - base: semantic - traits: - - versioned - - documented - schema: - required: - - name - - category - properties: - name: - type: string - category: - type: string - enum: - - database - - framework - - language - - infrastructure - - tool - - library - website: - type: string - format: uri - license: - type: string - use_case: - type: string - description: "Why/where we use this technology" - - - name: design-pattern - description: "A design pattern or architectural pattern" - base: semantic - traits: - - cited - schema: - required: - - pattern_name - - context - - solution - properties: - pattern_name: - type: string - context: - type: string - description: "When to use this pattern" - solution: - type: string - description: "How the pattern solves the problem" - consequences: - type: object - description: "Trade-offs and implications" - related_patterns: - type: array - items: - type: string - - # PROCEDURAL ENTITY TYPES - # These capture step-by-step processes and operational knowledge - - - name: deployment-procedure - description: "Step-by-step deployment or release procedure" - base: procedural - traits: - - versioned - - stakeholders - schema: - required: - - name - - steps - - target_environment - properties: - name: - type: string - description: "Procedure name" - steps: - type: array - description: "Ordered list of steps" - items: - type: object - properties: - order: - type: integer - action: - type: string - verification: - type: string - rollback: - type: string - target_environment: - type: string - description: "Target environment" - enum: - - development - - staging - - production - prerequisites: - type: array - description: "Required conditions before execution" - items: - type: string - estimated_duration: - type: string - description: "Expected time to complete" - automation_level: - type: string - enum: - - manual - - semi-automated - - fully-automated - - - name: runbook - description: "Operational runbook for handling scenarios" - base: procedural - traits: - - versioned - - stakeholders - schema: - required: - - title - - trigger - - procedure - properties: - title: - type: string - trigger: - type: string - description: "What triggers this runbook" - severity: - type: string - enum: - - critical - - high - - medium - - low - procedure: - type: array - description: "Step-by-step procedure" - items: - type: object - properties: - step: - type: integer - action: - type: string - expected_outcome: - type: string - escalation: - type: object - description: "Escalation path" - properties: - conditions: - type: string - contact: - type: string - related_alerts: - type: array - items: - type: string - - - name: migration-guide - description: "Database or system migration procedure" - base: procedural - traits: - - versioned - - dated - schema: - required: - - title - - from_state - - to_state - - steps - properties: - title: - type: string - from_state: - type: string - description: "Current state before migration" - to_state: - type: string - description: "Target state after migration" - steps: - type: array - items: - type: object - rollback_procedure: - type: array - items: - type: object - data_validation: - type: array - description: "Validation checks" - items: - type: string - downtime_required: - type: boolean - -# Traits (Mixins) -# Reusable field sets that can be composed into entity types -traits: - versioned: - description: "Adds version tracking fields" - fields: - version: - type: string - pattern: "^\\d+\\.\\d+\\.\\d+.*$" - changelog: - type: array - items: - type: object - - documented: - description: "Adds documentation reference" - fields: - documentation_url: - type: string - format: uri - readme_path: - type: string - - dated: - description: "Adds decision/event date" - fields: - decision_date: - type: string - format: date - review_date: - type: string - format: date - - cited: - description: "Requires citations/sources" - requires: - - citations - - timeline: - description: "Adds incident timeline" - fields: - timeline: - type: array - items: - type: object - properties: - timestamp: - type: string - format: date-time - event: - type: string - actor: - type: string - - stakeholders: - description: "Adds stakeholder tracking" - fields: - stakeholders: - type: array - items: - type: object - properties: - name: - type: string - role: - type: string - contact: - type: string - -# Relationships -# Define how entities can relate to each other -relationships: - depends_on: - description: "Component dependency relationship" - from: - - component - to: - - component - - technology - symmetric: false - - implements: - description: "Component implements a pattern or decision" - from: - - component - to: - - design-pattern - - architectural-decision - symmetric: false - - caused_by: - description: "Incident causality" - from: - - incident-report - to: - - component - - technology - symmetric: false - - resolves: - description: "Decision resolves an issue" - from: - - architectural-decision - to: - - incident-report - symmetric: false - - supersedes: - description: "Newer version supersedes older" - from: - - architectural-decision - - component - - runbook - - deployment-procedure - to: - - architectural-decision - - component - - runbook - - deployment-procedure - symmetric: false - - documents: - description: "Procedure documents how to work with entity" - from: - - runbook - - deployment-procedure - - migration-guide - to: - - component - - technology - symmetric: false - - triggers: - description: "Incident triggers runbook execution" - from: - - incident-report - to: - - runbook - symmetric: false - -# Discovery Configuration -# Patterns for auto-discovering entities -discovery: - enabled: true - confidence_threshold: 0.8 - - patterns: - # Technology patterns - - content_pattern: "\\b(PostgreSQL|MySQL|MongoDB|Redis|Elasticsearch)\\b" - suggest_entity: technology - - content_pattern: "\\b(React|Vue|Angular|Next\\.js|Django)\\b" - suggest_entity: technology - - content_pattern: "\\b(FastAPI|Express|Flask|Spring)\\b" - suggest_entity: technology - - content_pattern: "\\b(Docker|Kubernetes|Terraform|AWS|GCP|Azure)\\b" - suggest_entity: technology - - # Pattern patterns - - content_pattern: "\\b(Factory|Singleton|Observer|Adapter)\\s+Pattern\\b" - suggest_entity: design-pattern - - content_pattern: "\\b(Repository|Strategy|Decorator)\\s+Pattern\\b" - suggest_entity: design-pattern - - content_pattern: "\\b(CQRS|Event\\s+Sourcing|Saga|Circuit\\s+Breaker)\\b" - suggest_entity: design-pattern - - # Component patterns - - file_pattern: "**/services/**/*.py" - suggest_entity: component - - file_pattern: "**/components/**/*.tsx" - suggest_entity: component - - # Incident patterns - - content_pattern: "\\b(outage|incident|postmortem|RCA)\\b" - suggest_entity: incident-report - - # Procedural patterns - runbooks and deployments - - content_pattern: "\\b(runbook|playbook|SOP|procedure)\\b" - suggest_entity: runbook - - content_pattern: "\\b(deploy|release|rollout)\\s+(steps|procedure)\\b" - suggest_entity: deployment-procedure - - content_pattern: "\\b(migration|migrate|upgrade)\\s+(guide|plan)\\b" - suggest_entity: migration-guide - - file_pattern: "**/runbooks/**/*.md" - suggest_entity: runbook - - file_pattern: "**/docs/procedures/**/*.md" - suggest_entity: deployment-procedure diff --git a/skills/ontology/ontologies.deprecated/schemas/ontology-meta-schema.json b/skills/ontology/ontologies.deprecated/schemas/ontology-meta-schema.json deleted file mode 100644 index 94a4978..0000000 --- a/skills/ontology/ontologies.deprecated/schemas/ontology-meta-schema.json +++ /dev/null @@ -1,258 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://mnemonic.org/schemas/ontology/v1", - "title": "Mnemonic Ontology Schema", - "description": "JSON Schema for validating Mnemonic ontology definition files", - "type": "object", - "properties": { - "ontology": { - "type": "object", - "description": "Ontology metadata", - "required": ["id", "version"], - "properties": { - "id": { - "type": "string", - "description": "Unique identifier for the ontology", - "pattern": "^[a-z][a-z0-9-]*$" - }, - "version": { - "type": "string", - "description": "Semantic version string", - "pattern": "^\\d+\\.\\d+\\.\\d+.*$" - }, - "description": { - "type": "string", - "description": "Human-readable description" - }, - "schema_url": { - "type": "string", - "description": "URL to external schema definition", - "format": "uri" - } - } - }, - "namespaces": { - "type": "object", - "description": "Custom namespace definitions", - "additionalProperties": { - "type": "object", - "properties": { - "description": { - "type": "string", - "description": "Namespace description" - }, - "type_hint": { - "type": "string", - "description": "Default memory type for this namespace", - "enum": ["semantic", "episodic", "procedural"] - }, - "replaces": { - "type": "string", - "description": "Base namespace this replaces" - } - } - } - }, - "entity_types": { - "type": "array", - "description": "Custom entity type definitions", - "items": { - "$ref": "#/$defs/entityType" - } - }, - "traits": { - "type": "object", - "description": "Reusable trait/mixin definitions", - "additionalProperties": { - "$ref": "#/$defs/trait" - } - }, - "relationships": { - "type": "object", - "description": "Relationship type definitions", - "additionalProperties": { - "$ref": "#/$defs/relationship" - } - }, - "discovery": { - "type": "object", - "description": "Entity discovery configuration", - "properties": { - "enabled": { - "type": "boolean", - "description": "Whether discovery is enabled", - "default": false - }, - "patterns": { - "type": "array", - "description": "Discovery patterns", - "items": { - "$ref": "#/$defs/discoveryPattern" - } - }, - "confidence_threshold": { - "type": "number", - "description": "Minimum confidence for suggestions", - "minimum": 0, - "maximum": 1, - "default": 0.8 - } - } - } - }, - "$defs": { - "entityType": { - "type": "object", - "description": "Entity type definition", - "required": ["name", "base"], - "properties": { - "name": { - "type": "string", - "description": "Entity type name", - "pattern": "^[a-z][a-z0-9-]*$" - }, - "description": { - "type": "string", - "description": "Entity type description" - }, - "base": { - "type": "string", - "description": "Base memory type", - "enum": ["semantic", "episodic", "procedural"] - }, - "traits": { - "type": "array", - "description": "Traits this entity type includes", - "items": { - "type": "string" - } - }, - "schema": { - "type": "object", - "description": "JSON Schema for entity fields", - "properties": { - "required": { - "type": "array", - "items": { - "type": "string" - } - }, - "properties": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/propertySchema" - } - } - } - } - } - }, - "trait": { - "type": "object", - "description": "Trait/mixin definition", - "properties": { - "description": { - "type": "string" - }, - "fields": { - "type": "object", - "description": "Fields provided by this trait", - "additionalProperties": { - "$ref": "#/$defs/propertySchema" - } - }, - "requires": { - "type": "array", - "description": "MIF fields this trait requires", - "items": { - "type": "string" - } - } - } - }, - "relationship": { - "type": "object", - "description": "Relationship type definition", - "properties": { - "description": { - "type": "string" - }, - "from": { - "type": "array", - "description": "Entity types that can be the source", - "items": { - "type": "string" - } - }, - "to": { - "type": "array", - "description": "Entity types that can be the target", - "items": { - "type": "string" - } - }, - "symmetric": { - "type": "boolean", - "description": "Whether the relationship is symmetric", - "default": false - } - } - }, - "discoveryPattern": { - "type": "object", - "description": "Pattern for discovering entities", - "required": ["suggest_entity"], - "properties": { - "content_pattern": { - "type": "string", - "description": "Regex pattern to match in content" - }, - "file_pattern": { - "type": "string", - "description": "Glob pattern to match file paths" - }, - "suggest_entity": { - "type": "string", - "description": "Entity type to suggest when pattern matches" - } - } - }, - "propertySchema": { - "type": "object", - "description": "JSON Schema property definition", - "properties": { - "type": { - "type": "string", - "enum": [ - "string", - "number", - "integer", - "boolean", - "array", - "object", - "null" - ] - }, - "description": { - "type": "string" - }, - "format": { - "type": "string", - "description": "Format hint (e.g., 'uri', 'date-time')" - }, - "pattern": { - "type": "string", - "description": "Regex pattern for string validation" - }, - "items": { - "type": "object", - "description": "Schema for array items" - }, - "enum": { - "type": "array", - "description": "Allowed values" - } - } - } - } -} diff --git a/skills/qmd-reindex/SKILL.md b/skills/qmd-reindex/SKILL.md index 7eb3073..d37f2a1 100644 --- a/skills/qmd-reindex/SKILL.md +++ b/skills/qmd-reindex/SKILL.md @@ -1,9 +1,7 @@ --- allowed-tools: - Bash -description: > - Re-index mnemonic memories for qmd semantic search. Run after capturing - new memories or bulk imports. +description: Re-index mnemonic memories for qmd semantic search. Run after capturing new memories or bulk imports. name: qmd-reindex user-invocable: true --- diff --git a/skills/qmd-setup/SKILL.md b/skills/qmd-setup/SKILL.md index 7c96c74..0dfa0e6 100644 --- a/skills/qmd-setup/SKILL.md +++ b/skills/qmd-setup/SKILL.md @@ -3,9 +3,7 @@ allowed-tools: - Bash - Read - Write -description: > - Set up @tobilu/qmd semantic search for mnemonic memories. Registers collections, - builds indexes, and generates embeddings. Run this once per machine. +description: Set up @tobilu/qmd semantic search for mnemonic memories. Registers collections, builds indexes, and generates embeddings. Run this once per machine. name: qmd-setup user-invocable: true --- diff --git a/skills/search/SKILL.md b/skills/search/SKILL.md new file mode 100644 index 0000000..0c6ce96 --- /dev/null +++ b/skills/search/SKILL.md @@ -0,0 +1,167 @@ +--- +allowed-tools: +- Bash +- Read +- Glob +- Grep +- Write +- Task +description: > + This skill should be used when the user says "search memories", "find in memories", + "grep mnemonic", "look for memory", "deep search", "synthesize knowledge", or asks + questions like "what do we know about X". Provides progressive disclosure and + enhanced iterative search with synthesis. +name: search +user-invocable: true +--- + +## Memory + +Search first: `/mnemonic:search {relevant_keywords}` +Capture after: `/mnemonic:capture {namespace} "{title}"` + +Run `/mnemonic:list --namespaces` to see available namespaces from loaded ontologies. + + +# Mnemonic Search Skill + +Search and filtering for mnemonic memories. + +## Trigger Phrases + +- "search memories", "find in memories", "grep memories", "search mnemonic" +- "deep search memories", "comprehensive memory search", "synthesize knowledge about" + +--- + +## Core Search Patterns + +### By Namespace + +```bash +rg "^namespace: _semantic/decisions" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l +``` + +### By Tag + +```bash +# Single tag +rg -l "^ - architecture" ${MNEMONIC_ROOT}/ --glob "*.memory.md" + +# Multiple tags (AND) +rg -l "^ - architecture" ${MNEMONIC_ROOT}/ --glob "*.memory.md" | xargs rg -l "^ - database" +``` + +### By Type + +```bash +rg "^type: semantic" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l +rg "^type: episodic" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l +rg "^type: procedural" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l +``` + +### By Date + +```bash +rg "^created: 2026-01" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l +``` + +### By Title + +```bash +rg -i '^title: ".*auth.*"' ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l +``` + +### By Confidence + +```bash +rg "confidence: 0\.9" ${MNEMONIC_ROOT}/ --glob "*.memory.md" -l +``` + +### Full-Text + +```bash +rg -i "search term" ${MNEMONIC_ROOT}/ --glob "*.memory.md" +``` + +### Combined: Namespace + Text + +```bash +rg "database" ${MNEMONIC_ROOT} --path "*/_semantic/decisions/" --glob "*.memory.md" +``` + +### Recent Files + +```bash +find ${MNEMONIC_ROOT} -name "*.memory.md" -mtime -7 +``` + +--- + +## Progressive Disclosure Protocol + +Always start at Level 1. Expand only if needed. + +| Level | What | How | +|-------|------|-----| +| 1 (start here) | Titles only | `rg -l "pattern" ${MNEMONIC_ROOT}/ --glob "*.memory.md"` then extract `^title:` | +| 2 | Frontmatter + summary | Read first ~50 lines of matched files | +| 3 | Full detail | Read entire memory file | + +--- + +## Semantic Search (requires qmd) + +If `@tobilu/qmd` is installed (see `/mnemonic:qmd-setup`): + +```bash +# BM25 keyword search (ranked) +qmd search "authentication middleware" -n 10 + +# Semantic vector search (meaning-based) +qmd vsearch "how do we handle user sessions" -n 10 + +# Hybrid search (BM25 + vector combined) +qmd query "authentication patterns" -n 10 + +# Scope to collection +qmd search "auth" -c mnemonic-zircote +``` + +| Tool | Best For | Requires | +|------|----------|----------| +| `rg` | Exact strings, regex, frontmatter fields | Nothing | +| `qmd search` | Ranked keyword search, typo-tolerant | `qmd update` | +| `qmd vsearch` | Conceptual/meaning-based queries | `qmd embed` | +| `qmd query` | Best overall recall, combines both | Both | + +After adding memories, run `/mnemonic:qmd-reindex` to update indexes. + +--- + +## Enhanced Search (Iterative with Synthesis) + +For complex or multi-faceted queries: + +1. **Initial search** with user's query +2. **Analyze results** for gaps +3. **Iterative refinement** (up to 3 rounds via Task tool with `mnemonic-search-subcall` agent) +4. **Synthesize** findings into a coherent answer with source citations + +Use when queries span multiple namespaces or need comprehensive coverage. + +### Output Format + +```markdown +## Synthesized Answer +{Answer drawing from all found memories} + +### Sources +| Memory | Namespace | Relevance | +|--------|-----------|-----------| +| [[memory-id]] title | namespace | High/Medium | + +### Gaps +- {Topics where no memories were found} +``` + diff --git a/skills/mnemonic-setup/SKILL.md b/skills/setup/SKILL.md similarity index 99% rename from skills/mnemonic-setup/SKILL.md rename to skills/setup/SKILL.md index 519e3a3..b270af6 100644 --- a/skills/mnemonic-setup/SKILL.md +++ b/skills/setup/SKILL.md @@ -1,5 +1,5 @@ --- -name: mnemonic-setup +name: setup description: Configure Claude for proactive mnemonic memory behavior without user intervention user-invocable: true allowed-tools: diff --git a/tools/mnemonic-validate b/tools/mnemonic-validate index 0c21619..93563ef 100755 --- a/tools/mnemonic-validate +++ b/tools/mnemonic-validate @@ -2,7 +2,7 @@ """ mnemonic-validate: Validate mnemonic memory files against MIF Level 3 schema. -This tool parses the MIF schema from skills/mnemonic-format/SKILL.md and validates +This tool parses the MIF schema from skills/format/SKILL.md and validates all memory files against it. Usage: @@ -114,7 +114,7 @@ def find_plugin_root() -> Path: def parse_mif_schema(skill_path: Path) -> MIFSchema: - """Parse MIF schema from mnemonic-format SKILL.md.""" + """Parse MIF schema from format SKILL.md.""" content = skill_path.read_text() schema = MIFSchema() @@ -705,7 +705,7 @@ def main(): plugin_root = Path(__file__).parent.parent # Load schema - skill_path = plugin_root / "skills" / "mnemonic-format" / "SKILL.md" + skill_path = plugin_root / "skills" / "format" / "SKILL.md" if not skill_path.exists(): print(f"Error: Cannot find MIF schema at {skill_path}", file=sys.stderr) sys.exit(1)

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