tableau-init
The first step of the tableau-dashboard-plugin workflow. Running it in a project
directory scaffolds a complete starting skeleton and writes the STATE.md manifest
that every downstream skill reads to know where the analyst is.
This skill is step 1 of 8. It has no upstream dependencies — it is what creates
the workflow state in the first place.
|
|
| Reads |
— (nothing; this step bootstraps the project) |
| Writes |
STATE.md + a scaffold/ folder of demo examples: scaffold/EXAMPLE-DASHBOARD-REQUEST.md, scaffold/EXAMPLE-datasources.json, scaffold/.env.example, scaffold/branding/EXAMPLE-branding.md, scaffold/sample-data/*.csv |
| STATE.md update |
Creates the manifest with init = approved and steps 2–8 = pending; records target_tableau_version, data_mode: csv, current_version: v_1 |
| Next step |
tableau-intake (or tableau-data if the analyst skips intake) |
scaffold/ examples vs. production inputs
Everything init writes under scaffold/ is a demo example so the analyst
can trial the whole workflow before owning any real inputs. Every downstream skill
prefers the production input at the project root and only falls back to the
scaffold/ example when the production file is absent:
| production input (preferred) |
scaffold/ demo fallback |
DASHBOARD-REQUEST.md |
scaffold/EXAMPLE-DASHBOARD-REQUEST.md |
datasources.json + .env (published-ds route) |
scaffold/EXAMPLE-datasources.json + scaffold/.env.example |
branding/branding.md |
scaffold/branding/EXAMPLE-branding.md |
data/*.csv (csv route) |
scaffold/sample-data/*.csv |
init deliberately creates only the scaffold/ examples (and STATE.md),
never the production files — their absence is exactly what tells the analyst (and
the model) which real inputs are still owed. See CONTRACT.md §3 for the canonical
rule.
How to run
Determine the project directory. Default to the current working directory.
This is where the skeleton and STATE.md will be written.
Ask for the target Tableau Desktop version — unless the user already stated
it. This is recorded once, here, and drives tableau-build later (it is never
re-asked downstream). Offer exactly the two allowed values:
2024.2-2025.x — the broad-compatibility target (no rounded corners, no
<explain-data> in the workbook).
2026.1+ — the newest target (enables border-radius and newer XML).
If unsure, recommend 2024.2-2025.x for the widest compatibility.
Run the scaffolder, passing the chosen version:
python "${CLAUDE_PLUGIN_ROOT}/skills/tableau-init/scripts/init.py" --target-version "<version>" "<project-dir>"
(Use python3 if python is unavailable.) The script copies this skill's
skeleton/ templates into the project's scaffold/ folder and writes a
schema-valid STATE.md. It is non-destructive: any file that already
exists — including an existing STATE.md — is preserved, never overwritten, so
re-running on an established project keeps the analyst's edits and pipeline
progress.
Relay the scaffolder's summary to the analyst: what was created, what was
preserved, and the one input to act on now — create their real
DASHBOARD-REQUEST.md at the project root (copy scaffold/'s example, or just
paste the request when running tableau-intake). Then tell them to open a
fresh conversation and run the next step (tableau-intake to structure the
request, or skip straight to tableau-data if they prefer). Suggest
tableau-route if they want the router to confirm the next step.
Don't walk the analyst through data acquisition or branding here. Those
decisions belong to the skills that own them — tableau-data explains the two
data routes (real CSVs in data/, or a published data source queried via the
VizQL Data Service, with the scaffold/sample-data/ demo as fallback) when the
analyst reaches that step, and tableau-brand handles branding. Init only lays
the examples down; it does not pre-explain how to fill them.
Notes
- The
scaffold/ examples (including scaffold/sample-data/*.csv) let the project
run a full demo immediately. How the analyst swaps in real data — into data/ —
is tableau-data's topic, not init's; don't describe acquisition modes here.
target_tableau_version is the one decision captured at init time. Everything
else (the request, the data, branding) is filled in by the later steps that
own those concerns.
The full STATE.md schema and the ordering / staleness / versioning rules live
in CONTRACT.md at the repo root. This skill restates only its own slice;
init.py is the executable mirror of the schema it writes.
1---2name: tableau-init3description: Scaffolds a new tableau-dashboard-plugin project. Creates a scaffold/ folder of demo examples (EXAMPLE-DASHBOARD-REQUEST.md, EXAMPLE-datasources.json, .env.example, branding/EXAMPLE-branding.md, starter sample-data/) and initializes the STATE.md manifest, recording the target Tableau Desktop version so the build step never has to re-ask. Use when the user wants to start a new Tableau dashboard project, scaffold the workflow, or when tableau-route reports a fresh project. Step 1 of 8 in the workflow.4---56# tableau-init78The first step of the `tableau-dashboard-plugin` workflow. Running it in a project9directory scaffolds a complete starting skeleton and writes the `STATE.md` manifest10that every downstream skill reads to know where the analyst is.1112This skill is **step 1 of 8**. It has no upstream dependencies — it is what creates13the workflow state in the first place.1415| | |16|---|---|17| **Reads** | — (nothing; this step bootstraps the project) |18| **Writes** | `STATE.md` + a `scaffold/` folder of demo examples: `scaffold/EXAMPLE-DASHBOARD-REQUEST.md`, `scaffold/EXAMPLE-datasources.json`, `scaffold/.env.example`, `scaffold/branding/EXAMPLE-branding.md`, `scaffold/sample-data/*.csv` |19| **STATE.md update** | Creates the manifest with `init` = `approved` and steps 2–8 = `pending`; records `target_tableau_version`, `data_mode: csv`, `current_version: v_1` |20| **Next step** | `tableau-intake` (or `tableau-data` if the analyst skips intake) |2122### scaffold/ examples vs. production inputs2324Everything `init` writes under `scaffold/` is a **demo example** so the analyst25can trial the whole workflow before owning any real inputs. Every downstream skill26**prefers the production input at the project root** and only falls back to the27`scaffold/` example when the production file is absent:2829| production input (preferred) | scaffold/ demo fallback |30|------------------------------|-------------------------|31| `DASHBOARD-REQUEST.md` | `scaffold/EXAMPLE-DASHBOARD-REQUEST.md` |32| `datasources.json` + `.env` *(published-ds route)* | `scaffold/EXAMPLE-datasources.json` + `scaffold/.env.example` |33| `branding/branding.md` | `scaffold/branding/EXAMPLE-branding.md` |34| `data/*.csv` *(csv route)* | `scaffold/sample-data/*.csv` |3536`init` deliberately creates **only** the `scaffold/` examples (and `STATE.md`),37never the production files — their absence is exactly what tells the analyst (and38the model) which real inputs are still owed. See CONTRACT.md §3 for the canonical39rule.4041## How to run42431. **Determine the project directory.** Default to the current working directory.44 This is where the skeleton and `STATE.md` will be written.45462. **Ask for the target Tableau Desktop version** — unless the user already stated47 it. This is recorded once, here, and drives `tableau-build` later (it is never48 re-asked downstream). Offer exactly the two allowed values:4950 - `2024.2-2025.x` — the broad-compatibility target (no rounded corners, no51 `<explain-data>` in the workbook).52 - `2026.1+` — the newest target (enables `border-radius` and newer XML).5354 If unsure, recommend `2024.2-2025.x` for the widest compatibility.55563. **Run the scaffolder**, passing the chosen version:5758 ```bash59 python "${CLAUDE_PLUGIN_ROOT}/skills/tableau-init/scripts/init.py" --target-version "<version>" "<project-dir>"60 ```6162 (Use `python3` if `python` is unavailable.) The script copies this skill's63 `skeleton/` templates into the project's `scaffold/` folder and writes a64 schema-valid `STATE.md`. It is **non-destructive**: any file that already65 exists — including an existing `STATE.md` — is preserved, never overwritten, so66 re-running on an established project keeps the analyst's edits and pipeline67 progress.68694. **Relay the scaffolder's summary** to the analyst: what was created, what was70 preserved, and the one input to act on now — create their real71 `DASHBOARD-REQUEST.md` at the project root (copy `scaffold/`'s example, or just72 paste the request when running `tableau-intake`). Then tell them to open a73 fresh conversation and run the next step (`tableau-intake` to structure the74 request, or skip straight to `tableau-data` if they prefer). Suggest75 `tableau-route` if they want the router to confirm the next step.7677 **Don't walk the analyst through data acquisition or branding here.** Those78 decisions belong to the skills that own them — `tableau-data` explains the two79 data routes (real CSVs in `data/`, or a published data source queried via the80 VizQL Data Service, with the `scaffold/sample-data/` demo as fallback) when the81 analyst reaches that step, and `tableau-brand` handles branding. Init only lays82 the examples down; it does not pre-explain how to fill them.8384## Notes8586- The `scaffold/` examples (including `scaffold/sample-data/*.csv`) let the project87 run a full demo immediately. How the analyst swaps in real data — into `data/` —88 is **`tableau-data`'s** topic, not init's; don't describe acquisition modes here.89- `target_tableau_version` is the one decision captured at init time. Everything90 else (the request, the data, branding) is filled in by the later steps that91 own those concerns.9293> The full `STATE.md` schema and the ordering / staleness / versioning rules live94> in `CONTRACT.md` at the repo root. This skill restates only its own slice;95> `init.py` is the executable mirror of the schema it writes.