Releases: kyle-chalmers/streamsnow
Release list
v0.3.0 — the UX release: 14 skills → 8, one front door, ≤5-question setup
The UX release: 14 skills → 8, one front door, ≤5-question setup, plain language on every
user-facing surface. Engine changes are minimal — the CLI checks, scaffolder, deploy generators,
hooks, and templates carry over (one exception: the configure wizard slimmed down); this is a
surface-area consolidation, applying the design system shipped in Ticketwright v2.0.
Changed — the rename map (v0.2 → v0.3)
| v0.2 | v0.3 |
|---|---|
start-app + new-app + refine-requirements + add-page + onboard |
start-app (the front door — owns spec → scaffold → build → ship; --spec for the requirements phase incl. backfill from existing source, --setup for machine + repo setup, adopt for existing repos) |
review-app + apply-review + auto-review-app + sql-review |
review-app (--fix applies findings as atomic commits, --auto loops review→fix to convergence, --sql writes the audit companions) |
deep-dive-data |
audit-lineage |
| — | feedback-app (new — upstreamed from production use: classify user feedback into BUG / POLISH / UX / NEW-FEATURE / CROSS-CUTTING, apply as atomic per-item commits, follow-up review) |
preview-app, validate-app, ship-app, migrate-app |
unchanged names, refreshed surfaces |
All 8 retired names still work as deprecated alias stubs (commands/); they will be removed in
the next major release.
Added
- Adopt mode (
skills/start-app/adopt.md) —/start-app adopton a repo that already has
Streamlit apps maps onto the observed layout instead of scaffolding over it, classifies custom
commands/skills as shadows / extends / unrelated against the plugin's skills, and writes a
MIGRATION.mdchecklist. An existingAGENTS.mdis never overwritten (renders to
AGENTS.streamsnow.mdfor manual merge). - ≤5-question
streamsnow configure— down from ~14 prompts. Asks only runtime, account
locator, governed database, allowed schemas, and deploy source; everything else (project
identity derived from the directory name, roles, warehouse, schema names, container objects,
git-repository deploy fields) is written as an inline-commented default in
streamsnow.config.yaml— the file is the editing surface, and re-runningconfigureprefills
from it so hand edits survive. Guarded by a newtests/test_wizard.pycontract test. - Plugin-surface contract test (
tests/test_plugin_surface.py) — CI now asserts the 8-skill
surface, the ≤80-line SKILL.md cap, the 8 alias stubs pointing at their replacements, no retired
name referenced as live insideskills/, and every relative markdown link resolving. - Spec backfill (
/start-app --spec <slug>on an app with existing code) — reverse-engineers
REQUIREMENTS.mdfromst.Pagedeclarations, chart/KPI/filter calls, SQL header blocks, cache
decorators, andsnowflake.yml, marking anything uncertain(inferred)for §10 review.
Upstreamed from proven production use. skills/_shared/runtime-decision.md— the container-vs-warehouse decision in one place,
neutrally framed (both runtimes are legitimate; the repo default wins absent a concrete reason),
with the detection rule, trade-off table, and the manifest/connection checklist. Skills now link
to it instead of re-explaining the choice (previously restated in 5+ skills).docs/migrating-a-consumer-repo.md— map a repo's home-grown skills to the plugin surface
(worked example: a 16-skill production repo), what stays local (branding parity, tracker
integration, warehouse-specific rules), and the incremental adoption path.
Changed (language & structure)
- SKILL.md ≤80 lines, depth in reference files — every skill's front page is now a scannable
contract (modes, steps, boundaries), with detail split into per-skill reference files
(start-app/{spec,scaffold,pages,setup,adopt}.md,
review-app/{dimensions,fixes,auto-loop,sql-companions}.md,audit-lineage/tracing.md,
feedback-app/classification.md,validate-app/fixing-checks.md). - Plain language on user surfaces — skill descriptions lead with the trigger use-case;
"deterministic PASS/FAIL ship gate" reads "the pass/fail check that must be clean before
shipping"; report summaries print critical / should-fix / nice-to-have; "legacy" dropped from
warehouse-runtime framing. Contributor-facing terms (bucket mechanics, check internals) stay in
reference files. - Graceful degradation instead of hard failure — missing config: review runs static-only and
says which findings go unverified; missing Snowflake connection: lineage/companion rows are
marked unverified with the exact enabler named; missing Playwright MCP: walkthroughs skip
silently. Skills name the enabler instead of refusing. - §11 Build Progress simplified —
Current phaseplus an append-only Sessions log whose last
line names the next command. The per-page status table is gone (page state is visible in the
tree and git); existing specs keep working, the table just stops being maintained. hooks/session_start.shdiscovery line, README, and docs updated to the 8-skill surface.
Carried from the previous Unreleased
docs/distribution.md— how StreamSnow ships (PyPI CLI + Claude Code plugin)
and the recorded decision not to add a separatecp -rcopyable kit
(streamsnow initis the config-driven "bettercp -r").- Thickened the plugin skills toward the source's depth — that content now lives in the v0.3
reference files rather than monolithic SKILL.mds.
v0.2.0
Fixed
- The scaffolded
branded_metricnow HTML-escapes its label/value/delta before
rendering withunsafe_allow_html=True, so a database-derived value cannot
inject markup into the viewer's page (hardening applied to the template and the
example). Dependency-name matching is PEP 503-normalized, so a manifest that
spells a package with underscores/dots (snowflake_snowpark_python) is no
longer reported as missing. validate-appnow validates the contents of the sibling dependency
manifest, not just its presence: container apps must declare a
requires-pythonthat admits the container runtime's Python (PEP 440
specifier semantics, so>=3.10is accepted and<3.11/==3.10.*are
correctly rejected) plusstreamlit+snowflake-snowpark-python; warehouse
apps must declare those deps inenvironment.ymland must not pinpython.check cachingnow flags two patterns it previously missed: a public loader
that hands a named query through a local variable
(sql = load_sql("x"); conn.query(sql)) and one that delegates a named
query to a private fetch helper (including transitive helper chains). Only the
SQL-bearing argument is inspected, so an unrelated string keyword (e.g.
query_tag="adhoc") no longer trips the generic-executor guard.
Added
- Documentation guides:
docs/getting-started.md(try the example with no
Snowflake, then set up a governed repo),docs/data-discovery.md(find tables
and wire governed queries), anddocs/deploying.md(the end-to-end deploy
story for both deploy sources). Linked from the README. - Runnable example app at
examples/sample-dashboard/— a StreamSnow-shaped
Streamlit dashboard wired to deterministic sample data, so it renders with
streamlit runand no Snowflake connection. Mirrors thestreamsnow init
structure (st.navigation entrypoint, branding,@st.cache_dataloaders). packagingruntime dependency (PEP 440 version-specifier parsing in
validate-app).
StreamSnow v0.1.0
First public release. Build, govern, and ship Streamlit-in-Snowflake apps with Claude Code: a streamsnow CLI (configure/init/new/validate-app/preview/check/deploy) + a Claude Code plugin (14 skills + shared recipes). Container & warehouse runtimes; stage-copy & git-repository deploy sources. Install: uvx streamsnow or pip install streamsnow. See CHANGELOG.md.