edsger 0.83.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 +102 -2
- package/assets/README.md +29 -10
- package/assets/audit/base.yaml +187 -0
- package/assets/audit/csharp.yaml +46 -0
- package/assets/audit/dart.yaml +46 -0
- package/assets/audit/go.yaml +46 -0
- package/assets/audit/java.yaml +46 -0
- package/assets/audit/python.yaml +49 -0
- package/assets/audit/typescript.yaml +51 -0
- package/assets/audit-viewer/assets/audit--os0TXXZ.css +1 -0
- package/assets/audit-viewer/assets/audit-CSblYELs.js +2 -0
- package/assets/audit-viewer/audit.html +31 -0
- package/assets/audit-viewer-single.html +32 -0
- package/assets/diagrams-viewer/assets/{abnfDiagram-VRR7QNED-BuBTl7CD.js → abnfDiagram-VRR7QNED-CWLpbgGU.js} +1 -1
- package/assets/diagrams-viewer/assets/{arc-OMyuAfpK.js → arc-B4VipCr_.js} +1 -1
- package/assets/diagrams-viewer/assets/{architectureDiagram-ZJ3FMSHR-BtZuD4Oc.js → architectureDiagram-ZJ3FMSHR-BMDodQXV.js} +1 -1
- package/assets/diagrams-viewer/assets/{blockDiagram-677ZJIJ3-BXUV3Kw8.js → blockDiagram-677ZJIJ3-DbHoVVH-.js} +1 -1
- package/assets/diagrams-viewer/assets/{c4Diagram-LMCZKHZV-CB6FLms7.js → c4Diagram-LMCZKHZV-CyUEj98S.js} +1 -1
- package/assets/diagrams-viewer/assets/channel-DWh7ErxY.js +1 -0
- package/assets/diagrams-viewer/assets/{chunk-2Q5K7J3B-mPN4SRuj.js → chunk-2Q5K7J3B-CWu0p0os.js} +1 -1
- package/assets/diagrams-viewer/assets/{chunk-32BRIVSS-DVv1-dcH.js → chunk-32BRIVSS-BhVWSCoK.js} +1 -1
- package/assets/diagrams-viewer/assets/{chunk-5VM5RSS4-CV1HWp5i.js → chunk-5VM5RSS4-B_2wZBAn.js} +1 -1
- package/assets/diagrams-viewer/assets/{chunk-EX3LRPZG-Dka-2CXP.js → chunk-EX3LRPZG-D_MRgtfL.js} +1 -1
- package/assets/diagrams-viewer/assets/{chunk-JWPE2WC7-D18DLD3z.js → chunk-JWPE2WC7-dsh1qiy0.js} +1 -1
- package/assets/diagrams-viewer/assets/{chunk-MOJQB5TN-DZ8recee.js → chunk-MOJQB5TN-BvLm4a6B.js} +1 -1
- package/assets/diagrams-viewer/assets/{chunk-RYQCIY6F-D-T7U7G_.js → chunk-RYQCIY6F-gJyPbIpx.js} +1 -1
- package/assets/diagrams-viewer/assets/{chunk-V7JOEXUC-CycRbumY.js → chunk-V7JOEXUC-BMvj0zJM.js} +1 -1
- package/assets/diagrams-viewer/assets/{chunk-VR4S4FIN-CgtEJekm.js → chunk-VR4S4FIN-Di2iBUXs.js} +1 -1
- package/assets/diagrams-viewer/assets/{chunk-XXDRQBXY-N1fSDz2n.js → chunk-XXDRQBXY-Cfajbd4I.js} +1 -1
- package/assets/diagrams-viewer/assets/classDiagram-OUVF2IWQ-winWhRce.js +1 -0
- package/assets/diagrams-viewer/assets/classDiagram-v2-EOCWNBFH-winWhRce.js +1 -0
- package/assets/diagrams-viewer/assets/{cose-bilkent-JH36ORCC-x2DnNSLL.js → cose-bilkent-JH36ORCC-ClE2EhTL.js} +1 -1
- package/assets/diagrams-viewer/assets/{cynefin-VYW2F7L2-CWCJCs-i.js → cynefin-VYW2F7L2-nm5z0Jwc.js} +1 -1
- package/assets/diagrams-viewer/assets/{cynefinDiagram-TSTJHNR4-mn39JWqG.js → cynefinDiagram-TSTJHNR4-CGhnRh5V.js} +1 -1
- package/assets/diagrams-viewer/assets/{dagre-VKFMJZFB-iOjB5Pax.js → dagre-VKFMJZFB-COlahHKk.js} +1 -1
- package/assets/diagrams-viewer/assets/{diagram-FQU43EPY-DIFXEG6K.js → diagram-FQU43EPY-DsUclBK0.js} +1 -1
- package/assets/diagrams-viewer/assets/{diagram-G47NLZAW-CUFys0Kk.js → diagram-G47NLZAW-CnjT9SvX.js} +1 -1
- package/assets/diagrams-viewer/assets/{diagram-NH7WQ7WH-ByXjnNJR.js → diagram-NH7WQ7WH-DiGoGOyA.js} +1 -1
- package/assets/diagrams-viewer/assets/{diagram-OA4YK3LP-B7VCnnms.js → diagram-OA4YK3LP-qi8nz9qe.js} +1 -1
- package/assets/diagrams-viewer/assets/{diagram-WEI45ONY-DdmQeP2M.js → diagram-WEI45ONY-BV3PGzwL.js} +1 -1
- package/assets/diagrams-viewer/assets/diagrams-8nCc1utO.css +1 -0
- package/assets/diagrams-viewer/assets/{diagrams-DFlErBCY.js → diagrams-CF48btj0.js} +100 -100
- package/assets/diagrams-viewer/assets/{ebnfDiagram-CCIWWBDH-B54UVMil.js → ebnfDiagram-CCIWWBDH-CtKWe-dh.js} +1 -1
- package/assets/diagrams-viewer/assets/{erDiagram-Q63AITRT-zkOgYlyz.js → erDiagram-Q63AITRT-Aajee3Fz.js} +1 -1
- package/assets/diagrams-viewer/assets/{flowDiagram-23GEKE2U-CCNIfraz.js → flowDiagram-23GEKE2U-N3Xe2K9t.js} +1 -1
- package/assets/diagrams-viewer/assets/{ganttDiagram-NO4QXBWP-DCn2zVSV.js → ganttDiagram-NO4QXBWP-Bjicdg8S.js} +1 -1
- package/assets/diagrams-viewer/assets/{gitGraphDiagram-IHSO6WYX-lB6SW9xm.js → gitGraphDiagram-IHSO6WYX-CacIXKIe.js} +1 -1
- package/assets/diagrams-viewer/assets/{infoDiagram-FWYZ7A6U-CvGfGSmH.js → infoDiagram-FWYZ7A6U-CVmDapTx.js} +1 -1
- package/assets/diagrams-viewer/assets/{ishikawaDiagram-FXEZZL3T-DnwhjgE5.js → ishikawaDiagram-FXEZZL3T-DMJf1YQN.js} +1 -1
- package/assets/diagrams-viewer/assets/{journeyDiagram-5HDEW3XC-C8LVhqZM.js → journeyDiagram-5HDEW3XC-Bk_U6MPk.js} +1 -1
- package/assets/diagrams-viewer/assets/{kanban-definition-HUTT4EX6-PYOrsIQc.js → kanban-definition-HUTT4EX6-n05wGXiD.js} +1 -1
- package/assets/diagrams-viewer/assets/{linear-CIU4B3PA.js → linear-DD_zky65.js} +1 -1
- package/assets/diagrams-viewer/assets/{mindmap-definition-LN4V7U3C-B-HjOMSw.js → mindmap-definition-LN4V7U3C-BWt_I9vr.js} +1 -1
- package/assets/diagrams-viewer/assets/{pegDiagram-2B236MQR-dAvsUVxy.js → pegDiagram-2B236MQR-CCZTIXBZ.js} +1 -1
- package/assets/diagrams-viewer/assets/{pieDiagram-ENE6RG2P-W-6EgmyD.js → pieDiagram-ENE6RG2P-BmIQql1w.js} +1 -1
- package/assets/diagrams-viewer/assets/{quadrantDiagram-ABIIQ3AL-SlUlWOO8.js → quadrantDiagram-ABIIQ3AL-BPvOH5QN.js} +1 -1
- package/assets/diagrams-viewer/assets/{railroadDiagram-RFXS5EU6-KjtAtTVy.js → railroadDiagram-RFXS5EU6-DpgVbjSl.js} +1 -1
- package/assets/diagrams-viewer/assets/{requirementDiagram-TGXJPOKE-DZtlwaER.js → requirementDiagram-TGXJPOKE-CDVpI3MH.js} +1 -1
- package/assets/diagrams-viewer/assets/{sankeyDiagram-HTMAVEWB-1Ae4oRc3.js → sankeyDiagram-HTMAVEWB-DU2J23Xy.js} +1 -1
- package/assets/diagrams-viewer/assets/{sequenceDiagram-DBY2YBRQ-DU-x0cLP.js → sequenceDiagram-DBY2YBRQ-BIVlCWU4.js} +1 -1
- package/assets/diagrams-viewer/assets/{sizeCapture-X5ZJPWSS-Cemh16BZ.js → sizeCapture-X5ZJPWSS-C9KxyKN2.js} +1 -1
- package/assets/diagrams-viewer/assets/{stateDiagram-2N3HPSRC-CtfrA6gP.js → stateDiagram-2N3HPSRC-Ba5mRI9d.js} +1 -1
- package/assets/diagrams-viewer/assets/stateDiagram-v2-6OUMAXLB-Dw-0OG6b.js +1 -0
- package/assets/diagrams-viewer/assets/{swimlanes-5IMT3BWC-BkZY9GJ7.js → swimlanes-5IMT3BWC-aOsD2O80.js} +2 -2
- package/assets/diagrams-viewer/assets/swimlanesDiagram-G3AALYLV-KujklZml.js +8 -0
- package/assets/diagrams-viewer/assets/{timeline-definition-FHXFAJF6-DikyXYB3.js → timeline-definition-FHXFAJF6-CmYd84Hc.js} +1 -1
- package/assets/diagrams-viewer/assets/{vennDiagram-L72KCM5P-C_7veK57.js → vennDiagram-L72KCM5P-CDiMK-z9.js} +1 -1
- package/assets/diagrams-viewer/assets/{wardleyDiagram-EHGQE667-Das_YJGv.js → wardleyDiagram-EHGQE667-BKLsv25u.js} +1 -1
- package/assets/diagrams-viewer/assets/{xychartDiagram-FW5EYKEG-B5fwef3a.js → xychartDiagram-FW5EYKEG-Bpj6Ub-a.js} +1 -1
- package/assets/diagrams-viewer/diagrams.html +19 -2
- package/assets/diagrams-viewer-single.html +382 -365
- package/assets/manifest.yaml +13 -1
- package/assets/mindmap/base.yaml +115 -0
- package/assets/mindmap/csharp.yaml +32 -0
- package/assets/mindmap/dart.yaml +42 -0
- package/assets/mindmap/go.yaml +33 -0
- package/assets/mindmap/java.yaml +40 -0
- package/assets/mindmap/python.yaml +43 -0
- package/assets/mindmap/typescript.yaml +47 -0
- package/assets/mindmap-viewer/assets/mindmap-C50Y8qu4.js +4 -0
- package/assets/mindmap-viewer/assets/mindmap-D7KMR9EM.css +1 -0
- package/assets/mindmap-viewer/mindmap.html +31 -0
- package/assets/mindmap-viewer-single.html +34 -0
- package/assets/schema/audit.schema.json +66 -0
- package/assets/schema/mindmap.schema.json +69 -0
- package/assets/schema/testcases.schema.json +69 -0
- package/assets/skills/audit/SKILL.md +76 -0
- package/assets/skills/mindmap/SKILL.md +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/assets/viewer/assets/index-BFtGar9N.css +1 -0
- package/assets/viewer/assets/index-XOKyyudT.js +3 -0
- package/assets/viewer/index.html +19 -2
- package/assets/viewer-single.html +21 -4
- package/dist/index.js +1961 -564
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/assets/diagrams-viewer/assets/channel-DfIqGUHQ.js +0 -1
- package/assets/diagrams-viewer/assets/classDiagram-OUVF2IWQ-D7S3taPH.js +0 -1
- package/assets/diagrams-viewer/assets/classDiagram-v2-EOCWNBFH-D7S3taPH.js +0 -1
- package/assets/diagrams-viewer/assets/diagrams-hdYg_gGB.css +0 -1
- package/assets/diagrams-viewer/assets/stateDiagram-v2-6OUMAXLB-BU13FASH.js +0 -1
- package/assets/diagrams-viewer/assets/swimlanesDiagram-G3AALYLV-03GXtgC-.js +0 -8
- package/assets/viewer/assets/index-C7hwGkuU.js +0 -3
- package/assets/viewer/assets/index-Dhc-7q5o.css +0 -1
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, and
|
|
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:
|
|
@@ -15,10 +15,22 @@ kinds:
|
|
|
15
15
|
dir: review
|
|
16
16
|
base: base
|
|
17
17
|
schema: schema/review.schema.json
|
|
18
|
+
audit:
|
|
19
|
+
dir: audit
|
|
20
|
+
base: base
|
|
21
|
+
schema: schema/audit.schema.json
|
|
18
22
|
diagrams:
|
|
19
23
|
dir: diagrams
|
|
20
24
|
base: base
|
|
21
25
|
schema: schema/diagrams.schema.json
|
|
26
|
+
mindmap:
|
|
27
|
+
dir: mindmap
|
|
28
|
+
base: base
|
|
29
|
+
schema: schema/mindmap.schema.json
|
|
30
|
+
testcases:
|
|
31
|
+
dir: testcases
|
|
32
|
+
base: base
|
|
33
|
+
schema: schema/testcases.schema.json
|
|
22
34
|
|
|
23
35
|
# Languages with dedicated overlays. `id` matches the detector in languages.yaml.
|
|
24
36
|
# `aliases` are accepted on the CLI (e.g. `--lang ts`).
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
id: base
|
|
2
|
+
name: Code Implementation Mind Map
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
kind: mindmap
|
|
5
|
+
extends: null
|
|
6
|
+
appliesTo: ["*"]
|
|
7
|
+
# A standard for building an implementation mind map of a repository: an outline
|
|
8
|
+
# tree whose root is the project and whose branches explain how the code is
|
|
9
|
+
# actually implemented, deep enough that each leaf points at concrete files. The
|
|
10
|
+
# `aspects` below are candidate top-level branches — the agent keeps only the
|
|
11
|
+
# ones this project's code supports and grows each into a faithful subtree.
|
|
12
|
+
|
|
13
|
+
guidance: >
|
|
14
|
+
The root of the tree is the project itself: its title plus a one-line summary
|
|
15
|
+
of what it does. The first level should be 3-7 branches that together explain
|
|
16
|
+
how the code is implemented — picked from the aspects below, renamed to fit
|
|
17
|
+
the project's own vocabulary where that is clearer. Every node needs a short
|
|
18
|
+
title (2-6 words, like an outline bullet) and a one-or-two-sentence summary
|
|
19
|
+
that says something true and specific about THIS codebase, not generic
|
|
20
|
+
filler. Interior nodes group; leaf nodes land on concrete implementation and
|
|
21
|
+
cite the files they describe. Prefer a tree a newcomer can absorb branch by
|
|
22
|
+
branch over an exhaustive file listing — depth where the code is interesting,
|
|
23
|
+
brevity where it is boilerplate.
|
|
24
|
+
|
|
25
|
+
maxDepth: 5
|
|
26
|
+
|
|
27
|
+
aspects:
|
|
28
|
+
- id: entry-points
|
|
29
|
+
name: Entry Points & Interfaces
|
|
30
|
+
appliesWhen: >
|
|
31
|
+
Almost any project. Where execution starts and what surface the outside
|
|
32
|
+
world sees: CLI commands, HTTP routes, exported library API, UI screens,
|
|
33
|
+
scheduled jobs, message consumers.
|
|
34
|
+
detect: ["*"]
|
|
35
|
+
guidance: >
|
|
36
|
+
Find the real entry points: bin/main files, route registration, the
|
|
37
|
+
public export surface, background workers. One child per interface kind
|
|
38
|
+
(e.g. "CLI commands", "HTTP API", "Public API"), then one grandchild per
|
|
39
|
+
command/route-group/export with a summary of what it does and which
|
|
40
|
+
handler file implements it.
|
|
41
|
+
|
|
42
|
+
- id: core-flows
|
|
43
|
+
name: Core Flows
|
|
44
|
+
appliesWhen: >
|
|
45
|
+
Any project with meaningful runtime behaviour. The handful of end-to-end
|
|
46
|
+
paths that define what the software does (e.g. "handle a request",
|
|
47
|
+
"run a build", "sync data").
|
|
48
|
+
detect: ["*"]
|
|
49
|
+
guidance: >
|
|
50
|
+
Pick the 2-5 flows that matter most and trace each through the code: one
|
|
51
|
+
child per flow, whose children are the ordered steps ("parse args →
|
|
52
|
+
resolve config → run agent → write report"), each step naming the
|
|
53
|
+
function/module that performs it and the file it lives in. Follow real
|
|
54
|
+
call paths — do not invent steps.
|
|
55
|
+
|
|
56
|
+
- id: modules
|
|
57
|
+
name: Module Structure
|
|
58
|
+
appliesWhen: >
|
|
59
|
+
Any non-trivial codebase. How the source tree is organised into modules /
|
|
60
|
+
packages / layers, and what each part is responsible for.
|
|
61
|
+
detect: ["src", "lib", "packages", "apps", "internal", "cmd"]
|
|
62
|
+
guidance: >
|
|
63
|
+
Mirror the actual top-level source layout (workspace packages, src
|
|
64
|
+
subdirectories, layers). One child per module with its responsibility in
|
|
65
|
+
one sentence; go one level deeper only where a module has genuinely
|
|
66
|
+
distinct sub-parts. Note the dependency direction between layers where it
|
|
67
|
+
is a deliberate part of the design.
|
|
68
|
+
|
|
69
|
+
- id: domain-data
|
|
70
|
+
name: Domain Model & Data
|
|
71
|
+
appliesWhen: >
|
|
72
|
+
The project owns meaningful state: database schemas, core domain
|
|
73
|
+
entities, rich configuration, or on-disk file formats it reads/writes.
|
|
74
|
+
detect: ["migrations", "schema", "models", "entities", "prisma", "*.sql", "types"]
|
|
75
|
+
guidance: >
|
|
76
|
+
Identify the central types/entities/tables/documents and how they relate
|
|
77
|
+
and persist. One child per entity or data store with a summary of what it
|
|
78
|
+
represents, its important fields or invariants, and where it is defined.
|
|
79
|
+
Include wire/file formats the project emits or consumes if they are part
|
|
80
|
+
of its contract.
|
|
81
|
+
|
|
82
|
+
- id: integrations
|
|
83
|
+
name: External Integrations
|
|
84
|
+
appliesWhen: >
|
|
85
|
+
The project talks to third-party services, external APIs, message
|
|
86
|
+
brokers, or other systems it does not own.
|
|
87
|
+
detect: ["client", "sdk", "api", "webhook", "queue", "http"]
|
|
88
|
+
guidance: >
|
|
89
|
+
One child per external system, summarising what it is used for, the
|
|
90
|
+
protocol/SDK involved, and where the integration code lives. Include how
|
|
91
|
+
credentials/endpoints are configured if that is visible in the code.
|
|
92
|
+
|
|
93
|
+
- id: cross-cutting
|
|
94
|
+
name: Cross-Cutting Concerns
|
|
95
|
+
appliesWhen: >
|
|
96
|
+
The project has deliberate machinery for concerns that span modules:
|
|
97
|
+
configuration, auth, error handling, logging, caching, concurrency,
|
|
98
|
+
feature flags.
|
|
99
|
+
detect: ["config", "auth", "middleware", "logger", "cache", "errors"]
|
|
100
|
+
guidance: >
|
|
101
|
+
Only include concerns with real, dedicated machinery in this repo — an
|
|
102
|
+
ad-hoc console.log does not earn a node. One child per concern with how
|
|
103
|
+
it is implemented and where; keep this branch honest and small.
|
|
104
|
+
|
|
105
|
+
- id: build-delivery
|
|
106
|
+
name: Build, Test & Delivery
|
|
107
|
+
appliesWhen: >
|
|
108
|
+
The project has a build pipeline, a test suite, packaging/publishing, or
|
|
109
|
+
CI/CD worth understanding to work on it.
|
|
110
|
+
detect: ["Makefile", "Dockerfile", ".github", "ci", "test", "tests", "scripts"]
|
|
111
|
+
guidance: >
|
|
112
|
+
Children for how the project is built (tools, targets), how it is tested
|
|
113
|
+
(frameworks, layout, what is covered), and how it ships (packaging,
|
|
114
|
+
release, CI workflows) — each summarising the actual setup and citing the
|
|
115
|
+
config files involved.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
id: csharp
|
|
2
|
+
name: C# / .NET Overlay
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
kind: mindmap
|
|
5
|
+
extends: base
|
|
6
|
+
appliesTo: [csharp]
|
|
7
|
+
|
|
8
|
+
aspects:
|
|
9
|
+
- id: solution-layout
|
|
10
|
+
name: Solution & Project Layout
|
|
11
|
+
appliesWhen: >
|
|
12
|
+
A .NET solution with multiple projects: which projects exist, what each
|
|
13
|
+
is for, and how they reference one another.
|
|
14
|
+
detect: ["*.sln", "*.csproj", "Program.cs"]
|
|
15
|
+
guidance: >
|
|
16
|
+
One child per project in the solution (app, library, tests) with its
|
|
17
|
+
purpose, target framework, and key project references; note the DI
|
|
18
|
+
composition root and where hosted services / controllers are registered.
|
|
19
|
+
|
|
20
|
+
- id: aspnet-wiring
|
|
21
|
+
name: ASP.NET Wiring
|
|
22
|
+
appliesWhen: >
|
|
23
|
+
An ASP.NET (Core) application: how requests are handled — middleware
|
|
24
|
+
order, DI registrations, controllers/minimal APIs, and EF Core
|
|
25
|
+
persistence.
|
|
26
|
+
detect: ["Program.cs", "Startup.cs", "Controllers", "Microsoft.AspNetCore", "DbContext"]
|
|
27
|
+
guidance: >
|
|
28
|
+
Read Program.cs/Startup.cs and map: the middleware pipeline in
|
|
29
|
+
registration order, the significant DI registrations (which interfaces
|
|
30
|
+
bind to which implementations, and their lifetimes where deliberate),
|
|
31
|
+
route groups to their controllers/endpoints, and each DbContext with the
|
|
32
|
+
entities it owns and where migrations live.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
id: dart
|
|
2
|
+
name: Dart / Flutter Overlay
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
kind: mindmap
|
|
5
|
+
extends: base
|
|
6
|
+
appliesTo: [dart]
|
|
7
|
+
|
|
8
|
+
aspects:
|
|
9
|
+
- id: flutter-composition
|
|
10
|
+
name: Screens & State
|
|
11
|
+
appliesWhen: >
|
|
12
|
+
A Flutter app: its screens/routes, the widget composition that matters,
|
|
13
|
+
and the state-management approach.
|
|
14
|
+
detect: ["pubspec.yaml", "lib/main.dart", "widgets", "*.dart"]
|
|
15
|
+
guidance: >
|
|
16
|
+
One child per screen/route from the router or navigator setup, with the
|
|
17
|
+
key widgets it composes; a sibling child for state management (provider,
|
|
18
|
+
riverpod, bloc, setState) describing where app state lives and how
|
|
19
|
+
widgets subscribe to it.
|
|
20
|
+
|
|
21
|
+
- id: platform-integration
|
|
22
|
+
name: Platform & Services
|
|
23
|
+
appliesWhen: >
|
|
24
|
+
The app talks to the platform or backend services: native plugins /
|
|
25
|
+
method channels, Firebase or another BaaS, local storage, push
|
|
26
|
+
notifications, deep links.
|
|
27
|
+
detect:
|
|
28
|
+
[
|
|
29
|
+
"MethodChannel",
|
|
30
|
+
"firebase",
|
|
31
|
+
"pubspec.yaml",
|
|
32
|
+
"android/",
|
|
33
|
+
"ios/",
|
|
34
|
+
"shared_preferences",
|
|
35
|
+
"sqflite"
|
|
36
|
+
]
|
|
37
|
+
guidance: >
|
|
38
|
+
One child per integration: the plugin/channel or SDK used, what it is
|
|
39
|
+
for, where the Dart-side wrapper lives, and any native (android/ios)
|
|
40
|
+
code the repo itself carries. Include local persistence (sqflite, hive,
|
|
41
|
+
shared_preferences) and how the app layer abstracts these behind
|
|
42
|
+
services/repositories, if it does.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
id: go
|
|
2
|
+
name: Go Overlay
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
kind: mindmap
|
|
5
|
+
extends: base
|
|
6
|
+
appliesTo: [go]
|
|
7
|
+
|
|
8
|
+
aspects:
|
|
9
|
+
- id: go-layout
|
|
10
|
+
name: Go Module Layout
|
|
11
|
+
appliesWhen: >
|
|
12
|
+
A Go module using the conventional cmd/, internal/, pkg/ layout, or with
|
|
13
|
+
several binaries built from one module.
|
|
14
|
+
detect: ["go.mod", "cmd", "internal", "pkg"]
|
|
15
|
+
guidance: >
|
|
16
|
+
One child per binary under cmd/ (what it does, its main package), plus
|
|
17
|
+
children for the significant internal/ and pkg/ packages with their
|
|
18
|
+
responsibilities and which binaries depend on them. Note interfaces used
|
|
19
|
+
as seams between packages where they are load-bearing.
|
|
20
|
+
|
|
21
|
+
- id: concurrency-model
|
|
22
|
+
name: Concurrency Model
|
|
23
|
+
appliesWhen: >
|
|
24
|
+
The code uses goroutines/channels beyond trivial helpers: worker pools,
|
|
25
|
+
pipelines, fan-out/fan-in, background loops, or graceful-shutdown
|
|
26
|
+
orchestration.
|
|
27
|
+
detect: ["go func", "chan ", "sync.WaitGroup", "errgroup", "context.Context", "select {"]
|
|
28
|
+
guidance: >
|
|
29
|
+
Map the long-lived goroutines and worker pools: what each concurrent unit
|
|
30
|
+
does, how work and results flow (channels, errgroup, mutex-guarded
|
|
31
|
+
state), and how cancellation propagates (context tree, signal handling,
|
|
32
|
+
shutdown order). One child per concurrent subsystem, citing where it is
|
|
33
|
+
started. Only include real concurrency — not every one-off goroutine.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
id: java
|
|
2
|
+
name: Java / JVM Overlay
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
kind: mindmap
|
|
5
|
+
extends: base
|
|
6
|
+
appliesTo: [java]
|
|
7
|
+
|
|
8
|
+
aspects:
|
|
9
|
+
- id: jvm-layout
|
|
10
|
+
name: Build Modules & Packages
|
|
11
|
+
appliesWhen: >
|
|
12
|
+
A Maven/Gradle build, possibly multi-module: which modules exist and how
|
|
13
|
+
the important packages inside them are layered.
|
|
14
|
+
detect: ["pom.xml", "build.gradle", "build.gradle.kts", "settings.gradle"]
|
|
15
|
+
guidance: >
|
|
16
|
+
One child per build module with its role and key dependencies, then the
|
|
17
|
+
significant packages inside the main module (controller/service/
|
|
18
|
+
repository or the project's own layering) with one-line
|
|
19
|
+
responsibilities. Note the framework wiring (Spring configuration,
|
|
20
|
+
annotations) where it drives the structure.
|
|
21
|
+
|
|
22
|
+
- id: spring-wiring
|
|
23
|
+
name: Spring Wiring
|
|
24
|
+
appliesWhen: >
|
|
25
|
+
A Spring (Boot) application: how the application is assembled —
|
|
26
|
+
configuration classes, profiles, the web layer, and JPA persistence.
|
|
27
|
+
detect:
|
|
28
|
+
[
|
|
29
|
+
"@SpringBootApplication",
|
|
30
|
+
"@Configuration",
|
|
31
|
+
"application.yml",
|
|
32
|
+
"application.properties",
|
|
33
|
+
"@Entity"
|
|
34
|
+
]
|
|
35
|
+
guidance: >
|
|
36
|
+
Map the @Configuration classes and what each wires, the property/profile
|
|
37
|
+
story (application.yml variants, @ConfigurationProperties holders),
|
|
38
|
+
controller route groups to their services, and the JPA entities with
|
|
39
|
+
their repositories and relationship mapping. Note AOP/interceptors and
|
|
40
|
+
scheduled/async methods where they carry real behaviour.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
id: python
|
|
2
|
+
name: Python Overlay
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
kind: mindmap
|
|
5
|
+
extends: base
|
|
6
|
+
appliesTo: [python]
|
|
7
|
+
|
|
8
|
+
aspects:
|
|
9
|
+
- id: package-surface
|
|
10
|
+
name: Package Surface
|
|
11
|
+
appliesWhen: >
|
|
12
|
+
The repo is (or contains) an installable Python package: console scripts,
|
|
13
|
+
the importable API, and how the distribution is built.
|
|
14
|
+
detect: ["pyproject.toml", "setup.py", "setup.cfg", "__init__.py"]
|
|
15
|
+
guidance: >
|
|
16
|
+
Read pyproject.toml/setup.cfg and map each console_scripts entry point
|
|
17
|
+
and top-level importable module to its implementation; note the build
|
|
18
|
+
backend (setuptools, poetry, hatch) and anything unusual about packaging.
|
|
19
|
+
|
|
20
|
+
- id: framework-wiring
|
|
21
|
+
name: Framework Wiring
|
|
22
|
+
appliesWhen: >
|
|
23
|
+
A web/API framework is present (Django, Flask, FastAPI, Celery): how the
|
|
24
|
+
app is assembled — routes/views, ORM models, settings, background tasks.
|
|
25
|
+
detect: ["django", "flask", "fastapi", "celery", "settings.py", "urls.py", "asgi", "wsgi"]
|
|
26
|
+
guidance: >
|
|
27
|
+
Start from the app factory / settings / URL conf and map: route groups to
|
|
28
|
+
their view/endpoint modules, ORM models to the domain they persist,
|
|
29
|
+
middleware in order, and task queues with their workers. Note where
|
|
30
|
+
configuration comes from (settings module, env, pydantic Settings).
|
|
31
|
+
|
|
32
|
+
- id: data-pipeline
|
|
33
|
+
name: Data & Model Pipeline
|
|
34
|
+
appliesWhen: >
|
|
35
|
+
The project trains models or processes data: notebooks, pandas/polars
|
|
36
|
+
transformations, ML training loops, or orchestrated pipelines (Airflow,
|
|
37
|
+
dbt, Prefect).
|
|
38
|
+
detect: ["notebooks", "*.ipynb", "torch", "sklearn", "pandas", "dags", "dbt_project.yml"]
|
|
39
|
+
guidance: >
|
|
40
|
+
Trace data from source to output: ingestion, the significant transforms,
|
|
41
|
+
training/evaluation (datasets, model definition, loss/metrics), and where
|
|
42
|
+
artifacts land (checkpoints, feature stores, dashboards). One child per
|
|
43
|
+
pipeline stage, citing the script/DAG/notebook that implements it.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
id: typescript
|
|
2
|
+
name: TypeScript / JavaScript Overlay
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
kind: mindmap
|
|
5
|
+
extends: base
|
|
6
|
+
appliesTo: [typescript]
|
|
7
|
+
|
|
8
|
+
# Adds JS/TS-idiomatic branches. New aspect ids are appended to the base set.
|
|
9
|
+
aspects:
|
|
10
|
+
- id: package-surface
|
|
11
|
+
name: Package Surface
|
|
12
|
+
appliesWhen: >
|
|
13
|
+
The repo is (or contains) a published npm package: what `package.json`
|
|
14
|
+
exposes via "exports"/"main"/"bin"/"types" and how the build produces it.
|
|
15
|
+
detect: ["package.json", "tsup.config*", "rollup.config*", "tsconfig.json"]
|
|
16
|
+
guidance: >
|
|
17
|
+
Read package.json (and the bundler config) and map each exposed entry —
|
|
18
|
+
bin commands, export subpaths, type declarations — to the source file
|
|
19
|
+
that implements it and the build step that produces the artifact.
|
|
20
|
+
|
|
21
|
+
- id: types-and-contracts
|
|
22
|
+
name: Types & Contracts
|
|
23
|
+
appliesWhen: >
|
|
24
|
+
TypeScript codebases where shared types are a deliberate part of the
|
|
25
|
+
design: central domain types, runtime validation at boundaries, or types
|
|
26
|
+
shared between packages/front-and-back ends.
|
|
27
|
+
detect: ["types.ts", "schema", "zod", "io-ts", "valibot", "*.d.ts", "trpc"]
|
|
28
|
+
guidance: >
|
|
29
|
+
Find where the load-bearing types live (a types.ts, a shared package, a
|
|
30
|
+
schema module) and how contracts are enforced at runtime boundaries
|
|
31
|
+
(zod/valibot parsing, JSON Schema, tRPC/OpenAPI codegen). One child per
|
|
32
|
+
contract surface: what it types, who consumes it, and where compile-time
|
|
33
|
+
types diverge from runtime validation. Skip this branch if types are
|
|
34
|
+
purely incidental.
|
|
35
|
+
|
|
36
|
+
- id: frontend-composition
|
|
37
|
+
name: Frontend Composition
|
|
38
|
+
appliesWhen: >
|
|
39
|
+
A component-based frontend is present (React, Next.js, Preact, Vue,
|
|
40
|
+
Svelte, Angular): routes/screens, the important components, and how
|
|
41
|
+
state/data flows between them.
|
|
42
|
+
detect: ["react", "next", "preact", "vue", "svelte", "@angular", "*.tsx", "*.vue", "*.svelte"]
|
|
43
|
+
guidance: >
|
|
44
|
+
One child per route/screen from the router or pages directory, with the
|
|
45
|
+
key components it composes; a sibling child for shared state/data
|
|
46
|
+
fetching (stores, context, hooks) describing where server data enters
|
|
47
|
+
the UI. Focus on routed screens and shared components, not every leaf.
|
|
@@ -0,0 +1,4 @@
|
|
|
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
|
+
${e.summary}
|
|
3
|
+
${e.files.join(`
|
|
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);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
: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}}
|
|
@@ -0,0 +1,31 @@
|
|
|
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 src="./assets/mindmap-C50Y8qu4.js"></script>
|
|
26
|
+
<link rel="stylesheet" crossorigin href="./assets/mindmap-D7KMR9EM.css">
|
|
27
|
+
</head>
|
|
28
|
+
<body>
|
|
29
|
+
<div id="app"></div>
|
|
30
|
+
</body>
|
|
31
|
+
</html>
|