Install
$ agentstack add skill-zhu1090093659-deepseek-pp-officecli-data-dashboard Open-source listing, not yet scanned by AgentStack. Follow the source repository for install instructions.
Security review
⚠ Flagged1 finding(s); flagged for manual review. · v0.1.0 How review works →
- • Prompt-injection patterns
- • Secret / credential exfiltration
- • Dangerous shell & filesystem operations
- • Untrusted network calls
- • Known-malicious package signatures
- high Pipes remote content directly into a shell (remote code execution).
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Data Dashboard (scene-layer on officecli-xlsx)
A dashboard is not "a spreadsheet with charts". It is a composition: one Dashboard sheet the user lands on with formula-driven KPI cards, cell-range-linked charts, sparklines, and semantic conditional formatting. Everything else (raw data, aggregations) is upstream infrastructure the user should never need to open. This skill teaches the composition pattern. Everything about the xlsx engine — cells, formulas, batch JSON, shell quoting, validate, HTML preview — comes from officecli-xlsx and is not re-taught here.
Setup
If officecli is missing:
- macOS / Linux:
curl -fsSL https://d.officecli.ai/install.sh | bash - Windows (PowerShell):
irm https://d.officecli.ai/install.ps1 | iex
Verify with officecli --version (open a new terminal if PATH hasn't picked up). If install fails, download a binary from https://github.com/iOfficeAI/OfficeCLI/releases.
⚠️ Help-First Rule
When a prop name, enum value, or alias is uncertain, consult help before guessing.
officecli help xlsx # element list
officecli help xlsx chart # full schema for charts
officecli help xlsx sparkline # sparklines
officecli help xlsx conditionalformatting # all CF rule types
Help reflects the installed CLI version. When this skill and help disagree, help wins. DeferredAddKeys (preset, referenceline, trendline, axisNumFmt, holesize, combosplit) work on add only — see Reference.
Mental Model & Inheritance
This skill inherits every xlsx hard rule from officecli-xlsx — shell quoting, zero formula errors, visual delivery floor, batch JSON shape ({"command":"set"|"add","path":...,"props":{...}} — key is command, NOT action), batch JSON dotted-name rule, chart data-feed forms, batch+resident limits, validate discipline. Read officecli-xlsx first; honour those rules, do not re-teach them here.
Reverse handoff — do NOT use this skill when:
- The ask is a single-sheet CSV-with-formatting tracker (no Dashboard sheet, no KPI cards, ≤ 1 chart) → go back to
officecli-xlsx. - The ask is a 3-statement / DCF / LBO financial model with blue-inputs / black-formulas / cross-sheet drivers → use
officecli-financial-model. - The ask is a weekly status report with one SUMIF summary and one chart over ` — it produces duplicate elements that fail validate.
- Refresh downstream cachedValue after every upstream edit.
fullCalcOnLoad=trueschedules runtime recalc only; it does NOT refresh build-timecachedValue. Afterset B=100 → set E==B+D → fix B=150, E is stale until you re-issue E's formula (or close/reopen). Stale cache ships "Net Change = 0" to the board. - Every chart has a descriptive title and every series has a name.
"Series1"in a legend is unfinished work. - Every KPI value cell has a formula. Verifiable:
officecli query "$FILE" 'Dashboard!:has(formula)' --json | jq '.data.results | length'should equal your planned KPI count. - Header row fill on every data sheet. Data sheet, Summary sheet, and any secondary data sheet need row 1 filled (e.g.,
fill=1F3864 + font.color=FFFFFF + font.bold=true). - 10+ rows on Data sheet → ≥ 1 CF rule on a numeric column. A 20-row table with zero visual scanning aid is a quality miss.
- Dashboard value columns sized to the widest expected cachedValue — not a fixed 22. Rule of thumb at 24pt bold + currency numFmt:
width ≈ ceil((visible_chars + 2) × 1.3). A KPI holding¥1,958,414,250(14 visible chars with currency + commas) needswidth ≥ 28; a 4-digit KPI still needswidth ≥ 22as the floor. Hardcoding22for a 10+ digit KPI is how###ships to the user. - Sparkline row height ≥ 20. A sparkline in a default 15pt row is a flat squiggle — set
/Dashboard/row[N] height=22(or 24 when paired with a 24pt KPI value cell in the same row). - Print deliverables set
_xlnm.Print_Areascoped to Dashboard + hide non-Dashboard sheets + add ``. Without all three, the print pipeline emits every sheet and Dashboard lands on page 2+. See §Print-ready delivery for the exact commands.
Quick Start
Minimal viable dashboard: 12-month revenue CSV → 4 KPIs + 1 line chart + activeTab + fullCalcOnLoad. Adapt the numbers, don't copy-paste blind. Broken into phases so a single failed phase is obvious.
Phase 1 — Data sheet: create, import, format.
FILE=my_dashboard.xlsx
officecli create "$FILE"
officecli import "$FILE" /Sheet1 --file sales.csv --header
officecli set "$FILE" '/Sheet1/col[A]' --prop width=12
officecli set "$FILE" '/Sheet1/col[B]' --prop width=15
officecli set "$FILE" '/Sheet1/B2:B13' --prop numFmt='$#,##0'
officecli set "$FILE" '/Sheet1/A1:B1' --prop fill=1F3864 --prop font.color=FFFFFF --prop font.bold=true
Phase 2 — Dashboard sheet + one KPI card.
officecli add "$FILE" / --type sheet --prop name=Dashboard
officecli set "$FILE" '/Dashboard/col[A]' --prop width=22
officecli set "$FILE" '/Dashboard/col[B]' --prop width=12
officecli set "$FILE" /Dashboard/A1 --prop value="Total Revenue" --prop font.size=9 --prop font.color=666666 --prop bold=true
officecli set "$FILE" /Dashboard/A2 --prop 'formula==SUM(Sheet1!B2:B13)' --prop numFmt='$#,##0' --prop font.size=24 --prop bold=true --prop font.color=2E7D32
Phase 3 — Sparkline + chart.
officecli add "$FILE" /Dashboard --type sparkline --prop cell=B2 --prop range='Sheet1!B2:B13' --prop type=line --prop color=4472C4 --prop highPoint=true --prop highMarkerColor=FF0000
officecli add "$FILE" /Dashboard --type chart \
--prop chartType=line \
--prop title="Revenue Trend" \
--prop series1.name="Revenue" \
--prop series1.values='Sheet1!B2:B13' \
--prop series1.categories='Sheet1!A2:A13' \
--prop preset=dashboard --prop axisNumFmt='$#,##0' \
--prop x=0 --prop y=5 --prop width=10 --prop height=15
Phase 4 — fullCalcOnLoad → activeTab (LAST) → close → validate.
officecli set "$FILE" / --prop calc.fullCalcOnLoad=true
# Resolve Dashboard's 0-based index from the actual sheet list — never hardcode.
DASH_IDX=$(officecli query "$FILE" sheet --json \
| jq '[.data.results[].path] | index("/Dashboard")')
officecli raw-set "$FILE" /workbook --xpath "//x:sheets" --action insertbefore \
--xml ""
officecli close "$FILE"
officecli validate "$FILE"
Verified end-to-end on a 12-row revenue CSV: validate reports no errors, Dashboard opens first, Dashboard/A2.cachedValue resolves (2,075,000 for the test data), chart renders with values linked.
Design Ideas
Options, not templates. The user's data and audience drive the choices.
Layout patterns (pick one, stay consistent)
Pattern 1 — executive summary (board packs): KPI strip A1:H4, charts stack from row 6.
┌ KPI1 │ KPI2 │ KPI3 │ KPI4 ┐ rows 1-4
├──────┴──────┴──────┴──────┤
│ Chart 1 (wide) │ rows 6-18
├───────────────┬───────────┤
│ Chart 2 │ Chart 3 │ rows 20-32
Pattern 2 — ops console (live ops): KPIs down A:B, charts fill C:L.
│ KPI1 │ │
│ KPI2 │ Chart 1 │ rows 1-12
│ KPI3 │ │
│ KPI4 ├───────────────────┤
│ KPI5 │ Chart 2 │ rows 14-26
Pattern 3 — scorecard (≥ 6 KPIs, no dominant chart): grid of 2×3 cards (label / value / sparkline).
│ KPI1 │ KPI2 │ KPI3 │ rows 1-4
│ KPI4 │ KPI5 │ KPI6 │ rows 5-8
Complexity scaling by data size
| Rows | KPIs | Charts | Sparklines | CF rules | Preset | |---|---|---|---|---|---| | on every chart. Options: minimal, dashboard, corporate, magazine, colorful, monochrome, dark`. Pick one and stay consistent across all charts on a single Dashboard — mixing presets reads as accidental.
Conditional formatting — semantic colors
Four CF rule types; each uses --type at add time:
| Intent | --type | Typical props | |---|---|---| | Magnitude bar (sales, spend) | databar | sqref=B2:B13 color=4472C4 min=0 max= — always set explicit min/max; defaults emit invalid XML | | Heat map (rates, growth) | colorscale | sqref=D2:D13 mincolor=FFCDD2 midcolor=FFFFFF maxcolor=C8E6C9 | | Status indicator | iconset | sqref=E2:E13 iconset=3Arrows — see help for the full enum | | Custom business rule | formulacf | sqref=B2:B13 'formula=$B2>=100000' fill=C8E6C9 font.color=2E7D32 — NEVER font.bold (schema rejects ``) |
Semantic colors to stay consistent within a dashboard:
- good / positive: fill
C8E6C9, font2E7D32 - bad / negative: fill
FFCDD2, fontC62828 - neutral: fill
F5F5F5, font666666
KPI card anatomy
A card is a label cell + a value cell. The label is small gray (font.size=9, font.color=666666, bold); the value is large bold (font.size=24, bold=true, numFmt, font.color signals tone). One row of light fill (e.g. F0F4FF) across the card area gives the "card" read without building merged-cell scaffolds. Value column width must be sized to the largest cachedValue — never narrower than 22, often 26–32 for 8+ digit currency (see Requirements).
Chart width budget by title length
At the dashboard preset's default title font, the chart plot-box width (in column units) must stay ahead of the title string, or the title clips mid-word. Rule of thumb: chart.width ≥ ceil(title.length × 0.18). A 35-character title ("Department: Year-End Headcount vs Attrition Rate") needs width ≥ 7; be safer and use 10–12. If the anchor cannot be widened, shorten the title to ≤ 25 characters — clipped titles in a board-ready deliverable are indefensible.
officecli get chart[N] does not expose numeric width on 1.0.63 — it returns .data.format.anchor (e.g. "A6:K21"). Derive column span from letters (A→K = 10 cols) for Gate 2.
Print-ready delivery (board-pack / investor-send / one-pager)
Triggers: ask contains "print" / "一页" / "董事会" / "投资人". Four artefacts on the Dashboard sheet; non-Dashboard sheets hidden so the print pipeline emits one page only.
# 1. Print_Area scoped to Dashboard (xlnm convention).
officecli add "$FILE" / --type namedrange --prop name=_xlnm.Print_Area --prop scope=Dashboard --prop 'refersTo=Dashboard!$A$1:$H$36'
# 2. fit-to-page on Dashboard.
officecli raw-set "$FILE" /Dashboard --xpath "//x:worksheet" --action prepend --xml ''
# 3. Landscape page setup.
officecli raw-set "$FILE" /Dashboard --xpath "//x:sheetData" --action insertafter --xml ''
# 4. Hide non-Dashboard sheets — Print_Area scope alone does NOT stop the print pipeline from emitting every visible sheet.
for S in Sheet1 Summary; do
officecli raw-set "$FILE" /workbook --xpath "//x:sheet[@name='$S']" --action setattr --xml "state=hidden" || true
done
Delete any Print_Area set on Data / Summary sheets — conflicting scopes emit multi-page output.
QA (REQUIRED — Delivery Gate)
Assume there are problems. Your job is to find them. A chart that was rendered does not mean a chart that was meaningful. "validate pass" is not delivery; "the Dashboard sheet reads like someone who knows the business made it" is delivery.
Minimum cycle before "done"
Inherit the xlsx baseline (view issues, formula error queries, validate, HTML preview scan): → see officecli-xlsx §QA minimum cycle.
Then run the dashboard-specific Delivery Gates. Each gate uses COUNT-then-if pattern with a .data.* wrapper — never chain && echo OK || echo FAIL.
Gate 1 — KPI formula coverage. Every planned KPI cell must carry a formula. Adjust -lt 2 to your plan (4 KPIs → -lt 4).
KPI_FORMULAS=$(officecli query "$FILE" 'Dashboard!:has(formula)' --json | jq '.data.results | length')
[ "$KPI_FORMULAS" -lt 2 ] && { echo "REJECT Gate 1: $KPI_FORMULAS formula cells on Dashboard"; exit 1; }
Gate 2 — Chart count matches plan, every chart has data + plausible title width.
CHART_COUNT=$(officecli query "$FILE" chart --json | jq '.data.results | length')
[ "$CHART_COUNT" -lt 1 ] && { echo "REJECT Gate 2: zero charts"; exit 1; }
col_num () { local c=$1 n=0; for ((k=0;k/dev/null | grep -niE '\{\{|\$fy\$||xxxx|TBD' | wc -l | tr -d ' ')
[ "$LEAKS" -gt 0 ] && { echo "REJECT Gate 6: $LEAKS placeholder tokens"; exit 1; }
Gate 7 — Visual delivery floor (ported from xlsx). Run officecli view "$FILE" html and Read the returned HTML path. Confirm:
- No
###in any Dashboard or Data cell (columns too narrow). - No truncated KPI labels, sheet tab names, or chart titles.
- No placeholder tokens rendered as text (
$fy$24,{var}, `,xxxx`). - Pie / doughnut slices render with distinct fill colors (if collapsed in LibreOffice, verify in the user's target viewer before declaring broken — → see officecli-xlsx §Known Issues/Renderer caveats).
- No empty chart anchors — every chart has a visible, plausible plot.
- Dashboard sheet opens first (tab highlighted, active area scrolled to top).
If view html is blocked (renderer conflict, headless, port busy), Gate 7 is still mandatory — run ALL fallback checks:
# a) Token / ### sweep.
officecli view "$FILE" text 2>/dev/null | grep -nE '###|\{\{||\$fy\$|xxxx' && { echo "REJECT Gate 7: tokens or ### present"; exit 1; }
# b) Per-KPI: cachedValue length × coef must fit col width. coef=0.55 fit-to-page, 0.85 otherwise.
for CELL in A2 C2 E2 G2; do
CV=$(officecli get "$FILE" "/Dashboard/$CELL" --json | jq -r '.data.format.cachedValue // .data.text // ""')
W=$(officecli get "$FILE" "/Dashboard/col[${CELL%%[0-9]*}]" --json | jq -r '.data.format.width // 0')
CAP=$(echo "$W * 0.55" | bc -l | awk '{print int($1)}')
[ "${#CV}" -gt "$CAP" ] && { echo "REJECT Gate 7: $CELL '$CV' (${#CV} chars) > cap $CAP"; exit 1; }
done
# c) Rerun Gate 2 title × 0.18 ≤ anchor span. d) Log which fallback was used and why.
Gate 7 must NEVER be skipped — skipping ships ### to the user.
If scene keywords include print / 一页 / board / 投资人 / 董事会, extend Gate 7 with a structural print-scope check:
if echo "$USER_REQ" | grep -qiE 'print|一页|投资人|董事会|board'; then
# Every non-Dashboard sheet must be hidden or veryHidden.
LEAKING=$(officecli query "$FILE" 'sheet' --json | jq -r '.data.results[] | select(.name != "Dashboard" and (.state // "visible") == "visible") | .name')
[ -n "$LEAKING" ] && { echo "REJECT Gate 7 print-scope: visible non-Dashboard sheet(s): $LEAKING — hide before delivery"; exit 1; }
# Dashboard must carry an explicit Print_Area named range.
PA=$(officecli query "$FILE" 'namedrange[name="_xlnm.Print_Area"]' --json | jq '.data.results | length')
[ "$PA" -ge 1 ] || { echo "REJECT Gate 7 print-scope: no _xlnm.Print_Area set"; exit 1; }
fi
The user opens the file in their target viewer (Office / WPS / Numbers) for the final print preview — the skill does not render export artefacts.
Gate 8 — Formula sanity (cachedValue real, not stale/error). fullCalcOnLoad=true refreshes at runtime, NOT build-time cache — so every formula cell must carry a non-empty, non-zero, non-error cachedValue now.
for CELL in A2 C2 E2 G2; do
JSON=$(officecli get "$FILE" "/Dashboard/$CELL" --json)
[ -z "$(echo "$JSON" | jq -r '.data.format.formula // ""')" ] && continue
CV=$(echo "$JSON" | jq -r '.data.format.cachedValue // ""')
case "$CV" in
"" | "0" | "#DIV/0!" | "#REF!" | "#N/A" | "#VALUE!" | "#NAME?" | "null")
echo "REJECT Gate 8: $CELL cachedValue='$CV' — re-issue formula or close+reopen"; exit 1 ;;
esac
done
If a KPI is genuinely zero (e.g. "terminations this quarter" = 0), whitelist it in the loop and document — default assumption is "zero is broken".
If anything fails, fix at source, re-run the full cycle.
Honest limits
Scatter's series1.xValues is not exposed in get --json (series values="") — use chart-level seriesCount. LibreOffice chart color drift / pie-slice collapse / checkbox double-box are viewer artifacts — spot-check in Office / WPS / Numbers first.
Reference
- **Sho
…
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: zhu1090093659
- Source: zhu1090093659/deepseek-pp
- License: Apache-2.0
- Homepage: https://chromewebstore.google.com/detail/deepseek++/kdmpkkahkhdmdhfkdihkopikgcocbpbf?hl=zh-CN&authuser=0
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.