edsger 0.82.0 → 0.84.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/README.md +101 -2
  2. package/assets/README.md +31 -18
  3. package/assets/audit/base.yaml +187 -0
  4. package/assets/audit/csharp.yaml +46 -0
  5. package/assets/audit/dart.yaml +46 -0
  6. package/assets/audit/go.yaml +46 -0
  7. package/assets/audit/java.yaml +46 -0
  8. package/assets/audit/python.yaml +49 -0
  9. package/assets/audit/typescript.yaml +51 -0
  10. package/assets/audit-viewer/assets/audit--os0TXXZ.css +1 -0
  11. package/assets/audit-viewer/assets/audit-CSblYELs.js +2 -0
  12. package/assets/audit-viewer/audit.html +31 -0
  13. package/assets/audit-viewer-single.html +32 -0
  14. package/assets/diagrams/base.yaml +351 -0
  15. package/assets/diagrams/csharp.yaml +48 -0
  16. package/assets/diagrams/dart.yaml +41 -0
  17. package/assets/diagrams/go.yaml +44 -0
  18. package/assets/diagrams/java.yaml +43 -0
  19. package/assets/diagrams/python.yaml +41 -0
  20. package/assets/diagrams/typescript.yaml +45 -0
  21. package/assets/diagrams-viewer/assets/abnfDiagram-VRR7QNED-CWLpbgGU.js +1 -0
  22. package/assets/diagrams-viewer/assets/arc-B4VipCr_.js +1 -0
  23. package/assets/diagrams-viewer/assets/architectureDiagram-ZJ3FMSHR-BMDodQXV.js +36 -0
  24. package/assets/diagrams-viewer/assets/blockDiagram-677ZJIJ3-DbHoVVH-.js +132 -0
  25. package/assets/diagrams-viewer/assets/c4Diagram-LMCZKHZV-CyUEj98S.js +10 -0
  26. package/assets/diagrams-viewer/assets/channel-DWh7ErxY.js +1 -0
  27. package/assets/diagrams-viewer/assets/chunk-2Q5K7J3B-CWu0p0os.js +1 -0
  28. package/assets/diagrams-viewer/assets/chunk-32BRIVSS-BhVWSCoK.js +1 -0
  29. package/assets/diagrams-viewer/assets/chunk-5VM5RSS4-B_2wZBAn.js +15 -0
  30. package/assets/diagrams-viewer/assets/chunk-EX3LRPZG-D_MRgtfL.js +231 -0
  31. package/assets/diagrams-viewer/assets/chunk-JWPE2WC7-dsh1qiy0.js +1 -0
  32. package/assets/diagrams-viewer/assets/chunk-MOJQB5TN-BvLm4a6B.js +88 -0
  33. package/assets/diagrams-viewer/assets/chunk-RYQCIY6F-gJyPbIpx.js +1 -0
  34. package/assets/diagrams-viewer/assets/chunk-V7JOEXUC-BMvj0zJM.js +206 -0
  35. package/assets/diagrams-viewer/assets/chunk-VR4S4FIN-Di2iBUXs.js +1 -0
  36. package/assets/diagrams-viewer/assets/chunk-XXDRQBXY-Cfajbd4I.js +1 -0
  37. package/assets/diagrams-viewer/assets/classDiagram-OUVF2IWQ-winWhRce.js +1 -0
  38. package/assets/diagrams-viewer/assets/classDiagram-v2-EOCWNBFH-winWhRce.js +1 -0
  39. package/assets/diagrams-viewer/assets/cose-bilkent-JH36ORCC-ClE2EhTL.js +1 -0
  40. package/assets/diagrams-viewer/assets/cynefin-VYW2F7L2-nm5z0Jwc.js +178 -0
  41. package/assets/diagrams-viewer/assets/cynefinDiagram-TSTJHNR4-CGhnRh5V.js +62 -0
  42. package/assets/diagrams-viewer/assets/cytoscape.esm-CUqq0XTU.js +331 -0
  43. package/assets/diagrams-viewer/assets/dagre-VKFMJZFB-COlahHKk.js +4 -0
  44. package/assets/diagrams-viewer/assets/defaultLocale-DX6XiGOO.js +1 -0
  45. package/assets/diagrams-viewer/assets/diagram-FQU43EPY-DsUclBK0.js +3 -0
  46. package/assets/diagrams-viewer/assets/diagram-G47NLZAW-CnjT9SvX.js +24 -0
  47. package/assets/diagrams-viewer/assets/diagram-NH7WQ7WH-DiGoGOyA.js +24 -0
  48. package/assets/diagrams-viewer/assets/diagram-OA4YK3LP-qi8nz9qe.js +30 -0
  49. package/assets/diagrams-viewer/assets/diagram-WEI45ONY-BV3PGzwL.js +41 -0
  50. package/assets/diagrams-viewer/assets/diagrams-8nCc1utO.css +1 -0
  51. package/assets/diagrams-viewer/assets/diagrams-CF48btj0.js +314 -0
  52. package/assets/diagrams-viewer/assets/ebnfDiagram-CCIWWBDH-CtKWe-dh.js +1 -0
  53. package/assets/diagrams-viewer/assets/erDiagram-Q63AITRT-Aajee3Fz.js +85 -0
  54. package/assets/diagrams-viewer/assets/flowDiagram-23GEKE2U-N3Xe2K9t.js +156 -0
  55. package/assets/diagrams-viewer/assets/ganttDiagram-NO4QXBWP-Bjicdg8S.js +292 -0
  56. package/assets/diagrams-viewer/assets/gitGraphDiagram-IHSO6WYX-CacIXKIe.js +106 -0
  57. package/assets/diagrams-viewer/assets/graph-C2PyVmSI.js +1 -0
  58. package/assets/diagrams-viewer/assets/infoDiagram-FWYZ7A6U-CVmDapTx.js +2 -0
  59. package/assets/diagrams-viewer/assets/init-Gi6I4Gst.js +1 -0
  60. package/assets/diagrams-viewer/assets/ishikawaDiagram-FXEZZL3T-DMJf1YQN.js +70 -0
  61. package/assets/diagrams-viewer/assets/journeyDiagram-5HDEW3XC-Bk_U6MPk.js +139 -0
  62. package/assets/diagrams-viewer/assets/kanban-definition-HUTT4EX6-n05wGXiD.js +89 -0
  63. package/assets/diagrams-viewer/assets/katex-C5jXJg4s.js +257 -0
  64. package/assets/diagrams-viewer/assets/layout-HEHzrzvT.js +1 -0
  65. package/assets/diagrams-viewer/assets/linear-DD_zky65.js +1 -0
  66. package/assets/diagrams-viewer/assets/map-BQHxRNoK.js +1 -0
  67. package/assets/diagrams-viewer/assets/mindmap-definition-LN4V7U3C-BWt_I9vr.js +96 -0
  68. package/assets/diagrams-viewer/assets/ordinal-Cboi1Yqb.js +1 -0
  69. package/assets/diagrams-viewer/assets/pegDiagram-2B236MQR-CCZTIXBZ.js +1 -0
  70. package/assets/diagrams-viewer/assets/pieDiagram-ENE6RG2P-BmIQql1w.js +39 -0
  71. package/assets/diagrams-viewer/assets/quadrantDiagram-ABIIQ3AL-BPvOH5QN.js +7 -0
  72. package/assets/diagrams-viewer/assets/railroadDiagram-RFXS5EU6-DpgVbjSl.js +1 -0
  73. package/assets/diagrams-viewer/assets/requirementDiagram-TGXJPOKE-CDVpI3MH.js +84 -0
  74. package/assets/diagrams-viewer/assets/sankeyDiagram-HTMAVEWB-DU2J23Xy.js +40 -0
  75. package/assets/diagrams-viewer/assets/sequenceDiagram-DBY2YBRQ-BIVlCWU4.js +162 -0
  76. package/assets/diagrams-viewer/assets/sizeCapture-X5ZJPWSS-C9KxyKN2.js +1 -0
  77. package/assets/diagrams-viewer/assets/stateDiagram-2N3HPSRC-Ba5mRI9d.js +1 -0
  78. package/assets/diagrams-viewer/assets/stateDiagram-v2-6OUMAXLB-Dw-0OG6b.js +1 -0
  79. package/assets/diagrams-viewer/assets/swimlanes-5IMT3BWC-aOsD2O80.js +2 -0
  80. package/assets/diagrams-viewer/assets/swimlanesDiagram-G3AALYLV-KujklZml.js +8 -0
  81. package/assets/diagrams-viewer/assets/timeline-definition-FHXFAJF6-CmYd84Hc.js +120 -0
  82. package/assets/diagrams-viewer/assets/vennDiagram-L72KCM5P-CDiMK-z9.js +34 -0
  83. package/assets/diagrams-viewer/assets/wardleyDiagram-EHGQE667-BKLsv25u.js +78 -0
  84. package/assets/diagrams-viewer/assets/xychartDiagram-FW5EYKEG-Bpj6Ub-a.js +7 -0
  85. package/assets/diagrams-viewer/diagrams.html +31 -0
  86. package/assets/diagrams-viewer-single.html +3593 -0
  87. package/assets/manifest.yaml +13 -1
  88. package/assets/mindmap/base.yaml +115 -0
  89. package/assets/mindmap/csharp.yaml +32 -0
  90. package/assets/mindmap/dart.yaml +42 -0
  91. package/assets/mindmap/go.yaml +33 -0
  92. package/assets/mindmap/java.yaml +40 -0
  93. package/assets/mindmap/python.yaml +43 -0
  94. package/assets/mindmap/typescript.yaml +47 -0
  95. package/assets/mindmap-viewer/assets/mindmap-D7KMR9EM.css +1 -0
  96. package/assets/mindmap-viewer/assets/mindmap-Di5RM-4N.js +4 -0
  97. package/assets/mindmap-viewer/mindmap.html +31 -0
  98. package/assets/mindmap-viewer-single.html +34 -0
  99. package/assets/schema/audit.schema.json +66 -0
  100. package/assets/schema/diagrams.schema.json +100 -0
  101. package/assets/schema/mindmap.schema.json +69 -0
  102. package/assets/skills/audit/SKILL.md +76 -0
  103. package/assets/skills/diagram/SKILL.md +70 -0
  104. package/assets/skills/mindmap/SKILL.md +69 -0
  105. package/assets/viewer/assets/index-BFtGar9N.css +1 -0
  106. package/assets/viewer/assets/index-XOKyyudT.js +3 -0
  107. package/assets/viewer/index.html +19 -2
  108. package/assets/viewer-single.html +21 -4
  109. package/dist/index.js +1720 -318
  110. package/dist/index.js.map +1 -1
  111. package/package.json +2 -2
  112. package/assets/viewer/assets/index-C7hwGkuU.js +0 -3
  113. package/assets/viewer/assets/index-Dhc-7q5o.css +0 -1
@@ -0,0 +1,34 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <script>
7
+ (function () {
8
+ try {
9
+ var t = localStorage.getItem("edsger-theme");
10
+ if (t !== "light" && t !== "dark") {
11
+ t =
12
+ window.matchMedia &&
13
+ window.matchMedia("(prefers-color-scheme: light)").matches
14
+ ? "light"
15
+ : "dark";
16
+ }
17
+ document.documentElement.setAttribute("data-theme", t);
18
+ } catch (e) {
19
+ document.documentElement.setAttribute("data-theme", "dark");
20
+ }
21
+ })();
22
+ </script>
23
+ <title>Edsger — Mind Map</title>
24
+ <!-- __EDSGER_MINDMAP__ is injected here when exported as a single self-contained file. -->
25
+ <script type="module" crossorigin>(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))l(i);new MutationObserver(i=>{for(const r of i)if(r.type==="childList")for(const _ of r.addedNodes)_.tagName==="LINK"&&_.rel==="modulepreload"&&l(_)}).observe(document,{childList:!0,subtree:!0});function n(i){const r={};return i.integrity&&(r.integrity=i.integrity),i.referrerPolicy&&(r.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?r.credentials="include":i.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function l(i){if(i.ep)return;i.ep=!0;const r=n(i);fetch(i.href,r)}})();var le,b,Ve,F,Pe,Ge,Ke,se,Z,W,Qe,me,ue,de,te={},ne=[],dt=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,ie=Array.isArray;function L(e,t){for(var n in t)e[n]=t[n];return e}function ge(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function ft(e,t,n){var l,i,r,_={};for(r in t)r=="key"?l=t[r]:r=="ref"?i=t[r]:_[r]=t[r];if(arguments.length>2&&(_.children=arguments.length>3?le.call(arguments,2):n),typeof e=="function"&&e.defaultProps!=null)for(r in e.defaultProps)_[r]===void 0&&(_[r]=e.defaultProps[r]);return X(e,_,l,i,null)}function X(e,t,n,l,i){var r={type:e,props:t,key:n,ref:l,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:i??++Ve,__i:-1,__u:0};return i==null&&b.vnode!=null&&b.vnode(r),r}function oe(e){return e.children}function ee(e,t){this.props=e,this.context=t}function q(e,t){if(t==null)return e.__?q(e.__,e.__i+1):null;for(var n;t<e.__k.length;t++)if((n=e.__k[t])!=null&&n.__e!=null)return n.__e;return typeof e.type=="function"?q(e):null}function ht(e){if(e.__P&&e.__d){var t=e.__v,n=t.__e,l=[],i=[],r=L({},t);r.__v=t.__v+1,b.vnode&&b.vnode(r),ve(e.__P,r,t,e.__n,e.__P.namespaceURI,32&t.__u?[n]:null,l,n??q(t),!!(32&t.__u),i),r.__v=t.__v,r.__.__k[r.__i]=r,Xe(l,r,i),t.__e=t.__=null,r.__e!=n&&Je(r)}}function Je(e){if((e=e.__)!=null&&e.__c!=null)return e.__e=e.__c.base=null,e.__k.some(function(t){if(t!=null&&t.__e!=null)return e.__e=e.__c.base=t.__e}),Je(e)}function Te(e){(!e.__d&&(e.__d=!0)&&F.push(e)&&!re.__r++||Pe!=b.debounceRendering)&&((Pe=b.debounceRendering)||Ge)(re)}function re(){try{for(var e,t=1;F.length;)F.length>t&&F.sort(Ke),e=F.shift(),t=F.length,ht(e)}finally{F.length=re.__r=0}}function Ye(e,t,n,l,i,r,_,a,d,c,u){var y,o,h,f,C,g,m,v=l&&l.__k||ne,k=t.length;for(d=pt(n,t,v,d,k),y=0;y<k;y++)(h=n.__k[y])!=null&&(o=h.__i!=-1&&v[h.__i]||te,h.__i=y,g=ve(e,h,o,i,r,_,a,d,c,u),f=h.__e,h.ref&&o.ref!=h.ref&&(o.ref&&ye(o.ref,null,h),u.push(h.ref,h.__c||f,h)),C==null&&f!=null&&(C=f),(m=!!(4&h.__u))||o.__k===h.__k?(d=Ze(h,d,e,m),m&&o.__e&&(o.__e=null)):typeof h.type=="function"&&g!==void 0?d=g:f&&(d=f.nextSibling),h.__u&=-7);return n.__e=C,d}function pt(e,t,n,l,i){var r,_,a,d,c,u=n.length,y=u,o=0;for(e.__k=new Array(i),r=0;r<i;r++)(_=t[r])!=null&&typeof _!="boolean"&&typeof _!="function"?(typeof _=="string"||typeof _=="number"||typeof _=="bigint"||_.constructor==String?_=e.__k[r]=X(null,_,null,null,null):ie(_)?_=e.__k[r]=X(oe,{children:_},null,null,null):_.constructor===void 0&&_.__b>0?_=e.__k[r]=X(_.type,_.props,_.key,_.ref?_.ref:null,_.__v):e.__k[r]=_,d=r+o,_.__=e,_.__b=e.__b+1,a=null,(c=_.__i=mt(_,n,d,y))!=-1&&(y--,(a=n[c])&&(a.__u|=2)),a==null||a.__v==null?(c==-1&&(i>u?o--:i<u&&o++),typeof _.type!="function"&&(_.__u|=4)):c!=d&&(c==d-1?o--:c==d+1?o++:(c>d?o--:o++,_.__u|=4))):e.__k[r]=null;if(y)for(r=0;r<u;r++)(a=n[r])!=null&&!(2&a.__u)&&(a.__e==l&&(l=q(a)),tt(a,a));return l}function Ze(e,t,n,l){var i,r;if(typeof e.type=="function"){for(i=e.__k,r=0;i&&r<i.length;r++)i[r]&&(i[r].__=e,t=Ze(i[r],t,n,l));return t}e.__e!=t&&(l&&(t&&e.type&&!t.parentNode&&(t=q(e)),n.insertBefore(e.__e,t||null)),t=e.__e);do t=t&&t.nextSibling;while(t!=null&&t.nodeType==8);return t}function mt(e,t,n,l){var i,r,_,a=e.key,d=e.type,c=t[n],u=c!=null&&(2&c.__u)==0;if(c===null&&a==null||u&&a==c.key&&d==c.type)return n;if(l>(u?1:0)){for(i=n-1,r=n+1;i>=0||r<t.length;)if((c=t[_=i>=0?i--:r++])!=null&&!(2&c.__u)&&a==c.key&&d==c.type)return _}return-1}function De(e,t,n){t[0]=="-"?e.setProperty(t,n??""):e[t]=n==null?"":typeof n!="number"||dt.test(t)?n:n+"px"}function J(e,t,n,l,i){var r,_;e:if(t=="style")if(typeof n=="string")e.style.cssText=n;else{if(typeof l=="string"&&(e.style.cssText=l=""),l)for(t in l)n&&t in n||De(e.style,t,"");if(n)for(t in n)l&&n[t]==l[t]||De(e.style,t,n[t])}else if(t[0]=="o"&&t[1]=="n")r=t!=(t=t.replace(Qe,"$1")),_=t.toLowerCase(),t=_ in e||t=="onFocusOut"||t=="onFocusIn"?_.slice(2):t.slice(2),e.l||(e.l={}),e.l[t+r]=n,n?l?n[W]=l[W]:(n[W]=me,e.addEventListener(t,r?de:ue,r)):e.removeEventListener(t,r?de:ue,r);else{if(i=="http://www.w3.org/2000/svg")t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(t!="width"&&t!="height"&&t!="href"&&t!="list"&&t!="form"&&t!="tabIndex"&&t!="download"&&t!="rowSpan"&&t!="colSpan"&&t!="role"&&t!="popover"&&t in e)try{e[t]=n??"";break e}catch{}typeof n=="function"||(n==null||n===!1&&t[4]!="-"?e.removeAttribute(t):e.setAttribute(t,t=="popover"&&n==1?"":n))}}function Ie(e){return function(t){if(this.l){var n=this.l[t.type+e];if(t[Z]==null)t[Z]=me++;else if(t[Z]<n[W])return;return n(b.event?b.event(t):t)}}}function ve(e,t,n,l,i,r,_,a,d,c){var u,y,o,h,f,C,g,m,v,k,N,H,D,R,P,z,T=t.type;if(t.constructor!==void 0)return null;128&n.__u&&(d=!!(32&n.__u),r=[a=t.__e=n.__e]),(u=b.__b)&&u(t);e:if(typeof T=="function"){y=_.length;try{if(v=t.props,k=T.prototype&&T.prototype.render,N=(u=T.contextType)&&l[u.__c],H=u?N?N.props.value:u.__:l,n.__c?m=(o=t.__c=n.__c).__=o.__E:(k?t.__c=o=new T(v,H):(t.__c=o=new ee(v,H),o.constructor=T,o.render=vt),N&&N.sub(o),o.state||(o.state={}),o.__n=l,h=o.__d=!0,o.__h=[],o._sb=[]),k&&o.__s==null&&(o.__s=o.state),k&&T.getDerivedStateFromProps!=null&&(o.__s==o.state&&(o.__s=L({},o.__s)),L(o.__s,T.getDerivedStateFromProps(v,o.__s))),f=o.props,C=o.state,o.__v=t,h)k&&T.getDerivedStateFromProps==null&&o.componentWillMount!=null&&o.componentWillMount(),k&&o.componentDidMount!=null&&o.__h.push(o.componentDidMount);else{if(k&&T.getDerivedStateFromProps==null&&v!==f&&o.componentWillReceiveProps!=null&&o.componentWillReceiveProps(v,H),t.__v==n.__v||!o.__e&&o.shouldComponentUpdate!=null&&o.shouldComponentUpdate(v,o.__s,H)===!1){t.__v!=n.__v&&(o.props=v,o.state=o.__s,o.__d=!1),t.__e=n.__e,t.__k=n.__k,t.__k.some(function(M){M&&(M.__=t)}),ne.push.apply(o.__h,o._sb),o._sb=[],o.__h.length&&_.push(o);break e}o.componentWillUpdate!=null&&o.componentWillUpdate(v,o.__s,H),k&&o.componentDidUpdate!=null&&o.__h.push(function(){o.componentDidUpdate(f,C,g)})}if(o.context=H,o.props=v,o.__P=e,o.__e=!1,D=b.__r,R=0,k)o.state=o.__s,o.__d=!1,D&&D(t),u=o.render(o.props,o.state,o.context),ne.push.apply(o.__h,o._sb),o._sb=[];else do o.__d=!1,D&&D(t),u=o.render(o.props,o.state,o.context),o.state=o.__s;while(o.__d&&++R<25);o.state=o.__s,o.getChildContext!=null&&(l=L(L({},l),o.getChildContext())),k&&!h&&o.getSnapshotBeforeUpdate!=null&&(g=o.getSnapshotBeforeUpdate(f,C)),P=u!=null&&u.type===oe&&u.key==null?et(u.props.children):u,a=Ye(e,ie(P)?P:[P],t,n,l,i,r,_,a,d,c),o.base=t.__e,t.__u&=-161,o.__h.length&&_.push(o),m&&(o.__E=o.__=null)}catch(M){if(_.length=y,t.__v=null,d||r!=null)if(M.then){for(t.__u|=d?160:128;a&&a.nodeType==8&&a.nextSibling;)a=a.nextSibling;r!=null&&(r[r.indexOf(a)]=null),t.__e=a}else{if(r!=null)for(z=r.length;z--;)ge(r[z]);fe(t)}else t.__e=n.__e,!t.__k&&n.__k&&(t.__k=n.__k),M.then||fe(t);b.__e(M,t,n)}}else r==null&&t.__v==n.__v?(t.__k=n.__k,t.__e=n.__e):a=t.__e=gt(n.__e,t,n,l,i,r,_,d,c);return(u=b.diffed)&&u(t),128&t.__u?void 0:a}function fe(e){e&&(e.__c&&(e.__c.__e=!0),e.__k&&e.__k.some(fe))}function Xe(e,t,n){for(var l=0;l<n.length;l++)ye(n[l],n[++l],n[++l]);b.__c&&b.__c(t,e),e.some(function(i){try{e=i.__h,i.__h=[],e.some(function(r){r.call(i)})}catch(r){b.__e(r,i.__v)}})}function et(e){return typeof e!="object"||e==null||e.__b>0?e:ie(e)?e.map(et):e.constructor!==void 0?null:L({},e)}function gt(e,t,n,l,i,r,_,a,d){var c,u,y,o,h,f,C,g=n.props||te,m=t.props,v=t.type;if(v=="svg"?i="http://www.w3.org/2000/svg":v=="math"?i="http://www.w3.org/1998/Math/MathML":i||(i="http://www.w3.org/1999/xhtml"),r!=null){for(c=0;c<r.length;c++)if((h=r[c])&&"setAttribute"in h==!!v&&(v?h.localName==v:h.nodeType==3)){e=h,r[c]=null;break}}if(e==null){if(v==null)return document.createTextNode(m);e=document.createElementNS(i,v,m.is&&m),a&&(b.__m&&b.__m(t,r),a=!1),r=null}if(v==null)g===m||a&&e.data==m||(e.data=m);else{if(r=v=="textarea"&&m.defaultValue!=null?null:r&&le.call(e.childNodes),!a&&r!=null)for(g={},c=0;c<e.attributes.length;c++)g[(h=e.attributes[c]).name]=h.value;for(c in g)h=g[c],c=="dangerouslySetInnerHTML"?y=h:c=="children"||c in m||c=="value"&&"defaultValue"in m||c=="checked"&&"defaultChecked"in m||J(e,c,null,h,i);for(c in m)h=m[c],c=="children"?o=h:c=="dangerouslySetInnerHTML"?u=h:c=="value"?f=h:c=="checked"?C=h:a&&typeof h!="function"||g[c]===h||J(e,c,h,g[c],i);if(u)a||y&&(u.__html==y.__html||u.__html==e.innerHTML)||(e.innerHTML=u.__html),t.__k=[];else if(y&&(e.innerHTML=""),Ye(t.type=="template"?e.content:e,ie(o)?o:[o],t,n,l,v=="foreignObject"?"http://www.w3.org/1999/xhtml":i,r,_,r?r[0]:n.__k&&q(n,0),a,d),r!=null)for(c=r.length;c--;)ge(r[c]);a&&v!="textarea"||(c="value",v=="progress"&&f==null?e.removeAttribute("value"):f!=null&&(f!==e[c]||v=="progress"&&!f||v=="option"&&f!=g[c])&&J(e,c,f,g[c],i),c="checked",C!=null&&C!=e[c]&&J(e,c,C,g[c],i))}return e}function ye(e,t,n){try{if(typeof e=="function"){var l=typeof e.__u=="function";l&&e.__u(),l&&t==null||(e.__u=e(t))}else e.current=t}catch(i){b.__e(i,n)}}function tt(e,t,n){var l,i;if(b.unmount&&b.unmount(e),(l=e.ref)&&(l.current&&l.current!=e.__e||ye(l,null,t)),(l=e.__c)!=null){if(l.componentWillUnmount)try{l.componentWillUnmount()}catch(r){b.__e(r,t)}l.base=l.__P=l.__n=null}if(l=e.__k)for(i=0;i<l.length;i++)l[i]&&tt(l[i],t,n||typeof e.type!="function");n||ge(e.__e),e.__c=e.__=e.__e=void 0}function vt(e,t,n){return this.constructor(e,n)}function yt(e,t,n){var l,i,r,_;t==document&&(t=document.documentElement),b.__&&b.__(e,t),i=(l=!1)?null:t.__k,r=[],_=[],ve(t,e=t.__k=ft(oe,null,[e]),i||te,te,t.namespaceURI,i?null:t.firstChild?le.call(t.childNodes):null,r,i?i.__e:t.firstChild,l,_),Xe(r,e,_),e.props.children=null}le=ne.slice,b={__e:function(e,t,n,l){for(var i,r,_;t=t.__;)if((i=t.__c)&&!i.__)try{if((r=i.constructor)&&r.getDerivedStateFromError!=null&&(i.setState(r.getDerivedStateFromError(e)),_=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(e,l||{}),_=i.__d),_)return i.__E=i}catch(a){e=a}throw e}},Ve=0,ee.prototype.setState=function(e,t){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=L({},this.state),typeof e=="function"&&(e=e(L({},n),this.props)),e&&L(n,e),e!=null&&this.__v&&(t&&this._sb.push(t),Te(this))},ee.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),Te(this))},ee.prototype.render=oe,F=[],Ge=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Ke=function(e,t){return e.__v.__b-t.__v.__b},re.__r=0,se=Math.random().toString(8),Z="__d"+se,W="__a"+se,Qe=/(PointerCapture)$|Capture$/i,me=0,ue=Ie(!1),de=Ie(!0);var bt=0;function s(e,t,n,l,i,r){t||(t={});var _,a,d=t;if("ref"in d)for(a in d={},t)a=="ref"?_=t[a]:d[a]=t[a];var c={type:e,props:d,key:n,ref:_,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--bt,__i:-1,__u:0,__source:i,__self:r};if(typeof e=="function"&&(_=e.defaultProps))for(a in _)d[a]===void 0&&(d[a]=_[a]);return b.vnode&&b.vnode(c),c}var B,E,ce,He,V=0,nt=[],S=b,Me=S.__b,Le=S.__r,Ue=S.diffed,Fe=S.__c,Re=S.unmount,Oe=S.__;function be(e,t){S.__h&&S.__h(E,e,V||t),V=0;var n=E.__H||(E.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function U(e){return V=1,kt(ot,e)}function kt(e,t,n){var l=be(B++,2);if(l.t=e,!l.__c&&(l.__=[ot(void 0,t),function(a){var d=l.__N?l.__N[0]:l.__[0],c=l.t(d,a);d!==c&&(l.__N=[c,l.__[1]],l.__c.setState({}))}],l.__c=E,!E.__f)){var i=function(a,d,c){if(!l.__c.__H)return!0;var u=!1,y=l.__c.props!==a;if(l.__c.__H.__.some(function(h){if(h.__N){u=!0;var f=h.__[0];h.__=h.__N,h.__N=void 0,f!==h.__[0]&&(y=!0)}}),r){var o=r.call(this,a,d,c);return u?o||y:o}return!u||y};E.__f=!0;var r=E.shouldComponentUpdate,_=E.componentWillUpdate;E.componentWillUpdate=function(a,d,c){if(this.__e){var u=r;r=void 0,i(a,d,c),r=u}_&&_.call(this,a,d,c)},E.shouldComponentUpdate=i}return l.__N||l.__}function j(e,t){var n=be(B++,3);!S.__s&&it(n.__H,t)&&(n.__=e,n.u=t,E.__H.__h.push(n))}function rt(e){return V=5,I(function(){return{current:e}},[])}function I(e,t){var n=be(B++,7);return it(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function Y(e,t){return V=8,I(function(){return e},t)}function je(){for(var e;e=nt.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(he),t.__h.some(lt),t.__h=[]}catch(n){t.__h=[],S.__e(n,e.__v)}}}S.__b=function(e){E=null,Me&&Me(e)},S.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),Oe&&Oe(e,t)},S.__r=function(e){Le&&Le(e),B=0;var t=(E=e.__c).__H;t&&(ce===E?(t.__h=[],E.__h=[],t.__.some(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(t.__h.length&&je(),B=0)),ce=E},S.diffed=function(e){Ue&&Ue(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(nt.push(t)!==1&&He===S.requestAnimationFrame||((He=S.requestAnimationFrame)||wt)(je)),t.__H.__.some(function(n){n.u&&(n.__H=n.u,n.u=void 0)})),ce=E=null},S.__c=function(e,t){t.some(function(n){try{n.__h.some(he),n.__h=n.__h.filter(function(l){return!l.__||lt(l)})}catch(l){t.some(function(i){i.__h&&(i.__h=[])}),t=[],S.__e(l,n.__v)}}),Fe&&Fe(e,t)},S.unmount=function(e){Re&&Re(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.some(function(l){try{he(l)}catch(i){t=i}}),n.__H=void 0,t&&S.__e(t,n.__v))};var qe=typeof requestAnimationFrame=="function";function wt(e){var t,n=function(){clearTimeout(l),qe&&cancelAnimationFrame(t),setTimeout(e)},l=setTimeout(n,35);qe&&(t=requestAnimationFrame(n))}function he(e){var t=E,n=e.__c;typeof n=="function"&&(e.__c=void 0,n()),E=t}function lt(e){var t=E;e.__c=e.__(),E=t}function it(e,t){return!e||e.length!==t.length||t.some(function(n,l){return n!==e[l]})}function ot(e,t){return typeof t=="function"?t(e):t}async function xt(){if(window.__EDSGER_MINDMAP__)return ze(window.__EDSGER_MINDMAP__);const e=await fetch("./edsger-mindmap.json",{cache:"no-store"});if(!e.ok)throw new Error(`Could not load edsger-mindmap.json (HTTP ${e.status})`);return ze(await e.json())}function ze(e){const t=[...e.history??[]].sort((n,l)=>n.generatedAt<l.generatedAt?-1:n.generatedAt>l.generatedAt?1:0);return{repo:e.repo,latest:e.latest??null,history:t,runs:e.runs??{}}}function Et(e){const t=new Map,n=(l,i)=>{t.set(l.id,{node:l,parent:i});for(const r of l.children)n(r,l.id)};return n(e,null),t}function _t(e,t){return`${e.title}
26
+ ${e.summary}
27
+ ${e.files.join(`
28
+ `)}`.toLowerCase().includes(t)}function St(e,t){if(!t)return null;const n=new Set,l=i=>{let r=_t(i,t);for(const _ of i.children)l(_)&&(r=!0);return r&&n.add(i.id),r};return l(e),n}function st(e,t,n){return e.children.length?t?e.children.some(l=>t.has(l.id)):n.has(e.id):!1}function $t(e,t,n){const l=[],i=r=>{for(const _ of r.children)t&&!t.has(_.id)||(l.push(_.id),st(_,t,n)&&i(_))};return i(e),l}function Ct(e,t){if(!t)return[];const n=[];let l=t;for(;l;){const i=e.get(l);if(!i)break;n.unshift(i.node),l=i.parent}return n}function At(e,t){if(!t)return[{text:e,hit:!1}];const n=e.toLowerCase(),l=[];let i=0;for(;;){const r=n.indexOf(t,i);if(r===-1)break;r>i&&l.push({text:e.slice(i,r),hit:!1}),l.push({text:e.slice(r,r+t.length),hit:!0}),i=r+t.length}return i<e.length&&l.push({text:e.slice(i),hit:!1}),l.length?l:[{text:e,hit:!1}]}function ct(e){return e.children.reduce((t,n)=>t+1+ct(n),0)}function ae({text:e,query:t}){return t?At(e,t).map((n,l)=>n.hit?s("mark",{children:n.text},l):n.text):e}function Nt({node:e,view:t,onToggle:n,onZoom:l,onSelect:i}){const r=e.children.length>0,_=t.isExpanded(e),a=t.selectedId===e.id,d=rt(null);j(()=>{var u;a&&((u=d.current)==null||u.scrollIntoView({block:"nearest"}))},[a]);const c=["row",a?"selected":"",t.isMatch(e)?"match":""].filter(Boolean).join(" ");return s("div",{class:"node","data-kind":e.kind,children:[s("div",{class:c,ref:d,onClick:()=>i(e.id),children:[r?s("button",{class:`disclosure ${_?"open":""}`,title:_?"Collapse":"Expand",onClick:u=>{u.stopPropagation(),i(e.id),n(e.id)},children:"▸"}):s("span",{class:"disclosure spacer"}),s("button",{class:`dot ${r&&!_?"loaded":""}`,title:"Zoom in",onClick:u=>{u.stopPropagation(),l(e.id)},children:s("span",{})}),s("div",{class:"node-text",children:[s("span",{class:"title",onDblClick:()=>l(e.id),children:s(ae,{text:e.title,query:t.query})}),e.kind&&e.kind!=="topic"?s("span",{class:"kind-badge",children:e.kind}):null,r&&!_?s("span",{class:"count-badge",children:ct(e)}):null,e.summary?s("span",{class:"summary",children:s(ae,{text:e.summary,query:t.query})}):null,e.files.length?s("span",{class:"files",children:e.files.map(u=>s("code",{class:"file",children:s(ae,{text:u,query:t.query})},u))}):null]})]}),r&&_?s("div",{class:"children",children:s(at,{nodes:e.children,view:t,onToggle:n,onZoom:l,onSelect:i})}):null]})}function at({nodes:e,view:t,onToggle:n,onZoom:l,onSelect:i}){return s("div",{class:"outline",children:e.filter(r=>t.isVisible(r)).map(r=>s(Nt,{node:r,view:t,onToggle:n,onZoom:l,onSelect:i},r.id))})}const ut="edsger-theme",pe=new Set;function Pt(){return typeof matchMedia<"u"&&matchMedia("(prefers-color-scheme: light)").matches?"light":"dark"}function Tt(){if(typeof document<"u"){const e=document.documentElement.getAttribute("data-theme");if(e==="light"||e==="dark")return e}try{const e=localStorage.getItem(ut);if(e==="light"||e==="dark")return e}catch{}return Pt()}let G=Tt();typeof document<"u"&&!document.documentElement.getAttribute("data-theme")&&document.documentElement.setAttribute("data-theme",G);function Dt(){return G}function It(e){G=e,typeof document<"u"&&document.documentElement.setAttribute("data-theme",e);try{localStorage.setItem(ut,e)}catch{}for(const t of pe)t()}function Ht(){It(G==="dark"?"light":"dark")}function Mt(e){return pe.add(e),()=>{pe.delete(e)}}function Lt(){const[e,t]=U(G);return j(()=>Mt(()=>t(Dt())),[]),e}function Ut(){const e=Lt(),n=`Switch to ${e==="dark"?"light":"dark"} mode`;return s("button",{type:"button",class:"theme-toggle",title:n,"aria-label":n,onClick:()=>Ht(),children:s("span",{"aria-hidden":"true",children:e==="dark"?"☀":"☾"})})}function We(e){const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(void 0,{year:"numeric",month:"short",day:"2-digit",hour:"2-digit",minute:"2-digit"})}function Ft(){var we;const[e,t]=U(null),[n,l]=U(null),[i,r]=U(null),[_,a]=U(null),[d,c]=U(new Set),[u,y]=U(null),[o,h]=U("");j(()=>{xt().then(t).catch(p=>l(p instanceof Error?p.message:String(p)))},[]);const f=I(()=>e?i&&e.runs[i]?e.runs[i]:e.latest:null,[e,i]),C=I(()=>e?[...e.history].reverse():[],[e]),g=I(()=>f?Et(f.root):null,[f]);j(()=>{f&&(a(null),y(null),c(new Set(f.root.children.map(p=>p.id))))},[f]);const m=I(()=>f?_&&(g!=null&&g.get(_))?g.get(_).node:f.root:null,[f,g,_]),v=I(()=>g?Ct(g,_):[],[g,_]),k=o.trim().toLowerCase(),N=I(()=>m?St(m,k):null,[k,m]),H=I(()=>({isVisible:p=>N?N.has(p.id):!0,isExpanded:p=>st(p,N,d),isMatch:p=>!!k&&_t(p,k),query:k,selectedId:u}),[N,d,k,u]),D=I(()=>m?$t(m,N,d):[],[m,N,d]),R=Y(p=>{c(w=>{const x=new Set(w);return x.has(p)?x.delete(p):x.add(p),x})},[]),P=Y(p=>{if(a(p),y(null),h(""),p&&(g!=null&&g.get(p))){const w=g.get(p).node;c(x=>{const $=new Set(x);$.add(p);for(const A of w.children)$.add(A.id);return $})}},[g]),z=Y(()=>{m&&c(p=>{const w=new Set(p),x=$=>{$.children.length&&w.add($.id),$.children.forEach(x)};return x(m),w})},[m]),T=Y(()=>{m&&c(p=>{const w=new Set(p),x=$=>{w.delete($.id),$.children.forEach(x)};for(const $ of m.children)x($);return w})},[m]),M=rt({index:g,flat:D,selected:u,expanded:d,zoomId:_});M.current={index:g,flat:D,selected:u,expanded:d,zoomId:_},j(()=>{const p=w=>{var Se,$e,Ce,Ae,Ne;const{index:x,flat:$,selected:A,expanded:xe,zoomId:K}=M.current,Q=w.target;if(Q&&(Q.tagName==="INPUT"||Q.tagName==="SELECT")){w.key==="Escape"&&Q.blur();return}if(!x||!$.length){w.key==="Escape"&&K&&(w.preventDefault(),P(((Se=x==null?void 0:x.get(K))==null?void 0:Se.parent)??null));return}const Ee=A?$.indexOf(A):-1;switch(w.key){case"ArrowDown":w.preventDefault(),y($[Math.min(Ee+1,$.length-1)]??null);break;case"ArrowUp":w.preventDefault(),y($[Math.max(Ee-1,0)]??null);break;case"ArrowRight":{if(!A)break;w.preventDefault();const O=($e=x.get(A))==null?void 0:$e.node;O!=null&&O.children.length&&!xe.has(A)&&R(A);break}case"ArrowLeft":{if(!A)break;w.preventDefault();const O=(Ce=x.get(A))==null?void 0:Ce.node;if(O!=null&&O.children.length&&xe.has(A))R(A);else{const _e=(Ae=x.get(A))==null?void 0:Ae.parent;_e&&$.includes(_e)&&y(_e)}break}case"Enter":A&&(w.preventDefault(),P(A));break;case"Escape":K&&(w.preventDefault(),P(((Ne=x.get(K))==null?void 0:Ne.parent)??null));break}};return window.addEventListener("keydown",p),()=>window.removeEventListener("keydown",p)},[R,P]),j(()=>{u&&!D.includes(u)&&y(null)},[D,u]);const ke=(e==null?void 0:e.repo)??(f==null?void 0:f.repo)??"";return s("div",{class:"app",children:[s("header",{class:"topbar",children:[s("div",{class:"brand",children:[s("span",{class:"logo",children:"edsger"}),s("span",{class:"subtitle",children:"mind map"})]}),s("div",{class:"topbar-actions",children:[ke?s("div",{class:"repo",children:ke}):null,s(Ut,{})]})]}),s("main",{class:"content",children:n?s("div",{class:"empty",children:[s("strong",{children:"Failed to load data."}),s("div",{class:"muted",children:n})]}):e?!f||!m?s("div",{class:"empty",children:["No mind map yet. Run ",s("code",{children:"edsger mindmap"}),"."]}):s("div",{class:"stack",children:[_?null:s("section",{class:"profile",children:[s("p",{class:"summary",children:f.profile.summary}),f.profile.kinds.length?s("div",{class:"chips",children:f.profile.kinds.map(p=>s("span",{class:"chip kind",children:p},p))}):null,s("dl",{class:"facts",children:[s("div",{children:[s("dt",{children:"Languages"}),s("dd",{children:f.languages.join(", ")||"generic"})]}),s("div",{children:[s("dt",{children:"Nodes"}),s("dd",{children:[f.nodeCount," · depth ",f.depth]})]}),s("div",{children:[s("dt",{children:"Commit"}),s("dd",{children:(we=f.git)!=null&&we.commit?s("code",{children:[f.git.commit,f.git.branch?` (${f.git.branch})`:"",f.git.dirty?" ✻":""]}):"—"})]}),s("div",{children:[s("dt",{children:"Generated"}),s("dd",{children:We(f.generatedAt)})]}),C.length>1?s("div",{children:[s("dt",{children:"Run"}),s("dd",{children:s("select",{class:"run-select",value:i??f.runId,onChange:p=>r(p.target.value),children:C.map(p=>s("option",{value:p.runId,children:[We(p.generatedAt)," · ",p.nodeCount," nodes"]},p.runId))})})]}):null]})]}),s("section",{class:"outline-panel",children:[s("div",{class:"outline-toolbar",children:[v.length?s("nav",{class:"breadcrumb",children:[s("button",{class:"crumb",onClick:()=>P(null),children:f.root.title}),v.slice(1,-1).map(p=>s("span",{children:[s("span",{class:"crumb-sep",children:"›"}),s("button",{class:"crumb",onClick:()=>P(p.id),children:p.title})]},p.id)),s("span",{class:"crumb-sep",children:"›"}),s("span",{class:"crumb current",children:m.title})]}):s("div",{class:"breadcrumb muted",children:"↑↓ ←→ navigate · Enter zoom · Esc back"}),s("div",{class:"outline-actions",children:[s("input",{class:"search",type:"search",placeholder:"Search titles, summaries, files…",value:o,onInput:p=>h(p.target.value)}),s("button",{class:"ghost-btn",onClick:z,children:"Expand all"}),s("button",{class:"ghost-btn",onClick:T,children:"Collapse all"})]})]}),s("div",{class:"zoom-head",children:[s("h2",{class:"zoom-title",children:m.title}),m.summary?s("p",{class:"zoom-summary",children:m.summary}):null,m.files.length?s("div",{class:"files",children:m.files.map(p=>s("code",{class:"file",children:p},p))}):null]}),k&&!D.length?s("div",{class:"empty muted",children:["No nodes match “",o,"”."]}):s(at,{nodes:m.children,view:H,onToggle:R,onZoom:P,onSelect:y})]}),f.notes&&!_?s("section",{class:"notes",children:[s("h2",{children:"Notes"}),s("p",{children:f.notes})]}):null]}):s("div",{class:"empty",children:"Loading…"})}),s("footer",{class:"foot",children:s("span",{children:"Generated by edsger"})})]})}const Be=document.getElementById("app");Be&&yt(s(Ft,{}),Be);</script>
29
+ <style rel="stylesheet" crossorigin>:root,:root[data-theme=dark]{--bg: #0d1117;--panel: #161b22;--panel-2: #1c2129;--border: #30363d;--text: #e6edf3;--muted: #8b949e;--accent: #58a6ff;--on-accent: #04101f;--chart-line: #e6edf3;--chart-axis: #8b949e;--chart-grid: #21262d;color-scheme:dark}:root[data-theme=light]{--bg: #ffffff;--panel: #f6f8fa;--panel-2: #eaeef2;--border: #d0d7de;--text: #1f2328;--muted: #59636e;--accent: #0969da;--on-accent: #ffffff;--chart-line: #1f2328;--chart-axis: #59636e;--chart-grid: #d8dee4;color-scheme:light}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:14px/1.5 -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.9em;background:var(--panel-2);padding:1px 5px;border-radius:5px}.app{max-width:1040px;margin:0 auto;padding:0 20px 60px}.topbar{display:flex;align-items:baseline;justify-content:space-between;padding:22px 0 14px}.brand{display:flex;align-items:baseline;gap:10px}.logo{font-weight:800;font-size:22px;letter-spacing:-.5px}.subtitle{color:var(--muted)}.repo{color:var(--muted);font-family:ui-monospace,monospace}.topbar-actions{display:flex;align-items:center;gap:14px}.theme-toggle{display:inline-flex;align-items:center;justify-content:center;width:34px;height:30px;padding:0;background:var(--panel-2);border:1px solid var(--border);border-radius:8px;color:var(--text);font-size:15px;line-height:1;cursor:pointer}.theme-toggle:hover{border-color:var(--accent);color:var(--accent)}.tabs{display:flex;gap:4px;border-bottom:1px solid var(--border);margin-bottom:22px}.tab{background:none;border:none;border-bottom:2px solid transparent;color:var(--muted);padding:10px 14px;font-size:14px;cursor:pointer}.tab:hover{color:var(--text)}.tab.active{color:var(--text);border-bottom-color:var(--accent);font-weight:600}.stack{display:flex;flex-direction:column;gap:18px}.two-col{display:grid;grid-template-columns:1fr 1fr;gap:18px}@media (max-width: 720px){.two-col{grid-template-columns:1fr}}.card{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:18px 20px}.card-title{margin:0 0 14px;font-size:15px;font-weight:600}.hero{display:flex;gap:26px;align-items:center;background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:22px}@media (max-width: 720px){.hero{flex-direction:column;align-items:flex-start}}.hero-meta{flex:1}.summary{margin:0 0 14px;font-size:15px}.facts{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px 18px;margin:0}.facts div{display:flex;flex-direction:column}.facts dt{color:var(--muted);font-size:12px;text-transform:uppercase;letter-spacing:.4px}.facts dd{margin:2px 0 0}.ring svg{display:block}.ring-track{fill:none;stroke:var(--border);stroke-width:12}.ring-value{fill:none;stroke-width:12;stroke-linecap:round;transition:stroke-dasharray .6s ease}.ring-score{font-size:34px;font-weight:800;text-anchor:middle}.ring-grade{font-size:12px;fill:var(--muted);text-anchor:middle}.bar-row{display:grid;grid-template-columns:220px 1fr 120px;align-items:center;gap:12px;padding:5px 0}@media (max-width: 620px){.bar-row{grid-template-columns:130px 1fr 70px}}.bar-label{color:var(--text)}.bar-track{background:var(--panel-2);border-radius:6px;height:10px;overflow:hidden}.bar-fill{height:100%;border-radius:6px;transition:width .5s ease}.bar-value{color:var(--muted);text-align:right;font-variant-numeric:tabular-nums}.list{margin:0;padding-left:18px}.list li{margin:4px 0}.list.good li::marker{color:#3fb950}.list.bad li::marker{color:#f85149}.recs{list-style:none;margin:0;padding:0}.recs li{padding:8px 0;border-bottom:1px solid var(--border)}.recs li:last-child{border-bottom:none}.pill{display:inline-block;font-size:11px;text-transform:uppercase;border-radius:20px;padding:2px 8px;margin-right:8px;font-weight:700}.pill.high{background:#6e2019;color:#ff7b72}.pill.medium{background:#5a4212;color:#e3b341}.pill.low{background:#22333b;color:#7ee2c8}:root[data-theme=light] .pill.high{background:#ffebe9;color:#cf222e}:root[data-theme=light] .pill.medium{background:#fff8c5;color:#9a6700}:root[data-theme=light] .pill.low{background:#dafbe1;color:#1a7f37}.run-picker{display:flex;align-items:center;gap:10px}.run-picker select,select{background:var(--panel-2);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:6px 10px}.crit-list{display:flex;flex-direction:column;gap:6px}.crit{border:1px solid var(--border);border-radius:8px;padding:8px 12px;background:var(--panel-2)}.crit summary{display:flex;align-items:center;gap:10px;cursor:pointer;list-style:none}.crit summary::-webkit-details-marker{display:none}.score-chip{font-variant-numeric:tabular-nums;font-weight:700;color:#0d1117;border-radius:6px;padding:1px 8px;font-size:12px}.crit-title{font-weight:500}.crit-just{margin:10px 0 6px;color:var(--text)}.evidence{margin:0;padding-left:18px}.evidence li{margin:3px 0}.table-wrap{overflow-x:auto}table.history{width:100%;border-collapse:collapse;font-variant-numeric:tabular-nums}table.history th,table.history td{padding:7px 10px;border-bottom:1px solid var(--border);text-align:left;white-space:nowrap}table.history th{color:var(--muted);font-weight:600;font-size:12px}table.history .num{text-align:right}table.history .cat{color:var(--muted)}table.history .strong{font-weight:700}.up{color:#3fb950}.down{color:#f85149}:root[data-theme=light] .up,:root[data-theme=light] .list.good li::marker{color:#1a7f37}:root[data-theme=light] .down,:root[data-theme=light] .list.bad li::marker{color:#cf222e}.grade-dot{font-size:10px}.chart{width:100%}.legend{display:flex;gap:18px;color:var(--muted);margin-top:12px;flex-wrap:wrap}.legend.wrap span{display:inline-flex;align-items:center;gap:6px}.swatch{width:12px;height:12px;border-radius:3px;display:inline-block}.empty{text-align:center;color:var(--muted);padding:60px 20px}.muted{color:var(--muted)}.foot{text-align:center;color:var(--muted);margin-top:34px;font-size:12px}.uplot,.u-title,.u-legend{color:var(--text)}.u-legend .u-marker{border-radius:2px}.profile{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:20px 22px}.profile .summary{font-size:15px;margin:0 0 12px}.chips{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 14px}.chip{border:1px solid var(--border);background:var(--panel-2);color:var(--text);border-radius:999px;padding:4px 12px;font-size:12.5px;cursor:default}.chip.kind{color:var(--accent);border-color:color-mix(in srgb,var(--accent) 40%,var(--border))}.run-select{background:var(--panel-2);color:var(--text);border:1px solid var(--border);border-radius:6px;padding:4px 8px;font:inherit}.outline-panel{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:14px 18px 22px}.outline-toolbar{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px;padding-bottom:12px;border-bottom:1px solid var(--border);margin-bottom:14px}.breadcrumb{display:flex;align-items:center;flex-wrap:wrap;gap:2px;font-size:13px;min-height:26px}.breadcrumb.muted{color:var(--muted);font-size:12.5px}.crumb{background:none;border:none;color:var(--accent);font:inherit;padding:2px 4px;border-radius:5px;cursor:pointer}.crumb:hover{background:var(--panel-2)}.crumb.current{color:var(--text);font-weight:600;cursor:default}.crumb-sep{color:var(--muted);padding:0 2px}.outline-actions{display:flex;align-items:center;gap:8px}.search{background:var(--panel-2);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:6px 10px;font:inherit;font-size:13px;width:240px}.search:focus{outline:none;border-color:var(--accent)}.ghost-btn{background:none;border:1px solid var(--border);color:var(--muted);border-radius:6px;padding:5px 10px;font-size:12.5px;cursor:pointer}.ghost-btn:hover{color:var(--text);border-color:var(--accent)}.zoom-head{margin:2px 0 12px}.zoom-title{margin:0;font-size:22px;letter-spacing:-.3px}.zoom-summary{margin:6px 0 0;color:var(--muted);max-width:72ch}.zoom-head .files{margin-top:8px}.outline{display:flex;flex-direction:column}.node .children{margin-left:13px;padding-left:22px;border-left:1px solid var(--border)}.row{display:flex;align-items:flex-start;gap:2px;padding:3px 6px 3px 0;border-radius:7px;cursor:default}.row:hover{background:color-mix(in srgb,var(--panel-2) 70%,transparent)}.row.selected{background:color-mix(in srgb,var(--accent) 14%,transparent)}.row.match .title{color:var(--accent)}.node-text mark{background:color-mix(in srgb,var(--accent) 32%,transparent);color:inherit;border-radius:3px;padding:0 1px}.disclosure{flex:none;width:18px;height:22px;background:none;border:none;color:var(--muted);font-size:11px;line-height:22px;padding:0;cursor:pointer;transition:transform .12s ease;transform-origin:45% 50%;visibility:hidden}.node:hover>.row>.disclosure,.row.selected>.disclosure{visibility:visible}.disclosure.open{transform:rotate(90deg)}.disclosure.spacer{cursor:default}.dot{flex:none;width:18px;height:22px;background:none;border:none;padding:0;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}.dot span{width:7px;height:7px;border-radius:50%;background:var(--muted);box-shadow:0 0 0 0 transparent;transition:box-shadow .12s ease,background .12s ease}.dot.loaded span{box-shadow:0 0 0 4px color-mix(in srgb,var(--muted) 28%,transparent)}.dot:hover span{background:var(--accent);box-shadow:0 0 0 4px color-mix(in srgb,var(--accent) 30%,transparent)}.node-text{min-width:0;padding:1px 0;line-height:20px}.node-text .title{font-weight:600}.node-text .summary{color:var(--muted);margin-left:8px}.node-text .summary:before{content:"— "}.kind-badge{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10.5px;color:var(--muted);background:var(--panel-2);border:1px solid var(--border);border-radius:5px;padding:0 5px;margin-left:8px;vertical-align:1px}.count-badge{font-size:11px;color:var(--muted);background:var(--panel-2);border-radius:999px;padding:0 7px;margin-left:8px;vertical-align:1px}.files{display:inline-flex;flex-wrap:wrap;gap:6px;margin-left:8px}code.file{font-size:11.5px;color:color-mix(in srgb,var(--accent) 75%,var(--text))}.notes{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:16px 20px}.notes h2{margin:0 0 8px;font-size:15px}.notes p{margin:0;color:var(--muted)}@media (max-width: 640px){.outline-toolbar{flex-direction:column;align-items:stretch}.search{width:100%}.node .children{padding-left:14px}}</style>
30
+ </head>
31
+ <body>
32
+ <div id="app"></div>
33
+ </body>
34
+ </html>
@@ -0,0 +1,66 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://github.com/stevenzg/edsger-assets/schema/audit.schema.json",
4
+ "title": "Edsger Repository Audit Standard",
5
+ "description": "Dimensions an auditor (human or agent) inspects across a whole repository to surface unprofessional, outdated, or fragile implementations. A `base` standard is merged with zero or more language overlays.",
6
+ "type": "object",
7
+ "required": ["id", "name", "version", "kind", "dimensions"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
11
+ "name": { "type": "string" },
12
+ "version": { "type": "string" },
13
+ "kind": { "const": "audit" },
14
+ "extends": { "type": ["string", "null"] },
15
+ "appliesTo": {
16
+ "type": "array",
17
+ "items": { "type": "string" },
18
+ "default": ["*"]
19
+ },
20
+ "guidance": {
21
+ "description": "Overall prose guidance on the tone and rigour of the audit.",
22
+ "type": "string"
23
+ },
24
+ "policy": {
25
+ "type": "object",
26
+ "additionalProperties": false,
27
+ "properties": {
28
+ "maxFindings": {
29
+ "description": "Cap on reported findings; the lowest-severity tail beyond it is omitted (and counted) so reports stay readable.",
30
+ "type": "integer",
31
+ "minimum": 1,
32
+ "default": 60
33
+ }
34
+ }
35
+ },
36
+ "dimensions": {
37
+ "type": "array",
38
+ "minItems": 1,
39
+ "items": { "$ref": "#/definitions/dimension" }
40
+ }
41
+ },
42
+ "definitions": {
43
+ "dimension": {
44
+ "type": "object",
45
+ "required": ["id", "title", "guidance"],
46
+ "additionalProperties": false,
47
+ "properties": {
48
+ "id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
49
+ "title": { "type": "string" },
50
+ "defaultSeverity": {
51
+ "enum": ["critical", "high", "medium", "low", "info"],
52
+ "default": "medium"
53
+ },
54
+ "guidance": { "type": "string" },
55
+ "checklist": {
56
+ "type": "array",
57
+ "items": { "type": "string" }
58
+ },
59
+ "references": {
60
+ "type": "array",
61
+ "items": { "type": "string" }
62
+ }
63
+ }
64
+ }
65
+ }
66
+ }
@@ -0,0 +1,100 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://github.com/stevenzg/edsger-assets/schema/diagrams.schema.json",
4
+ "title": "Edsger Diagram Catalog",
5
+ "description": "A catalog of professional software diagrams an agent can generate for a repository. A `base` catalog is merged with zero or more language overlays to form the effective catalog. For each project the agent selects the diagrams whose `detect` signals and `appliesWhen` guidance match the repository's characteristics, then emits Mermaid source for each.",
6
+ "type": "object",
7
+ "required": ["id", "name", "version", "kind", "groups"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
11
+ "name": { "type": "string" },
12
+ "version": { "type": "string" },
13
+ "kind": { "const": "diagrams" },
14
+ "extends": {
15
+ "description": "id of a catalog this overlay merges on top of (usually 'base').",
16
+ "type": ["string", "null"]
17
+ },
18
+ "appliesTo": {
19
+ "description": "Language ids this catalog targets, or ['*'] for any.",
20
+ "type": "array",
21
+ "items": { "type": "string" },
22
+ "default": ["*"]
23
+ },
24
+ "groups": {
25
+ "type": "array",
26
+ "minItems": 1,
27
+ "items": { "$ref": "#/definitions/group" }
28
+ }
29
+ },
30
+ "definitions": {
31
+ "group": {
32
+ "type": "object",
33
+ "required": ["id", "name", "diagrams"],
34
+ "additionalProperties": false,
35
+ "properties": {
36
+ "id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
37
+ "name": { "type": "string" },
38
+ "description": { "type": "string" },
39
+ "diagrams": {
40
+ "type": "array",
41
+ "minItems": 1,
42
+ "items": { "$ref": "#/definitions/diagram" }
43
+ }
44
+ }
45
+ },
46
+ "diagram": {
47
+ "type": "object",
48
+ "required": ["id", "title", "type", "appliesWhen", "guidance"],
49
+ "additionalProperties": false,
50
+ "properties": {
51
+ "id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
52
+ "title": { "type": "string" },
53
+ "type": {
54
+ "description": "The Mermaid diagram type to emit.",
55
+ "type": "string",
56
+ "enum": [
57
+ "flowchart",
58
+ "sequenceDiagram",
59
+ "classDiagram",
60
+ "stateDiagram-v2",
61
+ "erDiagram",
62
+ "journey",
63
+ "gantt",
64
+ "gitGraph",
65
+ "mindmap",
66
+ "timeline",
67
+ "requirementDiagram",
68
+ "quadrantChart",
69
+ "pie",
70
+ "sankey-beta",
71
+ "C4Context",
72
+ "C4Container",
73
+ "C4Component",
74
+ "C4Deployment",
75
+ "block-beta",
76
+ "architecture-beta"
77
+ ]
78
+ },
79
+ "appliesWhen": {
80
+ "description": "Prose describing the project characteristics that make this diagram valuable, so the agent can decide whether to include it.",
81
+ "type": "string"
82
+ },
83
+ "detect": {
84
+ "description": "Coarse signals (file globs, marker filenames, or keywords) that hint this diagram is relevant. '*' means 'almost always useful'. Advisory only — the agent still decides from real evidence.",
85
+ "type": "array",
86
+ "items": { "type": "string" },
87
+ "default": []
88
+ },
89
+ "guidance": {
90
+ "description": "How to construct this diagram from the repository: what to read, what nodes/edges to include, and how to keep it faithful and legible.",
91
+ "type": "string"
92
+ },
93
+ "references": {
94
+ "type": "array",
95
+ "items": { "type": "string" }
96
+ }
97
+ }
98
+ }
99
+ }
100
+ }
@@ -0,0 +1,69 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://github.com/stevenzg/edsger-assets/schema/mindmap.schema.json",
4
+ "title": "Edsger Mind Map Standard",
5
+ "description": "Guidance for building an implementation mind map of a repository: an outline tree (Workflowy-style) whose root is the project and whose branches explain how the code is actually implemented. A `base` standard is merged with zero or more language overlays. The `aspects` are candidate top-level branches — for each project the agent keeps only the aspects the code supports, and grows each into a faithful subtree grounded in real files.",
6
+ "type": "object",
7
+ "required": ["id", "name", "version", "kind", "aspects"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
11
+ "name": { "type": "string" },
12
+ "version": { "type": "string" },
13
+ "kind": { "const": "mindmap" },
14
+ "extends": {
15
+ "description": "id of a standard this overlay merges on top of (usually 'base').",
16
+ "type": ["string", "null"]
17
+ },
18
+ "appliesTo": {
19
+ "description": "Language ids this standard targets, or ['*'] for any.",
20
+ "type": "array",
21
+ "items": { "type": "string" },
22
+ "default": ["*"]
23
+ },
24
+ "guidance": {
25
+ "description": "Overall prose guidance on the shape of the tree: what the root is, how deep to go, what makes a good node.",
26
+ "type": "string"
27
+ },
28
+ "maxDepth": {
29
+ "description": "Recommended maximum depth of the tree, root inclusive.",
30
+ "type": "integer",
31
+ "minimum": 2,
32
+ "maximum": 10
33
+ },
34
+ "aspects": {
35
+ "type": "array",
36
+ "minItems": 1,
37
+ "items": { "$ref": "#/definitions/aspect" }
38
+ }
39
+ },
40
+ "definitions": {
41
+ "aspect": {
42
+ "type": "object",
43
+ "required": ["id", "name", "appliesWhen", "guidance"],
44
+ "additionalProperties": false,
45
+ "properties": {
46
+ "id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
47
+ "name": { "type": "string" },
48
+ "appliesWhen": {
49
+ "description": "Prose describing the project characteristics that make this branch valuable, so the agent can decide whether to include it.",
50
+ "type": "string"
51
+ },
52
+ "detect": {
53
+ "description": "Coarse signals (file globs, marker filenames, or keywords) that hint this aspect is relevant. '*' means 'almost always useful'. Advisory only — the agent still decides from real evidence.",
54
+ "type": "array",
55
+ "items": { "type": "string" },
56
+ "default": []
57
+ },
58
+ "guidance": {
59
+ "description": "How to grow this branch from the repository: what to read, what child nodes to create, and how to keep the subtree faithful and legible.",
60
+ "type": "string"
61
+ },
62
+ "references": {
63
+ "type": "array",
64
+ "items": { "type": "string" }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
@@ -0,0 +1,76 @@
1
+ ---
2
+ name: audit
3
+ description: >
4
+ Deep-audit the current repository across every professionalism dimension —
5
+ correctness, security, outdated/deprecated patterns, dependency health,
6
+ craftsmanship, error handling, architecture, testing, tooling, docs, and
7
+ performance — and produce an organised, evidence-backed issue list. Use when
8
+ the user asks to audit, review, critique, nitpick, or "find everything wrong
9
+ with" a repo, or to make it more professional/modern.
10
+ ---
11
+
12
+ # Audit a repository
13
+
14
+ You will comb through the repository in the current working directory looking
15
+ for anything unprofessional, outdated, fragile, or sloppy, and organise the
16
+ findings into a prioritised, evidence-backed report.
17
+
18
+ ## 1. Prefer the CLI if it is installed
19
+
20
+ If the `edsger` CLI is available, use it:
21
+
22
+ ```bash
23
+ command -v edsger >/dev/null 2>&1 && edsger audit || echo "no-cli"
24
+ ```
25
+
26
+ If it ran, summarise `.edsger/audit/report.md` for the user and stop.
27
+ Otherwise continue with the native flow below.
28
+
29
+ ## 2. Detect the language(s)
30
+
31
+ Look for manifest files to decide which overlays apply: `package.json`/`tsconfig.json`
32
+ → typescript; `pyproject.toml`/`requirements.txt` → python; `go.mod` → go;
33
+ `*.csproj`/`*.sln` → csharp; `pom.xml`/`build.gradle` → java; `pubspec.yaml` → dart.
34
+ A repo may match several.
35
+
36
+ ## 3. Load the audit standard
37
+
38
+ Read the base standard and any matching language overlays from this plugin:
39
+
40
+ - `${CLAUDE_PLUGIN_ROOT}/audit/base.yaml` (always)
41
+ - `${CLAUDE_PLUGIN_ROOT}/audit/<language>.yaml` (for each detected language)
42
+
43
+ Merge overlays onto the base **by id**: a dimension with the same `id` extends
44
+ the base one; new ids are added. If the repo has a `.edsger/audit/` directory,
45
+ those files override the bundled standard (same id-merge rules).
46
+
47
+ ## 4. Hunt for findings in every dimension
48
+
49
+ Explore the repository thoroughly with read-only tools (read files, grep,
50
+ `ls`, `git log`). Do **not** modify the repo. For every dimension, actively
51
+ look for violations of its guidance and checklist. Each finding needs:
52
+
53
+ - the dimension id and a severity (`critical`/`high`/`medium`/`low`/`info`)
54
+ - the file path (and line where it applies)
55
+ - what is wrong, **why it is unprofessional or outdated**, and a concrete fix
56
+ - an effort estimate: `quick`, `moderate`, or `involved`
57
+
58
+ Be exacting — this is a deliberate nitpicking pass — but every finding must be
59
+ grounded in evidence you actually saw. When the same issue recurs across many
60
+ files, consolidate it into ONE finding whose detail lists the affected
61
+ locations. Respect the standard's `policy.maxFindings` cap (drop the
62
+ lowest-severity tail and say how many were omitted). Also record what the repo
63
+ does well (`positives`), so the critique stays fair.
64
+
65
+ ## 5. Organise and report
66
+
67
+ Write `.edsger/audit/report.md` containing:
68
+
69
+ - a short overall assessment and finding counts by severity
70
+ - **Quick wins** — high-impact findings with `quick` effort
71
+ - findings grouped by dimension, each group sorted by severity, with
72
+ file/line, explanation, and suggested fix
73
+ - the positives list
74
+
75
+ Then give the user a concise summary: total findings, the severity breakdown,
76
+ the top 3–5 most important fixes, and the quickest wins.
@@ -0,0 +1,70 @@
1
+ ---
2
+ name: diagram
3
+ description: >
4
+ Generate professional software diagrams (architecture/C4, ER, sequence,
5
+ flowchart, class, state, data-flow, deployment, and more) tailored to a
6
+ repository's characteristics, as renderable Mermaid, and write them to a
7
+ viewable report. Use when the user asks to diagram, visualize, map, or chart a
8
+ codebase's architecture, database schema, request flow, or structure.
9
+ ---
10
+
11
+ # Diagram a repository
12
+
13
+ You will inspect the repository in the current working directory, decide which
14
+ professional diagrams genuinely fit **this** project, and emit each as valid
15
+ **Mermaid** so it renders in Markdown/HTML.
16
+
17
+ ## 1. Prefer the CLI if it is installed
18
+
19
+ If the `edsger` CLI is available, it runs the agent and produces a viewable HTML
20
+ dashboard — use it:
21
+
22
+ ```bash
23
+ command -v edsger >/dev/null 2>&1 && edsger diagram || echo "no-cli"
24
+ ```
25
+
26
+ If it ran, summarise `.edsger/diagrams/diagrams.md` for the user and stop.
27
+ Otherwise continue with the native flow below.
28
+
29
+ ## 2. Detect the language(s)
30
+
31
+ Look for manifest files to decide which overlays apply: `package.json`/`tsconfig.json`
32
+ → typescript; `pyproject.toml`/`requirements.txt` → python; `go.mod` → go;
33
+ `*.csproj`/`*.sln` → csharp; `pom.xml`/`build.gradle` → java; `pubspec.yaml` → dart.
34
+ A repo may match several.
35
+
36
+ ## 3. Load the catalog
37
+
38
+ Read the base catalog and any matching language overlays from this plugin:
39
+
40
+ - `${CLAUDE_PLUGIN_ROOT}/diagrams/base.yaml` (always)
41
+ - `${CLAUDE_PLUGIN_ROOT}/diagrams/<language>.yaml` (for each detected language)
42
+
43
+ Merge overlays onto the base **by id** (group ids and diagram ids). If the repo
44
+ has a `.edsger/diagrams/` directory, those files override the bundled catalog.
45
+
46
+ ## 4. Profile the project and select diagrams
47
+
48
+ Explore the repo (Read/Grep/Glob, read-only) and characterise it: what kind of
49
+ project is it (service, library, CLI, SPA, data pipeline, monorepo…), what does
50
+ it integrate with, does it own a database, does it deploy somewhere?
51
+
52
+ For each catalog diagram, use its `detect` signals and `appliesWhen` guidance to
53
+ decide whether it adds value **for this repo**. Only include diagrams the
54
+ evidence supports — a library needs different diagrams than a microservice. Never
55
+ invent structure that is not in the code.
56
+
57
+ ## 5. Generate faithful Mermaid
58
+
59
+ For each selected diagram, follow its `guidance` and produce **valid Mermaid** of
60
+ the specified `type`, grounded in real files (record the files as evidence). Keep
61
+ each diagram to roughly one screen and legible; prefer faithful over exhaustive.
62
+ Validate the Mermaid syntax mentally before emitting it.
63
+
64
+ ## 6. Write the report
65
+
66
+ Write `.edsger/diagrams/diagrams.md` containing: a short project profile, then one
67
+ section per diagram with a heading, a one-line description of what it shows and
68
+ why it applies, the fenced ` ```mermaid ` block, and the evidence files. Group by
69
+ catalog group (Architecture, Behaviour, Data, Deployment, Process). Then give the
70
+ user a concise summary of which diagrams you produced and why.
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: mindmap
3
+ description: >
4
+ Generate an implementation mind map of a repository — an outline tree
5
+ (Workflowy-style) whose root is the project and whose branches explain how
6
+ the code is actually implemented (entry points, core flows, module
7
+ structure, domain model, integrations), with every leaf grounded in real
8
+ files. Use when the user asks for a mind map, outline, tree, or structured
9
+ overview of how a codebase is implemented.
10
+ ---
11
+
12
+ # Mind-map a repository
13
+
14
+ You will inspect the repository in the current working directory and build an
15
+ **implementation mind map**: a tree whose root is the project and whose
16
+ branches explain how the code is implemented, deep enough that leaves point at
17
+ concrete files.
18
+
19
+ ## 1. Prefer the CLI if it is installed
20
+
21
+ If the `edsger` CLI is available, it runs the agent and produces a browsable
22
+ Workflowy-style viewer — use it:
23
+
24
+ ```bash
25
+ command -v edsger >/dev/null 2>&1 && edsger mindmap || echo "no-cli"
26
+ ```
27
+
28
+ If it ran, summarise `.edsger/mindmap/mindmap.md` for the user and stop.
29
+ Otherwise continue with the native flow below.
30
+
31
+ ## 2. Detect the language(s)
32
+
33
+ Look for manifest files to decide which overlays apply: `package.json`/`tsconfig.json`
34
+ → typescript; `pyproject.toml`/`requirements.txt` → python; `go.mod` → go;
35
+ `*.csproj`/`*.sln` → csharp; `pom.xml`/`build.gradle` → java; `pubspec.yaml` → dart.
36
+ A repo may match several.
37
+
38
+ ## 3. Load the standard
39
+
40
+ Read the base standard and any matching language overlays from this plugin:
41
+
42
+ - `${CLAUDE_PLUGIN_ROOT}/mindmap/base.yaml` (always)
43
+ - `${CLAUDE_PLUGIN_ROOT}/mindmap/<language>.yaml` (for each detected language)
44
+
45
+ Merge overlays onto the base **by aspect id** (new ids are appended). If the
46
+ repo has a `.edsger/mindmap/` directory, those files override the bundled
47
+ standard.
48
+
49
+ ## 4. Explore and build the tree
50
+
51
+ Explore the repo (Read/Grep/Glob, read-only) and characterise it. The
52
+ standard's `aspects` are **candidate top-level branches** — keep only the ones
53
+ this project's code supports (use `detect` and `appliesWhen`), rename them to
54
+ the project's own vocabulary where clearer, and grow each into a subtree by
55
+ following its `guidance`. Rules:
56
+
57
+ - Root = the project: name + one-line summary of what it does.
58
+ - 3-7 first-level branches; respect the standard's `maxDepth`.
59
+ - Every node: a short title (2-6 words) plus a one-or-two-sentence summary
60
+ that is true and specific to THIS codebase.
61
+ - Leaf nodes cite the file(s) they describe. Never invent structure that is
62
+ not in the code.
63
+
64
+ ## 5. Write the report
65
+
66
+ Write `.edsger/mindmap/mindmap.md` as a nested Markdown outline: a header with
67
+ the project profile, then the tree as indented bullets — `**Title** — summary`
68
+ with file references in backticks. Then give the user a concise summary of the
69
+ top-level branches and anything surprising you found.
@@ -0,0 +1 @@
1
+ .uplot,.uplot *,.uplot *:before,.uplot *:after{box-sizing:border-box}.uplot{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:1.5;width:min-content}.u-title{text-align:center;font-size:18px;font-weight:700}.u-wrap{position:relative;-webkit-user-select:none;user-select:none}.u-over,.u-under{position:absolute}.u-under{overflow:hidden}.uplot canvas{display:block;position:relative;width:100%;height:100%}.u-axis{position:absolute}.u-legend{font-size:14px;margin:auto;text-align:center}.u-inline{display:block}.u-inline *{display:inline-block}.u-inline tr{margin-right:16px}.u-legend th{font-weight:600}.u-legend th>*{vertical-align:middle;display:inline-block}.u-legend .u-marker{width:1em;height:1em;margin-right:4px;background-clip:padding-box!important}.u-inline.u-live th:after{content:":";vertical-align:middle}.u-inline:not(.u-live) .u-value{display:none}.u-series>*{padding:4px}.u-series th{cursor:pointer}.u-legend .u-off>*{opacity:.3}.u-select{background:#00000012;position:absolute;pointer-events:none}.u-cursor-x,.u-cursor-y{position:absolute;left:0;top:0;pointer-events:none;will-change:transform}.u-hz .u-cursor-x,.u-vt .u-cursor-y{height:100%;border-right:1px dashed #607D8B}.u-hz .u-cursor-y,.u-vt .u-cursor-x{width:100%;border-bottom:1px dashed #607D8B}.u-cursor-pt{position:absolute;top:0;left:0;border-radius:50%;border:0 solid;pointer-events:none;will-change:transform;background-clip:padding-box!important}.u-axis.u-off,.u-select.u-off,.u-cursor-x.u-off,.u-cursor-y.u-off,.u-cursor-pt.u-off{display:none}:root,:root[data-theme=dark]{--bg: #0d1117;--panel: #161b22;--panel-2: #1c2129;--border: #30363d;--text: #e6edf3;--muted: #8b949e;--accent: #58a6ff;--on-accent: #04101f;--chart-line: #e6edf3;--chart-axis: #8b949e;--chart-grid: #21262d;color-scheme:dark}:root[data-theme=light]{--bg: #ffffff;--panel: #f6f8fa;--panel-2: #eaeef2;--border: #d0d7de;--text: #1f2328;--muted: #59636e;--accent: #0969da;--on-accent: #ffffff;--chart-line: #1f2328;--chart-axis: #59636e;--chart-grid: #d8dee4;color-scheme:light}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:14px/1.5 -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.9em;background:var(--panel-2);padding:1px 5px;border-radius:5px}.app{max-width:1040px;margin:0 auto;padding:0 20px 60px}.topbar{display:flex;align-items:baseline;justify-content:space-between;padding:22px 0 14px}.brand{display:flex;align-items:baseline;gap:10px}.logo{font-weight:800;font-size:22px;letter-spacing:-.5px}.subtitle{color:var(--muted)}.repo{color:var(--muted);font-family:ui-monospace,monospace}.topbar-actions{display:flex;align-items:center;gap:14px}.theme-toggle{display:inline-flex;align-items:center;justify-content:center;width:34px;height:30px;padding:0;background:var(--panel-2);border:1px solid var(--border);border-radius:8px;color:var(--text);font-size:15px;line-height:1;cursor:pointer}.theme-toggle:hover{border-color:var(--accent);color:var(--accent)}.tabs{display:flex;gap:4px;border-bottom:1px solid var(--border);margin-bottom:22px}.tab{background:none;border:none;border-bottom:2px solid transparent;color:var(--muted);padding:10px 14px;font-size:14px;cursor:pointer}.tab:hover{color:var(--text)}.tab.active{color:var(--text);border-bottom-color:var(--accent);font-weight:600}.stack{display:flex;flex-direction:column;gap:18px}.two-col{display:grid;grid-template-columns:1fr 1fr;gap:18px}@media (max-width: 720px){.two-col{grid-template-columns:1fr}}.card{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:18px 20px}.card-title{margin:0 0 14px;font-size:15px;font-weight:600}.hero{display:flex;gap:26px;align-items:center;background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:22px}@media (max-width: 720px){.hero{flex-direction:column;align-items:flex-start}}.hero-meta{flex:1}.summary{margin:0 0 14px;font-size:15px}.facts{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px 18px;margin:0}.facts div{display:flex;flex-direction:column}.facts dt{color:var(--muted);font-size:12px;text-transform:uppercase;letter-spacing:.4px}.facts dd{margin:2px 0 0}.ring svg{display:block}.ring-track{fill:none;stroke:var(--border);stroke-width:12}.ring-value{fill:none;stroke-width:12;stroke-linecap:round;transition:stroke-dasharray .6s ease}.ring-score{font-size:34px;font-weight:800;text-anchor:middle}.ring-grade{font-size:12px;fill:var(--muted);text-anchor:middle}.bar-row{display:grid;grid-template-columns:220px 1fr 120px;align-items:center;gap:12px;padding:5px 0}@media (max-width: 620px){.bar-row{grid-template-columns:130px 1fr 70px}}.bar-label{color:var(--text)}.bar-track{background:var(--panel-2);border-radius:6px;height:10px;overflow:hidden}.bar-fill{height:100%;border-radius:6px;transition:width .5s ease}.bar-value{color:var(--muted);text-align:right;font-variant-numeric:tabular-nums}.list{margin:0;padding-left:18px}.list li{margin:4px 0}.list.good li::marker{color:#3fb950}.list.bad li::marker{color:#f85149}.recs{list-style:none;margin:0;padding:0}.recs li{padding:8px 0;border-bottom:1px solid var(--border)}.recs li:last-child{border-bottom:none}.pill{display:inline-block;font-size:11px;text-transform:uppercase;border-radius:20px;padding:2px 8px;margin-right:8px;font-weight:700}.pill.high{background:#6e2019;color:#ff7b72}.pill.medium{background:#5a4212;color:#e3b341}.pill.low{background:#22333b;color:#7ee2c8}:root[data-theme=light] .pill.high{background:#ffebe9;color:#cf222e}:root[data-theme=light] .pill.medium{background:#fff8c5;color:#9a6700}:root[data-theme=light] .pill.low{background:#dafbe1;color:#1a7f37}.run-picker{display:flex;align-items:center;gap:10px}.run-picker select,select{background:var(--panel-2);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:6px 10px}.crit-list{display:flex;flex-direction:column;gap:6px}.crit{border:1px solid var(--border);border-radius:8px;padding:8px 12px;background:var(--panel-2)}.crit summary{display:flex;align-items:center;gap:10px;cursor:pointer;list-style:none}.crit summary::-webkit-details-marker{display:none}.score-chip{font-variant-numeric:tabular-nums;font-weight:700;color:#0d1117;border-radius:6px;padding:1px 8px;font-size:12px}.crit-title{font-weight:500}.crit-just{margin:10px 0 6px;color:var(--text)}.evidence{margin:0;padding-left:18px}.evidence li{margin:3px 0}.table-wrap{overflow-x:auto}table.history{width:100%;border-collapse:collapse;font-variant-numeric:tabular-nums}table.history th,table.history td{padding:7px 10px;border-bottom:1px solid var(--border);text-align:left;white-space:nowrap}table.history th{color:var(--muted);font-weight:600;font-size:12px}table.history .num{text-align:right}table.history .cat{color:var(--muted)}table.history .strong{font-weight:700}.up{color:#3fb950}.down{color:#f85149}:root[data-theme=light] .up,:root[data-theme=light] .list.good li::marker{color:#1a7f37}:root[data-theme=light] .down,:root[data-theme=light] .list.bad li::marker{color:#cf222e}.grade-dot{font-size:10px}.chart{width:100%}.legend{display:flex;gap:18px;color:var(--muted);margin-top:12px;flex-wrap:wrap}.legend.wrap span{display:inline-flex;align-items:center;gap:6px}.swatch{width:12px;height:12px;border-radius:3px;display:inline-block}.empty{text-align:center;color:var(--muted);padding:60px 20px}.muted{color:var(--muted)}.foot{text-align:center;color:var(--muted);margin-top:34px;font-size:12px}.uplot,.u-title,.u-legend{color:var(--text)}.u-legend .u-marker{border-radius:2px}