用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/nodetool-ai/nodetool --skill sandbox-xlsx命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Produce a whole campaign in NodeTool rather than one video — entity sheets for a product and model, a set of still campaign frames, several short social cuts and a long film, all on one locked grade. Use when the user asks for a launch kit, a campaign, an asset pack, a content set, "a bunch of assets", or names several deliverables in different aspect ratios from one product. Not for a single video (use product-commercial or ugc-video).
Direct a polished product film in NodeTool — pack shots, macro hero spots, luxury commercials, brand films on location, with or without talent. Use when the user wants an ad that looks shot on a camera rather than a phone, mentions a pack shot, hero shot, product film, brand spot, cyclorama or studio lighting, or names a product as the subject of a multi-shot video. Not for self-filmed or creator-style pieces (use ugc-video).
Direct video where a written voiceover drives the picture — faceless explainers, narrated b-roll, documentary segments, tutorials, corporate and educational video with no on-camera talent. Use when the user asks for an explainer, a voiceover video, a narrated piece, a faceless video, or says the script comes first. Also use when spoken words must time the cut. Not for talking-head or creator video (use ugc-video).
正在显示 SKILL.md
| name | sandbox-xlsx |
| description | Read and write Excel workbooks in a Code node or CodeAct action, with exceljs running on the host |
Specifier: @nodetool-ai/sandbox-xlsx. Import it at the top of the body.
exceljs is built on Node streams and ships its own zip layer; it will never be a guest module. This pack is a host module: the import resolves to a generated facade over NodeTool's own implementation.
import { parse } from "@nodetool-ai/sandbox-xlsx";
const bytes = await workspace.readBytes("report.xlsx");
const sheets = await parse(bytes); // { "Sheet1": [...], "Costs": [...] }
const rows = await parse(bytes, { sheet: "Costs" }); // one sheet's rows
return { sheetNames: Object.keys(sheets), rows };
Options: sheet (name — returns that sheet's rows directly) and header
(default true; false gives raw cell arrays). Formula cells yield their
computed result, dates come back as ISO strings, and rich text is flattened.
Get the bytes from workspace.readBytes, or from a fetched body with
await response.bytes().
import { write } from "@nodetool-ai/sandbox-xlsx";
const bytes = await write({ Costs: inputs.rows, Notes: [{ note: "draft" }] });
await workspace.writeBytes("report.xlsx", bytes);
{sheetName: rows} is the short form. The long form is an array, one entry per
sheet, which is where per-sheet options live:
const bytes = await write([
{
name: "Costs",
rows: inputs.rows,
columns: ["item", "usd"], // pin the column order
styles: [
{ range: "A1:B1", bold: true, background: "FFE9A8" },
{ range: "B2:B999", numberFormat: "$#,##0.00" }
]
}
]);
Rows are records by default, and the header is the union of their keys in
first-seen order unless columns pins it. header: false takes arrays of
cells instead and writes no header row. Column widths are fitted to the
content; pass { autoFitColumns: false } to leave them alone. A style's
range is A1 or A1:C20, and it takes bold, italic, size, color,
background (hex, with or without #) and numberFormat.
write caps a workbook at 64 sheets and 250 000 cells.write returns bytes; workspace.writeBytes
(or sandboxToAsset) is what puts them somewhere.