@chalky/chalky 0.0.0-stage → 0.1.4

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.
Files changed (106) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +45 -2
  3. package/app/SYSTEM.md +31 -0
  4. package/app/extensions/appdata/README.md +10 -0
  5. package/app/extensions/appdata/guide.md +4 -0
  6. package/app/extensions/appdata/index.ts +47 -0
  7. package/app/extensions/boards/browser.js +357 -0
  8. package/app/extensions/boards/guide.md +4 -0
  9. package/app/extensions/boards/index.ts +98 -0
  10. package/app/extensions/commands/browser.js +13 -0
  11. package/app/extensions/commands/guide.md +3 -0
  12. package/app/extensions/commands/index.ts +96 -0
  13. package/app/extensions/doodle/README.md +15 -0
  14. package/app/extensions/doodle/browser.js +398 -0
  15. package/app/extensions/doodle/guide.md +6 -0
  16. package/app/extensions/doodle/index.ts +54 -0
  17. package/app/extensions/files/browser.js +96 -0
  18. package/app/extensions/files/guide.md +7 -0
  19. package/app/extensions/files/index.ts +73 -0
  20. package/app/extensions/frames/README.md +37 -0
  21. package/app/extensions/frames/browser.js +166 -0
  22. package/app/extensions/frames/guide.md +7 -0
  23. package/app/extensions/frames/index.ts +85 -0
  24. package/app/extensions/login/browser.js +363 -0
  25. package/app/extensions/login/index.ts +214 -0
  26. package/app/extensions/mcp/browser.js +64 -0
  27. package/app/extensions/mcp/guide.md +5 -0
  28. package/app/extensions/mcp/index.ts +64 -0
  29. package/app/extensions/model/index.ts +20 -0
  30. package/app/extensions/page/index.ts +96 -0
  31. package/app/extensions/page/page.html +615 -0
  32. package/app/extensions/point/README.md +22 -0
  33. package/app/extensions/point/browser.js +247 -0
  34. package/app/extensions/point/guide.md +6 -0
  35. package/app/extensions/point/index.ts +112 -0
  36. package/app/extensions/prompt/index.ts +19 -0
  37. package/app/extensions/reload/index.ts +21 -0
  38. package/app/extensions/screen/browser.js +76 -0
  39. package/app/extensions/screen/index.ts +80 -0
  40. package/app/extensions/steps/index.ts +17 -0
  41. package/app/extensions/swarm/README.md +47 -0
  42. package/app/extensions/swarm/guide.md +11 -0
  43. package/app/extensions/swarm/index.ts +304 -0
  44. package/app/extensions/ui/README.md +69 -0
  45. package/app/extensions/ui/agents.js +45 -0
  46. package/app/extensions/ui/browser.js +364 -0
  47. package/app/extensions/ui/components/App.js +28 -0
  48. package/app/extensions/ui/components/Button.js +28 -0
  49. package/app/extensions/ui/components/Card.js +23 -0
  50. package/app/extensions/ui/components/Column.js +17 -0
  51. package/app/extensions/ui/components/Markdown.js +37 -0
  52. package/app/extensions/ui/components/Row.js +17 -0
  53. package/app/extensions/ui/components/Table.js +31 -0
  54. package/app/extensions/ui/components/Text.js +19 -0
  55. package/app/extensions/ui/components/TextField.js +30 -0
  56. package/app/extensions/ui/guide.md +7 -0
  57. package/app/extensions/ui/index.ts +291 -0
  58. package/app/extensions/ui/skills/agent-apps/SKILL.md +91 -0
  59. package/app/extensions/ui/skills/ui-check/SKILL.md +71 -0
  60. package/app/extensions/ui/skills/ui-check/scripts/check.mjs +306 -0
  61. package/app/extensions/ui/skills/ui-design/SKILL.md +123 -0
  62. package/app/extensions/ui/voice.js +114 -0
  63. package/app/extensions/ui_history/browser.js +97 -0
  64. package/app/extensions/ui_history/index.ts +109 -0
  65. package/app/extensions/versions/browser.js +58 -0
  66. package/app/extensions/versions/index.ts +168 -0
  67. package/app/extensions/viewer/README.md +12 -0
  68. package/app/extensions/viewer/browser.js +322 -0
  69. package/app/extensions/viewer/guide.md +5 -0
  70. package/app/extensions/viewer/index.ts +209 -0
  71. package/app/extensions/voice/browser.js +71 -0
  72. package/app/extensions/voice/index.ts +37 -0
  73. package/app/mcp.json +3 -0
  74. package/app/settings.json +3 -0
  75. package/app/skills/plugin-map/SKILL.md +49 -0
  76. package/app/skills/write-skill/SKILL.md +57 -0
  77. package/app/ui/apps/.keep +0 -0
  78. package/bin/chalky.mjs +11 -0
  79. package/node_modules/xlsx/CHANGELOG.md +361 -0
  80. package/node_modules/xlsx/LICENSE +201 -0
  81. package/node_modules/xlsx/README.md +41 -0
  82. package/node_modules/xlsx/bin/xlsx.njs +310 -0
  83. package/node_modules/xlsx/bower.json +22 -0
  84. package/node_modules/xlsx/dist/LICENSE +201 -0
  85. package/node_modules/xlsx/dist/cpexcel.d.ts +39 -0
  86. package/node_modules/xlsx/dist/cpexcel.full.mjs +1502 -0
  87. package/node_modules/xlsx/dist/cpexcel.js +1506 -0
  88. package/node_modules/xlsx/dist/shim.min.js +2 -0
  89. package/node_modules/xlsx/dist/xlsx.core.min.js +18 -0
  90. package/node_modules/xlsx/dist/xlsx.core.min.map +1 -0
  91. package/node_modules/xlsx/dist/xlsx.extendscript.js +28259 -0
  92. package/node_modules/xlsx/dist/xlsx.full.min.js +24 -0
  93. package/node_modules/xlsx/dist/xlsx.full.min.map +1 -0
  94. package/node_modules/xlsx/dist/xlsx.mini.min.js +10 -0
  95. package/node_modules/xlsx/dist/xlsx.mini.min.map +1 -0
  96. package/node_modules/xlsx/dist/xlsx.zahl.js +4 -0
  97. package/node_modules/xlsx/dist/xlsx.zahl.mjs +2 -0
  98. package/node_modules/xlsx/dist/zahl.d.ts +4 -0
  99. package/node_modules/xlsx/package.json +183 -0
  100. package/node_modules/xlsx/types/index.d.ts +1065 -0
  101. package/node_modules/xlsx/types/tsconfig.json +15 -0
  102. package/node_modules/xlsx/xlsx.js +28103 -0
  103. package/node_modules/xlsx/xlsx.mjs +28228 -0
  104. package/node_modules/xlsx/xlsxworker.js +14 -0
  105. package/package.json +42 -4
  106. package/server.ts +281 -0
@@ -0,0 +1,37 @@
1
+ // Voice input: speech to text (port of the Python voice plugin). The browser half: a microphone button by the send
2
+ // button (browser.js) and /ui/voice.js, which apps can import too.
3
+ // Settings (environment, like MODEL_*): STT_BASE_URL, STT_MODEL, STT_API_KEY. With STT_BASE_URL set, audio goes to
4
+ // POST {STT_BASE_URL}/audio/transcriptions, OpenAI's endpoint, which most providers speak (OpenAI, Groq, Mistral,
5
+ // vLLM; others through LiteLLM). Without it, voice.js uses the browser's own speech recognition.
6
+ // The key stays here: apps are agent-written code, so they post audio to this server, never to the provider.
7
+ // GET /voice-api/config {"api": true | false}: whether audio can go to the API
8
+ // POST /voice-api/transcribe multipart: file (a complete audio file, e.g. chunk.webm), language?, prompt?
9
+ // -> {"text"} or {"error"} (with the provider's status)
10
+ import { Readable } from "node:stream";
11
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
12
+
13
+ const host = (globalThis as any).chalky;
14
+
15
+ export default function (_pi: ExtensionAPI) {
16
+ const base = (process.env.STT_BASE_URL || "").replace(/\/$/, "");
17
+ const json = (res: any, status: number, data: object) =>
18
+ res.writeHead(status, { "content-type": "application/json" }).end(JSON.stringify(data));
19
+
20
+ host.routes.set("/voice-api/config", (_req: any, res: any) => json(res, 200, { api: !!base }));
21
+
22
+ host.routes.set("/voice-api/transcribe", async (req: any, res: any) => {
23
+ if (!base) return json(res, 400, { error: "no STT_BASE_URL: use the browser's speech recognition" });
24
+ try {
25
+ // the page's form as is, plus the model (Node reads multipart itself: Request.formData)
26
+ const form = await new Request("http://local", { method: "POST", headers: req.headers,
27
+ body: Readable.toWeb(req) as any, duplex: "half" } as any).formData();
28
+ if (!(form.get("file") instanceof Blob)) return json(res, 400, { error: "no audio file" });
29
+ form.set("model", process.env.STT_MODEL || "whisper-1");
30
+ const r = await fetch(`${base}/audio/transcriptions`, { method: "POST", body: form,
31
+ headers: process.env.STT_API_KEY ? { authorization: `Bearer ${process.env.STT_API_KEY}` } : {} });
32
+ const data: any = await r.json().catch(() => ({}));
33
+ if (!r.ok) return json(res, 502, { error: `speech to text: ${r.status} ${data.error?.message ?? ""}`.trim() });
34
+ json(res, 200, { text: data.text ?? "" });
35
+ } catch (e: any) { json(res, 502, { error: `speech to text: ${e.message}` }); }
36
+ });
37
+ }
package/app/mcp.json ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "mcpServers": {}
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "compaction": { "keepRecentTokens": 20000 }
3
+ }
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: plugin-map
3
+ description: Find your way around your own code (the pi extensions in your code folder, the page among them) without reading whole files. Use before changing yourself, or before planning work for others that will.
4
+ ---
5
+ # Getting a map of your own code
6
+
7
+ Your code folder is the one your prompt names (it holds `extensions/`). Every feature is one extension, and every
8
+ extension is one folder, `extensions/<name>/`, holding all of that feature:
9
+
10
+ | File | What it is |
11
+ |---------------|--------------------------------------------------------------------|
12
+ | `index.ts` | the extension itself (pi loads it); starts with a header comment |
13
+ | `guide.md` | its short prompt section (the part you are reading in your own prompt) |
14
+ | `README.md` | the whole of what the guide says, read when the guide says |
15
+ | `browser.js` | its part of the page (the page extension loads every one it finds) |
16
+ | `skills/` | skills only this feature needs (its index.ts gives them to pi) |
17
+
18
+ An extension can have other files too (`ui/` has its components, `page/` has `page.html`). The headers are the
19
+ documentation, kept with the code, so read them before the code itself.
20
+
21
+ ## 1. The map: one line per extension
22
+ From your code folder:
23
+ ```
24
+ for d in extensions/*/; do printf '%-24s %s\n' "$d" "$(grep -m1 '^//' "$d/index.ts" | sed 's|^// \?||' | cut -c1-140)"; done
25
+ ```
26
+ Also there:
27
+ - `extensions/page/`: the page itself (`page.html`), its list of browser parts, and what serves them.
28
+ - `extensions/ui/components/*.js`: UI components, each starting with a comment line on what it is, then its
29
+ `about` block (props, levers, example; `head -20 <file>`).
30
+ - `skills/<name>/SKILL.md`: skills about you as a whole (this one); a feature's own skills are in its folder.
31
+ - `ui/`: what you built, not code: `surfaces.json` (the surfaces' design) and `apps/<name>/`.
32
+ - The host, `server.ts` one folder up: sessions, the web server, `globalThis.chalky`. Read its header; don't edit it.
33
+
34
+ ## 2. The headers of the extensions involved
35
+ ```
36
+ awk '/^import /{exit} 1' extensions/swarm/index.ts # everything above the imports
37
+ ```
38
+ Read only the headers of the extensions your work touches. All of them at once is over 13,000 characters.
39
+
40
+ ## 3. Then only the code you will change
41
+ Use `grep -n` to find the function, then `sed -n 'START,ENDp'` for that part. A whole file can be long
42
+ (swarm's index.ts is over 16,000 characters). If you are planning work for other agents, the headers are usually
43
+ enough: let each agent read the code it owns.
44
+
45
+ ## Keep the headers true
46
+ When you change what an extension provides (a tool, a route, a page message, an event, a host service), update
47
+ its header in the same change. Other agents, and you after a reload, rely on it. A new extension is a new folder
48
+ with an `index.ts` whose header starts with a one-line summary: that line is its entry in the map. After editing,
49
+ call the reload tool.
@@ -0,0 +1,57 @@
1
+ ---
2
+ name: write-skill
3
+ description: How to write or improve a skill (SKILL.md format, folder layout, a good description). Use when you want to save a method you worked out so you and other agents can reuse it, or when a skill is listed as broken.
4
+ ---
5
+ # Writing a skill
6
+
7
+ ## When a skill is worth it
8
+ - You worked out a method that wasn't obvious, and the task will come up again (here or in later runs).
9
+ - You hit a pitfall that cost time. Save the fix, not the story.
10
+ - Not for facts about the current project: those belong in the project's own files (e.g. CONTRACTS.md).
11
+ - One skill per kind of task. If one already covers it, improve that one instead of adding another.
12
+
13
+ ## Layout
14
+ ```
15
+ skills/<name>/ in your code folder (the one your prompt names, with extensions/ in it)
16
+ SKILL.md required: front matter + instructions
17
+ scripts/ optional: code to run (node or bash; python only if it is installed)
18
+ references/ optional: longer docs, read only when needed
19
+ assets/ optional: templates, data files
20
+ ```
21
+ A skill that only one feature needs goes in that extension's folder instead, `extensions/<name>/skills/<skill>/`
22
+ (as `extensions/ui/skills/`), and its `index.ts` gives the folder to pi:
23
+ `pi.on("resources_discover", () => ({ skillPaths: [path.join(import.meta.dirname, "skills")] }))`.
24
+
25
+ ## SKILL.md
26
+ ```markdown
27
+ ---
28
+ name: csv-report
29
+ description: Turns a CSV file into a summary report with totals per column. Use when the user gives a CSV and asks for a summary, report or totals.
30
+ ---
31
+ # CSV report
32
+ 1. Run `node scripts/report.mjs <file.csv>` (paths are relative to this skill's folder) to get the totals.
33
+ ...
34
+ ```
35
+ - `name`: exactly the folder's name. Lowercase letters, digits and single hyphens; at most 64 characters.
36
+ - `description`: at most 1024 characters. Say what it does AND when to use it, with the words a matching
37
+ task would contain. Agents decide whether to load the skill from this line alone, so it matters most.
38
+
39
+ ## Writing the body
40
+ - Write steps in the imperative ("Run …", "Check …"), with a short example of input and output.
41
+ - Explain why a step matters instead of shouting MUST: an agent that understands the reason handles
42
+ cases you didn't foresee. Keep it general, not tied to the one case you just solved.
43
+ - Work that must come out the same every time (parsing, checks, setup) goes in a script, not in prose.
44
+ Run the script once before saving it.
45
+ - Keep SKILL.md under ~500 lines. Move long material to references/ and say when to read each file.
46
+ A reference over ~300 lines gets a table of contents at the top.
47
+ - If the skill covers variants (e.g. several frameworks), keep the shared workflow in SKILL.md and one
48
+ reference per variant (references/react.md, references/vue.md), so only the relevant one is read.
49
+ - Refer to files by paths relative to the skill folder.
50
+ - No surprises: a skill does what its description says. Never put secrets (keys, passwords) in one.
51
+
52
+ ## After writing
53
+ - Call the reload tool: your skill list loads again when your turn ends, and the new skill shows in your prompt
54
+ (name, description and path; you read SKILL.md with read). If it doesn't show, its front matter is wrong.
55
+ - Read it once as a newcomer would: is anything only clear because you just did the work?
56
+ - Skills are shared, but another agent only sees a new skill after it reloads (tell it to call reload).
57
+ Tell the user what you added.
File without changes
package/bin/chalky.mjs ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ // chalky: starts Chalky from the installed package. Its home (app/, state/, workspace/) is CHALKY_HOME, else
3
+ // ~/.chalky; the first run copies the package's app/ there. Node won't run TypeScript under node_modules
4
+ // (ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING), so server.ts loads through jiti, as pi loads extensions.
5
+ // MODEL_BASE_URL=... MODEL_API_KEY=... [MODEL_NAME=...] chalky
6
+ import os from "node:os";
7
+ import path from "node:path";
8
+ import { createJiti } from "jiti";
9
+
10
+ process.env.CHALKY_HOME ??= path.join(os.homedir(), ".chalky");
11
+ await createJiti(import.meta.url).import(path.join(import.meta.dirname, "../server.ts"));
@@ -0,0 +1,361 @@
1
+ # CHANGELOG
2
+
3
+ This log is intended to keep track of backwards-incompatible changes, including
4
+ but not limited to API changes and file location changes. Minor behavioral
5
+ changes may not be included if they are not expected to break existing code.
6
+
7
+ ## v0.20.3
8
+
9
+ * Correct parsing of NUMBERS and ODS merge cells (h/t @s-ashwin)
10
+ * More precise treatment of infinite and NaN values
11
+ * XLML Streaming Write
12
+ * Parse `Int8Array` objects (for compatibility with JS engines in Java)
13
+ * CSV Export only quote leading ID (h/t @lako12)
14
+
15
+ ## v0.20.2
16
+
17
+ * Reworked parsing methods to avoid slow regexes (CVE-2024-22363)
18
+ * HTML properly encode data-v attribute
19
+ * SYLK read and write error cells
20
+
21
+ ## v0.20.1
22
+
23
+ * `init` use packaged test files to work around GitHub breaking changes
24
+ * SSF date code rounding to 15 decimal digits (h/t @davidtamaki)
25
+ * `sheet_to_json` force UTC interpretation for formatted strings (h/t @Blanay)
26
+ * QPW extract result of string formula
27
+ * XLSX parse non-compliant merge cell expressions
28
+ * NUMBERS correctly handle rows omitted from official exports
29
+ * DBF parse empty logical field (h/t @Roman91)
30
+ * `dense` option added to types
31
+ * package.json add mini and core scripts to export map (h/t @stof)
32
+
33
+ ## v0.20.0
34
+
35
+ * Use UTC interpretation of Date objects for date cells (potentially breaking)
36
+ * API functions support UTC and local time value interpretations
37
+ * Export `NaN` values to `#NUM!` and infinite values to `#DIV/0!`
38
+
39
+ ## v0.19.3
40
+
41
+ * XLSX Ensure comment address is valid (h/t @slonser)
42
+ * Enforce Excel worksheet name restrictions
43
+ * Fixed "Prototype Pollution" vulnerability (CVE-2023-30533)
44
+
45
+ ## v0.19.2
46
+
47
+ * XLSX proper decoding of hyperlinks (h/t @tw-yaxu)
48
+ * XLSX ignore unexpected attributes in rich text (h/t @colin4)
49
+ * `sheet_to_json` type fix (h/t @chsdwn)
50
+
51
+ ## v0.19.1
52
+
53
+ * Fixed types issue in strict mode (h/t @younes-io)
54
+ * Numbers 12.2 parsing skip ActivityStream.iwa
55
+
56
+ ## v0.19.0
57
+
58
+ * XLSX export hyperlinks compatible with google sheets (h/t Evan Bovie)
59
+ * NUMBERS export multiple sheets, full worksheet range
60
+ * formalized `dense` mode
61
+
62
+ ## v0.18.12
63
+
64
+ * `package.json` added types in `exports` structure
65
+ * uncapped NUMBERS single-sheet single-table export
66
+ * DBF export records using supported codepages
67
+
68
+ ## v0.18.11
69
+
70
+ * Base64 input ignore data URI wrapper
71
+ * Parse ZIP files that use ZIP64 extended information field
72
+ * More precise handling of time-only values
73
+ * Threaded Comment fallback text for older Excel
74
+
75
+ ## v0.18.10
76
+
77
+ * `exports` field in package.json to satiate ViteJS and newer tooling
78
+ * JSC (Safari / Bun) perf, see <https://bugs.webkit.org/show_bug.cgi?id=243148>
79
+ * workbook `bookType` property to denote the origin format when parsed from file
80
+ * XLSX force export of stub cells with number formats when `sheetStubs` is set
81
+
82
+ ## v0.18.9
83
+
84
+ * XLSX / ODS write defined names
85
+ * sync defined names to AutoFilter setting on export
86
+ * 1904 date system setting properly roundtripped
87
+ * ODS read/write number formats
88
+
89
+ ## v0.18.8
90
+
91
+ * Plaintext parsing of dateless meridien time values (`1:23:45 PM`)
92
+ * Legacy format (SYLK / WK# / Multiplan) minutiae
93
+
94
+ ## v0.18.7
95
+
96
+ * Normalized handling of `\r` and `\n` newline characters
97
+
98
+ ## v0.18.6
99
+
100
+ * Removed all npm dependencies
101
+ * Auto-correct bad Google Sheets format `d.m`
102
+ * NUMBERS write merge cells, cells up to column "ALL"
103
+
104
+ ## v0.18.5
105
+
106
+ * Enabled `sideEffects: false` in package.json
107
+ * Basic NUMBERS write support
108
+
109
+ ## v0.18.4
110
+
111
+ * CSV output omits trailing record separator
112
+ * Properly terminate NodeJS Streams
113
+ * DBF preserve column types on import and use when applicable on export
114
+
115
+ ## v0.18.3
116
+
117
+ * Removed references to `require` and `process` in browser builds
118
+
119
+ ## v0.18.2
120
+
121
+ * Hotfix for unicode processing of XLSX exports
122
+
123
+ ## v0.18.1
124
+
125
+ * Removed Node ESM build script and folded into standard ESM build
126
+ * Removed undocumented aliases including `make_formulae` and `get_formulae`
127
+
128
+ ## v0.18.0
129
+
130
+ * Browser scripts only expose `XLSX` variable
131
+ * Module no longer ships with `dist/jszip.js` browser script
132
+
133
+ ## v0.17.4
134
+
135
+ * CLI script moved to `xlsx-cli` package
136
+
137
+ ## v0.17.3
138
+
139
+ * `window.XLSX` explicit assignment to satiate LWC
140
+ * CSV Proper formatting of errors
141
+ * HTML emit data-\* attributes
142
+
143
+ ## v0.17.2
144
+
145
+ * Browser and Node optional ESM support
146
+ * DSV correct handling of bare quotes (h/t @bgamrat)
147
+
148
+ ## v0.17.1
149
+
150
+ * `XLSB` writer uses short cell form when viable
151
+
152
+ ## 0.17.0:
153
+
154
+ * mini build includes ODS parse/write support
155
+ * DBF explicitly cap worksheet to 1<<20 rows
156
+ * XLS throw errors on truncated records
157
+
158
+ ## v0.16.2
159
+
160
+ * Disabled `PRN` parsing by default (better support for CSV without delimeters)
161
+
162
+ ## v0.16.1
163
+
164
+ * skip empty custom property tags if data is absent (fixes DocSecurity issue)
165
+ * HTML output add raw value, type, number format
166
+ * DOM parse look for `v` / `t` / `z` attributes when determining value
167
+ * double quotes in properties escaped using `_x0022_`
168
+ * changed AMD structure for NetSuite and other RequireJS implementations
169
+ - `encode_cell` and `decode_cell` do not rely on `encode_col` / `decode_col`
170
+
171
+ ## v0.16.0
172
+
173
+ * Date handling changed
174
+ * XLML certain tag tests are now case insensitive
175
+ * Fixed potentially vulnerable regular expressions
176
+
177
+ ## v0.15.6
178
+
179
+ * CFB prevent infinite loop
180
+ * ODS empty cells marked as stub (type "z")
181
+ * `cellStyles` option implies `sheetStubs`
182
+
183
+ ## v0.15.5
184
+
185
+ * `sheets` parse option to specify which sheets to parse
186
+
187
+ ## v0.15.4
188
+
189
+ * AOA utilities properly preserve number formats
190
+ * Number formats captured in stub cells
191
+
192
+ ## v0.15.3
193
+
194
+ * Properties and Custom Properties properly XML-encoded
195
+
196
+ ## v0.15.2
197
+
198
+ - `sheet_get_cell` utility function
199
+ - `sheet_to_json` explicitly support `null` as alias for default behavior
200
+ - `encode_col` throw on negative column index
201
+ - HTML properly handle whitespace around tags in a run
202
+ - HTML use `id` option on write
203
+ - Files starting with `0x09` followed by a display character are now TSV files
204
+ - XLS parse references col/row indices mod by the correct number for BIFF ver
205
+ - XLSX comments moved to avoid overlapping cell
206
+ - XLSB outline level
207
+ - AutoFilter update `_FilterDatabase` defined name on write
208
+ - XLML skip CDATA blocks
209
+
210
+ ## v0.15.1 (2019-08-14)
211
+
212
+ * XLSX ignore XML artifacts
213
+ * HTML capture and persist merges
214
+
215
+ ## v0.15.0
216
+
217
+ * `dist/xlsx.mini.min.js` mini build with XLSX read/write and some utilities
218
+ * Removed legacy conversion utility functions
219
+
220
+ ## v0.14.5
221
+
222
+ * XLS PtgNameX lookup
223
+ * XLS always create stub cells for blank cells with comments
224
+
225
+
226
+ ## v0.14.4
227
+
228
+ * Better treatment of `skipHidden` in CSV output
229
+ * Ignore CLSID in XLS
230
+ * SYLK 7-bit character encoding
231
+ * SYLK and DBF codepage support
232
+
233
+ ## v0.14.3
234
+
235
+ * Proper shifting of addresses in Shared Formulae
236
+
237
+ ## v0.14.2
238
+
239
+ * Proper XML encoding of comments
240
+
241
+ ## v0.14.1
242
+
243
+ * raw cell objects can be passed to `sheet_add_aoa`
244
+ * `_FilterDatabase` fix for AutoFilter-related crashes
245
+ * `stream.to_json` doesn't end up accidentally scanning to max row
246
+
247
+ ## 0.14.0 (2018-09-06)
248
+
249
+ * `sheet_to_json` default flipped to `raw: true`
250
+
251
+ ## 0.13.5 (2018-08-25)
252
+
253
+ * HTML output generates `<br/>` instead of encoded newline character
254
+
255
+ ## 0.13.2 (2018-07-08)
256
+
257
+ * Buffer.from shim replaced, will not be defined in node `<=0.12`
258
+
259
+ ## 0.13.0 (2018-06-01)
260
+
261
+ * Library reshaped to support AMD out of the box
262
+
263
+ ## 0.12.11 (2018-04-27)
264
+
265
+ * XLS/XLSX/XLSB range truncation (errors in `WTF` mode)
266
+
267
+ ## 0.12.4 (2018-03-04)
268
+
269
+ * `JSZip` renamed to `JSZipSync`
270
+
271
+ ## 0.12.0 (2018-02-08)
272
+
273
+ * Extendscript target script in NPM package
274
+
275
+ ## 0.11.19 (2018-02-03)
276
+
277
+ * Error on empty workbook
278
+
279
+ ## 0.11.16 (2017-12-30)
280
+
281
+ * XLS ANSI/CP separation
282
+ * 'array' write type and ArrayBuffer processing
283
+
284
+ ## 0.11.6 (2017-10-16)
285
+
286
+ * Semicolon-delimited files are detected
287
+
288
+ ## 0.11.5 (2017-09-30)
289
+
290
+ * Bower main script shifted to full version
291
+ * 'binary' / 'string' encoding
292
+
293
+ ## 0.11.3 (2017-08-19)
294
+
295
+ * XLS cell ixfe/XF removed
296
+
297
+ ## 0.11.0 (2017-07-31)
298
+
299
+ * Strip `require` statements from minified version
300
+ * minifier mangler enabled
301
+
302
+ ## 0.10.9 (2017-07-28)
303
+
304
+ * XLML/HTML resolution logic looks further into the data stream to decide type
305
+ * Errors thrown on suspected RTF files
306
+
307
+ ## 0.10.5 (2017-06-09)
308
+
309
+ * HTML Table output header/footer should not include `<table>` tag
310
+
311
+ ## 0.10.2 (2017-05-16)
312
+
313
+ * Dates are converted to numbers by default (set `cellDates:true` to emit Dates)
314
+ * Module does not export CFB
315
+
316
+ ## 0.9.10 (2017-04-08)
317
+
318
+ * `--perf` renamed to `--read-only`
319
+
320
+ ## 0.9.9 (2017-04-03)
321
+
322
+ * default output format changed to XLSB
323
+ * comment text line endings are now normalized
324
+ * errors thrown on write when worksheets have invalid names
325
+
326
+ ## 0.9.7 (2017-03-28)
327
+
328
+ * XLS legacy `!range` field removed
329
+ * Hyperlink tooltip is stored in the `Tooltip` field
330
+
331
+ ## 0.9.6 (2017-03-25)
332
+
333
+ * `sheet_to_json` now passes `null` values when `raw` is set to `true`
334
+ * `sheet_to_json` treats `null` stub cells as values in conjunction with `raw`
335
+
336
+ ## 0.9.5 (2017-03-22)
337
+
338
+ * `cellDates` affects parsing in non-XLSX formats
339
+
340
+ ## 0.9.3 (2017-03-15)
341
+
342
+ * XLML property names are more closely mapped to the XLSX equivalent
343
+ * Stub cells are now cell type `z`
344
+
345
+ ## 0.9.2 (2017-03-13)
346
+
347
+ * Removed stale TypeScript definition files. Flowtype comments are used in the
348
+ `xlsx.flow.js` source and stripped to produce `xlsx.js`.
349
+ * sed usage reworked to support GNU sed in-place form. BSD sed seems to work,
350
+ but the build script has not been tested on other sed variants:
351
+
352
+ ```bash
353
+ $ sed -i.ext [...] # GNU
354
+ $ sed -i .ext [...] # bsd
355
+ ```
356
+
357
+ ## 0.9.0 (2017-03-09)
358
+
359
+ * Removed ods.js source. The xlsx.js source absorbed the ODS logic and exposes
360
+ the ODS variable, so projects should remove references to ods.js
361
+