edsger 0.84.0 → 0.85.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.
- package/README.md +37 -0
- package/assets/README.md +18 -9
- package/assets/manifest.yaml +5 -1
- package/assets/mindmap-viewer/assets/{mindmap-Di5RM-4N.js → mindmap-C50Y8qu4.js} +1 -1
- package/assets/mindmap-viewer/mindmap.html +1 -1
- package/assets/mindmap-viewer-single.html +1 -1
- package/assets/schema/testcases.schema.json +69 -0
- package/assets/skills/testcases/SKILL.md +73 -0
- package/assets/testcases/base.yaml +147 -0
- package/assets/testcases-viewer/assets/testcases-DaNbQxip.js +2 -0
- package/assets/testcases-viewer/assets/testcases-f2mIbfYU.css +1 -0
- package/assets/testcases-viewer/testcases.html +31 -0
- package/assets/testcases-viewer-single.html +32 -0
- package/dist/index.js +533 -31
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -162,6 +162,43 @@ a bullet to zoom into that subtree (with a breadcrumb back up), navigate with
|
|
|
162
162
|
the keyboard (↑/↓/←/→, Enter to zoom, Esc to zoom out), and search across
|
|
163
163
|
titles, summaries, and file paths.
|
|
164
164
|
|
|
165
|
+
### `edsger testcases` — manual test-case plan for the repo
|
|
166
|
+
|
|
167
|
+
Analyse the repository and derive a **manual test-case plan**: an outline tree
|
|
168
|
+
whose root is the project, whose branches are the areas a human tester should
|
|
169
|
+
exercise — core flows, inputs & edge cases, errors & recovery, data integrity,
|
|
170
|
+
integrations, configuration — and whose leaves are concrete test cases
|
|
171
|
+
(preconditions, exact steps, one expected result, a priority) that a tester who
|
|
172
|
+
has never read the code can execute. These are **not** automated code tests.
|
|
173
|
+
Writes to `.edsger/testcases/` (`testcases.md` + `testcases.json`, with each run
|
|
174
|
+
archived under `runs/<timestamp>/`).
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
edsger testcases # derive a test plan for the current repo
|
|
178
|
+
edsger testcases -C ./service # …another directory
|
|
179
|
+
edsger testcases --serve # generate, then open the interactive viewer
|
|
180
|
+
edsger testcases --focus "the export feature" # concentrate the depth somewhere
|
|
181
|
+
edsger testcases --json # also print JSON to stdout
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
The agent detects the project's language(s), loads the matching test-case
|
|
185
|
+
**standard** (from [edsger-assets](https://github.com/stevenzg/edsger-assets),
|
|
186
|
+
fully overridable), keeps only the test areas this project's code supports, and
|
|
187
|
+
grounds every case in real behaviour — commands, flags, routes, screens, and
|
|
188
|
+
error branches — citing the files that implement it. `testcases.md` is a nested
|
|
189
|
+
Markdown checklist a tester can tick off; for the interactive view:
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
edsger testcases serve # serve the test-case viewer
|
|
193
|
+
edsger testcases report --html testcases.html # export a self-contained HTML file
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
The viewer browses the plan **Workflowy-style** like the mind map —
|
|
197
|
+
collapse/expand, zoom with breadcrumbs, keyboard navigation, search — plus
|
|
198
|
+
test-case extras: **priority badges** with a filter (critical/high/medium/low),
|
|
199
|
+
per-branch case counts, and expandable case details showing preconditions,
|
|
200
|
+
numbered steps, and the expected result.
|
|
201
|
+
|
|
165
202
|
### `edsger pr-review <pr>` (requires `gh`)
|
|
166
203
|
|
|
167
204
|
Review a pull request against the review standard. Previews by default; pass
|
package/assets/README.md
CHANGED
|
@@ -15,6 +15,11 @@ This repository is the canonical source of truth for:
|
|
|
15
15
|
of a repository: an outline tree (entry points, core flows, module structure,
|
|
16
16
|
domain model, integrations) whose leaves cite the real files, browsable
|
|
17
17
|
Workflowy-style.
|
|
18
|
+
- **Manual test-case standards** (`testcases/`) — how to derive a manual
|
|
19
|
+
test-case plan from a repository: an outline tree of test areas (core flows,
|
|
20
|
+
inputs & edge cases, errors & recovery, data integrity, integrations) whose
|
|
21
|
+
leaves are concrete test cases (preconditions, steps, expected result) a
|
|
22
|
+
human tester can execute, browsable Workflowy-style.
|
|
18
23
|
|
|
19
24
|
The content here encodes widely accepted engineering best practices (OWASP, the
|
|
20
25
|
Twelve-Factor App, Google Engineering Practices, SLSA, Keep a Changelog, Semantic
|
|
@@ -26,9 +31,9 @@ These standards can be consumed three ways:
|
|
|
26
31
|
1. **The [`edsger`](https://www.npmjs.com/package/edsger) CLI** — bundles these
|
|
27
32
|
assets and runs them with the Claude Agent SDK.
|
|
28
33
|
2. **As a Claude Code plugin** — `/benchmark`, `/pr-review`, `/pr-resolve`, `/diagram`,
|
|
29
|
-
`/mindmap` skills that work inside Claude Code with no CLI install (see below).
|
|
34
|
+
`/mindmap`, `/testcases` skills that work inside Claude Code with no CLI install (see below).
|
|
30
35
|
3. **Raw YAML** — point any tooling at the files in `benchmark/`, `review/`,
|
|
31
|
-
`diagrams/`, and `
|
|
36
|
+
`diagrams/`, `mindmap/`, and `testcases/`.
|
|
32
37
|
|
|
33
38
|
## Use inside Claude Code (no CLI install)
|
|
34
39
|
|
|
@@ -40,7 +45,7 @@ plugin to get the skills as slash commands:
|
|
|
40
45
|
/plugin install edsger@edsger-assets
|
|
41
46
|
```
|
|
42
47
|
|
|
43
|
-
Then run `/benchmark`, `/pr-review`, `/pr-resolve`, `/diagram`, or `/
|
|
48
|
+
Then run `/benchmark`, `/pr-review`, `/pr-resolve`, `/diagram`, `/mindmap`, or `/testcases`. The skills read
|
|
44
49
|
the same YAML from this repo (`${CLAUDE_PLUGIN_ROOT}/benchmark/...`,
|
|
45
50
|
`${CLAUDE_PLUGIN_ROOT}/diagrams/...`) and prefer the `edsger` CLI when it is
|
|
46
51
|
installed, falling back to running natively with Claude Code's own tools.
|
|
@@ -52,19 +57,21 @@ edsger-assets/
|
|
|
52
57
|
├── .claude-plugin/ # Claude Code plugin + marketplace manifests
|
|
53
58
|
│ ├── plugin.json
|
|
54
59
|
│ └── marketplace.json
|
|
55
|
-
├── skills/ # Claude Code skills (/benchmark, /pr-review, /pr-resolve, /diagram, /mindmap)
|
|
60
|
+
├── skills/ # Claude Code skills (/benchmark, /pr-review, /pr-resolve, /diagram, /mindmap, /testcases)
|
|
56
61
|
│ ├── benchmark/SKILL.md
|
|
57
62
|
│ ├── pr-review/SKILL.md
|
|
58
63
|
│ ├── pr-resolve/SKILL.md
|
|
59
64
|
│ ├── diagram/SKILL.md
|
|
60
|
-
│
|
|
65
|
+
│ ├── mindmap/SKILL.md
|
|
66
|
+
│ └── testcases/SKILL.md
|
|
61
67
|
├── manifest.yaml # registry: versions, languages, default chains
|
|
62
68
|
├── languages.yaml # language detection heuristics (markers + globs)
|
|
63
69
|
├── schema/
|
|
64
70
|
│ ├── benchmark.schema.json # JSON Schema for a benchmark rubric
|
|
65
71
|
│ ├── review.schema.json # JSON Schema for a review standard
|
|
66
72
|
│ ├── diagrams.schema.json # JSON Schema for a diagram catalog
|
|
67
|
-
│
|
|
73
|
+
│ ├── mindmap.schema.json # JSON Schema for a mind-map standard
|
|
74
|
+
│ └── testcases.schema.json # JSON Schema for a manual test-case standard
|
|
68
75
|
├── benchmark/
|
|
69
76
|
│ ├── base.yaml # language-agnostic baseline (always applied)
|
|
70
77
|
│ ├── typescript.yaml # overlays, merged on top of base
|
|
@@ -79,9 +86,11 @@ edsger-assets/
|
|
|
79
86
|
├── diagrams/
|
|
80
87
|
│ ├── base.yaml # universal diagram catalog (C4, ER, sequence, flow, …)
|
|
81
88
|
│ └── … # language overlays (react tree, JPA model, goroutines, …)
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
89
|
+
├── mindmap/
|
|
90
|
+
│ ├── base.yaml # universal mind-map aspects (entry points, flows, modules, …)
|
|
91
|
+
│ └── … # language overlays (package surface, go layout, …)
|
|
92
|
+
└── testcases/
|
|
93
|
+
└── base.yaml # universal manual-test areas (core flows, edge cases, errors, …)
|
|
85
94
|
```
|
|
86
95
|
|
|
87
96
|
## How standards are resolved
|
package/assets/manifest.yaml
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
schemaVersion: 1
|
|
4
4
|
name: edsger-assets
|
|
5
5
|
version: 0.1.0
|
|
6
|
-
description: Industrial-grade benchmark rubrics, PR review standards, diagram catalogs,
|
|
6
|
+
description: Industrial-grade benchmark rubrics, PR review standards, diagram catalogs, mind-map standards, and manual test-case standards.
|
|
7
7
|
|
|
8
8
|
# Standard kinds shipped in this repository.
|
|
9
9
|
kinds:
|
|
@@ -27,6 +27,10 @@ kinds:
|
|
|
27
27
|
dir: mindmap
|
|
28
28
|
base: base
|
|
29
29
|
schema: schema/mindmap.schema.json
|
|
30
|
+
testcases:
|
|
31
|
+
dir: testcases
|
|
32
|
+
base: base
|
|
33
|
+
schema: schema/testcases.schema.json
|
|
30
34
|
|
|
31
35
|
# Languages with dedicated overlays. `id` matches the detector in languages.yaml.
|
|
32
36
|
# `aliases` are accepted on the CLI (e.g. `--lang ts`).
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
(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}
|
|
2
2
|
${e.summary}
|
|
3
3
|
${e.files.join(`
|
|
4
|
-
`)}`.toLowerCase().includes(t)}function St(e,t){
|
|
4
|
+
`)}`.toLowerCase().includes(t)}function St(e,t){const n=new Set,l=i=>{let r=t(i);for(const _ of i.children)l(_)&&(r=!0);return r&&n.add(i.id),r};return l(e),n}function $t(e,t){return t?St(e,n=>_t(n,t)):null}function st(e,t,n){return e.children.length?t?e.children.some(l=>t.has(l.id)):n.has(e.id):!1}function Ct(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 At(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 Nt(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?Nt(e,t).map((n,l)=>n.hit?s("mark",{children:n.text},l):n.text):e}function Pt({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(Pt,{node:r,view:t,onToggle:n,onZoom:l,onSelect:i},r.id))})}const ut="edsger-theme",pe=new Set;function Tt(){return typeof matchMedia<"u"&&matchMedia("(prefers-color-scheme: light)").matches?"light":"dark"}function Dt(){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 Tt()}let G=Dt();typeof document<"u"&&!document.documentElement.getAttribute("data-theme")&&document.documentElement.setAttribute("data-theme",G);function It(){return G}function Ht(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 Mt(){Ht(G==="dark"?"light":"dark")}function Lt(e){return pe.add(e),()=>{pe.delete(e)}}function Ut(){const[e,t]=U(G);return j(()=>Lt(()=>t(It())),[]),e}function Ft(){const e=Ut(),n=`Switch to ${e==="dark"?"light":"dark"} mode`;return s("button",{type:"button",class:"theme-toggle",title:n,"aria-label":n,onClick:()=>Mt(),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 Rt(){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?At(g,_):[],[g,_]),k=o.trim().toLowerCase(),N=I(()=>m?$t(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?Ct(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(Ft,{})]})]}),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(Rt,{}),Be);
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
</script>
|
|
23
23
|
<title>Edsger — Mind Map</title>
|
|
24
24
|
<!-- __EDSGER_MINDMAP__ is injected here when exported as a single self-contained file. -->
|
|
25
|
-
<script type="module" crossorigin src="./assets/mindmap-
|
|
25
|
+
<script type="module" crossorigin src="./assets/mindmap-C50Y8qu4.js"></script>
|
|
26
26
|
<link rel="stylesheet" crossorigin href="./assets/mindmap-D7KMR9EM.css">
|
|
27
27
|
</head>
|
|
28
28
|
<body>
|
|
@@ -25,7 +25,7 @@
|
|
|
25
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
26
|
${e.summary}
|
|
27
27
|
${e.files.join(`
|
|
28
|
-
`)}`.toLowerCase().includes(t)}function St(e,t){
|
|
28
|
+
`)}`.toLowerCase().includes(t)}function St(e,t){const n=new Set,l=i=>{let r=t(i);for(const _ of i.children)l(_)&&(r=!0);return r&&n.add(i.id),r};return l(e),n}function $t(e,t){return t?St(e,n=>_t(n,t)):null}function st(e,t,n){return e.children.length?t?e.children.some(l=>t.has(l.id)):n.has(e.id):!1}function Ct(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 At(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 Nt(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?Nt(e,t).map((n,l)=>n.hit?s("mark",{children:n.text},l):n.text):e}function Pt({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(Pt,{node:r,view:t,onToggle:n,onZoom:l,onSelect:i},r.id))})}const ut="edsger-theme",pe=new Set;function Tt(){return typeof matchMedia<"u"&&matchMedia("(prefers-color-scheme: light)").matches?"light":"dark"}function Dt(){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 Tt()}let G=Dt();typeof document<"u"&&!document.documentElement.getAttribute("data-theme")&&document.documentElement.setAttribute("data-theme",G);function It(){return G}function Ht(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 Mt(){Ht(G==="dark"?"light":"dark")}function Lt(e){return pe.add(e),()=>{pe.delete(e)}}function Ut(){const[e,t]=U(G);return j(()=>Lt(()=>t(It())),[]),e}function Ft(){const e=Ut(),n=`Switch to ${e==="dark"?"light":"dark"} mode`;return s("button",{type:"button",class:"theme-toggle",title:n,"aria-label":n,onClick:()=>Mt(),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 Rt(){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?At(g,_):[],[g,_]),k=o.trim().toLowerCase(),N=I(()=>m?$t(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?Ct(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(Ft,{})]})]}),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(Rt,{}),Be);</script>
|
|
29
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
30
|
</head>
|
|
31
31
|
<body>
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://github.com/stevenzg/edsger-assets/schema/testcases.schema.json",
|
|
4
|
+
"title": "Edsger Manual Test-Case Standard",
|
|
5
|
+
"description": "Guidance for deriving a manual test-case plan from a repository: an outline tree (Workflowy-style) whose root is the project, whose branches are test areas, and whose leaves are concrete manual test cases (preconditions, steps, expected result) a human tester can execute. A `base` standard is merged with zero or more language overlays. The `aspects` are candidate top-level test areas — 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": "testcases" },
|
|
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 plan: what the root is, what makes a good test case, how to assign priorities.",
|
|
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 test area 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 test area from the repository: what code to read, what scenario groups to create, and what makes each leaf an executable manual test case.",
|
|
60
|
+
"type": "string"
|
|
61
|
+
},
|
|
62
|
+
"references": {
|
|
63
|
+
"type": "array",
|
|
64
|
+
"items": { "type": "string" }
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: testcases
|
|
3
|
+
description: >
|
|
4
|
+
Derive a manual test-case plan for a repository — an outline tree
|
|
5
|
+
(Workflowy-style) whose root is the project, whose branches are the areas a
|
|
6
|
+
human tester should exercise (core flows, inputs & edge cases, errors &
|
|
7
|
+
recovery, data integrity, integrations), and whose leaves are concrete
|
|
8
|
+
manual test cases with preconditions, steps, and an expected result. These
|
|
9
|
+
are NOT automated code tests. Use when the user asks how to test the
|
|
10
|
+
software manually, for a test plan, QA checklist, or acceptance test cases.
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Derive manual test cases for a repository
|
|
14
|
+
|
|
15
|
+
You will inspect the repository in the current working directory and build a
|
|
16
|
+
**manual test-case plan**: a tree whose root is the project, whose branches
|
|
17
|
+
are test areas, and whose leaves are single test cases a human tester who has
|
|
18
|
+
never read the code can execute.
|
|
19
|
+
|
|
20
|
+
## 1. Prefer the CLI if it is installed
|
|
21
|
+
|
|
22
|
+
If the `edsger` CLI is available, it runs the agent and produces a browsable
|
|
23
|
+
Workflowy-style viewer — use it:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
command -v edsger >/dev/null 2>&1 && edsger testcases || echo "no-cli"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
If it ran, summarise `.edsger/testcases/testcases.md` for the user and stop.
|
|
30
|
+
Otherwise continue with the native flow below.
|
|
31
|
+
|
|
32
|
+
## 2. Detect the language(s)
|
|
33
|
+
|
|
34
|
+
Look for manifest files to decide which overlays apply: `package.json`/`tsconfig.json`
|
|
35
|
+
→ typescript; `pyproject.toml`/`requirements.txt` → python; `go.mod` → go;
|
|
36
|
+
`*.csproj`/`*.sln` → csharp; `pom.xml`/`build.gradle` → java; `pubspec.yaml` → dart.
|
|
37
|
+
A repo may match several.
|
|
38
|
+
|
|
39
|
+
## 3. Load the standard
|
|
40
|
+
|
|
41
|
+
Read the base standard and any matching language overlays from this plugin:
|
|
42
|
+
|
|
43
|
+
- `${CLAUDE_PLUGIN_ROOT}/testcases/base.yaml` (always)
|
|
44
|
+
- `${CLAUDE_PLUGIN_ROOT}/testcases/<language>.yaml` (for each detected language)
|
|
45
|
+
|
|
46
|
+
Merge overlays onto the base **by aspect id** (new ids are appended). If the
|
|
47
|
+
repo has a `.edsger/testcases/` directory, those files override the bundled
|
|
48
|
+
standard.
|
|
49
|
+
|
|
50
|
+
## 4. Explore and build the plan
|
|
51
|
+
|
|
52
|
+
Explore the repo (Read/Grep/Glob, read-only) and characterise it. The
|
|
53
|
+
standard's `aspects` are **candidate top-level test areas** — keep only the
|
|
54
|
+
ones this project's code supports (use `detect` and `appliesWhen`), rename
|
|
55
|
+
them to the project's own vocabulary where clearer, and grow each into a
|
|
56
|
+
subtree by following its `guidance`. Rules:
|
|
57
|
+
|
|
58
|
+
- Root = the project: name + one line on what a tester is validating.
|
|
59
|
+
- 3-7 first-level test areas; respect the standard's `maxDepth`.
|
|
60
|
+
- Interior nodes group features/scenarios; every **leaf is one test case**
|
|
61
|
+
with: preconditions (state to prepare), numbered steps (exact, observable
|
|
62
|
+
actions), and a single expected result.
|
|
63
|
+
- Give each case a priority — critical, high, medium, or low — and cite the
|
|
64
|
+
file(s) implementing the behaviour under test. Derive cases only from
|
|
65
|
+
behaviour that is actually in the code.
|
|
66
|
+
|
|
67
|
+
## 5. Write the report
|
|
68
|
+
|
|
69
|
+
Write `.edsger/testcases/testcases.md` as a nested Markdown outline: a header
|
|
70
|
+
with the project profile, then the tree as indented bullets — test cases as
|
|
71
|
+
`- [ ] **Title** (priority) — summary` with indented Preconditions / Steps /
|
|
72
|
+
Expected beneath. Then give the user a concise summary of the test areas, the
|
|
73
|
+
case counts by priority, and where they should start testing.
|