@nomad-e/bluma-cli 0.6.9 → 0.8.0
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/dist/config/skills/pdf/SKILL.md +7 -0
- package/dist/config/skills/pdf/scripts/create_report.py +18 -2
- package/dist/config/skills/pdf/scripts/merge_pdfs.py +9 -0
- package/dist/config/skills/xlsx/SKILL.md +8 -0
- package/dist/config/skills/xlsx/scripts/recalc.py +9 -0
- package/dist/main.js +1100 -715
- package/package.json +1 -1
|
@@ -18,6 +18,13 @@ license: Proprietary. LICENSE.txt has complete terms
|
|
|
18
18
|
> design agency, not a script. Typography, spacing, color, and hierarchy are
|
|
19
19
|
> not optional — they are the foundation of a credible document.
|
|
20
20
|
|
|
21
|
+
## Prerequisites
|
|
22
|
+
|
|
23
|
+
- **Python 3.10+** installed and available in PATH
|
|
24
|
+
- Install dependencies: `pip install reportlab pypdf`
|
|
25
|
+
- If any script fails with `command not found` or `ModuleNotFoundError`, Python or its
|
|
26
|
+
packages are missing — install them before proceeding
|
|
27
|
+
|
|
21
28
|
## MANDATORY workflow — new multi-page reports (read first)
|
|
22
29
|
|
|
23
30
|
Ad-hoc 30-line ReportLab scripts are the #1 cause of “cheap PDF” output (no
|
|
@@ -46,8 +46,24 @@ from pathlib import Path
|
|
|
46
46
|
from typing import Any
|
|
47
47
|
from xml.sax.saxutils import escape
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
MIN_PYTHON = (3, 10)
|
|
50
|
+
if sys.version_info < MIN_PYTHON:
|
|
51
|
+
print(
|
|
52
|
+
f"Error: Python {'.'.join(map(str, MIN_PYTHON))}+ is required "
|
|
53
|
+
f"(found {'.'.join(map(str, sys.version_info[:3]))})",
|
|
54
|
+
file=sys.stderr,
|
|
55
|
+
)
|
|
56
|
+
sys.exit(1)
|
|
57
|
+
|
|
58
|
+
try:
|
|
59
|
+
from reportlab.lib.pagesizes import A4
|
|
60
|
+
from reportlab.lib.units import cm
|
|
61
|
+
except ImportError:
|
|
62
|
+
print(
|
|
63
|
+
"Error: reportlab is required. Install with: pip install reportlab",
|
|
64
|
+
file=sys.stderr,
|
|
65
|
+
)
|
|
66
|
+
sys.exit(1)
|
|
51
67
|
from reportlab.lib.colors import HexColor
|
|
52
68
|
from reportlab.lib.styles import ParagraphStyle
|
|
53
69
|
from reportlab.lib.enums import TA_CENTER, TA_JUSTIFY
|
|
@@ -8,6 +8,15 @@ Usage:
|
|
|
8
8
|
import argparse
|
|
9
9
|
import sys
|
|
10
10
|
|
|
11
|
+
MIN_PYTHON = (3, 10)
|
|
12
|
+
if sys.version_info < MIN_PYTHON:
|
|
13
|
+
print(
|
|
14
|
+
f"Error: Python {'.'.join(map(str, MIN_PYTHON))}+ is required "
|
|
15
|
+
f"(found {'.'.join(map(str, sys.version_info[:3]))})",
|
|
16
|
+
file=sys.stderr,
|
|
17
|
+
)
|
|
18
|
+
sys.exit(1)
|
|
19
|
+
|
|
11
20
|
def merge_pdfs(input_files: list[str], output_path: str) -> None:
|
|
12
21
|
try:
|
|
13
22
|
from pypdf import PdfWriter, PdfReader
|
|
@@ -16,6 +16,14 @@ license: Proprietary. LICENSE.txt has complete terms
|
|
|
16
16
|
|
|
17
17
|
# XLSX — Spreadsheet Creation, Editing & Analysis
|
|
18
18
|
|
|
19
|
+
## Prerequisites
|
|
20
|
+
|
|
21
|
+
- **Python 3.10+** installed and available in PATH
|
|
22
|
+
- Install dependencies: `pip install openpyxl pandas`
|
|
23
|
+
- **LibreOffice** installed (required by `recalc.py` for formula recalculation)
|
|
24
|
+
- If any script fails with `command not found` or `ModuleNotFoundError`, Python or its
|
|
25
|
+
packages are missing — install them before proceeding
|
|
26
|
+
|
|
19
27
|
## Core Principle
|
|
20
28
|
|
|
21
29
|
> **Formulas, not hardcodes.** Every calculated value MUST be an Excel
|
|
@@ -19,6 +19,15 @@ import os
|
|
|
19
19
|
import sys
|
|
20
20
|
import time
|
|
21
21
|
|
|
22
|
+
MIN_PYTHON = (3, 10)
|
|
23
|
+
if sys.version_info < MIN_PYTHON:
|
|
24
|
+
print(
|
|
25
|
+
f"Error: Python {'.'.join(map(str, MIN_PYTHON))}+ is required "
|
|
26
|
+
f"(found {'.'.join(map(str, sys.version_info[:3]))})",
|
|
27
|
+
file=sys.stderr,
|
|
28
|
+
)
|
|
29
|
+
sys.exit(1)
|
|
30
|
+
|
|
22
31
|
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
23
32
|
sys.path.insert(0, SCRIPT_DIR)
|
|
24
33
|
|