Agent Skillsnodetool-ai/nodetool › sandbox-markdown

sandbox-markdown

GitHub

在沙箱环境中将 Markdown 解析为令牌流或 HTML,支持提取标题、链接、列表、代码块和表格等结构信息。

packages/sandbox-packs/sandbox-markdown/SKILL.md nodetool-ai/nodetool

Trigger Scenarios

需要解析 Markdown 内容 从 Markdown 中提取结构化数据如目录或链接

Install

npx skills add nodetool-ai/nodetool --skill sandbox-markdown -g -y
More Options

Non-standard path

npx skills add https://github.com/nodetool-ai/nodetool/tree/main/packages/sandbox-packs/sandbox-markdown -g -y

Use without installing

npx skills use nodetool-ai/nodetool@sandbox-markdown

指定 Agent (Claude Code)

npx skills add nodetool-ai/nodetool --skill sandbox-markdown -a claude-code -g -y

安装 repo 全部 skill

npx skills add nodetool-ai/nodetool --all -g -y

预览 repo 内 skill

npx skills add nodetool-ai/nodetool --list

SKILL.md

Frontmatter
{
    "name": "sandbox-markdown",
    "description": "Parse markdown into a token stream inside a Code node or CodeAct action, with marked's lexer running in the guest"
}

Markdown in the sandbox

Specifier: @nodetool-ai/sandbox-markdown. One module, the marked root export. Import it at the top of the body.

marked is pure JavaScript — no Node builtins, no DOM — so it compiles straight into the QuickJS guest. There is no pre-built "extract headers" helper; marked.lexer gives you the token stream and you read what you need out of it.

lexer — markdown text to tokens

import { marked } from "@nodetool-ai/sandbox-markdown";

const tokens = marked.lexer(inputs.markdown);
return { tokenCount: tokens.length };

Each token carries a type (heading, paragraph, list, code, table, link tokens nested inside paragraph/text tokens, etc.) and the fields that type needs.

Headers → a document outline

import { marked } from "@nodetool-ai/sandbox-markdown";

const headers = marked.lexer(inputs.markdown)
  .filter((t) => t.type === "heading")
  .map((t) => ({ level: t.depth, text: t.text }));
return { headers };

Links → a flat list

marked nests inline tokens (links, emphasis) inside block tokens. Walk tokens.links for a document's reference-style link definitions, or walk each block's .tokens for inline links:

import { marked } from "@nodetool-ai/sandbox-markdown";

function collectLinks(tokens, out = []) {
  for (const t of tokens) {
    if (t.type === "link") out.push({ href: t.href, text: t.text });
    if (t.tokens) collectLinks(t.tokens, out);
    if (t.items) collectLinks(t.items, out);
  }
  return out;
}

const links = collectLinks(marked.lexer(inputs.markdown));
return { links };

Lists → nested items

import { marked } from "@nodetool-ai/sandbox-markdown";

const lists = marked.lexer(inputs.markdown)
  .filter((t) => t.type === "list")
  .map((t) => ({
    ordered: t.ordered,
    items: t.items.map((item) => item.text)
  }));
return { lists };

Code blocks → language + source

import { marked } from "@nodetool-ai/sandbox-markdown";

const codeBlocks = marked.lexer(inputs.markdown)
  .filter((t) => t.type === "code")
  .map((t) => ({ language: t.lang || "text", code: t.text }));
return { codeBlocks };

Tables → rows of records

import { marked } from "@nodetool-ai/sandbox-markdown";

const tables = marked.lexer(inputs.markdown)
  .filter((t) => t.type === "table")
  .map((t) => {
    const headers = t.header.map((cell) => cell.text);
    return t.rows.map((row) =>
      Object.fromEntries(row.map((cell, i) => [headers[i], cell.text]))
    );
  });
return { tables };

Markdown → HTML

import { marked } from "@nodetool-ai/sandbox-markdown";

const html = marked.parse(inputs.markdown);
return { html };

Gotchas

  • Everything runs in the guest. The 64 MB guest heap holds your input text, the token tree, and the returned value at once.
  • marked.lexer is synchronous, unlike marked.parse (which can be async when you register an async extension — the default configuration is not).
  • Token shapes differ by type. A list token's items are themselves tokens with their own .tokens; a table token has header/rows, not a flat cells array. Log a sample token when a shape is unclear.
  • This pack is the only route to markdown parsing. There is no data.parseMarkdown global; every library the sandbox offers is an importable module, and this is the one for markdown.

Version History

  • a6a7e57 Current 2026-08-20 09:52

Same Skill Collection

.claude/skills/ask-matt/SKILL.md
.claude/skills/ast-grep-outline/SKILL.md
.claude/skills/ast-grep/SKILL.md
.claude/skills/codebase-design/SKILL.md
.claude/skills/companion-clis/SKILL.md
.claude/skills/diagnosing-bugs/SKILL.md
.claude/skills/domain-modeling/SKILL.md
.claude/skills/flash/SKILL.md
.claude/skills/implement/SKILL.md
.claude/skills/improve-codebase-architecture/SKILL.md
.claude/skills/nodetool-api-reference/SKILL.md
.claude/skills/nodetool-browser-agent/SKILL.md
.claude/skills/nodetool-chat-cli/SKILL.md
.claude/skills/nodetool-custom-node-developer/SKILL.md
.claude/skills/nodetool-deployment/SKILL.md
.claude/skills/nodetool-model-provider-config/SKILL.md
.claude/skills/nodetool-rag-indexing/SKILL.md
.claude/skills/nodetool-troubleshooter/SKILL.md
.claude/skills/nodetool-workflow-builder/SKILL.md
.claude/skills/prototype/SKILL.md
.claude/skills/research/SKILL.md
.claude/skills/resolving-merge-conflicts/SKILL.md
.claude/skills/setup-matt-pocock-skills/SKILL.md
.claude/skills/tdd/SKILL.md
.claude/skills/to-spec/SKILL.md
.claude/skills/to-tickets/SKILL.md
.claude/skills/triage/SKILL.md
.claude/skills/wayfinder/SKILL.md
.claude/skills/wizard/SKILL.md
.claude/skills/yts806379-everything-claude-code-e2e-testing/SKILL.md
packages/sandbox-packs/sandbox-aws/SKILL.md
packages/sandbox-packs/sandbox-chrono/SKILL.md
packages/sandbox-packs/sandbox-color/SKILL.md
packages/sandbox-packs/sandbox-csv/SKILL.md
packages/sandbox-packs/sandbox-dates/SKILL.md
packages/sandbox-packs/sandbox-decimal/SKILL.md
packages/sandbox-packs/sandbox-diff/SKILL.md
packages/sandbox-packs/sandbox-docx/SKILL.md
packages/sandbox-packs/sandbox-dsl/SKILL.md
packages/sandbox-packs/sandbox-epub/SKILL.md
packages/sandbox-packs/sandbox-exif/SKILL.md
packages/sandbox-packs/sandbox-expr/SKILL.md
packages/sandbox-packs/sandbox-fabric/SKILL.md
packages/sandbox-packs/sandbox-flow/SKILL.md
packages/sandbox-packs/sandbox-gif/SKILL.md
packages/sandbox-packs/sandbox-html/SKILL.md
packages/sandbox-packs/sandbox-ics/SKILL.md
packages/sandbox-packs/sandbox-jmespath/SKILL.md
packages/sandbox-packs/sandbox-mammoth/SKILL.md

Metadata

Files
0
Version
a6a7e57
Hash
6e719e3b
Indexed
2026-08-20 09:52

- 위키
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-08-25 05:50
浙ICP备14020137号-1 $방문자$