@taloswork/ose-shared 0.1.12 → 0.1.13
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.
- package/package.json +3 -3
- package/skills/document/SKILL.md +33 -45
- package/skills/document/bin/deck-build.cjs +10482 -272
- package/skills/document/bin/deck-chart.cjs +21 -12
- package/skills/document/bin/deck-plan.cjs +11654 -42
- package/skills/document/bin/deck-qa.cjs +95 -21
- package/skills/document/bin/deck-scenario.cjs +20 -3
- package/skills/document/bin/deck-styles.cjs +1604 -0
- package/skills/document/bin/doc-convert.cjs +182 -257
- package/skills/document/bin/doc-fill.cjs +140 -19
- package/skills/document/bin/doc-gen.cjs +1903 -281
- package/skills/document/bin/doc-validate.cjs +127 -52
- package/skills/document/bin/docx-defaults.cjs +9907 -0
- package/skills/document/bin/html2pptx.cjs +35949 -31972
- package/skills/document/bin/pdf-form.cjs +8 -0
- package/skills/document/bin/pdf-ops.cjs +8 -0
- package/skills/document/bin/pptx-notes.cjs +10038 -0
- package/skills/document/bin/pptx-tokenize.cjs +19 -4
- package/skills/document/bin/template-skin.cjs +10910 -0
- package/skills/document/bin-reference.md +15 -10
- package/skills/document/catalog.json +33 -32
- package/skills/document/content-pipeline.md +79 -44
- package/skills/document/deck-design.md +55 -32
- package/skills/document/generated-visuals.md +99 -0
- package/skills/document/layouts/MAINTAINERS.md +33 -0
- package/skills/document/layouts/README.md +20 -20
- package/skills/document/layouts/big-stat.tpl +1 -1
- package/skills/document/layouts/capacity.json +1 -1
- package/skills/document/layouts/cards-3.tpl +1 -1
- package/skills/document/layouts/chart-full.tpl +1 -1
- package/skills/document/layouts/chart-kpi.tpl +1 -1
- package/skills/document/layouts/comparison.tpl +1 -1
- package/skills/document/layouts/data-table.tpl +1 -1
- package/skills/document/layouts/funnel.tpl +1 -1
- package/skills/document/layouts/gantt.tpl +1 -1
- package/skills/document/layouts/hub-flow.tpl +4 -0
- package/skills/document/layouts/icon-row.tpl +1 -1
- package/skills/document/layouts/image-grid.tpl +1 -1
- package/skills/document/layouts/matrix-2x2.tpl +1 -1
- package/skills/document/layouts/mock-qa.tpl +4 -0
- package/skills/document/layouts/profiles.json +2 -2
- package/skills/document/layouts/pyramid.tpl +1 -1
- package/skills/document/layouts/radar.tpl +1 -1
- package/skills/document/layouts/ring-progress.tpl +1 -1
- package/skills/document/layouts/slots.json +1 -1
- package/skills/document/layouts/steps-vertical.tpl +1 -1
- package/skills/document/layouts/steps.tpl +1 -1
- package/skills/document/layouts/three-kpi.tpl +1 -1
- package/skills/document/layouts/timeline.tpl +1 -1
- package/skills/document/layouts/toc-panel.tpl +1 -1
- package/skills/document/layouts/two-kpi.tpl +2 -2
- package/skills/document/layouts/versus.tpl +1 -1
- package/skills/document/packs/README.md +1 -1
- package/skills/document/pdf.md +13 -0
- package/skills/document/rewrite.md +23 -8
- package/skills/document/scenarios.json +19 -2
- package/skills/document/scenarios.schema.json +1 -0
- package/skills/document/styles/_backdrops/rimlight.html +3 -2
- package/skills/document/styles/_contract-defaults.css +6 -1
- package/skills/document/styles/_samples/_groups/biz-premium.webp +0 -0
- package/skills/document/styles/_samples/mckinsey.webp +0 -0
- package/skills/document/styles/mckinsey/backdrop.html +7 -5
- package/skills/grill-me/SKILL.md +6 -0
- package/skills/grill-me/agents/openai.yaml +5 -0
- package/skills/grilling/SKILL.md +28 -0
- package/skills/grilling/agents/openai.yaml +3 -0
|
@@ -29833,9 +29833,9 @@ var require_load2 = __commonJS({
|
|
|
29833
29833
|
var require_lib4 = __commonJS({
|
|
29834
29834
|
"node_modules/jszip/lib/index.js"(exports2, module2) {
|
|
29835
29835
|
"use strict";
|
|
29836
|
-
function
|
|
29837
|
-
if (!(this instanceof
|
|
29838
|
-
return new
|
|
29836
|
+
function JSZip2() {
|
|
29837
|
+
if (!(this instanceof JSZip2)) {
|
|
29838
|
+
return new JSZip2();
|
|
29839
29839
|
}
|
|
29840
29840
|
if (arguments.length) {
|
|
29841
29841
|
throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");
|
|
@@ -29844,7 +29844,7 @@ var require_lib4 = __commonJS({
|
|
|
29844
29844
|
this.comment = null;
|
|
29845
29845
|
this.root = "";
|
|
29846
29846
|
this.clone = function() {
|
|
29847
|
-
var newObj = new
|
|
29847
|
+
var newObj = new JSZip2();
|
|
29848
29848
|
for (var i in this) {
|
|
29849
29849
|
if (typeof this[i] !== "function") {
|
|
29850
29850
|
newObj[i] = this[i];
|
|
@@ -29853,16 +29853,16 @@ var require_lib4 = __commonJS({
|
|
|
29853
29853
|
return newObj;
|
|
29854
29854
|
};
|
|
29855
29855
|
}
|
|
29856
|
-
|
|
29857
|
-
|
|
29858
|
-
|
|
29859
|
-
|
|
29860
|
-
|
|
29861
|
-
|
|
29862
|
-
return new
|
|
29856
|
+
JSZip2.prototype = require_object2();
|
|
29857
|
+
JSZip2.prototype.loadAsync = require_load2();
|
|
29858
|
+
JSZip2.support = require_support2();
|
|
29859
|
+
JSZip2.defaults = require_defaults2();
|
|
29860
|
+
JSZip2.version = "3.10.1";
|
|
29861
|
+
JSZip2.loadAsync = function(content, options) {
|
|
29862
|
+
return new JSZip2().loadAsync(content, options);
|
|
29863
29863
|
};
|
|
29864
|
-
|
|
29865
|
-
module2.exports =
|
|
29864
|
+
JSZip2.external = require_external();
|
|
29865
|
+
module2.exports = JSZip2;
|
|
29866
29866
|
}
|
|
29867
29867
|
});
|
|
29868
29868
|
|
|
@@ -32776,7 +32776,7 @@ var require_browser_buffer_encode = __commonJS({
|
|
|
32776
32776
|
var require_zip_stream = __commonJS({
|
|
32777
32777
|
"node_modules/exceljs/lib/utils/zip-stream.js"(exports2, module2) {
|
|
32778
32778
|
var events = require("events");
|
|
32779
|
-
var
|
|
32779
|
+
var JSZip2 = require_lib4();
|
|
32780
32780
|
var StreamBuf = require_stream_buf();
|
|
32781
32781
|
var { stringToBuffer } = require_browser_buffer_encode();
|
|
32782
32782
|
var ZipWriter = class extends events.EventEmitter {
|
|
@@ -32789,7 +32789,7 @@ var require_zip_stream = __commonJS({
|
|
|
32789
32789
|
},
|
|
32790
32790
|
options
|
|
32791
32791
|
);
|
|
32792
|
-
this.zip = new
|
|
32792
|
+
this.zip = new JSZip2();
|
|
32793
32793
|
this.stream = new StreamBuf();
|
|
32794
32794
|
}
|
|
32795
32795
|
append(data, options) {
|
|
@@ -44469,7 +44469,7 @@ var require_theme1 = __commonJS({
|
|
|
44469
44469
|
var require_xlsx = __commonJS({
|
|
44470
44470
|
"node_modules/exceljs/lib/xlsx/xlsx.js"(exports2, module2) {
|
|
44471
44471
|
var fs = require("fs");
|
|
44472
|
-
var
|
|
44472
|
+
var JSZip2 = require_lib4();
|
|
44473
44473
|
var { PassThrough } = require_readable2();
|
|
44474
44474
|
var ZipStream = require_zip_stream();
|
|
44475
44475
|
var StreamBuf = require_stream_buf();
|
|
@@ -44708,7 +44708,7 @@ var require_xlsx = __commonJS({
|
|
|
44708
44708
|
tables: {},
|
|
44709
44709
|
vmlDrawings: {}
|
|
44710
44710
|
};
|
|
44711
|
-
const zip = await
|
|
44711
|
+
const zip = await JSZip2.loadAsync(buffer);
|
|
44712
44712
|
for (const entry of Object.values(zip.files)) {
|
|
44713
44713
|
if (!entry.dir) {
|
|
44714
44714
|
let entryName = entry.name;
|
|
@@ -88983,6 +88983,8 @@ function fillOfficeTemplate(bytes, data, opts = {}) {
|
|
|
88983
88983
|
throw new Error(`not a readable OOXML file: ${e.message}`);
|
|
88984
88984
|
}
|
|
88985
88985
|
const unfilled = /* @__PURE__ */ new Set();
|
|
88986
|
+
const restNames = /* @__PURE__ */ new Set();
|
|
88987
|
+
data = expandPptxLines(zip, data, restNames);
|
|
88986
88988
|
let doc;
|
|
88987
88989
|
try {
|
|
88988
88990
|
doc = new import_docxtemplater.default(zip, {
|
|
@@ -89005,7 +89007,7 @@ function fillOfficeTemplate(bytes, data, opts = {}) {
|
|
|
89005
89007
|
// record it so the caller can report what was left blank.
|
|
89006
89008
|
nullGetter(part) {
|
|
89007
89009
|
if (part.value)
|
|
89008
|
-
unfilled.add(part.value);
|
|
89010
|
+
unfilled.add(restNames.has(part.value) ? part.value.slice(0, -"_rest".length) : part.value);
|
|
89009
89011
|
return "";
|
|
89010
89012
|
}
|
|
89011
89013
|
});
|
|
@@ -89016,6 +89018,50 @@ function fillOfficeTemplate(bytes, data, opts = {}) {
|
|
|
89016
89018
|
const out = doc.getZip().generate({ type: "nodebuffer", compression: "DEFLATE" });
|
|
89017
89019
|
return { bytes: new Uint8Array(out), unfilled: [...unfilled] };
|
|
89018
89020
|
}
|
|
89021
|
+
var PPTX_SLIDE = /^ppt\/slides\/slide\d+\.xml$/;
|
|
89022
|
+
var SOLE_TOKEN_PARA = /^<a:p>((?:<a:pPr\b[^>]*(?:\/>|>[\s\S]*?<\/a:pPr>))?)<a:r>((?:<a:rPr\b[^>]*(?:\/>|>[\s\S]*?<\/a:rPr>))?)<a:t>\{\{([\w.]+)\}\}<\/a:t><\/a:r><\/a:p>$/;
|
|
89023
|
+
function expandPptxLines(zip, data, restNames) {
|
|
89024
|
+
const out = { ...data };
|
|
89025
|
+
for (const name of Object.keys(zip.files)) {
|
|
89026
|
+
if (!PPTX_SLIDE.test(name))
|
|
89027
|
+
continue;
|
|
89028
|
+
const xml = zip.file(name).asText();
|
|
89029
|
+
const paras = xml.match(/<a:p>[\s\S]*?<\/a:p>/g) ?? [];
|
|
89030
|
+
let next = xml;
|
|
89031
|
+
for (let i = 0; i < paras.length; i++) {
|
|
89032
|
+
const m = SOLE_TOKEN_PARA.exec(paras[i]);
|
|
89033
|
+
if (!m)
|
|
89034
|
+
continue;
|
|
89035
|
+
const tok = m[3];
|
|
89036
|
+
const restM = SOLE_TOKEN_PARA.exec(paras[i + 1] ?? "");
|
|
89037
|
+
const hasRest = !!restM && restM[3] === `${tok}_rest`;
|
|
89038
|
+
const v = data[tok];
|
|
89039
|
+
if (hasRest)
|
|
89040
|
+
restNames.add(`${tok}_rest`);
|
|
89041
|
+
if (v === void 0 || v === null)
|
|
89042
|
+
continue;
|
|
89043
|
+
const lines = typeof v === "string" && v.includes("\n") ? v.split(/\r?\n/) : null;
|
|
89044
|
+
if (!lines && !hasRest)
|
|
89045
|
+
continue;
|
|
89046
|
+
const make = (para, from, key, text) => {
|
|
89047
|
+
out[key] = text;
|
|
89048
|
+
return para.replace(`{{${from}}}`, `{{${key}}}`);
|
|
89049
|
+
};
|
|
89050
|
+
const parts = [];
|
|
89051
|
+
const all = lines ?? [typeof v === "string" ? v : v == null ? "" : String(v)];
|
|
89052
|
+
all.forEach((line, k) => {
|
|
89053
|
+
const useRest = hasRest && k > 0;
|
|
89054
|
+
parts.push(make(useRest ? paras[i + 1] : paras[i], useRest ? `${tok}_rest` : tok, `${tok}__${k}`, line));
|
|
89055
|
+
});
|
|
89056
|
+
next = next.replace(paras[i] + (hasRest ? paras[i + 1] : ""), parts.join(""));
|
|
89057
|
+
if (hasRest)
|
|
89058
|
+
i++;
|
|
89059
|
+
}
|
|
89060
|
+
if (next !== xml)
|
|
89061
|
+
zip.file(name, next);
|
|
89062
|
+
}
|
|
89063
|
+
return out;
|
|
89064
|
+
}
|
|
89019
89065
|
function templateError(e) {
|
|
89020
89066
|
const err = e;
|
|
89021
89067
|
const inner = err.properties?.errors;
|
|
@@ -89073,6 +89119,65 @@ async function fillXlsxTemplate(bytes, data) {
|
|
|
89073
89119
|
return { bytes: new Uint8Array(out), unfilled: [...unfilled] };
|
|
89074
89120
|
}
|
|
89075
89121
|
|
|
89122
|
+
// packages/core/dist/document/template-residue.js
|
|
89123
|
+
var import_jszip = __toESM(require_lib4(), 1);
|
|
89124
|
+
|
|
89125
|
+
// packages/core/dist/document/ooxml-util.js
|
|
89126
|
+
function unescXml(s) {
|
|
89127
|
+
return s.replace(/&(amp|lt|gt|quot|apos|#x?[0-9a-fA-F]+);/g, (whole, code) => {
|
|
89128
|
+
switch (code) {
|
|
89129
|
+
case "amp":
|
|
89130
|
+
return "&";
|
|
89131
|
+
case "lt":
|
|
89132
|
+
return "<";
|
|
89133
|
+
case "gt":
|
|
89134
|
+
return ">";
|
|
89135
|
+
case "quot":
|
|
89136
|
+
return '"';
|
|
89137
|
+
case "apos":
|
|
89138
|
+
return "'";
|
|
89139
|
+
default: {
|
|
89140
|
+
const n = code.startsWith("#x") || code.startsWith("#X") ? parseInt(code.slice(2), 16) : parseInt(code.slice(1), 10);
|
|
89141
|
+
return Number.isInteger(n) && n >= 0 && n <= 1114111 ? String.fromCodePoint(n) : whole;
|
|
89142
|
+
}
|
|
89143
|
+
}
|
|
89144
|
+
});
|
|
89145
|
+
}
|
|
89146
|
+
|
|
89147
|
+
// packages/core/dist/document/template-residue.js
|
|
89148
|
+
function residueOf(templateTexts, outputTexts, fixed) {
|
|
89149
|
+
const out = new Set(outputTexts.map((t) => t.trim()));
|
|
89150
|
+
return [...new Set(templateTexts.map((t) => t.trim()))].filter((t) => [...t].length >= 8 && !fixed.has(t) && out.has(t));
|
|
89151
|
+
}
|
|
89152
|
+
async function pptxSlideParagraphs(bytes) {
|
|
89153
|
+
const zip = await import_jszip.default.loadAsync(Buffer.from(bytes));
|
|
89154
|
+
const names = Object.keys(zip.files).map((p) => ({ p, n: /^ppt\/slides\/slide(\d+)\.xml$/.exec(p)?.[1] })).filter((x) => Boolean(x.n)).sort((a, b) => Number(a.n) - Number(b.n));
|
|
89155
|
+
const slides = [];
|
|
89156
|
+
for (const { p } of names) {
|
|
89157
|
+
const xml = await zip.file(p).async("string");
|
|
89158
|
+
const paras = [];
|
|
89159
|
+
for (const m of xml.matchAll(/<a:p\b[^>]*>[\s\S]*?<\/a:p>/g)) {
|
|
89160
|
+
let t = "";
|
|
89161
|
+
for (const r of m[0].matchAll(/<a:t\b[^>]*>([\s\S]*?)<\/a:t>/g))
|
|
89162
|
+
t += unescXml(r[1]);
|
|
89163
|
+
if (t.trim())
|
|
89164
|
+
paras.push(t.trim());
|
|
89165
|
+
}
|
|
89166
|
+
slides.push(paras);
|
|
89167
|
+
}
|
|
89168
|
+
return slides;
|
|
89169
|
+
}
|
|
89170
|
+
var MIN_SLIDES = 3;
|
|
89171
|
+
function fixedTexts(slides, ratio = 0.8) {
|
|
89172
|
+
if (slides.length < MIN_SLIDES)
|
|
89173
|
+
return /* @__PURE__ */ new Set();
|
|
89174
|
+
const count = /* @__PURE__ */ new Map();
|
|
89175
|
+
for (const s of slides)
|
|
89176
|
+
for (const t of new Set(s))
|
|
89177
|
+
count.set(t, (count.get(t) ?? 0) + 1);
|
|
89178
|
+
return new Set([...count].filter(([, c]) => slides.length > 0 && c / slides.length >= ratio).map(([t]) => t));
|
|
89179
|
+
}
|
|
89180
|
+
|
|
89076
89181
|
// apps/admin/data/skills.lib/document/bin-src/doc-fill.mjs
|
|
89077
89182
|
function die(msg, code = 1) {
|
|
89078
89183
|
process.stderr.write(`doc-fill: ${msg}
|
|
@@ -89100,7 +89205,23 @@ async function main() {
|
|
|
89100
89205
|
die(e.message);
|
|
89101
89206
|
}
|
|
89102
89207
|
await (0, import_promises.writeFile)(out, Buffer.from(result.bytes)).catch((e) => die(`cannot write ${out}: ${e.message}`));
|
|
89103
|
-
|
|
89208
|
+
let residue;
|
|
89209
|
+
if (ext === ".pptx") {
|
|
89210
|
+
try {
|
|
89211
|
+
const tplSlides = await pptxSlideParagraphs(bytes);
|
|
89212
|
+
const outSlides = await pptxSlideParagraphs(result.bytes);
|
|
89213
|
+
residue = residueOf(tplSlides.flat(), outSlides.flat(), fixedTexts(tplSlides));
|
|
89214
|
+
} catch (e) {
|
|
89215
|
+
residue = null;
|
|
89216
|
+
process.stderr.write(`doc-fill: residue check skipped: ${e.message}
|
|
89217
|
+
`);
|
|
89218
|
+
}
|
|
89219
|
+
}
|
|
89220
|
+
process.stdout.write(JSON.stringify({ ok: true, out, unfilled: result.unfilled, residue }) + "\n");
|
|
89221
|
+
if (residue && residue.length) {
|
|
89222
|
+
process.stderr.write(`doc-fill: ${residue.length} sentence(s) of the template's own content are still in the deck \u2014 replace or delete them before delivering
|
|
89223
|
+
`);
|
|
89224
|
+
}
|
|
89104
89225
|
if (result.unfilled.length) {
|
|
89105
89226
|
process.stderr.write(`doc-fill: left ${result.unfilled.length} placeholder(s) blank: ${result.unfilled.join(", ")}
|
|
89106
89227
|
`);
|