rdstudio 0.2.0__py3-none-any.whl
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.
- rdstudio/__init__.py +3 -0
- rdstudio/_node/rdstudio.mjs +59351 -0
- rdstudio/brief.py +46 -0
- rdstudio/build.py +218 -0
- rdstudio/classify.py +131 -0
- rdstudio/cli.py +369 -0
- rdstudio/config.py +115 -0
- rdstudio/gitlog.py +92 -0
- rdstudio/launcher.py +63 -0
- rdstudio/learner.py +187 -0
- rdstudio/mcp_server.py +313 -0
- rdstudio/okf.py +775 -0
- rdstudio/procedures.py +233 -0
- rdstudio/references.py +228 -0
- rdstudio/reports.py +75 -0
- rdstudio/scaffold.py +227 -0
- rdstudio/scopes.py +162 -0
- rdstudio/search.py +149 -0
- rdstudio/serve.py +214 -0
- rdstudio/store.py +161 -0
- rdstudio/templates/agents/critic.md +20 -0
- rdstudio/templates/agents/librarian.md +21 -0
- rdstudio/templates/agents/searcher.md +21 -0
- rdstudio/templates/agents_section.md +31 -0
- rdstudio/templates/claude_section.md +3 -0
- rdstudio/templates/knowledge/overview.md +20 -0
- rdstudio/templates/knowledge/tasks/bootstrap-knowledge-base.md +45 -0
- rdstudio/templates/skills/decision/SKILL.md +47 -0
- rdstudio/templates/skills/handoff/SKILL.md +18 -0
- rdstudio/templates/skills/ingest-ref/SKILL.md +32 -0
- rdstudio/templates/skills/lint-okf/SKILL.md +15 -0
- rdstudio/templates/skills/promote/SKILL.md +25 -0
- rdstudio/templates/skills/question/SKILL.md +33 -0
- rdstudio/templates/skills/record-okf/SKILL.md +61 -0
- rdstudio/templates/skills/report/SKILL.md +46 -0
- rdstudio/templates/skills/report/template.html +74 -0
- rdstudio/templates/skills/search-okf/SKILL.md +36 -0
- rdstudio/templates/skills/task/SKILL.md +51 -0
- rdstudio/web/app.js +140 -0
- rdstudio/web/fonts.css +48 -0
- rdstudio/web/icon-192.png +0 -0
- rdstudio/web/icon-512.png +0 -0
- rdstudio/web/index.html +109 -0
- rdstudio/web/js/data.js +125 -0
- rdstudio/web/js/diagrams.js +116 -0
- rdstudio/web/js/graph.js +396 -0
- rdstudio/web/js/knowledge.js +212 -0
- rdstudio/web/js/layout-worker.js +15 -0
- rdstudio/web/js/layout.js +226 -0
- rdstudio/web/js/learn.js +83 -0
- rdstudio/web/js/map.js +1293 -0
- rdstudio/web/js/markdown.js +173 -0
- rdstudio/web/js/pages.js +219 -0
- rdstudio/web/js/procedures.js +262 -0
- rdstudio/web/js/settings.js +95 -0
- rdstudio/web/js/util.js +99 -0
- rdstudio/web/report.css +35 -0
- rdstudio/web/report.js +104 -0
- rdstudio/web/style.css +566 -0
- rdstudio/web/sw.js +166 -0
- rdstudio/web/themes/cyber.css +139 -0
- rdstudio/web/themes/map.css +133 -0
- rdstudio/web/themes/notebook.css +134 -0
- rdstudio/web/themes/space.css +135 -0
- rdstudio/web/themes/studio.css +110 -0
- rdstudio/web/vendor/d3.min.js +2 -0
- rdstudio/web/vendor/fonts/atkinson-hyperlegible-next-latin-ext-wght-italic.woff2 +0 -0
- rdstudio/web/vendor/fonts/atkinson-hyperlegible-next-latin-ext-wght-normal.woff2 +0 -0
- rdstudio/web/vendor/fonts/atkinson-hyperlegible-next-latin-wght-italic.woff2 +0 -0
- rdstudio/web/vendor/fonts/atkinson-hyperlegible-next-latin-wght-normal.woff2 +0 -0
- rdstudio/web/vendor/fonts/caveat-latin-wght-normal.woff2 +0 -0
- rdstudio/web/vendor/fonts/ibm-plex-mono-latin-400-normal.woff2 +0 -0
- rdstudio/web/vendor/fonts/ibm-plex-mono-latin-600-normal.woff2 +0 -0
- rdstudio/web/vendor/fonts/ibm-plex-sans-latin-wght-italic.woff2 +0 -0
- rdstudio/web/vendor/fonts/ibm-plex-sans-latin-wght-normal.woff2 +0 -0
- rdstudio/web/vendor/fonts/inter-latin-opsz-italic.woff2 +0 -0
- rdstudio/web/vendor/fonts/inter-latin-opsz-normal.woff2 +0 -0
- rdstudio/web/vendor/fonts/jetbrains-mono-latin-wght-italic.woff2 +0 -0
- rdstudio/web/vendor/fonts/jetbrains-mono-latin-wght-normal.woff2 +0 -0
- rdstudio/web/vendor/fonts/literata-latin-ext-opsz-italic.woff2 +0 -0
- rdstudio/web/vendor/fonts/literata-latin-ext-opsz-normal.woff2 +0 -0
- rdstudio/web/vendor/fonts/literata-latin-opsz-italic.woff2 +0 -0
- rdstudio/web/vendor/fonts/literata-latin-opsz-normal.woff2 +0 -0
- rdstudio/web/vendor/fonts/source-sans-3-latin-wght-italic.woff2 +0 -0
- rdstudio/web/vendor/fonts/source-sans-3-latin-wght-normal.woff2 +0 -0
- rdstudio/web/vendor/fonts/source-serif-4-latin-opsz-italic.woff2 +0 -0
- rdstudio/web/vendor/fonts/source-serif-4-latin-opsz-normal.woff2 +0 -0
- rdstudio/web/vendor/hljs/github-dark.min.css +10 -0
- rdstudio/web/vendor/hljs/github.min.css +10 -0
- rdstudio/web/vendor/hljs/highlight.min.js +1262 -0
- rdstudio/web/vendor/hljs/julia.min.js +18 -0
- rdstudio/web/vendor/hljs/latex.min.js +33 -0
- rdstudio/web/vendor/hljs/matlab.min.js +15 -0
- rdstudio/web/vendor/katex/auto-render.min.js +1 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- rdstudio/web/vendor/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- rdstudio/web/vendor/katex/katex.min.css +1 -0
- rdstudio/web/vendor/katex/katex.min.js +1 -0
- rdstudio/web/vendor/licenses/atkinson-hyperlegible-next-OFL.txt +93 -0
- rdstudio/web/vendor/licenses/caveat-OFL.txt +93 -0
- rdstudio/web/vendor/licenses/d3-7.9.0.txt +13 -0
- rdstudio/web/vendor/licenses/highlightjs-cdn-assets-11.12.0.txt +29 -0
- rdstudio/web/vendor/licenses/ibm-plex-mono-OFL.txt +93 -0
- rdstudio/web/vendor/licenses/ibm-plex-sans-OFL.txt +93 -0
- rdstudio/web/vendor/licenses/inter-OFL.txt +93 -0
- rdstudio/web/vendor/licenses/jetbrains-mono-OFL.txt +93 -0
- rdstudio/web/vendor/licenses/katex-0.18.7.txt +21 -0
- rdstudio/web/vendor/licenses/literata-OFL.txt +93 -0
- rdstudio/web/vendor/licenses/markdown-it-15.0.2.txt +22 -0
- rdstudio/web/vendor/licenses/markdown-it-footnote-4.0.0.txt +22 -0
- rdstudio/web/vendor/licenses/markdown-it-texmath-1.0.0.txt +21 -0
- rdstudio/web/vendor/licenses/mermaid-12.0.0.txt +21 -0
- rdstudio/web/vendor/licenses/source-sans-3-OFL.txt +93 -0
- rdstudio/web/vendor/licenses/source-serif-4-OFL.txt +93 -0
- rdstudio/web/vendor/licenses/vega-6.4.0.txt +27 -0
- rdstudio/web/vendor/licenses/vega-embed-7.2.0.txt +27 -0
- rdstudio/web/vendor/licenses/vega-lite-6.4.3.txt +27 -0
- rdstudio/web/vendor/markdown-it-footnote.min.js +2 -0
- rdstudio/web/vendor/markdown-it.min.js +14 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/abnfDiagram-DGLNOSUI.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/architecture-7GRP2DOG-HF4J73XS.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/architectureDiagram-IU6H5EVY.mjs +36 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/blockDiagram-FSX6DT2V.mjs +140 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/c4Diagram-YNRVYILN.mjs +38 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-22SYA5HA.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-2FTYKNOQ.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-36VM3LGA.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-3SEI7E7V.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-3T2MNPEU.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-44AU3KAP.mjs +174 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-4MZOTL6B.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-52IMQVNL.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-5NYYYZGL.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-BOZ75642.mjs +15 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-CVBX6EWK.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-D36F7FYG.mjs +14 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-DEGLBX6O.mjs +213 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-F6PIGZHG.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-FE53TMRB.mjs +133 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-FNR2RGIF.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-GDOATIN3.mjs +32 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-H7BX327W.mjs +2 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-HI3EPXIC.mjs +2 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-JCBDXJ5W.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-JGXDHUYS.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-L2B47AAZ.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-LIEGGFIX.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-LLWYPJEZ.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-MFYRHTYG.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-MIE3LDYP.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-MLQVGYRW.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-MNT3HHAC.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-NRRTYJAG.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-OCMJQKYE.mjs +10 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-PKJCTQEK.mjs +339 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-QADHU5CF.mjs +2 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-QVIEFLGF.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-QX7LGXZU.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-R2KH53MI.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-RXM7Z7NK.mjs +2 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-S4TE5DX6.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-SDIBIOXT.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-TDFULVG6.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-TECWHJ6D.mjs +62 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-TINYC7RT.mjs +70 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-V3KJR4XU.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-VTMXW4ES.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-Y5NT6LW5.mjs +88 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-Y5O5OPKC.mjs +3 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-YZG4BXY6.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZZ52EIBP.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-v2-VV4INRHB.mjs +217 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/cose-bilkent-MSIMRU2B.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/cynefin-OW5HDTMX-KMPDV6GS.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/cynefinDiagram-KTGLXFXK.mjs +62 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/dagre-QJJCSHY4.mjs +4 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/diagram-2ZIM67RP.mjs +3 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/diagram-FYHH5O6R.mjs +24 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/diagram-LYLDACMS.mjs +200 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/diagram-TYT3HRBC.mjs +24 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/diagram-XVIN6YVD.mjs +30 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/diagram-ZO2NLLYC.mjs +41 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/ebnfDiagram-TU3FGH35.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/elk-GHAXNSLK.mjs +27 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/erDiagram-XID3VV23.mjs +99 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/eventmodeling-NTZA5JFV-P5QJSWSK.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/flowDiagram-WPHQAKTU.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/ganttDiagram-QACGSKG6.mjs +292 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/gitGraph-4MIJSDKK-V5NEQQYP.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/gitGraphDiagram-EB76O4HC.mjs +106 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/info-A6RAGUB7-IGBHH2L7.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/infoDiagram-343ZKIDN.mjs +2 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/ishikawaDiagram-UEEU5D75.mjs +70 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/journeyDiagram-4QTZOVLF.mjs +139 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/kanban-definition-VEJL4RG2.mjs +89 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/katex-QVRI4OIV.mjs +257 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/mindmap-definition-C5K5ZT7T.mjs +96 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/packet-AYTQ26CC-PJTKDECJ.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/pegDiagram-FHIILVJB.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/pie-WAS4IAKB-U3JFQXZN.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/pieDiagram-S76BU6V7.mjs +39 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/quadrantDiagram-HZBLWUZE.mjs +7 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/radar-RG4KPBEZ-7T2UW32D.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/railroad-74A4TZTK-DZY7ARDL.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/railroad-abnf-HS5TGJTU-LWS535ZK.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/railroad-ebnf-LZEXJU2U-EA3S4ZFM.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/railroad-peg-WCYAUIDC-DUKZONPX.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/railroadDiagram-R6RP3MQ2.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/requirementDiagram-SGBABQV6.mjs +84 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/sankeyDiagram-IM6M5BOW.mjs +40 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/sequenceDiagram-FGJOIFJ2.mjs +169 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/sizeCapture-ERV5D3W5.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-v2-6KDGCZ5J.mjs +291 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/swimlanes-OJBUSBEF.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/swimlanesDiagram-LNXYTHDW.mjs +8 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/timeline-definition-7G6YQRTY.mjs +120 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/treeView-Q6P3EWNA-AABPVERA.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/treemap-WGGIJYW6-F2JSY3V3.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/usecaseDiagram-6Y6TMLBO.mjs +383 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/vennDiagram-6RODYPCK.mjs +34 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/wardley-WFR3VGLG-EIT5NWVN.mjs +1 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/wardleyDiagram-RFZKLAPA.mjs +78 -0
- rdstudio/web/vendor/mermaid/chunks/mermaid.esm.min/xychartDiagram-TWWI2QJZ.mjs +7 -0
- rdstudio/web/vendor/mermaid/mermaid.esm.min.mjs +14 -0
- rdstudio/web/vendor/texmath.js +368 -0
- rdstudio/web/vendor/vega/vega-embed.min.js +7 -0
- rdstudio/web/vendor/vega/vega-lite.min.js +2 -0
- rdstudio/web/vendor/vega/vega.min.js +1 -0
- rdstudio-0.2.0.dist-info/METADATA +201 -0
- rdstudio-0.2.0.dist-info/RECORD +251 -0
- rdstudio-0.2.0.dist-info/WHEEL +4 -0
- rdstudio-0.2.0.dist-info/entry_points.txt +3 -0
- rdstudio-0.2.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: promote
|
|
3
|
+
description: Move knowledge that is not specific to this project into the developer's global knowledge base. Use when a finding, procedure or practice would help in other projects, or when the developer asks to keep something globally.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Promote to the global knowledge base
|
|
7
|
+
|
|
8
|
+
The developer keeps a private, cross-project knowledge base (search it with
|
|
9
|
+
`scope: "global"`). Project and global knowledge never link to each other, so
|
|
10
|
+
a promoted concept must make sense on its own.
|
|
11
|
+
|
|
12
|
+
1. **Propose, don't act.** Name the concept and say why it is general. Promote
|
|
13
|
+
only after the developer agrees.
|
|
14
|
+
2. **Make it self-contained.** If it links to project concepts, either inline
|
|
15
|
+
the essential facts or accept that those links will not resolve in the
|
|
16
|
+
global base.
|
|
17
|
+
3. **Promote:** use the rdstudio `promote` tool with the concept id. Use `keep: true`
|
|
18
|
+
to copy rather than move when the project still needs its own copy (the tool
|
|
19
|
+
refuses to move a concept other project concepts link to).
|
|
20
|
+
4. Report the new global id to the developer.
|
|
21
|
+
|
|
22
|
+
Material that is general from the start (tooling habits, reading notes outside
|
|
23
|
+
this project) can be recorded straight into the global base with
|
|
24
|
+
the rdstudio `record` tool and `scope: "global"`, again only when the developer
|
|
25
|
+
asked for it.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: question
|
|
3
|
+
description: Record an open question, or record the answer to one. Use when an unresolved question comes up that should not be forgotten, or when a recorded question gets answered.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Questions
|
|
7
|
+
|
|
8
|
+
## Opening a question
|
|
9
|
+
|
|
10
|
+
Search `type: Question` first. Then record at `questions/<short-slug>`:
|
|
11
|
+
|
|
12
|
+
```markdown
|
|
13
|
+
---
|
|
14
|
+
type: Question
|
|
15
|
+
title: <the question, ending with ?>
|
|
16
|
+
description: <why it matters, one sentence>
|
|
17
|
+
tags: [open]
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Question
|
|
21
|
+
|
|
22
|
+
The question in full, with context and what depends on it.
|
|
23
|
+
|
|
24
|
+
# Leads
|
|
25
|
+
|
|
26
|
+
What might answer it (references, experiments, people).
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Answering a question
|
|
30
|
+
|
|
31
|
+
Update the concept: add an `# Answer` section (with sources or the experiment
|
|
32
|
+
that settled it), change the `open` tag to `answered`, and link any decision
|
|
33
|
+
that followed. Keep the question text unchanged so the history reads clearly.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: record-okf
|
|
3
|
+
description: Record knowledge in the project knowledge base (OKF) — findings, designs, references, procedures, research notes. Use whenever something worth remembering was learned or settled.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Record knowledge
|
|
7
|
+
|
|
8
|
+
Write to the knowledge base through the rdstudio `record` tool, which stamps
|
|
9
|
+
provenance and regenerates indexes. Do not hand-edit `index.md` files; they are
|
|
10
|
+
generated.
|
|
11
|
+
|
|
12
|
+
## Before writing
|
|
13
|
+
|
|
14
|
+
1. Search first (the `search-okf` skill). Update an existing concept rather than creating
|
|
15
|
+
a near-duplicate.
|
|
16
|
+
2. Pick the directory that fits; list the root with
|
|
17
|
+
the rdstudio `list_concepts` tool if unsure. Create a new directory only when no
|
|
18
|
+
existing one fits, and mention it to the developer.
|
|
19
|
+
|
|
20
|
+
## A good concept
|
|
21
|
+
|
|
22
|
+
- **One idea per concept.** Split long material into linked concepts.
|
|
23
|
+
- **Frontmatter:** `type` (required; e.g. `Design`, `Decision`, `Question`,
|
|
24
|
+
`Task`, `Procedure`, `Reference`, `Research`, `Experiment`), `title`, and a
|
|
25
|
+
one-sentence `description` (it appears in indexes and search results). Add
|
|
26
|
+
`tags` sparingly.
|
|
27
|
+
- **Links** use bundle-absolute paths: `[model](/design/model.md)`. Linking to a
|
|
28
|
+
concept that does not exist yet is fine; it marks knowledge worth writing.
|
|
29
|
+
- **Rate links** by how consequential they are, with the link's title:
|
|
30
|
+
`[model](/design/model.md "requires")`. `requires`: this concept cannot be
|
|
31
|
+
understood without that one (a prerequisite). `uses`: relies on it in a key
|
|
32
|
+
fact, example or proof, but not to define it. `see also`: a forward reference
|
|
33
|
+
(something that builds on this concept) or a tangent. Unrated links count as
|
|
34
|
+
`uses`. The map filters by rating and hides links implied by chains of
|
|
35
|
+
others, so honest ratings make it clearer. Do not rate a link `requires` in
|
|
36
|
+
both directions unless the concepts truly depend on each other; the Review
|
|
37
|
+
tab flags such cycles.
|
|
38
|
+
- **Sources:** list external material under `sources` with a stable `id`, and
|
|
39
|
+
attribute claims with footnotes keyed by that id: `...text.[^tao-vu]`.
|
|
40
|
+
- Prefer structure (headings, lists, tables) over long prose. Maths in `$...$`
|
|
41
|
+
and `$$...$$` renders in the dashboard.
|
|
42
|
+
- **Diagrams** go in ` ```mermaid ` fences (flowchart, sequenceDiagram,
|
|
43
|
+
stateDiagram-v2, classDiagram, erDiagram, timeline, mindmap). The text is the
|
|
44
|
+
source of truth: anyone can read and edit it, and the dashboard draws it
|
|
45
|
+
offline. Keep each diagram small and focused; split rather than sprawl. If
|
|
46
|
+
the developer sketches something (a photo or screenshot), transcribe it into
|
|
47
|
+
Mermaid rather than storing only the image.
|
|
48
|
+
|
|
49
|
+
## Significance
|
|
50
|
+
|
|
51
|
+
A significant edit updates `generated` and, if a human had reviewed the
|
|
52
|
+
concept, flags it as changed since review. Set `significant: false` for trivial
|
|
53
|
+
edits (typos, formatting) or content the developer dictated verbatim, `true` for
|
|
54
|
+
anything that changes meaning, or leave it out to let rdstudio judge from the
|
|
55
|
+
size of the change. Never add `verified` entries yourself; only the developer verifies
|
|
56
|
+
(`rdstudio verify <id>`).
|
|
57
|
+
|
|
58
|
+
## Updating part of a concept
|
|
59
|
+
|
|
60
|
+
Use `section_heading` with `body` to replace one section, or `append` to add to
|
|
61
|
+
the end, instead of resending the whole body.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: report
|
|
3
|
+
description: Write an HTML report for the developer after substantial work — a task, an experiment, an investigation or a long session. Reports appear in the dashboard's Reports tab.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Write a report
|
|
7
|
+
|
|
8
|
+
Reports are the agent's channel to the developer: richer than chat, kept
|
|
9
|
+
permanently, and browsable in the dashboard. They are HTML, not markdown, so
|
|
10
|
+
they can hold charts, maths, figures and tables.
|
|
11
|
+
|
|
12
|
+
## When
|
|
13
|
+
|
|
14
|
+
After completing a task, running an experiment, finishing an investigation, or
|
|
15
|
+
when the developer asks. One report per piece of work.
|
|
16
|
+
|
|
17
|
+
## Where and how
|
|
18
|
+
|
|
19
|
+
1. Copy `.claude/skills/report/template.html` to
|
|
20
|
+
`{reports}/YYYY-MM-DD-<short-slug>.html`.
|
|
21
|
+
2. Fill in the `<meta name="rdstudio:...">` tags (title, date, author as your
|
|
22
|
+
actor id, activity) and the description.
|
|
23
|
+
3. Write the body. Structure it for a reader who was not watching:
|
|
24
|
+
- **Summary**: two to four sentences on what was done and the result.
|
|
25
|
+
- **What changed**: files, concepts, decisions (link them).
|
|
26
|
+
- **Results**: figures, tables, charts, with honest caveats.
|
|
27
|
+
- **Deviations and issues**: anything that did not go to plan.
|
|
28
|
+
- **For you to do**: what the developer should check, test or decide.
|
|
29
|
+
4. Link knowledge with `<a href="/{knowledge}/<id>.md">`. Those links open in the
|
|
30
|
+
dashboard and draw the report into the graph. Reports link to knowledge, never
|
|
31
|
+
the reverse.
|
|
32
|
+
|
|
33
|
+
## Rich content
|
|
34
|
+
|
|
35
|
+
The template loads the dashboard's bundled libraries (no internet needed):
|
|
36
|
+
|
|
37
|
+
- Maths: `\( ... \)` inline and `\[ ... \]` display, rendered by KaTeX.
|
|
38
|
+
- Charts: a Vega-Lite spec in `<script type="application/json" class="vega-lite">`
|
|
39
|
+
is rendered in place. Inline data under `data.values`, or reference a CSV/JSON
|
|
40
|
+
file saved next to the report.
|
|
41
|
+
- Diagrams: Mermaid source in `<pre class="mermaid">...</pre>` is drawn in
|
|
42
|
+
place, in the dashboard's theme.
|
|
43
|
+
- Figures: save images next to the report (e.g. `{reports}/media/`) and use
|
|
44
|
+
relative paths.
|
|
45
|
+
|
|
46
|
+
Keep reports factual. State what was measured, not what you hoped.
|
|
@@ -0,0 +1,74 @@
|
|
|
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">
|
|
6
|
+
<title>REPORT TITLE</title>
|
|
7
|
+
<meta name="rdstudio:date" content="YYYY-MM-DD">
|
|
8
|
+
<meta name="rdstudio:author" content="AGENT ACTOR ID">
|
|
9
|
+
<meta name="rdstudio:activity" content="Task / Experiment / Investigation / Session">
|
|
10
|
+
<meta name="description" content="One sentence: what this report is about.">
|
|
11
|
+
<!-- Shared assets from the dashboard (paths are relative to reports/). -->
|
|
12
|
+
<link rel="stylesheet" href="../vendor/katex/katex.min.css">
|
|
13
|
+
<link rel="stylesheet" href="../report.css">
|
|
14
|
+
<script defer src="../vendor/katex/katex.min.js"></script>
|
|
15
|
+
<script defer src="../vendor/katex/auto-render.min.js"></script>
|
|
16
|
+
<script defer src="../vendor/vega/vega.min.js"></script>
|
|
17
|
+
<script defer src="../vendor/vega/vega-lite.min.js"></script>
|
|
18
|
+
<script defer src="../vendor/vega/vega-embed.min.js"></script>
|
|
19
|
+
<script defer src="../report.js"></script>
|
|
20
|
+
</head>
|
|
21
|
+
<body>
|
|
22
|
+
<main>
|
|
23
|
+
<header class="report-head">
|
|
24
|
+
<p class="report-meta">Report, YYYY-MM-DD, AGENT ACTOR ID</p>
|
|
25
|
+
<h1>REPORT TITLE</h1>
|
|
26
|
+
</header>
|
|
27
|
+
|
|
28
|
+
<p class="summary">Two to four sentences: what was done and what came of it.</p>
|
|
29
|
+
|
|
30
|
+
<h2>What changed</h2>
|
|
31
|
+
<ul>
|
|
32
|
+
<li>Files, with a clause each on why.</li>
|
|
33
|
+
<li>Knowledge recorded, e.g. <a href="/knowledge/decisions/example.md">the decision</a>.</li>
|
|
34
|
+
</ul>
|
|
35
|
+
|
|
36
|
+
<h2>Results</h2>
|
|
37
|
+
<p>Inline maths like \( \rho(W) < 1 \) and display maths:</p>
|
|
38
|
+
\[ \lambda_{\max} \approx g \sqrt{N p (1 - p)} \]
|
|
39
|
+
|
|
40
|
+
<script type="application/json" class="vega-lite">
|
|
41
|
+
{
|
|
42
|
+
"$schema": "https://vega.github.io/schema/vega-lite/v6.json",
|
|
43
|
+
"data": { "values": [
|
|
44
|
+
{ "g": 0.5, "radius": 0.49 }, { "g": 1.0, "radius": 1.01 }, { "g": 1.5, "radius": 1.52 }
|
|
45
|
+
] },
|
|
46
|
+
"mark": { "type": "line", "point": true },
|
|
47
|
+
"encoding": {
|
|
48
|
+
"x": { "field": "g", "type": "quantitative", "title": "Gain g" },
|
|
49
|
+
"y": { "field": "radius", "type": "quantitative", "title": "Spectral radius" }
|
|
50
|
+
},
|
|
51
|
+
"height": 220
|
|
52
|
+
}
|
|
53
|
+
</script>
|
|
54
|
+
<p class="chart-caption">What the chart shows, and how it was produced.</p>
|
|
55
|
+
|
|
56
|
+
<p>Structure (pipelines, dependencies, state machines) as a Mermaid diagram:</p>
|
|
57
|
+
<pre class="mermaid">
|
|
58
|
+
flowchart LR
|
|
59
|
+
G[Genome] --> M[Block matrix] --> S[Simulate] --> F{Fitness}
|
|
60
|
+
F -->|select| G
|
|
61
|
+
</pre>
|
|
62
|
+
|
|
63
|
+
<h2>Deviations and issues</h2>
|
|
64
|
+
<p>Anything that did not go to plan.</p>
|
|
65
|
+
|
|
66
|
+
<section class="todo">
|
|
67
|
+
<h2>For you to do</h2>
|
|
68
|
+
<ul>
|
|
69
|
+
<li>What to check, test or decide.</li>
|
|
70
|
+
</ul>
|
|
71
|
+
</section>
|
|
72
|
+
</main>
|
|
73
|
+
</body>
|
|
74
|
+
</html>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: search-okf
|
|
3
|
+
description: Look something up in the project knowledge base (OKF) before re-deriving it. Use when a question may already be answered, a decision may already be recorded, or you need project context.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Search the knowledge base
|
|
7
|
+
|
|
8
|
+
The knowledge base in `{knowledge}/` records what this project has already
|
|
9
|
+
settled: design, decisions, answered questions, procedures, references and
|
|
10
|
+
findings. Check it before re-deriving anything or reopening a settled question.
|
|
11
|
+
|
|
12
|
+
## Steps
|
|
13
|
+
|
|
14
|
+
1. The rdstudio `search` tool with a few specific keywords. Filter with `type`
|
|
15
|
+
(e.g. `Decision`, `Question`, `Procedure`), `tags` or `under` (a directory)
|
|
16
|
+
when you know them.
|
|
17
|
+
2. For promising hits, the rdstudio `outline` tool to see the headings.
|
|
18
|
+
3. The rdstudio `read` tool with `section_heading` to read only the part you need.
|
|
19
|
+
Read a whole concept only when it is short or all of it is relevant.
|
|
20
|
+
4. Follow `links_to` / `linked_from` from the outline when the answer spans
|
|
21
|
+
concepts.
|
|
22
|
+
|
|
23
|
+
For lookups that need several searches, delegate to the **librarian** subagent
|
|
24
|
+
so the intermediate results stay out of your context; it returns a short answer
|
|
25
|
+
with concept ids.
|
|
26
|
+
|
|
27
|
+
## Reporting what you found
|
|
28
|
+
|
|
29
|
+
- Cite concept ids (e.g. `decisions/activation-function`) so the developer can
|
|
30
|
+
open them in the dashboard.
|
|
31
|
+
- Say how much to trust each source: `human-reviewed`, `machine-confirmed` or
|
|
32
|
+
`unverified`, and whether it has changed since review.
|
|
33
|
+
- If a recorded decision applies, follow it. If you believe its stated
|
|
34
|
+
assumption no longer holds, say so explicitly instead of silently diverging.
|
|
35
|
+
- If nothing is recorded, say so. If the answer you then work out is worth
|
|
36
|
+
keeping, record it with the `record-okf` skill.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: task
|
|
3
|
+
description: Create or work through a task concept (prompt, plan, approval, implementation, outcome). Use when the developer hands over a piece of work as a task, or points at a task concept.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Tasks
|
|
7
|
+
|
|
8
|
+
Tasks are concepts in `tasks/` with `type: Task`. Their state is a tag:
|
|
9
|
+
`todo`, `active`, `done` or `dropped`.
|
|
10
|
+
|
|
11
|
+
## Creating a task
|
|
12
|
+
|
|
13
|
+
```markdown
|
|
14
|
+
---
|
|
15
|
+
type: Task
|
|
16
|
+
title: <imperative summary>
|
|
17
|
+
description: <one sentence>
|
|
18
|
+
tags: [task, todo]
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Prompt
|
|
22
|
+
|
|
23
|
+
What is wanted, in the developer's words.
|
|
24
|
+
|
|
25
|
+
# Plan
|
|
26
|
+
|
|
27
|
+
(Filled in by the agent before implementation.)
|
|
28
|
+
|
|
29
|
+
# Acceptance
|
|
30
|
+
|
|
31
|
+
How we will know it is done.
|
|
32
|
+
|
|
33
|
+
# Outcome
|
|
34
|
+
|
|
35
|
+
Not started.
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Working a task
|
|
39
|
+
|
|
40
|
+
1. Read the task. Search the knowledge base for related decisions and designs.
|
|
41
|
+
2. Write the `# Plan` section: files to change, approach, assumptions, and open
|
|
42
|
+
questions. Set the tag to `active`. **Stop and wait for the developer's
|
|
43
|
+
approval.**
|
|
44
|
+
3. Implement. Record decisions and findings as they arise (the `decision` skill,
|
|
45
|
+
the `record-okf` skill).
|
|
46
|
+
4. Write `# Outcome`: what changed, deviations from the plan and why, follow-ups,
|
|
47
|
+
and anything the developer should test. Link the report if you wrote one.
|
|
48
|
+
Set the tag to `done`.
|
|
49
|
+
5. Write a report with the `report` skill for substantial tasks.
|
|
50
|
+
|
|
51
|
+
Never edit the `# Prompt` section.
|
rdstudio/web/app.js
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// rdstudio dashboard: hash router and shell.
|
|
2
|
+
|
|
3
|
+
import { store, load, watch, loadLearner } from "./js/data.js";
|
|
4
|
+
import { conceptView, dirView } from "./js/knowledge.js";
|
|
5
|
+
import { graphView, leaveGraph } from "./js/graph.js";
|
|
6
|
+
import { mapView } from "./js/map.js";
|
|
7
|
+
import { changesView, reviewView, reviewCount, reportsView, reportView, skillsView, skillView } from "./js/pages.js";
|
|
8
|
+
import { proceduresView, procedureView, procedures } from "./js/procedures.js";
|
|
9
|
+
import { settingsView } from "./js/settings.js";
|
|
10
|
+
import { learnView } from "./js/learn.js";
|
|
11
|
+
import { renderDiagrams } from "./js/diagrams.js";
|
|
12
|
+
import { h } from "./js/util.js";
|
|
13
|
+
|
|
14
|
+
const view = document.getElementById("view");
|
|
15
|
+
const menu = document.querySelector(".menu");
|
|
16
|
+
let current = null; // { tab, key, node }
|
|
17
|
+
|
|
18
|
+
function parse() {
|
|
19
|
+
const raw = location.hash.replace(/^#/, "") || "/";
|
|
20
|
+
const [, head = "", ...rest] = raw.split("/");
|
|
21
|
+
const tail = rest.map(decodeURIComponent).join("/");
|
|
22
|
+
switch (head) {
|
|
23
|
+
case "": return { tab: "knowledge", key: "d:", render: () => dirView("") };
|
|
24
|
+
case "d": return { tab: "knowledge", key: "d:" + tail, render: () => dirView(tail) };
|
|
25
|
+
case "k": return { tab: "knowledge", key: "k:" + tail, render: () => conceptView(tail) };
|
|
26
|
+
case "graph": return { tab: "graph", key: "graph", render: graphView };
|
|
27
|
+
case "map": return { tab: "map", key: "map:" + tail, render: () => mapView(tail) };
|
|
28
|
+
case "path": return { tab: "map", key: "path:" + tail, render: () => mapView("", { path: tail }) };
|
|
29
|
+
case "learn": return { tab: "learn", key: "learn", render: learnView };
|
|
30
|
+
case "changes": return { tab: "changes", key: "changes", render: changesView };
|
|
31
|
+
case "review": return { tab: "review", key: "review", render: reviewView };
|
|
32
|
+
case "reports": return { tab: "reports", key: "reports", render: reportsView };
|
|
33
|
+
case "r": return { tab: "reports", key: "r:" + tail, render: () => reportView(tail) };
|
|
34
|
+
case "procedures": return { tab: "procedures", key: "procedures", render: proceduresView };
|
|
35
|
+
case "p": return { tab: "procedures", key: "p:" + tail, render: () => procedureView(tail) };
|
|
36
|
+
case "settings": return { tab: "settings", key: "settings", render: settingsView };
|
|
37
|
+
case "skills": return { tab: "skills", key: "skills", render: skillsView };
|
|
38
|
+
case "skill": return { tab: "skills", key: "skill:" + tail, render: () => skillView("skill", tail) };
|
|
39
|
+
case "agent": return { tab: "skills", key: "agent:" + tail, render: () => skillView("agent", tail) };
|
|
40
|
+
default: return { tab: "knowledge", key: "404", render: () => h("div", { class: "page" }, h("h1", {}, "Page not found"), h("p", {}, h("a", { href: "#/" }, "Go to knowledge"))) };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function updateChrome(tab) {
|
|
45
|
+
for (const a of document.querySelectorAll(".tabs a, .settings-link")) {
|
|
46
|
+
a.toggleAttribute("aria-current", a.dataset.tab === tab);
|
|
47
|
+
if (a.dataset.tab === tab) a.setAttribute("aria-current", "page");
|
|
48
|
+
}
|
|
49
|
+
const brand = document.querySelector(".brand");
|
|
50
|
+
brand.textContent = store.site.title || "rdstudio";
|
|
51
|
+
const review = reviewCount();
|
|
52
|
+
const rc = document.querySelector('[data-count="review"]');
|
|
53
|
+
rc.textContent = review || "";
|
|
54
|
+
rc.hidden = !review;
|
|
55
|
+
const reports = store.reports.length;
|
|
56
|
+
const rp = document.querySelector('[data-count="reports"]');
|
|
57
|
+
rp.textContent = reports || "";
|
|
58
|
+
rp.hidden = !reports;
|
|
59
|
+
menu.hidden = tab !== "knowledge";
|
|
60
|
+
document.querySelector('[data-tab="procedures"]').hidden = !procedures().length && tab !== "procedures";
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function route({ keepScroll = false } = {}) {
|
|
64
|
+
const next = parse();
|
|
65
|
+
if (current?.tab === "graph" && next.tab !== "graph") leaveGraph();
|
|
66
|
+
current?.node?.leave?.();
|
|
67
|
+
closeDrawer();
|
|
68
|
+
const scroll = keepScroll ? window.scrollY : 0;
|
|
69
|
+
const node = await next.render();
|
|
70
|
+
if (!keepScroll || current?.key !== next.key) {
|
|
71
|
+
view.replaceChildren(node);
|
|
72
|
+
window.scrollTo(0, scroll);
|
|
73
|
+
} else {
|
|
74
|
+
view.replaceChildren(node);
|
|
75
|
+
window.scrollTo(0, scroll);
|
|
76
|
+
}
|
|
77
|
+
current = { ...next, node };
|
|
78
|
+
updateChrome(next.tab);
|
|
79
|
+
renderDiagrams(view);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function closeDrawer() {
|
|
83
|
+
document.body.classList.remove("drawer-open");
|
|
84
|
+
menu.setAttribute("aria-expanded", "false");
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
menu.addEventListener("click", () => {
|
|
88
|
+
const open = !document.body.classList.contains("drawer-open");
|
|
89
|
+
document.body.classList.toggle("drawer-open", open);
|
|
90
|
+
menu.setAttribute("aria-expanded", String(open));
|
|
91
|
+
});
|
|
92
|
+
document.querySelector(".scrim").addEventListener("click", closeDrawer);
|
|
93
|
+
|
|
94
|
+
// Full screen (hides the phone's status and navigation bars), where supported.
|
|
95
|
+
const fullscreen = document.querySelector(".fullscreen");
|
|
96
|
+
if (document.fullscreenEnabled && !matchMedia("(display-mode: fullscreen)").matches) {
|
|
97
|
+
fullscreen.hidden = false;
|
|
98
|
+
fullscreen.addEventListener("click", () => {
|
|
99
|
+
if (document.fullscreenElement) document.exitFullscreen();
|
|
100
|
+
else document.documentElement.requestFullscreen({ navigationUI: "hide" }).catch(() => {});
|
|
101
|
+
});
|
|
102
|
+
document.addEventListener("fullscreenchange", () => fullscreen.setAttribute("aria-pressed", String(!!document.fullscreenElement)));
|
|
103
|
+
}
|
|
104
|
+
document.addEventListener("keydown", (e) => { if (e.key === "Escape") closeDrawer(); });
|
|
105
|
+
window.addEventListener("hashchange", () => route());
|
|
106
|
+
|
|
107
|
+
async function refresh() {
|
|
108
|
+
// Live update: the graph merges new data in place; other views re-render keeping scroll.
|
|
109
|
+
if ((current?.tab === "graph" || current?.tab === "map") && current.node?.refresh) {
|
|
110
|
+
current.node.refresh();
|
|
111
|
+
updateChrome(current.tab);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
await route({ keepScroll: true });
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
try {
|
|
118
|
+
await load();
|
|
119
|
+
await loadLearner();
|
|
120
|
+
await route();
|
|
121
|
+
const live = document.querySelector(".live");
|
|
122
|
+
if (store.site.static) {
|
|
123
|
+
live.hidden = true; // an exported snapshot does not change
|
|
124
|
+
} else {
|
|
125
|
+
watch(refresh, (ok) => { live.classList.toggle("offline", !ok); live.textContent = ok ? "Live" : "Offline"; });
|
|
126
|
+
}
|
|
127
|
+
} catch (err) {
|
|
128
|
+
view.replaceChildren(h("div", { class: "page" }, h("h1", {}, "The dashboard data could not be loaded"),
|
|
129
|
+
h("p", { class: "lede" }, "Run rdstudio build (or rdstudio serve) in the project, then reload this page."),
|
|
130
|
+
h("pre", {}, String(err))));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// The service worker is registered in index.html. The first time, hand it the
|
|
134
|
+
// files this page loaded before it was in control, so the next visit is served
|
|
135
|
+
// from the cache.
|
|
136
|
+
if ("serviceWorker" in navigator && !navigator.serviceWorker.controller) {
|
|
137
|
+
navigator.serviceWorker.ready.then((reg) => reg.active?.postMessage({
|
|
138
|
+
warm: [location.href.split("#")[0], ...performance.getEntriesByType("resource").map((e) => e.name)],
|
|
139
|
+
}));
|
|
140
|
+
}
|
rdstudio/web/fonts.css
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/* Every font the themes use. Browsers download a face only when a theme uses it. */
|
|
2
|
+
|
|
3
|
+
@font-face { font-family: "Literata"; font-style: normal; font-weight: 200 900; font-display: swap;
|
|
4
|
+
src: url(vendor/fonts/literata-latin-opsz-normal.woff2) format("woff2-variations");
|
|
5
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
|
|
6
|
+
@font-face { font-family: "Literata"; font-style: normal; font-weight: 200 900; font-display: swap;
|
|
7
|
+
src: url(vendor/fonts/literata-latin-ext-opsz-normal.woff2) format("woff2-variations");
|
|
8
|
+
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
|
|
9
|
+
@font-face { font-family: "Literata"; font-style: italic; font-weight: 200 900; font-display: swap;
|
|
10
|
+
src: url(vendor/fonts/literata-latin-opsz-italic.woff2) format("woff2-variations");
|
|
11
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
|
|
12
|
+
@font-face { font-family: "Literata"; font-style: italic; font-weight: 200 900; font-display: swap;
|
|
13
|
+
src: url(vendor/fonts/literata-latin-ext-opsz-italic.woff2) format("woff2-variations");
|
|
14
|
+
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+1E00-1E9F, U+2113, U+A720-A7FF; }
|
|
15
|
+
@font-face { font-family: "Atkinson"; font-style: normal; font-weight: 200 800; font-display: swap;
|
|
16
|
+
src: url(vendor/fonts/atkinson-hyperlegible-next-latin-wght-normal.woff2) format("woff2-variations");
|
|
17
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
|
|
18
|
+
@font-face { font-family: "Atkinson"; font-style: normal; font-weight: 200 800; font-display: swap;
|
|
19
|
+
src: url(vendor/fonts/atkinson-hyperlegible-next-latin-ext-wght-normal.woff2) format("woff2-variations");
|
|
20
|
+
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+1E00-1E9F, U+2113, U+A720-A7FF; }
|
|
21
|
+
@font-face { font-family: "Atkinson"; font-style: italic; font-weight: 200 800; font-display: swap;
|
|
22
|
+
src: url(vendor/fonts/atkinson-hyperlegible-next-latin-wght-italic.woff2) format("woff2-variations"); }
|
|
23
|
+
@font-face { font-family: "JetBrains Mono"; font-style: normal; font-weight: 100 800; font-display: swap;
|
|
24
|
+
src: url(vendor/fonts/jetbrains-mono-latin-wght-normal.woff2) format("woff2-variations"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
|
|
25
|
+
@font-face { font-family: "JetBrains Mono"; font-style: italic; font-weight: 100 800; font-display: swap;
|
|
26
|
+
src: url(vendor/fonts/jetbrains-mono-latin-wght-italic.woff2) format("woff2-variations"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
|
|
27
|
+
@font-face { font-family: "Source Serif 4"; font-style: normal; font-weight: 200 900; font-display: swap;
|
|
28
|
+
src: url(vendor/fonts/source-serif-4-latin-opsz-normal.woff2) format("woff2-variations"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
|
|
29
|
+
@font-face { font-family: "Source Serif 4"; font-style: italic; font-weight: 200 900; font-display: swap;
|
|
30
|
+
src: url(vendor/fonts/source-serif-4-latin-opsz-italic.woff2) format("woff2-variations"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
|
|
31
|
+
@font-face { font-family: "Source Sans 3"; font-style: normal; font-weight: 200 900; font-display: swap;
|
|
32
|
+
src: url(vendor/fonts/source-sans-3-latin-wght-normal.woff2) format("woff2-variations"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
|
|
33
|
+
@font-face { font-family: "Source Sans 3"; font-style: italic; font-weight: 200 900; font-display: swap;
|
|
34
|
+
src: url(vendor/fonts/source-sans-3-latin-wght-italic.woff2) format("woff2-variations"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
|
|
35
|
+
@font-face { font-family: "Inter"; font-style: normal; font-weight: 100 900; font-display: swap;
|
|
36
|
+
src: url(vendor/fonts/inter-latin-opsz-normal.woff2) format("woff2-variations"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
|
|
37
|
+
@font-face { font-family: "Inter"; font-style: italic; font-weight: 100 900; font-display: swap;
|
|
38
|
+
src: url(vendor/fonts/inter-latin-opsz-italic.woff2) format("woff2-variations"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
|
|
39
|
+
@font-face { font-family: "IBM Plex Sans"; font-style: normal; font-weight: 100 700; font-display: swap;
|
|
40
|
+
src: url(vendor/fonts/ibm-plex-sans-latin-wght-normal.woff2) format("woff2-variations"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
|
|
41
|
+
@font-face { font-family: "IBM Plex Sans"; font-style: italic; font-weight: 100 700; font-display: swap;
|
|
42
|
+
src: url(vendor/fonts/ibm-plex-sans-latin-wght-italic.woff2) format("woff2-variations"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
|
|
43
|
+
@font-face { font-family: "IBM Plex Mono"; font-style: normal; font-weight: 400; font-display: swap;
|
|
44
|
+
src: url(vendor/fonts/ibm-plex-mono-latin-400-normal.woff2) format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
|
|
45
|
+
@font-face { font-family: "IBM Plex Mono"; font-style: normal; font-weight: 600; font-display: swap;
|
|
46
|
+
src: url(vendor/fonts/ibm-plex-mono-latin-600-normal.woff2) format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
|
|
47
|
+
@font-face { font-family: "Caveat"; font-style: normal; font-weight: 400 700; font-display: swap;
|
|
48
|
+
src: url(vendor/fonts/caveat-latin-wght-normal.woff2) format("woff2-variations"); }
|
|
Binary file
|
|
Binary file
|
rdstudio/web/index.html
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
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, viewport-fit=cover">
|
|
6
|
+
<title>rdstudio</title>
|
|
7
|
+
<link rel="manifest" href="manifest.webmanifest" crossorigin="use-credentials">
|
|
8
|
+
<meta name="theme-color" content="#141a20">
|
|
9
|
+
<meta name="mobile-web-app-capable" content="yes">
|
|
10
|
+
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
11
|
+
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
|
12
|
+
<link rel="apple-touch-icon" href="icon-192.png">
|
|
13
|
+
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='7' fill='%235646c0'/%3E%3Ccircle cx='11' cy='12' r='3.2' fill='%23f4f6f2'/%3E%3Ccircle cx='22' cy='10' r='2.4' fill='%23f4f6f2'/%3E%3Ccircle cx='19' cy='22' r='3.6' fill='%23f4f6f2'/%3E%3Cpath d='M11 12 22 10M11 12l8 10M22 10l-3 12' stroke='%23f4f6f2' stroke-width='1.4'/%3E%3C/svg%3E">
|
|
14
|
+
<script>
|
|
15
|
+
// Instant reopening and offline reading (sw.js), registered before anything
|
|
16
|
+
// else loads so it installs even when a file fails. Browsers allow it only
|
|
17
|
+
// on https or localhost; everything works without it. ?nosw skips it.
|
|
18
|
+
(function () {
|
|
19
|
+
if (!("serviceWorker" in navigator) || new URLSearchParams(location.search).has("nosw")) return;
|
|
20
|
+
var had = Boolean(navigator.serviceWorker.controller);
|
|
21
|
+
(function register(tries) {
|
|
22
|
+
navigator.serviceWorker.register("sw.js").catch(function () {
|
|
23
|
+
if (tries < 3) setTimeout(function () { register(tries + 1); }, 800);
|
|
24
|
+
});
|
|
25
|
+
})(0);
|
|
26
|
+
// A new rdstudio took over just as this page opened: show the new version.
|
|
27
|
+
navigator.serviceWorker.addEventListener("controllerchange", function () {
|
|
28
|
+
if (had && performance.now() < 10000) location.reload();
|
|
29
|
+
});
|
|
30
|
+
// Tunnels sometimes drop a request (a 504). If a script or style fails,
|
|
31
|
+
// reload once, when the service worker (which retries) is ready or after
|
|
32
|
+
// a few seconds without it.
|
|
33
|
+
var failed = false;
|
|
34
|
+
addEventListener("error", function (e) {
|
|
35
|
+
var t = e.target;
|
|
36
|
+
if (failed || !t || !/^(SCRIPT|LINK)$/.test(t.tagName)) return;
|
|
37
|
+
var last = Number(sessionStorage.getItem("rdstudio.retry") || 0);
|
|
38
|
+
if (Date.now() - last < 30000) return; // tried already: show the error instead
|
|
39
|
+
failed = true;
|
|
40
|
+
sessionStorage.setItem("rdstudio.retry", String(Date.now()));
|
|
41
|
+
var wait = new Promise(function (r) { setTimeout(r, 4000); });
|
|
42
|
+
Promise.race([navigator.serviceWorker.ready, wait]).then(function () { location.reload(); });
|
|
43
|
+
}, true);
|
|
44
|
+
})();
|
|
45
|
+
</script>
|
|
46
|
+
<link rel="stylesheet" href="vendor/katex/katex.min.css">
|
|
47
|
+
<link id="code-light" rel="stylesheet" href="vendor/hljs/github.min.css" media="(prefers-color-scheme: light)">
|
|
48
|
+
<link id="code-dark" rel="stylesheet" href="vendor/hljs/github-dark.min.css" media="(prefers-color-scheme: dark)">
|
|
49
|
+
<link id="theme-css" rel="stylesheet" href="themes/studio.css">
|
|
50
|
+
<script>
|
|
51
|
+
// Apply the saved theme before first paint (see js/settings.js).
|
|
52
|
+
(function () {
|
|
53
|
+
try {
|
|
54
|
+
var themes = ["studio", "notebook", "map", "space", "cyber"];
|
|
55
|
+
var former = { notebook: "studio", journal: "studio", modern: "studio", blueprint: "map", terminal: "cyber" };
|
|
56
|
+
var theme = localStorage.getItem("rdstudio.look") || former[localStorage.getItem("rdstudio.theme")];
|
|
57
|
+
var mode = localStorage.getItem("rdstudio.mode");
|
|
58
|
+
if (themes.indexOf(theme) > 0) document.getElementById("theme-css").href = "themes/" + theme + ".css";
|
|
59
|
+
if (mode === "light" || mode === "dark") {
|
|
60
|
+
document.documentElement.dataset.mode = mode;
|
|
61
|
+
document.getElementById("code-light").media = mode === "light" ? "all" : "not all";
|
|
62
|
+
document.getElementById("code-dark").media = mode === "dark" ? "all" : "not all";
|
|
63
|
+
}
|
|
64
|
+
} catch (e) { /* storage unavailable: defaults apply */ }
|
|
65
|
+
})();
|
|
66
|
+
</script>
|
|
67
|
+
<link rel="stylesheet" href="style.css">
|
|
68
|
+
</head>
|
|
69
|
+
<body>
|
|
70
|
+
<header class="bar">
|
|
71
|
+
<button class="menu" type="button" aria-label="Show contents" aria-expanded="false">
|
|
72
|
+
<svg width="18" height="18" viewBox="0 0 18 18" aria-hidden="true"><path d="M2 4h14M2 9h14M2 14h14" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg>
|
|
73
|
+
</button>
|
|
74
|
+
<a class="brand" href="#/">rdstudio</a>
|
|
75
|
+
<nav class="tabs" aria-label="Sections">
|
|
76
|
+
<a href="#/" data-tab="knowledge">Knowledge</a>
|
|
77
|
+
<a href="#/map" data-tab="map">Map</a>
|
|
78
|
+
<a href="#/graph" data-tab="graph">Graph</a>
|
|
79
|
+
<a href="#/learn" data-tab="learn">Learn</a>
|
|
80
|
+
<a href="#/changes" data-tab="changes">Changes</a>
|
|
81
|
+
<a href="#/review" data-tab="review">Review <span class="count" data-count="review"></span></a>
|
|
82
|
+
<a href="#/reports" data-tab="reports">Reports <span class="count" data-count="reports"></span></a>
|
|
83
|
+
<a href="#/procedures" data-tab="procedures" hidden>Procedures</a>
|
|
84
|
+
<a href="#/skills" data-tab="skills">Skills & agents</a>
|
|
85
|
+
</nav>
|
|
86
|
+
<span class="live" title="The page refreshes when files change">Live</span>
|
|
87
|
+
<button class="fullscreen" type="button" aria-label="Full screen" aria-pressed="false" title="Full screen" hidden>
|
|
88
|
+
<svg width="17" height="17" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M4 9V4h5M15 4h5v5M20 15v5h-5M9 20H4v-5"/></svg>
|
|
89
|
+
</button>
|
|
90
|
+
<a class="settings-link" href="#/settings" data-tab="settings" aria-label="Settings">
|
|
91
|
+
<svg width="17" height="17" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M4 7h10M18 7h2M4 17h4M12 17h8"/><circle cx="16" cy="7" r="2.2" fill="none" stroke="currentColor" stroke-width="1.8"/><circle cx="10" cy="17" r="2.2" fill="none" stroke="currentColor" stroke-width="1.8"/></svg>
|
|
92
|
+
<span>Settings</span>
|
|
93
|
+
</a>
|
|
94
|
+
</header>
|
|
95
|
+
<div class="scrim"></div>
|
|
96
|
+
<main id="view" tabindex="-1"></main>
|
|
97
|
+
|
|
98
|
+
<script src="vendor/markdown-it.min.js"></script>
|
|
99
|
+
<script src="vendor/markdown-it-footnote.min.js"></script>
|
|
100
|
+
<script src="vendor/katex/katex.min.js"></script>
|
|
101
|
+
<script src="vendor/texmath.js"></script>
|
|
102
|
+
<script src="vendor/hljs/highlight.min.js"></script>
|
|
103
|
+
<script src="vendor/hljs/latex.min.js"></script>
|
|
104
|
+
<script src="vendor/hljs/julia.min.js"></script>
|
|
105
|
+
<script src="vendor/hljs/matlab.min.js"></script>
|
|
106
|
+
<script src="vendor/d3.min.js"></script>
|
|
107
|
+
<script type="module" src="app.js"></script>
|
|
108
|
+
</body>
|
|
109
|
+
</html>
|