@taloswork/ose-shared 0.1.10 → 0.1.12

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 (126) hide show
  1. package/package.json +3 -3
  2. package/skills/document/SKILL.md +143 -215
  3. package/skills/document/art-directions/base.css +27 -2
  4. package/skills/document/art-directions/cinematic-depth.css +3 -1
  5. package/skills/document/art-directions/collage-paper.css +5 -1
  6. package/skills/document/art-directions/editorial-cut.css +5 -1
  7. package/skills/document/art-directions/geometric-pop.css +6 -0
  8. package/skills/document/art-directions/gradient-mesh.css +5 -1
  9. package/skills/document/art-directions/illustrated-doodle.css +5 -0
  10. package/skills/document/art-directions/luxury-ornament.css +4 -1
  11. package/skills/document/art-directions/maximalist-blocks.css +6 -0
  12. package/skills/document/art-directions/technical-grid.css +4 -0
  13. package/skills/document/assets/fonts/fonts.json +2 -2
  14. package/skills/document/assets/pdf-fonts/NotoSansSC-PDF-Bold.ttf +0 -0
  15. package/skills/document/assets/pdf-fonts/NotoSansSC-PDF-Regular.ttf +0 -0
  16. package/skills/document/assets/pdf-fonts/OFL.txt +93 -0
  17. package/skills/document/assets/pdf-fonts/README.md +35 -0
  18. package/skills/document/assets/tessdata/LICENSE-Apache-2.0.txt +202 -0
  19. package/skills/document/assets/tessdata/README.md +21 -0
  20. package/skills/document/assets/tessdata/chi_sim.traineddata.gz +0 -0
  21. package/skills/document/assets/tessdata/eng.traineddata.gz +0 -0
  22. package/skills/document/bin/deck-build.cjs +2311 -41
  23. package/skills/document/bin/deck-chart.cjs +762 -0
  24. package/skills/document/bin/deck-plan.cjs +802 -0
  25. package/skills/document/bin/deck-qa.cjs +984 -249
  26. package/skills/document/bin/deck-scenario.cjs +1346 -0
  27. package/skills/document/bin/doc-convert.cjs +130 -39
  28. package/skills/document/bin/doc-fill.cjs +73121 -170
  29. package/skills/document/bin/doc-gen.cjs +625 -68
  30. package/skills/document/bin/doc-run.cjs +162 -24
  31. package/skills/document/bin/doc-scan.cjs +13 -0
  32. package/skills/document/bin/doc-text.cjs +13 -0
  33. package/skills/document/bin/doc-validate.cjs +718 -23
  34. package/skills/document/bin/doc-xml.cjs +9 -5
  35. package/skills/document/bin/docx-annotate.cjs +95 -19
  36. package/skills/document/bin/fontkit.cjs +1 -0
  37. package/skills/document/bin/html2pptx.cjs +1372 -121
  38. package/skills/document/bin/ocr-worker.cjs +1 -0
  39. package/skills/document/bin/ocr.cjs +131 -40
  40. package/skills/document/bin/pdf-form.cjs +674 -177
  41. package/skills/document/bin/pdf-images.cjs +13 -0
  42. package/skills/document/bin/pdf-ops.cjs +634 -199
  43. package/skills/document/bin/pdf-render.cjs +19 -3
  44. package/skills/document/bin/pdf-tables.cjs +13 -0
  45. package/skills/document/bin/pptx-clone.cjs +3 -3
  46. package/skills/document/bin/pptx-slide.cjs +3 -3
  47. package/skills/document/bin/xlsx-query.cjs +192 -61
  48. package/skills/document/bin-reference.md +56 -33
  49. package/skills/document/content-pipeline.md +129 -242
  50. package/skills/document/deck-design.md +355 -638
  51. package/skills/document/layouts/README.md +46 -33
  52. package/skills/document/layouts/capacity.json +1 -0
  53. package/skills/document/layouts/slots.json +1 -1
  54. package/skills/document/layouts/toc-panel.tpl +1 -1
  55. package/skills/document/motion/README.md +3 -2
  56. package/skills/document/office.md +3 -3
  57. package/skills/document/packs/board-brief/backdrop.html +2 -0
  58. package/skills/document/packs/board-brief/pack.css +2 -1
  59. package/skills/document/packs/mckinsey-photo/backdrop.html +2 -0
  60. package/skills/document/packs/mckinsey-photo/pack.css +2 -1
  61. package/skills/document/packs/press-room/backdrop.html +2 -0
  62. package/skills/document/packs/press-room/pack.css +2 -1
  63. package/skills/document/packs/prismatic-3d/backdrop.html +2 -0
  64. package/skills/document/packs/prismatic-3d/pack.css +4 -1
  65. package/skills/document/pdf.md +53 -49
  66. package/skills/document/rewrite.md +241 -308
  67. package/skills/document/scenarios.json +1290 -0
  68. package/skills/document/scenarios.schema.json +103 -0
  69. package/skills/document/styles/README.md +15 -25
  70. package/skills/document/styles/_contract-defaults.css +25 -1
  71. package/skills/document/styles/anthropic/skin.css +6 -3
  72. package/skills/document/styles/apple/skin.css +4 -3
  73. package/skills/document/styles/bistro-warm/backdrop.html +2 -0
  74. package/skills/document/styles/bistro-warm/skin.css +4 -1
  75. package/skills/document/styles/black-gold/skin.css +6 -5
  76. package/skills/document/styles/bold-clash/backdrop.html +2 -0
  77. package/skills/document/styles/bold-clash/skin.css +2 -1
  78. package/skills/document/styles/branding/skin.css +4 -4
  79. package/skills/document/styles/campus-teal/backdrop.html +2 -0
  80. package/skills/document/styles/campus-teal/skin.css +2 -1
  81. package/skills/document/styles/cinereel/skin.css +7 -3
  82. package/skills/document/styles/clinic-care/backdrop.html +2 -0
  83. package/skills/document/styles/clinic-care/skin.css +2 -1
  84. package/skills/document/styles/cool/skin.css +6 -5
  85. package/skills/document/styles/dark-glass/backdrop.html +2 -0
  86. package/skills/document/styles/dark-glass/skin.css +2 -1
  87. package/skills/document/styles/gov-brief/backdrop.html +2 -0
  88. package/skills/document/styles/gov-brief/skin.css +2 -1
  89. package/skills/document/styles/grid-tech/backdrop.html +2 -0
  90. package/skills/document/styles/grid-tech/skin.css +2 -1
  91. package/skills/document/styles/hand-drawn/skin.css +3 -3
  92. package/skills/document/styles/ivory-gold/skin.css +7 -6
  93. package/skills/document/styles/legal-slate/backdrop.html +2 -0
  94. package/skills/document/styles/legal-slate/skin.css +2 -1
  95. package/skills/document/styles/magazine-ink/skin.css +4 -3
  96. package/skills/document/styles/mckinsey/skin.css +2 -1
  97. package/skills/document/styles/memphis/backdrop.html +2 -0
  98. package/skills/document/styles/memphis/skin.css +2 -1
  99. package/skills/document/styles/mono/skin.css +6 -2
  100. package/skills/document/styles/neon-cyber/backdrop.html +2 -0
  101. package/skills/document/styles/neon-cyber/skin.css +2 -1
  102. package/skills/document/styles/olive-gold/skin.css +7 -6
  103. package/skills/document/styles/organic-earth/backdrop.html +2 -0
  104. package/skills/document/styles/organic-earth/skin.css +2 -1
  105. package/skills/document/styles/pastel-saas/backdrop.html +2 -0
  106. package/skills/document/styles/pastel-saas/skin.css +2 -1
  107. package/skills/document/styles/portfolio-noir/backdrop.html +2 -0
  108. package/skills/document/styles/portfolio-noir/skin.css +2 -1
  109. package/skills/document/styles/retro-press/backdrop.html +2 -0
  110. package/skills/document/styles/retro-press/skin.css +2 -1
  111. package/skills/document/styles/sport-arena/backdrop.html +2 -0
  112. package/skills/document/styles/sport-arena/skin.css +4 -1
  113. package/skills/document/styles/swiss-grid/skin.css +10 -5
  114. package/skills/document/styles/wedding-blush/backdrop.html +2 -0
  115. package/skills/document/styles/wedding-blush/skin.css +4 -1
  116. package/skills/document/theme-system.md +85 -77
  117. package/skills/document/themes/README.md +7 -5
  118. package/skills/document/vision.md +8 -5
  119. package/skills/document/xlsx.md +15 -25
  120. package/skills/cozy-static-svg/SKILL.md +0 -76
  121. package/skills/cozy-static-svg/references/approved-preview.png +0 -0
  122. package/skills/cozy-static-svg/references/cross-platform.md +0 -73
  123. package/skills/cozy-static-svg/references/moon_keeps_watch.svg +0 -229
  124. package/skills/cozy-static-svg/references/style-anchor.md +0 -271
  125. package/skills/cozy-static-svg/scripts/artkit.py +0 -321
  126. package/skills/cozy-static-svg/scripts/to_png.py +0 -333
@@ -1 +1 @@
1
- {"banner-columns":{"slots":["banner","col1_title","b1","b2","col2_title","b3","b4","col3_title","b5"],"chart":false},"bento":{"slots":["eyebrow","title","big_title","big_num","big_unit","big_body","card1_title","card1_body","card2_title","card2_body","card3_title","card3_body","card4_title","card4_body","footer","pageno"],"chart":false},"big-stat":{"slots":["eyebrow","title","stat","unit","lead","note","footer","pageno"],"chart":false},"blocks-2x2":{"slots":["eyebrow","title","intro","block1_title","block1_body","block2_title","block2_body","block3_title","block3_body","block4_title","block4_body","quote","quote_attr","refs","footer","pageno"],"chart":false},"brand-values":{"slots":["eyebrow","title","footer","pageno"],"rows":{"values":["name","body"]},"chart":false},"business-model":{"slots":["eyebrow","title","tag","stream1_label","stream1_value","stream1_body","stream2_label","stream2_value","stream2_body","stream3_label","stream3_value","stream3_body","econ1_label","econ1","econ2_label","econ2","footer","pageno"],"chart":false},"cards-3":{"slots":["eyebrow","title","card1_title","card1_body","card2_title","card2_body","card3_title","card3_body","footer","pageno"],"chart":false},"cards-grid":{"slots":["eyebrow","title","card1_title","card1_body","card2_title","card2_body","card3_title","card3_body","card4_title","card4_body","card5_title","card5_body","card6_title","card6_body","footer","pageno"],"chart":false},"chart-full":{"slots":["eyebrow","title","lead","source","footer","pageno"],"chart":true},"chart-kpi":{"slots":["eyebrow","title","kpi1_num","kpi1_unit","kpi1_label","kpi2_num","kpi2_unit","kpi2_label","footer","pageno"],"chart":true},"color-palette":{"slots":["eyebrow","title","footer","pageno"],"rows":{"swatches":["name","hex"]},"chart":false},"comparison":{"slots":["eyebrow","title","colA_title","dim1","colA_v1","dim2","colA_v2","dim3","colA_v3","badge","colB_title","colB_v1","colB_v2","colB_v3","colC_title","colC_v1","colC_v2","colC_v3","footer","pageno"],"chart":false},"concept-hub":{"slots":["eyebrow","title","center_title","center_body","node1_title","node1_body","node2_title","node2_body","node3_title","node3_body","node4_title","node4_body","footer","pageno"],"chart":false},"cover-centered":{"slots":["eyebrow","title","subtitle","meta"],"chart":false},"cover-image":{"slots":["image_label","eyebrow","title","subtitle"],"chart":false},"cover-minimal":{"slots":["title","subtitle","meta"],"chart":false},"cover-statement":{"slots":["eyebrow","statement","meta"],"chart":false},"cover":{"slots":["eyebrow","title","subtitle","presenter","date"],"chart":false},"customer-proof":{"slots":["eyebrow","title","quote","person","role","metric1_label","metric1","metric2_label","metric2","logo1","logo2","logo3","logo4","footer","pageno"],"chart":false},"data-table":{"slots":["eyebrow","title","col0","col1","col2","col3","r1_key","r1c1","r1c2","r1c3","r2_key","r2c1","r2c2","r2c3","r3_key","r3c1","r3c2","r3c3","r4_key","r4c1","r4c2","r4c3","footer","pageno"],"chart":false},"dos-donts":{"slots":["eyebrow","do_head","do1","do2","do3","do4","dont_head","dont1","dont2","dont3","dont4","footer","pageno"],"chart":false},"editorial-panel":{"slots":["eyebrow","title","lead1","lead2","quote","quote_attr","card1_title","card1_body","card2_title","card2_body","card3_title","card3_body","card4_title","card4_body","list_title","list1","list2","list3","list4","note"],"chart":false},"ending-contact":{"slots":["eyebrow","title","email","phone","web","addr"],"chart":false},"ending":{"slots":["eyebrow","title","sub","contact"],"chart":false},"funding-ask":{"slots":["eyebrow","round","ask","runway","title","use1","pct1","use2","pct2","use3","pct3","footer","pageno"],"chart":false},"funnel":{"slots":["eyebrow","title","s1_label","s1_val","s2_label","s2_val","s3_label","s3_val","s4_label","s4_val","rate_label","rate","footer","pageno"],"chart":false},"gantt":{"slots":["eyebrow","title","footer","pageno"],"rows":{"cols":["label"],"tasks":["name","from","to"]},"chart":false},"hero":{"slots":["eyebrow","title","sub"],"chart":false},"icon-row":{"slots":["eyebrow","title","item1_title","item1_body","item2_title","item2_body","item3_title","item3_body","item4_title","item4_body","footer","pageno"],"chart":false},"image-full":{"slots":["image_label","eyebrow","title","caption","pageno"],"chart":false},"image-grid":{"slots":["eyebrow","title","img1_label","img1_title","img1_body","img2_label","img2_title","img2_body","img3_label","img3_title","img3_body","footer","pageno"],"chart":false},"image-left":{"slots":["eyebrow","title","image_label","card1_title","card1_body","card2_title","card2_body","card3_title","card3_body","footer","pageno"],"chart":false},"list":{"slots":["eyebrow","title","item1_title","item1_desc","item2_title","item2_desc","item3_title","item3_desc","item4_title","item4_desc","footer","pageno"],"chart":false},"logo-guidelines":{"slots":["eyebrow","title","wordmark","tagline","v1_label","v2_label","v3_label","footer","pageno"],"chart":false},"map-distribution":{"slots":["eyebrow","title","footer","pageno"],"rows":{"pins":["x","y"],"regions":["name","pct"]},"chart":false},"map-quad":{"slots":["title","q1_num","q1_unit","q1_label","q1_note","q2_num","q2_unit","q2_label","q2_note","q3_num","q3_unit","q3_label","q3_note","q4_num","q4_unit","q4_label","q4_note","footer","pageno"],"chart":false},"market-rings":{"slots":["eyebrow","title","body","growth","tam_label","tam","sam_label","sam","som_label","som","footer","pageno"],"chart":false},"matrix-2x2":{"slots":["eyebrow","title","q1_title","q1_body","q2_title","q2_body","q3_title","q3_body","q4_title","q4_body","footer","pageno"],"chart":false},"numbered-brief":{"slots":["title","para1","para2","quote","source","right_title","item1_title","item2_title","item3_title","item4_title","source_label","source_note","pageno"],"chart":false},"org-tree":{"slots":["eyebrow","title","top","dept1_title","dept1_body","dept2_title","dept2_body","dept3_title","dept3_body","footer","pageno"],"chart":false},"pitch-problem":{"slots":["eyebrow","title","stat_label","stat","stat_note","point1_title","point1_body","point2_title","point2_body","point3_title","point3_body","footer","pageno"],"chart":false},"pitch-solution":{"slots":["badge","title","lead","pillar1_title","pillar1_body","pillar2_title","pillar2_body","pillar3_title","pillar3_body","footer","pageno"],"chart":false},"pricing-tiers":{"slots":["eyebrow","title","tier1","price1","unit1","tier1_title","tier1_body","featured","tier2","price2","unit2","tier2_title","tier2_body","tier3","price3","unit3","tier3_title","tier3_body","footer","pageno"],"chart":false},"problem-solution-banner":{"slots":["problem_label","problem_body","image_label","solution_body","solution_label"],"chart":false},"problem-solution":{"slots":["eyebrow","title","problem_title","problem_1","problem_2","problem_3","solution_title","solution_1","solution_2","solution_3","footer","pageno"],"chart":false},"product-device":{"slots":["eyebrow","title","body","feature1","feature2","feature3","media_label","screen_title","screen_note","footer","pageno"],"chart":false},"pyramid":{"slots":["eyebrow","title","level1","level2","level3","level4","footer","pageno"],"chart":false},"quote-aside":{"slots":["quote","source","footer","pageno"],"chart":false},"quote":{"slots":["eyebrow","quote","source","footer","pageno"],"chart":false},"radar":{"slots":["eyebrow","title","footer","pageno"],"rows":{"metrics":["name","score"]},"chart":"derived"},"ring-progress":{"slots":["eyebrow","title","footer","pageno"],"rows":{"rings":["label","pct","note"]},"chart":false},"section-fullbleed":{"slots":["image_label","desc","index","title"],"chart":false},"section-image":{"slots":["index","eyebrow","title","desc","image_label","footer","pageno"],"chart":false},"section-stat":{"slots":["eyebrow","title","desc","stat","unit","stat_label","footer","pageno"],"chart":false},"section":{"slots":["index","eyebrow","title","desc","footer","pageno"],"chart":false},"split-two-col":{"slots":["eyebrow","title","card1_title","card1_body","card2_title","card2_body","card3_title","card3_body","image_label","footer","pageno"],"chart":false},"stats-chart":{"slots":["brand1","brand2","brand3","title","note"],"chart":true},"steps-serpentine":{"slots":["eyebrow","title","step1_title","step1_body","step2_title","step2_body","step3_title","step3_body","step4_title","step4_body","step5_title","step5_body","step6_title","step6_body","step7_title","step7_body","step8_title","step8_body"],"chart":false},"steps-vertical":{"slots":["eyebrow","title","footer","pageno"],"rows":{"steps":["name","body"]},"chart":false},"steps":{"slots":["eyebrow","title","step1_title","step1_body","step2_title","step2_body","step3_title","step3_body","step4_title","step4_body","footer","pageno"],"chart":false},"team-founders":{"slots":["eyebrow","title","lead","f1_initials","f1_name","f1_role","f1_bio","f2_initials","f2_name","f2_role","f2_bio","f3_initials","f3_name","f3_role","f3_bio","footer","pageno"],"chart":false},"team-row":{"slots":["eyebrow","title","footer","pageno"],"rows":{"members":["name","role"]},"chart":false},"three-kpi":{"slots":["eyebrow","title","kpi1_num","kpi1_unit","kpi1_name","kpi1_desc","kpi2_num","kpi2_unit","kpi2_name","kpi2_desc","kpi3_num","kpi3_unit","kpi3_name","kpi3_desc","footer","pageno"],"chart":false},"timeline":{"slots":["eyebrow","title","item1_date","item1_title","item1_desc","item2_date","item2_title","item2_desc","item3_date","item3_title","item3_desc","item4_date","item4_title","item4_desc","footer","pageno"],"chart":false},"title-meta":{"slots":["index","eyebrow","title","subtitle","meta"],"chart":false},"title":{"slots":["eyebrow","title"],"chart":false},"toc-agenda":{"slots":["eyebrow","title","item1_title","item1_dur","item2_title","item2_dur","item3_title","item3_dur","item4_title","item4_dur","item5_title","item5_dur","footer","pageno"],"chart":false},"toc-editorial":{"slots":["item1_title","item1_desc","item2_title","item2_desc","item3_title","item3_desc","item4_title","item4_desc","title","desc","footer","pageno"],"chart":false},"toc-panel":{"slots":["brand1","brand2","brand3","title"],"rows":{"entries":["name","desc"]},"chart":false},"toc":{"slots":["eyebrow","title","item1_title","item1_desc","item2_title","item2_desc","item3_title","item3_desc","item4_title","item4_desc","footer","pageno"],"chart":false},"traction-milestones":{"slots":["eyebrow","title","metric1_label","metric1","metric2_label","metric2","metric3_label","metric3","m1_date","m1","m2_date","m2","m3_date","m3","m4_date","m4","footer","pageno"],"chart":false},"transition":{"slots":["eyebrow","number","title"],"chart":false},"two-kpi":{"slots":["eyebrow","title","kpi1_num","kpi1_unit","kpi1_label","kpi2_num","kpi2_unit","kpi2_label","footer","pageno"],"chart":false},"type-specimen":{"slots":["eyebrow","title","specimen","font_name","weights","heading_label","heading_sample","body_label","body_sample","charset","footer","pageno"],"chart":false},"versus":{"slots":["eyebrow","title","before_title","before_num","before_body","after_title","after_num","after_body","footer","pageno"],"chart":false}}
1
+ {"banner-columns":{"slots":["banner","col1_title","b1","b2","col2_title","b3","b4","col3_title","b5"],"chart":false},"bento":{"slots":["eyebrow","title","big_title","big_num","big_unit","big_body","card1_title","card1_body","card2_title","card2_body","card3_title","card3_body","card4_title","card4_body","footer","pageno"],"chart":false},"big-stat":{"slots":["eyebrow","title","stat","unit","lead","note","footer","pageno"],"chart":false},"blocks-2x2":{"slots":["eyebrow","title","intro","block1_title","block1_body","block2_title","block2_body","block3_title","block3_body","block4_title","block4_body","quote","quote_attr","refs","footer","pageno"],"chart":false},"brand-values":{"slots":["eyebrow","title","footer","pageno"],"rows":{"values":["name","body"]},"chart":false},"business-model":{"slots":["eyebrow","title","tag","stream1_label","stream1_value","stream1_body","stream2_label","stream2_value","stream2_body","stream3_label","stream3_value","stream3_body","econ1_label","econ1","econ2_label","econ2","footer","pageno"],"chart":false},"cards-3":{"slots":["eyebrow","title","card1_title","card1_body","card2_title","card2_body","card3_title","card3_body","footer","pageno"],"chart":false},"cards-grid":{"slots":["eyebrow","title","card1_title","card1_body","card2_title","card2_body","card3_title","card3_body","card4_title","card4_body","card5_title","card5_body","card6_title","card6_body","footer","pageno"],"chart":false},"chart-full":{"slots":["eyebrow","title","lead","source","footer","pageno"],"chart":true},"chart-kpi":{"slots":["eyebrow","title","kpi1_num","kpi1_unit","kpi1_label","kpi2_num","kpi2_unit","kpi2_label","footer","pageno"],"chart":true},"color-palette":{"slots":["eyebrow","title","footer","pageno"],"rows":{"swatches":["name","hex"]},"chart":false},"comparison":{"slots":["eyebrow","title","colA_title","dim1","colA_v1","dim2","colA_v2","dim3","colA_v3","badge","colB_title","colB_v1","colB_v2","colB_v3","colC_title","colC_v1","colC_v2","colC_v3","footer","pageno"],"chart":false},"concept-hub":{"slots":["eyebrow","title","center_title","center_body","node1_title","node1_body","node2_title","node2_body","node3_title","node3_body","node4_title","node4_body","footer","pageno"],"chart":false},"cover-centered":{"slots":["eyebrow","title","subtitle","meta"],"chart":false},"cover-image":{"slots":["image_label","eyebrow","title","subtitle"],"chart":false},"cover-minimal":{"slots":["title","subtitle","meta"],"chart":false},"cover-statement":{"slots":["eyebrow","statement","meta"],"chart":false},"cover":{"slots":["eyebrow","title","subtitle","presenter","date"],"chart":false},"customer-proof":{"slots":["eyebrow","title","quote","person","role","metric1_label","metric1","metric2_label","metric2","logo1","logo2","logo3","logo4","footer","pageno"],"chart":false},"data-table":{"slots":["eyebrow","title","col0","col1","col2","col3","r1_key","r1c1","r1c2","r1c3","r2_key","r2c1","r2c2","r2c3","r3_key","r3c1","r3c2","r3c3","r4_key","r4c1","r4c2","r4c3","footer","pageno"],"chart":false},"dos-donts":{"slots":["eyebrow","do_head","do1","do2","do3","do4","dont_head","dont1","dont2","dont3","dont4","footer","pageno"],"chart":false},"editorial-panel":{"slots":["eyebrow","title","lead1","lead2","quote","quote_attr","card1_title","card1_body","card2_title","card2_body","card3_title","card3_body","card4_title","card4_body","list_title","list1","list2","list3","list4","note"],"chart":false},"ending-contact":{"slots":["eyebrow","title","email","phone","web","addr"],"chart":false},"ending":{"slots":["eyebrow","title","sub","contact"],"chart":false},"funding-ask":{"slots":["eyebrow","round","ask","runway","title","use1","pct1","use2","pct2","use3","pct3","footer","pageno"],"chart":false},"funnel":{"slots":["eyebrow","title","s1_label","s1_val","s2_label","s2_val","s3_label","s3_val","s4_label","s4_val","rate_label","rate","footer","pageno"],"chart":false},"gantt":{"slots":["eyebrow","title","footer","pageno"],"rows":{"cols":["label"],"tasks":["name","from","to"]},"chart":false},"hero":{"slots":["eyebrow","title","sub"],"chart":false},"icon-row":{"slots":["eyebrow","title","item1_title","item1_body","item2_title","item2_body","item3_title","item3_body","item4_title","item4_body","footer","pageno"],"chart":false},"image-full":{"slots":["image_label","eyebrow","title","caption","pageno"],"chart":false},"image-grid":{"slots":["eyebrow","title","img1_label","img1_title","img1_body","img2_label","img2_title","img2_body","img3_label","img3_title","img3_body","footer","pageno"],"chart":false},"image-left":{"slots":["eyebrow","title","image_label","card1_title","card1_body","card2_title","card2_body","card3_title","card3_body","footer","pageno"],"chart":false},"list":{"slots":["eyebrow","title","item1_title","item1_desc","item2_title","item2_desc","item3_title","item3_desc","item4_title","item4_desc","footer","pageno"],"chart":false},"logo-guidelines":{"slots":["eyebrow","title","wordmark","tagline","v1_label","v2_label","v3_label","footer","pageno"],"chart":false},"map-distribution":{"slots":["eyebrow","title","footer","pageno"],"rows":{"pins":["x","y"],"regions":["name","pct"]},"chart":false},"map-quad":{"slots":["title","q1_num","q1_unit","q1_label","q1_note","q2_num","q2_unit","q2_label","q2_note","q3_num","q3_unit","q3_label","q3_note","q4_num","q4_unit","q4_label","q4_note","footer","pageno"],"chart":false},"market-rings":{"slots":["eyebrow","title","body","growth","tam_label","tam","sam_label","sam","som_label","som","footer","pageno"],"chart":false},"matrix-2x2":{"slots":["eyebrow","title","q1_title","q1_body","q2_title","q2_body","q3_title","q3_body","q4_title","q4_body","footer","pageno"],"chart":false},"numbered-brief":{"slots":["title","para1","para2","quote","source","right_title","item1_title","item2_title","item3_title","item4_title","source_label","source_note","pageno"],"chart":false},"org-tree":{"slots":["eyebrow","title","top","dept1_title","dept1_body","dept2_title","dept2_body","dept3_title","dept3_body","footer","pageno"],"chart":false},"pitch-problem":{"slots":["eyebrow","title","stat_label","stat","stat_note","point1_title","point1_body","point2_title","point2_body","point3_title","point3_body","footer","pageno"],"chart":false},"pitch-solution":{"slots":["badge","title","lead","pillar1_title","pillar1_body","pillar2_title","pillar2_body","pillar3_title","pillar3_body","footer","pageno"],"chart":false},"pricing-tiers":{"slots":["eyebrow","title","tier1","price1","unit1","tier1_title","tier1_body","featured","tier2","price2","unit2","tier2_title","tier2_body","tier3","price3","unit3","tier3_title","tier3_body","footer","pageno"],"chart":false},"problem-solution-banner":{"slots":["problem_label","problem_body","image_label","solution_body","solution_label"],"chart":false},"problem-solution":{"slots":["eyebrow","title","problem_title","problem_1","problem_2","problem_3","solution_title","solution_1","solution_2","solution_3","footer","pageno"],"chart":false},"product-device":{"slots":["eyebrow","title","body","feature1","feature2","feature3","media_label","screen_title","screen_note","footer","pageno"],"chart":false},"pyramid":{"slots":["eyebrow","title","level1","level2","level3","level4","footer","pageno"],"chart":false},"quote-aside":{"slots":["quote","source","footer","pageno"],"chart":false},"quote":{"slots":["eyebrow","quote","source","footer","pageno"],"chart":false},"radar":{"slots":["eyebrow","title","footer","pageno"],"rows":{"metrics":["name","score"]},"chart":"derived"},"ring-progress":{"slots":["eyebrow","title","footer","pageno"],"rows":{"rings":["label","pct","note"]},"chart":false},"section-fullbleed":{"slots":["image_label","desc","index","title"],"chart":false},"section-image":{"slots":["index","eyebrow","title","desc","image_label","footer","pageno"],"chart":false},"section-stat":{"slots":["eyebrow","title","desc","stat","unit","stat_label","footer","pageno"],"chart":false},"section":{"slots":["index","eyebrow","title","desc","footer","pageno"],"chart":false},"split-two-col":{"slots":["eyebrow","title","card1_title","card1_body","card2_title","card2_body","card3_title","card3_body","image_label","footer","pageno"],"chart":false},"stats-chart":{"slots":["brand1","brand2","brand3","title","note"],"chart":true},"steps-serpentine":{"slots":["eyebrow","title","step1_title","step1_body","step2_title","step2_body","step3_title","step3_body","step4_title","step4_body","step5_title","step5_body","step6_title","step6_body","step7_title","step7_body","step8_title","step8_body"],"chart":false},"steps-vertical":{"slots":["eyebrow","title","footer","pageno"],"rows":{"steps":["name","body"]},"chart":false},"steps":{"slots":["eyebrow","title","step1_title","step1_body","step2_title","step2_body","step3_title","step3_body","step4_title","step4_body","footer","pageno"],"chart":false},"team-founders":{"slots":["eyebrow","title","lead","f1_initials","f1_name","f1_role","f1_bio","f2_initials","f2_name","f2_role","f2_bio","f3_initials","f3_name","f3_role","f3_bio","footer","pageno"],"chart":false},"team-row":{"slots":["eyebrow","title","footer","pageno"],"rows":{"members":["name","role"]},"chart":false},"three-kpi":{"slots":["eyebrow","title","kpi1_num","kpi1_unit","kpi1_name","kpi1_desc","kpi2_num","kpi2_unit","kpi2_name","kpi2_desc","kpi3_num","kpi3_unit","kpi3_name","kpi3_desc","footer","pageno"],"chart":false},"timeline":{"slots":["eyebrow","title","item1_date","item1_title","item1_desc","item2_date","item2_title","item2_desc","item3_date","item3_title","item3_desc","item4_date","item4_title","item4_desc","footer","pageno"],"chart":false},"title-meta":{"slots":["index","eyebrow","title","subtitle","meta"],"chart":false},"title":{"slots":["eyebrow","title"],"chart":false},"toc-agenda":{"slots":["eyebrow","title","item1_title","item1_dur","item2_title","item2_dur","item3_title","item3_dur","item4_title","item4_dur","item5_title","item5_dur","footer","pageno"],"chart":false},"toc-editorial":{"slots":["item1_title","item1_desc","item2_title","item2_desc","item3_title","item3_desc","item4_title","item4_desc","title","desc","footer","pageno"],"chart":false},"toc-panel":{"slots":["brand1","brand2","brand3","image_label","title"],"rows":{"entries":["name","desc"]},"chart":false},"toc":{"slots":["eyebrow","title","item1_title","item1_desc","item2_title","item2_desc","item3_title","item3_desc","item4_title","item4_desc","footer","pageno"],"chart":false},"traction-milestones":{"slots":["eyebrow","title","metric1_label","metric1","metric2_label","metric2","metric3_label","metric3","m1_date","m1","m2_date","m2","m3_date","m3","m4_date","m4","footer","pageno"],"chart":false},"transition":{"slots":["eyebrow","number","title"],"chart":false},"two-kpi":{"slots":["eyebrow","title","kpi1_num","kpi1_unit","kpi1_label","kpi2_num","kpi2_unit","kpi2_label","footer","pageno"],"chart":false},"type-specimen":{"slots":["eyebrow","title","specimen","font_name","weights","heading_label","heading_sample","body_label","body_sample","charset","footer","pageno"],"chart":false},"versus":{"slots":["eyebrow","title","before_title","before_num","before_body","after_title","after_num","after_body","footer","pageno"],"chart":false}}
@@ -1,7 +1,7 @@
1
1
  <!-- layouts/toc-panel — structure-only. role=toc. 左大标题+插图 / 右深色面板目录. rows.entries{name,desc} — 3–5 chapters spread down the panel. -->
2
2
  <section class="slide" data-layout="toc-panel" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div>
3
3
  <div class="toc-topbar" style="position:absolute;left:80px;right:80px;top:34px;display:flex;justify-content:space-between;align-items:center;font-size:calc(15px * var(--type-scale,1));font-weight:700"><span class="toc-brand">{{brand1|公司名称}}</span><span class="toc-brand">{{brand2|战略评审}}</span><span class="toc-brand">{{brand3|2026-03-15}}</span></div>
4
- <div class="surface" style="position:absolute;left:calc(96px * var(--space-scale,1));top:150px;width:300px;height:280px;display:flex;align-items:center;justify-content:center;border-radius:var(--card-radius)"><span class="surface-label" style="font-size:calc(14px * var(--type-scale,1))">插图占位</span></div>
4
+ <div class="surface" style="position:absolute;left:calc(96px * var(--space-scale,1));top:150px;width:300px;height:280px;display:flex;align-items:center;justify-content:center;border-radius:var(--card-radius)"><span class="surface-label" style="font-size:calc(14px * var(--type-scale,1))">{{image_label|插图占位}}</span></div>
5
5
  <h1 class="cover-title" style="position:absolute;left:calc(92px * var(--space-scale,1));top:456px;font-size:calc(76px * var(--type-scale,1));line-height:1.02;letter-spacing:-1px">{{title|目录}}</h1>
6
6
  <div class="panel" style="position:absolute;left:700px;right:80px;top:96px;bottom:56px;border-radius:var(--card-radius);padding:56px 60px;display:flex;flex-direction:column;justify-content:space-between">
7
7
  {{#entries}}<div class="panel-item"><div class="panel-item-title" style="font-size:calc(30px * var(--type-scale,1));font-weight:800;letter-spacing:.5px">{{name|占位章节}}</div><p class="panel-item-desc" style="font-size:calc(19px * var(--type-scale,1));margin-top:8px">{{desc|简述本节要讨论的内容。}}</p></div>{{/entries}}
@@ -25,7 +25,8 @@ cover · zoom · split · morph。
25
25
  ## 烤字的族不能给标题派入场
26
26
 
27
27
  把标题烤进背景图的族(`--talos-bake:1`),那些字到 pptx 里是扁平像素,挂在其上的
28
- `data-anim` 会被**静默丢弃**。`deck-layouts.test.ts` 的闸门 6 硬管这条:黑金/橄榄金/
29
- 奶油青铜/奶油珊瑚/纸感手绘/黑白胶片/暖米绿意这 7 个族的预设因此只派给 `.cover-sub`
28
+ `data-anim` 会被**静默丢弃**。`deck-layouts.test.ts` 的闸门 6 硬管这条:凡是 skin.css
29
+ 给标题写了 `--talos-bake:1` 的族(黑金、橄榄金、奶油青铜、奶油珊瑚、纸感手绘、黑白胶片、
30
+ 暖米绿意,以及多数生成族),预设只派给 `.cover-sub`
30
31
  `.card` `.stat-lead` 这类仍是文字的元素。落地当天它真的响过两次(`organic-earth` 与
31
32
  一次针对本目录预设的变异验证)。
@@ -12,9 +12,9 @@ prompt carries a `delivery="file"` pointer at that sidecar. So:
12
12
 
13
13
  - **Generate** a .docx → `doc-gen` (read **rewrite.md**); a deck → the deck path
14
14
  (SKILL.md → deck-design.md; `doc-gen` makes no decks).
15
- - **Edit** an existing .docx / .pptx → **rewrite.md**: `doc-xml replace` for text,
16
- `doc-fill` for `{{tokens}}`, `pptx-slide` / `pptx-clone` for slides,
17
- `docx-annotate` for comments and tracked changes.
15
+ - **Edit** an existing .docx / .pptx → **rewrite.md**: `doc-xml replace` for .docx
16
+ text (.pptx text: `doc-fill` tokens or raw XML), `doc-fill` for `{{tokens}}`,
17
+ `pptx-slide` / `pptx-clone` for slides, `docx-annotate` for comments and tracked changes.
18
18
  - Everything visual (a diagram/chart that matters) → if you can see images, look
19
19
  at the original (see vision.md).
20
20
 
@@ -1,4 +1,6 @@
1
1
  <!-- generated by scripts/ppt-tpl/gen-skin.mjs — signature: corner-marks -->
2
2
  <div style="position:absolute;inset:0;background:#F4FAFF"></div>
3
+ <div class="sig-layer" data-signature="corner-marks" style="position:absolute;inset:0;pointer-events:none">
3
4
  <div style="position:absolute;left:56px;top:56px;border-left:2px solid var(--accent);border-top:2px solid var(--accent);width:34px;height:34px;pointer-events:none"></div>
4
5
  <div style="position:absolute;right:56px;bottom:56px;border-right:2px solid var(--accent);border-bottom:2px solid var(--accent);width:34px;height:34px;pointer-events:none"></div>
6
+ </div>
@@ -2,7 +2,7 @@
2
2
  手改会在下次生成时丢失:要改就改 family.json。 */
3
3
  :root{
4
4
  --space-scale:0.96; --type-scale:0.94;
5
- --accent:#075F8B; --c1:#075F8B; --c2:#634E8E; --c3:#913C61; --c4:#8E4430; --chart-1:#075F8B;
5
+ --accent:#075F8B; --c1:#075F8B; --c2:#634E8E; --c3:#913C61; --c4:#8E4430; --chart-1:#075F8B; --series-1:#075F8B; --series-2:#8570B3; --series-3:#76234A; --series-4:#9E533E;
6
6
  --title:#202930; --body:#4B5156; --muted:#767D82; --foot:#767D82;
7
7
  --hair:#C8D3DC; --card-radius:4px;
8
8
  --font-head:'Archivo','Noto Sans SC',sans-serif;
@@ -14,6 +14,7 @@
14
14
  .deck-header,.deck-footer,.deck-pageno{color:var(--muted)}
15
15
  .rule,.rule-foot{background:var(--hair)}
16
16
  .eyebrow{color:var(--accent);letter-spacing:.22em;font-weight:700}
17
+ .slide:is([data-layout="cover-image"],[data-layout="image-full"],[data-layout="section-fullbleed"]) .eyebrow{color:#B5CFDC}
17
18
  .accent-bar{background:var(--accent)}
18
19
  .deck-title,.cover-title,.section-title,.ending-title{color:var(--title);font-family:var(--font-head);font-weight:700}
19
20
  .cover-sub,.ending-sub,.section-desc{color:var(--muted)}
@@ -1,6 +1,8 @@
1
1
  <!-- generated by scripts/ppt-tpl/gen-skin.mjs — signature: crop-marks -->
2
2
  <div style="position:absolute;inset:0;background:#FAFDFF"></div>
3
+ <div class="sig-layer" data-signature="crop-marks" style="position:absolute;inset:0;pointer-events:none">
3
4
  <div style="position:absolute;left:44px;top:44px;border-left:1px solid var(--hair);border-top:1px solid var(--hair);width:26px;height:26px;pointer-events:none"></div>
4
5
  <div style="position:absolute;right:44px;top:44px;border-right:1px solid var(--hair);border-top:1px solid var(--hair);width:26px;height:26px;pointer-events:none"></div>
5
6
  <div style="position:absolute;left:44px;bottom:44px;border-left:1px solid var(--hair);border-bottom:1px solid var(--hair);width:26px;height:26px;pointer-events:none"></div>
6
7
  <div style="position:absolute;right:44px;bottom:44px;border-right:1px solid var(--hair);border-bottom:1px solid var(--hair);width:26px;height:26px;pointer-events:none"></div>
8
+ </div>
@@ -2,7 +2,7 @@
2
2
  手改会在下次生成时丢失:要改就改 family.json。 */
3
3
  :root{
4
4
  --space-scale:0.88; --type-scale:0.95;
5
- --accent:#1074A7; --c1:#1074A7; --c2:#645DD4; --c3:#C22B93; --c4:#D02841; --chart-1:#1074A7;
5
+ --accent:#1074A7; --c1:#1074A7; --c2:#645DD4; --c3:#C22B93; --c4:#D02841; --chart-1:#1074A7; --series-1:#1074A7; --series-2:#7874ED; --series-3:#C73197; --series-4:#B20E30;
6
6
  --title:#003044; --body:#375366; --muted:#687987; --foot:#687987;
7
7
  --hair:#CFDCE6; --card-radius:4px;
8
8
  --font-head:'IBM Plex Sans','Noto Sans SC',sans-serif;
@@ -14,6 +14,7 @@
14
14
  .deck-header,.deck-footer,.deck-pageno{color:var(--muted)}
15
15
  .rule,.rule-foot{background:var(--hair)}
16
16
  .eyebrow{color:var(--accent);letter-spacing:.22em;font-weight:700}
17
+ .slide:is([data-layout="cover-image"],[data-layout="image-full"],[data-layout="section-fullbleed"]) .eyebrow{color:#B7D5E5}
17
18
  .accent-bar{background:var(--accent)}
18
19
  .deck-title,.cover-title,.section-title,.ending-title{color:var(--title);font-family:var(--font-head);font-weight:700}
19
20
  .cover-sub,.ending-sub,.section-desc{color:var(--muted)}
@@ -1,4 +1,6 @@
1
1
  <!-- generated by scripts/ppt-tpl/gen-skin.mjs — signature: header-band -->
2
2
  <div style="position:absolute;inset:0;background:#FDF5F0"></div>
3
+ <div class="sig-layer" data-signature="header-band" style="position:absolute;inset:0;pointer-events:none">
3
4
  <div style="position:absolute;left:0;right:0;top:0;height:5px;background:var(--accent);opacity:.92;pointer-events:none"></div>
4
5
  <div style="position:absolute;left:0;top:0;width:60px;height:16px;background:var(--accent);pointer-events:none"></div>
6
+ </div>
@@ -2,7 +2,7 @@
2
2
  手改会在下次生成时丢失:要改就改 family.json。 */
3
3
  :root{
4
4
  --space-scale:1; --type-scale:1;
5
- --accent:#C12E4C; --c1:#C12E4C; --c2:#896103; --c3:#0B7927; --c4:#117379; --chart-1:#C12E4C;
5
+ --accent:#C12E4C; --c1:#C12E4C; --c2:#896103; --c3:#0B7927; --c4:#117379; --chart-1:#C12E4C; --series-1:#C12E4C; --series-2:#845F0F; --series-3:#2C8E3C; --series-4:#116A70;
6
6
  --title:#26201D; --body:#564F4B; --muted:#827B76; --foot:#827B76;
7
7
  --hair:#CBBFB7; --card-radius:4px;
8
8
  --font-head:'Bodoni Moda','Songti SC',sans-serif;
@@ -14,6 +14,7 @@
14
14
  .deck-header,.deck-footer,.deck-pageno{color:var(--muted)}
15
15
  .rule,.rule-foot{background:var(--hair)}
16
16
  .eyebrow{color:var(--accent);letter-spacing:.22em;font-weight:700}
17
+ .slide:is([data-layout="cover-image"],[data-layout="image-full"],[data-layout="section-fullbleed"]) .eyebrow{color:#ECC0C9}
17
18
  .accent-bar{background:var(--accent)}
18
19
  .deck-title,.cover-title,.section-title,.ending-title{color:var(--title);font-family:var(--font-head);font-weight:700;--talos-bake:1}
19
20
  .cover-sub,.ending-sub,.section-desc{color:var(--muted)}
@@ -1,4 +1,6 @@
1
1
  <!-- generated by scripts/ppt-tpl/gen-skin.mjs — signature: diagonal-band -->
2
2
  <div style="position:absolute;inset:0;background:#270E28"></div>
3
+ <div class="sig-layer" data-signature="diagonal-band" style="position:absolute;inset:0;pointer-events:none">
3
4
  <div style="position:absolute;right:-60px;top:-40px;width:260px;height:820px;background:var(--accent);opacity:.14;transform:rotate(18deg);pointer-events:none"></div>
4
5
  <div style="position:absolute;right:96px;top:-40px;width:2px;height:820px;background:var(--accent);opacity:.5;transform:rotate(18deg);pointer-events:none"></div>
6
+ </div>
@@ -2,7 +2,7 @@
2
2
  手改会在下次生成时丢失:要改就改 family.json。 */
3
3
  :root{
4
4
  --space-scale:0.98; --type-scale:1.06;
5
- --accent:#E168CF; --c1:#E168CF; --c2:#8E88FA; --c3:#099DEE; --c4:#1FA3C4; --chart-1:#E168CF;
5
+ --accent:#E168CF; --c1:#E168CF; --c2:#8E88FA; --c3:#099DEE; --c4:#1FA3C4; --chart-1:#E168CF; --series-1:#E168CF; --series-2:#8E88FA; --series-3:#0C6AA1; --series-4:#29A9CA;
6
6
  --title:#F8F1FA; --body:#C8BDCC; --muted:#938898; --foot:#938898;
7
7
  --hair:#523A52; --card-radius:4px;
8
8
  --font-head:'Big Shoulders Display','Noto Sans SC',sans-serif;
@@ -14,6 +14,7 @@
14
14
  .deck-header,.deck-footer,.deck-pageno{color:var(--muted)}
15
15
  .rule,.rule-foot{background:var(--hair)}
16
16
  .eyebrow{color:var(--accent);letter-spacing:.22em;font-weight:700}
17
+ .slide:is([data-layout="cover-image"],[data-layout="image-full"],[data-layout="section-fullbleed"]) .eyebrow{color:#F6D2F1}
17
18
  .accent-bar{background:var(--accent)}
18
19
  .deck-title,.cover-title,.section-title,.ending-title{color:var(--title);font-family:var(--font-head);font-weight:700;--talos-bake:1}
19
20
  .cover-sub,.ending-sub,.section-desc{color:var(--muted)}
@@ -26,3 +27,5 @@
26
27
  .kpi-num,.stat-num{color:var(--title);font-family:var(--font-head);--talos-bake:1}
27
28
  .kpi-label,.stat-unit{color:var(--muted)} .stat-lead{color:var(--title)} .stat-note{color:var(--body)}
28
29
  .media-frame,.media-cutout{border-radius:0;clip-path:polygon(12% 0,100% 0,88% 100%,0 82%);border:1px solid var(--accent)}
30
+ .slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .slide-backdrop:has(> .theme-art-layer) > .sig-layer > *{translate:230px 0}
31
+ .slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .slide-backdrop:has(> .theme-art-layer) > .sig-layer{-webkit-mask-image:var(--decor-safe-mask);mask-image:var(--decor-safe-mask)}
@@ -1,54 +1,58 @@
1
1
  # PDF (L3)
2
2
 
3
- Default to the **text layer**; render pages only when the content is visual.
4
-
5
- ## Steps
6
-
7
- 1. `bin/doc-scan file.pdf` — inspect per-page signals.
8
- 2. For text-dominated pages: `bin/doc-text file.pdf` and read the result.
9
- 3. For a page with `scanned:true`, high `imageCoverage`, or a `mathHint`/
10
- `tableHint` you must honor: `bin/pdf-render file.pdf <page>` then look at the
11
- PNG (see vision.md). Only do this when you can see images.
12
- 4. **Formulas:** no extractor emits LaTeX. `pdf-render` the page and transcribe
13
- to LaTeX from the image (small/dense formulas: render at higher fidelity — a
14
- `mathHint` page is worth a full-page render before transcribing). If the model
15
- can't see images, say so — a text-only model cannot recover formulas.
16
- Rebuilding into a doc/deck: emit the LaTeX as text, or render the formula to
17
- an image and place that (pptxgenjs has no native math typesetting).
18
- 5. **Tables:** the text layer often mangles columns. Prefer rendering the page,
19
- or (for data you must compute on) ask the user to provide the table as xlsx.
3
+ Default to the **text layer** (the `<file>.txt` sidecar you already read, or `doc-text`);
4
+ render pages only when the content is visual.
5
+
6
+ ## Read: text first, escalate on evidence
7
+
8
+ 1. `bin/doc-scan.cjs file.pdf` → cheap per-page signals (`textChars`, `imageCoverage`,
9
+ `mathHint`, `tableHint`, `scanned`).
10
+ 2. Read intent: summarize/translate → text; formulas/tables/figures/layout → visual;
11
+ unsure → start with text.
12
+ 3. Per page: `scanned` OR high `imageCoverage` OR (visual intent AND a math/table hint)
13
+ → `bin/pdf-render.cjs file.pdf <page>` and look (vision.md); else
14
+ `bin/doc-text.cjs file.pdf`.
15
+ 4. **Self-correct:** text garbled or missing where the answer should be (a formula's
16
+ symbols shredded, a table collapsed into one line, a page with almost no characters)
17
+ → render THAT page and look.
18
+ 5. **Formulas:** no extractor emits LaTeX. Render the page (keep scale 2) and transcribe
19
+ to LaTeX from the image. Rebuilding into a doc/deck: emit the LaTeX as text, or render
20
+ the formula to an image and place that.
21
+ 6. **Tables:** `bin/pdf-tables.cjs file.pdf [page]` recovers text-layer tables as rows.
22
+ Missing, garbled, ruled or scanned → render the page and read it visually; for data you
23
+ must compute on, an .xlsx from the user is exact.
24
+ 7. **Figures as files** (e.g. rebuilding a deck): `bin/pdf-images.cjs file.pdf [pages]`
25
+ extracts embedded images at native resolution; vector pages yield nothing → render.
20
26
 
21
27
  ## Boundaries / failure
22
28
 
23
- - Scanned PDF + text-only model → OCR (slow) or explicitly report that a
24
- multimodal model is needed. Never return an empty summary silently.
25
- - Very large PDFs: render only the pages you actually need — do not bulk-render.
26
- - Encrypted/corrupt PDF → `doc-scan`/`doc-text` exit non-zero; report the error.
27
-
28
- ## Form filling (verify visually — mandatory when you can see images)
29
-
30
- After `bin/pdf-form.cjs fill` (or coordinate `pdf-ops stamp` on a flat form):
31
-
32
- 1. `bin/pdf-render.cjs filled.pdf <page>` for each filled page.
33
- 2. LOOK at the PNG: is every value in its box, nothing clipped/overlapping?
34
- 3. Misplaced → adjust coordinates/field values and refill; re-render to confirm.
35
- 4. Text-only model: state that the fill is unverified visually — don't claim it
36
- is correct.
37
-
38
- ## Encrypt / decrypt
39
-
40
- - `bin/pdf-ops.cjs encrypt <in> <out> <user-pw> [owner-pw]` — AES-256.
41
- - `bin/pdf-ops.cjs decrypt <in> <password> <out>` — wrong password exits
42
- non-zero; never guess passwords.
43
- - Extract embedded images at native resolution with `bin/pdf-images.cjs <file>
44
- [pages]` — one PNG per placed image plus a JSON manifest (page/bbox/size).
45
- Re-encoded to PNG (pixel-exact, not byte-exact) at the image's own resolution,
46
- so it beats a full-page `pdf-render` when you need the figures as separate
47
- assets (e.g. reconstructing a deck). Vector/text-only pages yield nothing —
48
- `pdf-render` and look instead.
49
-
50
- ## Form-fill validation overlay
51
-
52
- After filling: `bin/pdf-form.cjs overlay filled.pdf boxed.pdf` stamps a red
53
- outline around every field, then `pdf-render` the page and LOOK — every value
54
- inside its box, nothing clipped.
29
+ - **Vision unavailable** (text-only model): text, or OCR a rendered page (vision.md),
30
+ and state the limitation plainly — never return an empty summary silently. A
31
+ text-only model cannot recover formulas.
32
+ - Very large PDFs: render only the pages you need — never bulk-render.
33
+ - Corrupt PDF → `doc-scan`/`doc-text` exit non-zero; report the error. A
34
+ password-protected PDF exits 1 (`PDF is password-protected … decrypt first`) from
35
+ every reader and editor: ask for the password and `pdf-ops decrypt` it.
36
+
37
+ ## Forms and flat-PDF filling
38
+
39
+ 1. `bin/pdf-form.cjs list in.pdf` → field names and types; `fill in.pdf values.json
40
+ out.pdf [--flatten]` with `{"<field>": "text", "<checkbox>": true}` (unknown names
41
+ come back in `skipped`).
42
+ 2. A flat PDF (no fields) → `bin/pdf-ops.cjs stamp in.pdf stamps.json out.pdf` with
43
+ `[{"page": 1, "x": 72, "y": 700, "text": "…", "size"?: 11}]` (points, origin bottom-left).
44
+ 3. **Chinese works:** fill, `stamp` and `watermark` draw CJK text in the bundled Noto
45
+ Sans SC. A character it lacks (emoji, rare extension hanzi) exits 1 naming it —
46
+ replace it; never drop text silently.
47
+ 4. **Verify visually (mandatory when you can see images):** `bin/pdf-form.cjs overlay
48
+ filled.pdf boxed.pdf` outlines every field in red; `pdf-render` each filled page and
49
+ LOOK — every value inside its box, nothing clipped or overlapping. Misplaced → adjust
50
+ and refill. A text-only model states the fill is visually unverified.
51
+
52
+ ## Page ops and passwords
53
+
54
+ `bin/pdf-ops.cjs merge | split | rotate | watermark` keep every page verbatim
55
+ (bin-reference.md "Fill and edit"). `encrypt <in> <out> <user-pw> [owner-pw]` is
56
+ AES-256 — run `doc-validate` and render BEFORE encrypting (an encrypted PDF fails
57
+ `doc-validate`). `decrypt <in> <password> <out>` exits non-zero on a wrong password —
58
+ never guess passwords; `""` decrypts an owner-password-only PDF.