Back to home

huluwocom

huluTable-dsh-plugin

A local table data management plugin developed for DeepSeek Harness

Stars
1
Language
TypeScript
Created
Aug 15, 2026
Updated
Aug 16, 2026

Introduction

huluTable

A DeepSeek Harness Web client plugin: a "Tables" trigger in the sidebar footer plus a full-viewport table workspace — foolproof online-table data management. No database, no server: all data lives in the browser's IndexedDB and works out of the box. Current release: v0.1.

中文 · License · Changelog

huluTable brings an online spreadsheet into DeepSeek Harness: a table library, a virtualized grid editor, 18 column types, formulas, filters and sorts, kanban/calendar/chart views, Excel import/export and more. Double-click a cell to edit, drag the corner to fill series, right-click for row/column menus — every change is undoable.

Screenshots

Table libraryGrid editor
Table libraryGrid editor
KanbanCalendarChart
KanbanCalendarChart
GoalsExcel importColumn menu
GoalsImportColumn menu

Features

AreaCapabilities
Table libraryList/search/tags/stars; create blank or from 6 templates (Customer CRM, Projects, Finance ledger, Attendance, To-dos, Inventory); rename/duplicate/delete; recycle bin (30-day TTL); one-click JSON backup/restore
Grid editorVirtual scrolling (10k+ rows); double-click editing; drag-select / Shift-extend; copy-paste (Excel TSV included); fill drag (increment/decrement/series/copy); delta-level undo/redo; long-press drag to reorder rows/columns; row/column copy, cut, paste; row/column context menus
Columns18 column types; column settings panel (required/default/width/freeze/hide/description); format validation (phone/email/url/number/length/regex); dropdown options with background colors; linked selects (map/source modes); single-click dropdown pickers; edge drag resizing; frozen columns (positional — the freeze follows reorders)
Filter & sortHeader filters (text/number/multi-select dropdown/color); multi-level sorts (Shift stacks); AND/OR filter combinations; one-click clear
StatsBottom stats bar (sum/average/max/min/count); per-column goal progress bars (header chips + goals panel)
Formulasfx bar; 30+ built-ins (SUM/AVERAGE/IF/CONCAT/TODAY/ROUND…); cell/range references; automatic recalculation; template quick-inserts
ViewsGrid / Kanban (grouped by a dropdown column, drag cards = CRM funnel) / Calendar (month view on a date column, jump to earliest date) / Chart (bar/pie/funnel); view management (create/duplicate/rename/delete, bound columns)
Conditional formattingRow/column-scope rules (equals/range/contains… coloring), managed from the column settings
Import/export.xlsx / .csv export (whole table or filtered rows); import (header detection + type inference + preview + create/append)
Collaboration tracesPer-cell edit history (last 5, hover to view); cell comments (badge + popover add/edit/delete)
UsabilityChinese/English UI; empty-state guidance; sticky header; row numbers and frozen columns stay pinned on horizontal scroll

Installation

huluTable is a DeepSeek Harness bundle: an npm package carrying a patch configuration layer (dsh.bundle.patch). Prerequisites: the dsh CLI installed, and a profile that includes @deepseek-ai/dsh-web-app (the web surface).

Option 1 — local checkout (development / trying it out)

dsh plugin --profile web add /path/to/HuluTable
dsh web                          # open http://127.0.0.1:3080

Option 2 — install from GitHub (source + automatic build)

dsh plugin --profile web add github:huluwocom/HuluTable

This repository's prepare script builds lib/ straight from src/ (self-contained transpilation — no monorepo, no type-checking). pnpm ≥10 refuses to run git dependencies' build scripts until you allow it: copy the exact package key dsh prints into that profile's pnpm-workspace.yaml:

allowBuilds:
  dsh-hulutable-plugin: true

Then re-run add. Consider pinning a commit (github:you/HuluTable#<sha>) so later pushes cannot silently change what runs.

Option 3 — tarball (prebuilt, no build permission needed)

dsh plugin --profile web add ./releases/dsh-hulutable-plugin-0.1.0.tgz

The releases/ directory ships a pnpm pack artifact plus its SHA-256 checksum; you can also pnpm pack yourself.

Note: the dsh-web-app bundle ships a built-in ui-hulutable row pointing at the monorepo workspace package. This bundle's cordis.patch.yml disables the built-in row and inserts an independent row (patches cannot rename a row, hence disable+insert), so the standalone version takes effect after installation. Once published to npm, dsh plugin --profile web add dsh-hulutable-plugin is equivalent to the three options above.

Development

pnpm install            # installs deps; prepare runs the build automatically (tsdown → lib/)
pnpm run build          # builds the node half + browser half (lib/index.js, lib/invariant.js, lib/client.js)
pnpm run watch          # rebuild on change
pnpm run pack           # build and pack a tarball into releases/

Type-checking and tests (SDK required)

The @deepseek-ai/* SDK packages are not yet published to npm; at runtime the web shell provides the platform modules. Type-checking and the test suite need a local deepseek-harness checkout linked in:

pnpm link-sdk /path/to/deepseek-harness   # writes link: devDependencies and runs pnpm install
pnpm run typecheck                        # tsc --noEmit
pnpm run test                             # vitest (jsdom)
pnpm run coverage                         # 100% coverage gate
pnpm run lint                             # oxlint

The build itself (prepare / build) needs no SDK: type-only imports are erased during transpilation, and cross-plugin value imports are rejected at build time by the purity gate.

Architecture

src/
├── index.ts                 # node half (deliberately empty — all behavior is browser-side)
├── invariant.ts             # package invariant companion (loaded via the "./invariant" export)
└── client/                  # browser half (dsh.client, platform: web)
    ├── index.ts             # registers the hulutable dictionaries + the sidebar.footer.action trigger
    ├── HulutableRoot.tsx    # trigger row + workspace panel shell
    ├── TableLibrary.tsx     # table library home (backup/restore/recycle bin)
    ├── controller.ts        # HulutableController: single snapshot store + every mutation
    ├── persistence.ts       # IndexedDB persistence (debounced batch flush) + in-memory impl
    ├── domain/              # data model, delta undo, editor ops, query engine, formulas, templates, validation
    ├── grid/                # virtualized grid, memoized cells, geometry, menus/filters/pickers/panels
    ├── views/               # kanban / calendar / chart views
    └── io/io.ts             # SheetJS import/export + type inference

Performance & data

  • Virtual scrolling: only the visible window (±4 row/column overscan) renders; scrolling is rAF-throttled; cells are React.memo.
  • Undo is delta-level (only changed cells/structure are recorded), independent of table size; formula recomputation touches only formula cells.
  • IndexedDB writes are debounced (500ms + immediate on pagehide); storage unavailability (private mode) degrades to in-memory mode.
  • First load is about 1.6MB (SheetJS included, ~400KB gzip), then browser-cached.

License

MIT © 2025 huluTable contributors

Third-party dependencies: clsx (MIT), recharts (MIT), xlsx / SheetJS (Apache-2.0) — see THIRD_PARTY_NOTICES.md.