From d9033233963bb88bc11e6cfcab9b4b5868198360 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Mon, 8 Jun 2026 15:04:09 -0400 Subject: [PATCH 1/4] feat: start adding agents week Signed-off-by: Henry Schreiner --- .gitignore | 3 + AGENTS.md | 25 ++-- CLAUDE.md | 1 + content/week14_agents/setup.md | 212 +++++++++++++++++++++++++++++++++ myst.yml | 3 + 5 files changed, 234 insertions(+), 10 deletions(-) create mode 120000 CLAUDE.md create mode 100644 content/week14_agents/setup.md diff --git a/.gitignore b/.gitignore index cf07268..8a6be3d 100644 --- a/.gitignore +++ b/.gitignore @@ -203,3 +203,6 @@ content/week09_compiled/ramses/ _output/Volumes *.doit.db _output/ + +# Symlink to AGENTS.md +.claude/ diff --git a/AGENTS.md b/AGENTS.md index 550ee4b..bc2e107 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,22 +4,24 @@ MyST MD course site for _Software Engineering for Scientific Computing_. ## Build & run -| Target | Command | -| ---------------------------- | -------------------------------------------------------------------- | -| Book (with pixi) | `pixi run book` | -| Pyodide / JupyterLite | `nox -s pyodide` | -| Slides | `npx @marp-team/marp-cli@latest --input-dir slides --output _output` | -| Live dev server (JupyterLab) | `pixi run lab` | +| Target | Command | +| ---------------------- | -------------------------------------------------------------------- | +| Book (with pixi) | `pixi run book` | +| Pyodide / JupyterLite | `nox -s pyodide` | +| Slides | `npx @marp-team/marp-cli@latest --input-dir slides --output _output` | +| Live dev server (MyST) | `pixi run serve` | +| JupyterLab | `pixi run lab` | - `pixi run book` depends on the `install-kernel` task, which installs the project's Python kernel into the pixi environment (`--sys-prefix`), then builds the site using `myst build --execute --html`. It sets `PYDEVD_DISABLE_FILE_VALIDATION=1`. - `mystmd` is configured to **execute all notebooks** on every build - (`--execute` flag). + (`--execute` flag), so broken code in a notebook breaks CI. - Only files listed in the `toc` section of `myst.yml` are included in the - build. The `notes/` directory is explicitly excluded and contains instructor - notes—do not reference it as book content. + build. Adding a new chapter file means adding it to `myst.yml`. The `notes/` + directory is explicitly excluded and contains instructor notes—do not + reference it as book content. ## Environment @@ -41,7 +43,10 @@ MyST MD course site for _Software Engineering for Scientific Computing_. - Always use `prek -a --quiet` instead of `pre-commit run -a`. - Hooks include: ruff-format, blacken-docs, nbstripout, prettier, codespell, - blocklint, plus a **custom `disallow-caps` hook**. + blocklint, plus a **custom `disallow-caps` hook** that rejects + miscapitalizations of names like pybind11, NumPy, CMake, ccache, GitHub, and + pytest — always use the canonical spelling (the hook also applies to this + file). - Prettier config (`.prettierrc.toml`): prose wraps at 80 chars by default, **but never for `slides/*.md`**. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 120000 index 0000000..47dc3e3 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +AGENTS.md \ No newline at end of file diff --git a/content/week14_agents/setup.md b/content/week14_agents/setup.md new file mode 100644 index 0000000..783e16a --- /dev/null +++ b/content/week14_agents/setup.md @@ -0,0 +1,212 @@ +# Setting up Agentic AI + +Agentic AI is the most significant change to software engineering ever. It is +also still a fast-changing field; we'll try to balance general advice and +specific examples that might change. + +## LLM details + +The core of agentic programming is an LLM, large language model. These are +simply completion engines trained on lots of data with a limited enough number +of parameters so that they learn concepts from the dataset. + +Models don't take letters in, they take tokens. That's why you can't ask a model +to count the "r"'s in "strawberry" - it doesn't actually see the word that way. +Tokenization is model specific; Claude Opus 4.7 has a finer tokenization than +Opus 4.6. (Different tokenizations are usually associated with a newly trained +model, rather than just updated weights, but model numbering has social +implications.) + +## Selecting a harness + +The first think you'll interact with is the harness. These tend come in three +flavors: + +- **TUI**, short for Terminal User Interface. These run in your terminal. Works + anywhere, including on clusters. +- **GUI**, short for Graphical User Interface. These are stand-alone application + with custom graphics. These can often do a little more than TUI's, like render + webpage previews. +- **Editor plugins**: These run in your editor, usually looking like a chat + window alongside the normal editor. + +Most harnesses come in all three flavors, you just pick the one you like +interacting with best. Some harnesses are more feature rich in one flavor. For +example, Copilot usually adds features to the editor plugin first. Claude code +and OpenCode favor the TUI. Codex favors the GUI. + +There's a second component to harnesses, and it's really important: the **system +prompt**. The reason most model providers have a harness is to provide a system +prompt that is customized to that model. Model specific customizations are +likely not really needed, especially for larger models, so feel free to explore +if you can. But note that's likely the biggest difference between the same model +using different harnesses. + +Some providers (like Anthropic) require you use their harness to use +subscription coding, so you don't get a choice. (Providers can cache the prompt +tokens, saving 10k-30k tokens). + +Harness provide **tools**, which are things the model can call to perform +operations. Models are mostly smart enough to figure out how to use tools, and +most harnesses provide a small set of useful tools, so this isn't usually an +issue except maybe for small local models. + +This is what makes Agentic AI special, and more useful than a simple chat; the +model can call tools, read output, and loop, fixing mistakes, just like a human +would. Many other things in this course - tests, formatters, linters, type +checking, and CI all feed into the agentic loop, letting the agent correct +mistakes and produces high quality output. + +Most harnesses have these features: + +- `/` commands - these control the harness. Common examples: + - `/init`: Set up or update the `AGENTS.md` file (equivalent) + - `/restore` (or `/sessions`): open up a previous session + - `/review`: Review a PR and/or other diff (depends on the harness) +- `@` to load files into context (just mentioning them works too, but it's up to + the model to load all or parts) + +## Selecting a model + +There are different levels of models, with different costs / subscription usages +associated with them. Small open source models can even run locally. Some models +are faster than others, too. In general, if you are just learning about agentic +AI, you should use a fairly powerful model, so you don't hit model limitations. +Once you've used it for a bit, then you can start matching model strength to the +problem description. You often have an "effort level" toggle as well. Using a +strong model with a high effort level on a simple task can actually overengineer +sometimes. + +Here's a current breakdown of some current models: + +- Frontier models: Claude Opus, GPT 5.5 +- Workhorse models: Claude Sonnet, GPT 5.4, Kimi K2.6, Composer 2.5 +- Simple models: Claude Haiku, GPT 5.4 mini +- Local models: Gemma 4, Qwen 3.6 + +(GLM 5.1 sits right inbtween Simple and Workhorse, and is a personal favorite). + +Here are some suggested task breakdowns. You can always use a stronger model, +this is just a recommended minimum: + +- Local models + - Asking questions about a codebase + - Very, very simple edits + - Throw-aways scripts (like plotting code) + - Writing config for AI + - Summaries +- Simple models + - Repetitive edits + - Categorization/triage of open issues + - Simple merge conflicts + - Simple tests + - Fixing lints + - Quick chores + - Setting up, compiling, running code + - Working on webpages / theming +- Workhorse models + - Complex merge configts + - Complex tests + - PR/diff review + - Assistance with docs + - Bug fixes + - Fixing CI + - Conversion (languages, CI providers, documentation generators, etc) + - Adding static types + - Recovering old PRs or changes + - Applying a design document / standard +- Frontier models + - Large refactors + - Profiling and optimizations + - Difficult bug fixes + - New features + - Any of the smaller model items if they fail to do it first + +## Setting up the harness + +Once you've picked a harness and model provider, then you'll need to download +and install it, and get signed in or your API key set somewhere. + +Your harness has a centeral location for config and a user-level +`AGENTS.md`-equivelent file. You can add a little bit of text here that will +always be loaded right after the system prompt. Here's a template: + +```md +You are on macOS. The github user is ``. `python3` can be used if +python without dependencies is needed. Use `uv run` if in a python package. + +Use `prek -a --quiet` instead of `pre-commit run -a` for linting. + +If you make a commit, follow conventional commits and add a trailer: +`Assisted-by: :`, where `` is the current agent harness +(like ClaudeCode), and `` is the AI model (Like claude-opus-4.8). + +Prefix PR descriptions and comments on PRs with the line ":robot: _AI text +below_ :robot:" to indicate you are an agent speaking on a user's behalf. +``` + +(You would insert your github username above). This does several things: + +- Some basic system setup, so the agents don't have to keep asking the same + questions +- Guide for running prek, since I use that everywhere +- Enforce conventional comments and Linux kernel style trailer. If using claude, + `You don't need to add a coauthored-by claude when you have this.` can be + added. +- Not needed for a large model, but if using local models, add + `Use relative paths when possible.`, this reduces the errors in making paths. +- Makes sure AI text is clearly marked (Claude also seems to comment on PRs + sometimes without asking, so this helps there too). + +Some example locations for this file: + +- Claude Code: `~/.claude/CLAUDE.md` +- OpenCode: `~/.config/opencode/AGENTS.md` +- Pi: `~/.pi/agent/APPEND_SYSTEM.md` + +There are also useful settings in these folders, too, like auto approve for +certain tools. + +## Setting up the project + +When you start up a harness, you are starting fresh, there's no knowledge about +the high level project features or low level details, everything must be +investigated by the agent. To speed this up, reduce token usage, and give the +agent a better "big-pictue" view, you should create a project-level `AGENTS.md` +file. You can type `/init` into your harness, and that should generate one. Some +tools have custom file names; if yours does, move it to `AGENTS.md` after it is +generated. The only tool that does not support the `AGENTS.md` stamdard is +Claude Code; if you are using that then you'll also need to run +`ln -s AGENTS.md CLAUDE.md` and add `CLAUDE.md` to your gitignore (also +`.claude` while you are at it). Feel free to review and edit if it got anything +wrong (like best way to run the tests, etc). + +If it's a new project, you can write one shortly after getting started. You can +update it with AI as well, so feel free to include specifics that might change. +You can even instruct the AI to update `AGENTS.md` when things change in the +`AGENTS.md`! + +## Things to try first + +You can do nearly anything, but some ideas to get started. + +Try investicating the codebase. Some example prompts: + +- `How to I run the tests?` +- `Write a `ARCHITECTURE.md` describing how this project works.` +- `Who wrote the majority of the CI?` + +Your agent can look up git history, webpages, and much more, as it needs, +without being explicitly told. + +Try reviewing code: + +- `\review` (some harnesses require a PR number or description of what to review +- `Review this repository and look for things that can be modernized or simplified` + +And try this on issues or PRs if you have any: + +- `Categorize the open issues and tell me which ones are easiest to close` +- `Fix #123` +- `Is #234 still broken?` +- `Fix the CI` (on a failing PR) diff --git a/myst.yml b/myst.yml index 04b74fc..8b28801 100644 --- a/myst.yml +++ b/myst.yml @@ -92,6 +92,9 @@ project: children: - file: content/week13_misc/webassembly.md - file: content/week13_misc/shell.md + - title: "WIP: Agentic AI" + children: + - file: content/week14_agents/setup.md site: title: SE4Sci nav: From f5ab1d805a0abc69dba649966763a9a9991c461f Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Mon, 8 Jun 2026 15:53:34 -0400 Subject: [PATCH 2/4] chore: some fixup by Claude Assisted-by: ClaudeCode:claude-opus-4.8 Signed-off-by: Henry Schreiner --- content/week14_agents/setup.md | 41 ++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/content/week14_agents/setup.md b/content/week14_agents/setup.md index 783e16a..6ddc063 100644 --- a/content/week14_agents/setup.md +++ b/content/week14_agents/setup.md @@ -19,7 +19,7 @@ implications.) ## Selecting a harness -The first think you'll interact with is the harness. These tend come in three +The first thing you'll interact with is the harness. These tend to come in three flavors: - **TUI**, short for Terminal User Interface. These run in your terminal. Works @@ -32,8 +32,8 @@ flavors: Most harnesses come in all three flavors, you just pick the one you like interacting with best. Some harnesses are more feature rich in one flavor. For -example, Copilot usually adds features to the editor plugin first. Claude code -and OpenCode favor the TUI. Codex favors the GUI. +example, Copilot usually adds features to the editor plugin first. Claude Code +and OpenCode favor the TUI. There's a second component to harnesses, and it's really important: the **system prompt**. The reason most model providers have a harness is to provide a system @@ -44,9 +44,9 @@ using different harnesses. Some providers (like Anthropic) require you use their harness to use subscription coding, so you don't get a choice. (Providers can cache the prompt -tokens, saving 10k-30k tokens). +tokens, reducing the cost and latency of the 10k-30k tokens of system prompt). -Harness provide **tools**, which are things the model can call to perform +Harnesses provide **tools**, which are things the model can call to perform operations. Models are mostly smart enough to figure out how to use tools, and most harnesses provide a small set of useful tools, so this isn't usually an issue except maybe for small local models. @@ -55,7 +55,7 @@ This is what makes Agentic AI special, and more useful than a simple chat; the model can call tools, read output, and loop, fixing mistakes, just like a human would. Many other things in this course - tests, formatters, linters, type checking, and CI all feed into the agentic loop, letting the agent correct -mistakes and produces high quality output. +mistakes and produce high quality output. Most harnesses have these features: @@ -84,7 +84,8 @@ Here's a current breakdown of some current models: - Simple models: Claude Haiku, GPT 5.4 mini - Local models: Gemma 4, Qwen 3.6 -(GLM 5.1 sits right inbtween Simple and Workhorse, and is a personal favorite). +(GLM 5.1 sits right in between Simple and Workhorse, and is a personal +favorite). Here are some suggested task breakdowns. You can always use a stronger model, this is just a recommended minimum: @@ -92,7 +93,7 @@ this is just a recommended minimum: - Local models - Asking questions about a codebase - Very, very simple edits - - Throw-aways scripts (like plotting code) + - Throw-away scripts (like plotting code) - Writing config for AI - Summaries - Simple models @@ -105,7 +106,7 @@ this is just a recommended minimum: - Setting up, compiling, running code - Working on webpages / theming - Workhorse models - - Complex merge configts + - Complex merge conflicts - Complex tests - PR/diff review - Assistance with docs @@ -119,6 +120,7 @@ this is just a recommended minimum: - Large refactors - Profiling and optimizations - Difficult bug fixes + - Prototyping new features - New features - Any of the smaller model items if they fail to do it first @@ -127,8 +129,8 @@ this is just a recommended minimum: Once you've picked a harness and model provider, then you'll need to download and install it, and get signed in or your API key set somewhere. -Your harness has a centeral location for config and a user-level -`AGENTS.md`-equivelent file. You can add a little bit of text here that will +Your harness has a central location for config and a user-level +`AGENTS.md`-equivalent file. You can add a little bit of text here that will always be loaded right after the system prompt. Here's a template: ```md @@ -145,12 +147,12 @@ Prefix PR descriptions and comments on PRs with the line ":robot: _AI text below_ :robot:" to indicate you are an agent speaking on a user's behalf. ``` -(You would insert your github username above). This does several things: +(You would insert your GitHub username above). This does several things: - Some basic system setup, so the agents don't have to keep asking the same questions - Guide for running prek, since I use that everywhere -- Enforce conventional comments and Linux kernel style trailer. If using claude, +- Enforce conventional commits and Linux kernel style trailer. If using claude, `You don't need to add a coauthored-by claude when you have this.` can be added. - Not needed for a large model, but if using local models, add @@ -172,10 +174,10 @@ certain tools. When you start up a harness, you are starting fresh, there's no knowledge about the high level project features or low level details, everything must be investigated by the agent. To speed this up, reduce token usage, and give the -agent a better "big-pictue" view, you should create a project-level `AGENTS.md` +agent a better "big-picture" view, you should create a project-level `AGENTS.md` file. You can type `/init` into your harness, and that should generate one. Some tools have custom file names; if yours does, move it to `AGENTS.md` after it is -generated. The only tool that does not support the `AGENTS.md` stamdard is +generated. The only tool that does not support the `AGENTS.md` standard is Claude Code; if you are using that then you'll also need to run `ln -s AGENTS.md CLAUDE.md` and add `CLAUDE.md` to your gitignore (also `.claude` while you are at it). Feel free to review and edit if it got anything @@ -190,10 +192,10 @@ You can even instruct the AI to update `AGENTS.md` when things change in the You can do nearly anything, but some ideas to get started. -Try investicating the codebase. Some example prompts: +Try investigating the codebase. Some example prompts: -- `How to I run the tests?` -- `Write a `ARCHITECTURE.md` describing how this project works.` +- `How do I run the tests?` +- `Write an ARCHITECTURE.md describing how this project works.` - `Who wrote the majority of the CI?` Your agent can look up git history, webpages, and much more, as it needs, @@ -201,7 +203,8 @@ without being explicitly told. Try reviewing code: -- `\review` (some harnesses require a PR number or description of what to review +- `/review` (some harnesses require a PR number or description of what to + review) - `Review this repository and look for things that can be modernized or simplified` And try this on issues or PRs if you have any: From 40306491e0307628d34761a98b394063b5704007 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Mon, 8 Jun 2026 16:39:05 -0400 Subject: [PATCH 3/4] build: add package.json to build slides with bun Add a bun-based package.json with a build-slides script (marp), and switch the CI build-slides job to use bun install + bun run build-slides instead of npx. Ignore node_modules and exclude bun.lock from codespell (it flagged a sha512 integrity hash). Assisted-by: ClaudeCode:claude-opus-4.8 --- .github/workflows/cd.yml | 7 +- .gitignore | 3 + .pre-commit-config.yaml | 1 + bun.lock | 319 +++++++++++++++++++++++++++++++++++++++ package.json | 12 ++ 5 files changed, 341 insertions(+), 1 deletion(-) create mode 100644 bun.lock create mode 100644 package.json diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 61c6204..b29fa18 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -57,8 +57,13 @@ jobs: steps: - uses: actions/checkout@v6 + - uses: oven-sh/setup-bun@v2 + + - name: Install dependencies + run: bun install --frozen-lockfile + - name: Make slides - run: npx @marp-team/marp-cli@latest --input-dir slides --output _output + run: bun run build-slides - uses: actions/upload-artifact@v7 with: diff --git a/.gitignore b/.gitignore index 8a6be3d..d1b7266 100644 --- a/.gitignore +++ b/.gitignore @@ -204,5 +204,8 @@ _output/Volumes *.doit.db _output/ +# Node / bun +node_modules/ + # Symlink to AGENTS.md .claude/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a968905..924adb0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -40,6 +40,7 @@ repos: hooks: - id: codespell args: ["-L", "hist,whet,classe,nd", "-w"] + exclude: ^bun\.lock$ - repo: local hooks: diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..cc22bb3 --- /dev/null +++ b/bun.lock @@ -0,0 +1,319 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "se-for-sci", + "dependencies": { + "@marp-team/marp-cli": "^4.0", + }, + }, + }, + "packages": { + "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@csstools/postcss-is-pseudo-class": ["@csstools/postcss-is-pseudo-class@5.0.3", "", { "dependencies": { "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ=="], + + "@csstools/selector-resolve-nested": ["@csstools/selector-resolve-nested@3.1.0", "", { "peerDependencies": { "postcss-selector-parser": "^7.0.0" } }, "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g=="], + + "@csstools/selector-specificity": ["@csstools/selector-specificity@5.0.0", "", { "peerDependencies": { "postcss-selector-parser": "^7.0.0" } }, "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw=="], + + "@marp-team/marp-cli": ["@marp-team/marp-cli@4.4.0", "", { "dependencies": { "@marp-team/marp-core": "^4.3.0", "@marp-team/marpit": "^3.2.1", "chokidar": "^4.0.3", "cosmiconfig": "^9.0.1", "puppeteer-core": "^24.39.1", "serve-index": "^1.9.2", "tmp": "^0.2.5", "ws": "^8.19.0" }, "bin": { "marp": "marp-cli.js" } }, "sha512-fLBOZpi0mi7IoN+fXiCyGklbdROSE40DKv7LZa7en1mBd1XlQe5O7mE9KEzuYRKVbUMK4swrQqgcQ9WNNNoY6Q=="], + + "@marp-team/marp-core": ["@marp-team/marp-core@4.3.0", "", { "dependencies": { "@marp-team/marpit": "^3.2.1", "@marp-team/marpit-svg-polyfill": "^2.1.0", "highlight.js": "^11.11.1", "katex": "^0.16.33", "mathjax-full": "^3.2.2", "postcss-selector-parser": "^7.1.1", "xss": "^1.0.15" } }, "sha512-Qwd0wsHS+7bdCBmmnxCU2OKclCSdsVu4U474zSs44Y2SMXr6d9wBYAMD5IXI4dbmaB57Ez5fdPUxPZZsFo8Tmw=="], + + "@marp-team/marpit": ["@marp-team/marpit@3.2.1", "", { "dependencies": { "@csstools/postcss-is-pseudo-class": "^5.0.3", "cssesc": "^3.0.0", "js-yaml": "^4.1.1", "lodash.kebabcase": "^4.1.1", "markdown-it": "^14.1.1", "markdown-it-front-matter": "^0.2.4", "postcss": "^8.5.6", "postcss-nesting": "^13.0.2" } }, "sha512-MflN1movsh8PXJbM9otjJOtlcB0vSrvw5PgXs2PDguVYVzKQmGpiy9QHHKq0rryrgaSp376TdJWBP7mXHHAG8w=="], + + "@marp-team/marpit-svg-polyfill": ["@marp-team/marpit-svg-polyfill@2.1.0", "", { "peerDependencies": { "@marp-team/marpit": ">=0.5.0" }, "optionalPeers": ["@marp-team/marpit"] }, "sha512-VqCoAKwv1HJdzZp36dDPxznz2JZgRjkVSSPHpCzk72G2N753F0HPKXjevdjxmzN6gir9bUGBgMD1SguWJIi11A=="], + + "@puppeteer/browsers": ["@puppeteer/browsers@2.13.2", "", { "dependencies": { "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", "semver": "^7.7.4", "tar-fs": "^3.1.1", "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" } }, "sha512-5EUZSUIc37H6aIXyWO0Z4y8NlF8NnjgmqeQgOGiswAU7pY0HOo16ho4+alIWmSfdZnjqBRawMsP3I5YqLSn6kw=="], + + "@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="], + + "@types/node": ["@types/node@25.9.2", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw=="], + + "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], + + "@xmldom/xmldom": ["@xmldom/xmldom@0.9.10", "", {}, "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw=="], + + "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="], + + "b4a": ["b4a@1.8.1", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw=="], + + "bare-events": ["bare-events@2.9.1", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg=="], + + "bare-fs": ["bare-fs@4.7.2", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4", "bare-url": "^2.2.2", "fast-fifo": "^1.3.2" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-aTvMFUWkBmjzKtEQMDGGDNF8bkfpD5N1b/FCwt7A3wrU4t1o/e/85Wzkluh6JlODCjqVESYCkQCdTXqZ9G7VFg=="], + + "bare-os": ["bare-os@3.9.1", "", {}, "sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ=="], + + "bare-path": ["bare-path@3.0.1", "", { "dependencies": { "bare-os": "^3.0.1" } }, "sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ=="], + + "bare-stream": ["bare-stream@2.13.1", "", { "dependencies": { "streamx": "^2.25.0", "teex": "^1.0.1" }, "peerDependencies": { "bare-abort-controller": "*", "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-abort-controller", "bare-buffer", "bare-events"] }, "sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow=="], + + "bare-url": ["bare-url@2.4.5", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ=="], + + "basic-ftp": ["basic-ftp@5.3.1", "", {}, "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw=="], + + "batch": ["batch@0.6.1", "", {}, "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw=="], + + "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "chromium-bidi": ["chromium-bidi@14.0.0", "", { "dependencies": { "mitt": "^3.0.1", "zod": "^3.24.1" }, "peerDependencies": { "devtools-protocol": "*" } }, "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], + + "cosmiconfig": ["cosmiconfig@9.0.2", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "cssfilter": ["cssfilter@0.0.10", "", {}, "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw=="], + + "data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "degenerator": ["degenerator@5.0.1", "", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" } }, "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ=="], + + "depd": ["depd@1.1.2", "", {}, "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="], + + "devtools-protocol": ["devtools-protocol@0.0.1608973", "", {}, "sha512-Tpm17fxYzt+J7VrGdc1k8YdRqS3YV7se/M6KeemEqvUbq/n7At1rWVuXMxQgpWkdwSdIEKYbU//Bve+Shm4YNQ=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + + "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + + "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], + + "esm": ["esm@3.2.25", "", {}, "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="], + + "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], + + "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], + + "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + + "get-uri": ["get-uri@6.0.5", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg=="], + + "highlight.js": ["highlight.js@11.11.1", "", {}, "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w=="], + + "http-errors": ["http-errors@1.8.1", "", { "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.1" } }, "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g=="], + + "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], + + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ip-address": ["ip-address@10.2.0", "", {}, "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "katex": ["katex@0.16.47", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "linkify-it": ["linkify-it@5.0.1", "", { "dependencies": { "uc.micro": "^2.0.0" } }, "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg=="], + + "lodash.kebabcase": ["lodash.kebabcase@4.1.1", "", {}, "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g=="], + + "lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], + + "markdown-it": ["markdown-it@14.2.0", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.1", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ=="], + + "markdown-it-front-matter": ["markdown-it-front-matter@0.2.4", "", {}, "sha512-25GUs0yjS2hLl8zAemVndeEzThB1p42yxuDEKbd4JlL3jiz+jsm6e56Ya8B0VREOkNxLYB4TTwaoPJ3ElMmW+w=="], + + "mathjax-full": ["mathjax-full@3.2.2", "", { "dependencies": { "esm": "^3.2.25", "mhchemparser": "^4.1.0", "mj-context-menu": "^0.6.1", "speech-rule-engine": "^4.0.6" } }, "sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w=="], + + "mdurl": ["mdurl@2.0.0", "", {}, "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="], + + "mhchemparser": ["mhchemparser@4.2.1", "", {}, "sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], + + "mj-context-menu": ["mj-context-menu@0.6.1", "", {}, "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nanoid": ["nanoid@3.3.12", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ=="], + + "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + + "netmask": ["netmask@2.1.1", "", {}, "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="], + + "pac-resolver": ["pac-resolver@7.0.1", "", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "postcss": ["postcss@8.5.15", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A=="], + + "postcss-nesting": ["postcss-nesting@13.0.2", "", { "dependencies": { "@csstools/selector-resolve-nested": "^3.1.0", "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ=="], + + "postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], + + "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], + + "proxy-agent": ["proxy-agent@6.5.0", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.1", "https-proxy-agent": "^7.0.6", "lru-cache": "^7.14.1", "pac-proxy-agent": "^7.1.0", "proxy-from-env": "^1.1.0", "socks-proxy-agent": "^8.0.5" } }, "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="], + + "punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="], + + "puppeteer-core": ["puppeteer-core@24.43.1", "", { "dependencies": { "@puppeteer/browsers": "2.13.2", "chromium-bidi": "14.0.0", "debug": "^4.4.3", "devtools-protocol": "0.0.1608973", "typed-query-selector": "^2.12.2", "webdriver-bidi-protocol": "0.4.1", "ws": "^8.20.0" } }, "sha512-T5ScUMAsmhdNbgDR41AGESYeS6V9MSgetkSnVhhW+gXvzC42VesKCn5ld87gAZDJ6vLHL9GkRvY9WtQWSnwFbw=="], + + "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "semver": ["semver@7.8.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-wnilbGyMxzbY7dNOl7jpKbLSjcfeweJWU5j4+u5qW+6/wuGD9KzIGOyZnQVSBM9E7DtWaaH3CyHkppYrKYoxwg=="], + + "serve-index": ["serve-index@1.9.2", "", { "dependencies": { "accepts": "~1.3.8", "batch": "0.6.1", "debug": "2.6.9", "escape-html": "~1.0.3", "http-errors": "~1.8.0", "mime-types": "~2.1.35", "parseurl": "~1.3.3" } }, "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], + + "socks": ["socks@2.8.9", "", { "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" } }, "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw=="], + + "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], + + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "speech-rule-engine": ["speech-rule-engine@4.1.4", "", { "dependencies": { "@xmldom/xmldom": "0.9.10", "commander": "13.1.0", "wicked-good-xpath": "1.3.0" }, "bin": { "sre": "bin/sre" } }, "sha512-i/VCLG1fvRc95pMHRqG4aQNscv+9aIsqA2oI7ZQS51sTdUcDHYX6cpT8/tqZ+enjs1tKVwbRBWgxut9SWn+f9g=="], + + "statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], + + "streamx": ["streamx@2.27.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-WZ189TKnHoAokYHvwzaAQMpd55cgUmFIcJFzBSgGcb886jau5DL+XdDhTWV4ps3FLvk+OORp0dLRTPsLZ21CSA=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "tar-fs": ["tar-fs@3.1.2", "", { "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0" } }, "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw=="], + + "tar-stream": ["tar-stream@3.2.0", "", { "dependencies": { "b4a": "^1.6.4", "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg=="], + + "teex": ["teex@1.0.1", "", { "dependencies": { "streamx": "^2.12.5" } }, "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg=="], + + "text-decoder": ["text-decoder@1.2.7", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ=="], + + "tmp": ["tmp@0.2.7", "", {}, "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "typed-query-selector": ["typed-query-selector@2.12.2", "", {}, "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ=="], + + "uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="], + + "undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "webdriver-bidi-protocol": ["webdriver-bidi-protocol@0.4.1", "", {}, "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw=="], + + "wicked-good-xpath": ["wicked-good-xpath@1.3.0", "", {}, "sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="], + + "xss": ["xss@1.0.15", "", { "dependencies": { "commander": "^2.20.3", "cssfilter": "0.0.10" }, "bin": { "xss": "bin/xss" } }, "sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], + + "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + + "serve-index/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "speech-rule-engine/commander": ["commander@13.1.0", "", {}, "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw=="], + + "xss/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "serve-index/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..b55c80d --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "se-for-sci", + "private": true, + "type": "module", + "scripts": { + "build-slides": "marp --input-dir slides --output _output", + "clean": "rm -rf _output" + }, + "dependencies": { + "@marp-team/marp-cli": "^4.0" + } +} From 27a568b12ff7caafcf69f1dff7435ff8009fd790 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Mon, 8 Jun 2026 16:39:45 -0400 Subject: [PATCH 4/4] feat: add week 14 agents slides Add the week-14-1 Marp slide deck for the agents week, link it from the setup chapter, and document the slides naming/theme/linking conventions in AGENTS.md. Assisted-by: ClaudeCode:claude-opus-4.8 --- AGENTS.md | 7 +- content/week14_agents/setup.md | 2 + slides/week-14-1.md | 177 +++++++++++++++++++++++++++++++++ 3 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 slides/week-14-1.md diff --git a/AGENTS.md b/AGENTS.md index bc2e107..a859c9e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -35,7 +35,12 @@ MyST MD course site for _Software Engineering for Scientific Computing_. - `content/` — Book chapters (mix of `.md` and `.ipynb`). - `slides/` — Marp slide decks. These are rendered by CI and deployed to - `public/slides`. + `public/slides`. Files are named `week-NN-N.md` (e.g. `week-14-1.md`) and use + the Marp `gaia` theme; copy the front matter from an existing deck. Slides + parallel a content chapter: the chapter links to its deck near the top with + `` {button}`Slides ` ``, and + the deck opens with a `# SE4Sci` / `## ` lead slide, with `---` + separating slides. - `notes/` — Instructor notes; not built into the book. - `myst.yml` drives the project configuration and table of contents. diff --git a/content/week14_agents/setup.md b/content/week14_agents/setup.md index 6ddc063..020da6c 100644 --- a/content/week14_agents/setup.md +++ b/content/week14_agents/setup.md @@ -1,5 +1,7 @@ # Setting up Agentic AI +{button}`Slides <https://se-for-sci.github.io/slides/week-14-1>` + Agentic AI is the most significant change to software engineering ever. It is also still a fast-changing field; we'll try to balance general advice and specific examples that might change. diff --git a/slides/week-14-1.md b/slides/week-14-1.md new file mode 100644 index 0000000..7860dea --- /dev/null +++ b/slides/week-14-1.md @@ -0,0 +1,177 @@ +--- +marp: true +theme: gaia +_class: lead +paginate: false +backgroundColor: #fff +backgroundImage: url('https://marp.app/assets/hero-background.svg') +--- + +# SE4Sci + +## Setting up Agentic AI + +--- + +## Agentic AI + +- The most significant change to software engineering ever +- Still a fast-changing field +- We'll balance general advice with specific (and changing) examples + +--- + +## LLM details + +- The core of agentic programming is an LLM (large language model) +- Simply completion engines trained on lots of data +- Limited number of parameters, so they learn _concepts_ from the data + +--- + +## Tokenization + +- Models don't take in letters, they take in **tokens** +- That's why a model can't count the "r"'s in "strawberry" +- Tokenization is model specific + - Claude Opus 4.7 has finer tokenization than Opus 4.6 + - Usually tied to a newly trained model, not just updated weights + +--- + +## Selecting a harness + +The first thing you interact with. Three flavors: + +- **TUI** (Terminal User Interface) — runs in your terminal, works anywhere, even on clusters +- **GUI** (Graphical User Interface) — stand-alone app, can render extras like webpage previews +- **Editor plugins** — chat window alongside your editor + +Most harnesses come in all three; pick the one you like best. + +--- + +## The system prompt + +- The biggest reason providers ship a harness +- A system prompt customized to that model (10k–30k tokens, cached) +- Model-specific tuning often isn't really needed for larger models +- Likely the **biggest difference** between the same model in different harnesses +- Some providers (e.g. Anthropic) require their harness for subscription coding + +--- + +## Tools and the agentic loop + +- Harnesses provide **tools** — things the model can call to do work +- Models are mostly smart enough to figure out how to use them +- The model can call tools, read output, and **loop**, fixing mistakes — like a human +- Tests, formatters, linters, type checking, and CI all feed the loop, producing high quality output + +--- + +## Common harness features + +- `/` commands control the harness: + - `/init`: set up or update the `AGENTS.md` file + - `/restore` (or `/sessions`): open a previous session + - `/review`: review a PR and/or other diff +- `@` to load files into context (mentioning them often works too) + +--- + +## Selecting a model + +- Different levels, with different costs / subscription usage +- Some models are faster; small open source models can run locally +- Learning agentic AI? Use a fairly powerful model so you don't hit limits +- Later, match model strength to the problem +- An "effort level" toggle exists too — strong model + high effort on a simple task can **overengineer** + +--- + +## A current breakdown + +- **Frontier**: Claude Opus, GPT 5.5 +- **Workhorse**: Claude Sonnet, GPT 5.4, Kimi K2.6, Composer 2.5 +- **Simple**: Claude Haiku, GPT 5.4 mini +- **Local**: Gemma 4, Qwen 3.6 + +(GLM 5.1 sits between Simple and Workhorse, and is a personal favorite.) + +--- + +## Suggested tasks (minimums) + +- **Local**: codebase questions, very simple edits, throw-away scripts, AI config, summaries +- **Simple**: repetitive edits, issue triage, simple merge conflicts/tests, fixing lints, building & running code, theming +- **Workhorse**: complex merge conflicts/tests, PR review, docs, bug fixes, fixing CI, conversions, static types +- **Frontier**: large refactors, profiling/optimization, hard bugs, prototyping and new features + +--- + +## Setting up the harness + +- Download, install, sign in or set your API key +- Each harness has a user-level `AGENTS.md`-equivalent, loaded right after the system prompt + +Some locations: + +- Claude Code: `~/.claude/CLAUDE.md` +- OpenCode: `~/.config/opencode/AGENTS.md` +- Pi: `~/.pi/agent/APPEND_SYSTEM.md` + +--- + +## A user config template + +```md +You are on macOS. The github user is `<username>`. `python3` can be used if python without dependencies is needed. Use `uv run` if in a python package. + +Use `prek -a --quiet` instead of `pre-commit run -a` for linting. + +If you make a commit, follow conventional commits and add a trailer: `Assisted-by: <harness>:<model>`. + +Prefix PR descriptions and comments with ":robot: _AI text below_ :robot:". +``` + +For local models, add `Use relative paths when possible.` + +--- + +## Setting up the project + +- A fresh harness knows nothing — everything must be investigated +- A project-level `AGENTS.md` speeds this up, cuts tokens, gives a big-picture view +- Type `/init` to generate one; rename to `AGENTS.md` if needed +- Claude Code is the only tool not supporting `AGENTS.md`: + - `ln -s AGENTS.md CLAUDE.md` and gitignore `CLAUDE.md` (and `.claude`) +- Review and edit anything it got wrong + +--- + +## Things to try first + +Investigate the codebase: + +- `How do I run the tests?` +- `Write an ARCHITECTURE.md describing how this project works.` +- `Who wrote the majority of the CI?` + +Review code: + +- `/review` +- `Review this repository and look for things that can be modernized or simplified` + +--- + +## Things to try first (2) + +On issues or PRs: + +- `Categorize the open issues and tell me which ones are easiest to close` +- `Fix #123` +- `Is #234 still broken?` +- `Fix the CI` (on a failing PR) + +The agent can look up git history, webpages, and more — without being told.