@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.
Files changed (66) hide show
  1. package/package.json +3 -3
  2. package/skills/document/SKILL.md +33 -45
  3. package/skills/document/bin/deck-build.cjs +10482 -272
  4. package/skills/document/bin/deck-chart.cjs +21 -12
  5. package/skills/document/bin/deck-plan.cjs +11654 -42
  6. package/skills/document/bin/deck-qa.cjs +95 -21
  7. package/skills/document/bin/deck-scenario.cjs +20 -3
  8. package/skills/document/bin/deck-styles.cjs +1604 -0
  9. package/skills/document/bin/doc-convert.cjs +182 -257
  10. package/skills/document/bin/doc-fill.cjs +140 -19
  11. package/skills/document/bin/doc-gen.cjs +1903 -281
  12. package/skills/document/bin/doc-validate.cjs +127 -52
  13. package/skills/document/bin/docx-defaults.cjs +9907 -0
  14. package/skills/document/bin/html2pptx.cjs +35949 -31972
  15. package/skills/document/bin/pdf-form.cjs +8 -0
  16. package/skills/document/bin/pdf-ops.cjs +8 -0
  17. package/skills/document/bin/pptx-notes.cjs +10038 -0
  18. package/skills/document/bin/pptx-tokenize.cjs +19 -4
  19. package/skills/document/bin/template-skin.cjs +10910 -0
  20. package/skills/document/bin-reference.md +15 -10
  21. package/skills/document/catalog.json +33 -32
  22. package/skills/document/content-pipeline.md +79 -44
  23. package/skills/document/deck-design.md +55 -32
  24. package/skills/document/generated-visuals.md +99 -0
  25. package/skills/document/layouts/MAINTAINERS.md +33 -0
  26. package/skills/document/layouts/README.md +20 -20
  27. package/skills/document/layouts/big-stat.tpl +1 -1
  28. package/skills/document/layouts/capacity.json +1 -1
  29. package/skills/document/layouts/cards-3.tpl +1 -1
  30. package/skills/document/layouts/chart-full.tpl +1 -1
  31. package/skills/document/layouts/chart-kpi.tpl +1 -1
  32. package/skills/document/layouts/comparison.tpl +1 -1
  33. package/skills/document/layouts/data-table.tpl +1 -1
  34. package/skills/document/layouts/funnel.tpl +1 -1
  35. package/skills/document/layouts/gantt.tpl +1 -1
  36. package/skills/document/layouts/hub-flow.tpl +4 -0
  37. package/skills/document/layouts/icon-row.tpl +1 -1
  38. package/skills/document/layouts/image-grid.tpl +1 -1
  39. package/skills/document/layouts/matrix-2x2.tpl +1 -1
  40. package/skills/document/layouts/mock-qa.tpl +4 -0
  41. package/skills/document/layouts/profiles.json +2 -2
  42. package/skills/document/layouts/pyramid.tpl +1 -1
  43. package/skills/document/layouts/radar.tpl +1 -1
  44. package/skills/document/layouts/ring-progress.tpl +1 -1
  45. package/skills/document/layouts/slots.json +1 -1
  46. package/skills/document/layouts/steps-vertical.tpl +1 -1
  47. package/skills/document/layouts/steps.tpl +1 -1
  48. package/skills/document/layouts/three-kpi.tpl +1 -1
  49. package/skills/document/layouts/timeline.tpl +1 -1
  50. package/skills/document/layouts/toc-panel.tpl +1 -1
  51. package/skills/document/layouts/two-kpi.tpl +2 -2
  52. package/skills/document/layouts/versus.tpl +1 -1
  53. package/skills/document/packs/README.md +1 -1
  54. package/skills/document/pdf.md +13 -0
  55. package/skills/document/rewrite.md +23 -8
  56. package/skills/document/scenarios.json +19 -2
  57. package/skills/document/scenarios.schema.json +1 -0
  58. package/skills/document/styles/_backdrops/rimlight.html +3 -2
  59. package/skills/document/styles/_contract-defaults.css +6 -1
  60. package/skills/document/styles/_samples/_groups/biz-premium.webp +0 -0
  61. package/skills/document/styles/_samples/mckinsey.webp +0 -0
  62. package/skills/document/styles/mckinsey/backdrop.html +7 -5
  63. package/skills/grill-me/SKILL.md +6 -0
  64. package/skills/grill-me/agents/openai.yaml +5 -0
  65. package/skills/grilling/SKILL.md +28 -0
  66. 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 JSZip() {
29837
- if (!(this instanceof JSZip)) {
29838
- return new JSZip();
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 JSZip();
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
- JSZip.prototype = require_object2();
29857
- JSZip.prototype.loadAsync = require_load2();
29858
- JSZip.support = require_support2();
29859
- JSZip.defaults = require_defaults2();
29860
- JSZip.version = "3.10.1";
29861
- JSZip.loadAsync = function(content, options) {
29862
- return new JSZip().loadAsync(content, options);
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
- JSZip.external = require_external();
29865
- module2.exports = JSZip;
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 JSZip = require_lib4();
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 JSZip();
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 JSZip = require_lib4();
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 JSZip.loadAsync(buffer);
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
- process.stdout.write(JSON.stringify({ ok: true, out, unfilled: result.unfilled }) + "\n");
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
  `);