Releases: suprsend/cli
Release list
1.0.1
1.0.0
Changelog
- fff1159 ENG-496: CLI 0.2 config refactor and UX fixes (#65)
- 4378f35 chore(deps): bump sigstore/cosign-installer in the actions group (#68)
- e74ecb4 genskills: agent-friendly description + per-command Tips (#66)
- 1b37645 genskills: narrow cli skill trigger to running commands only (#67)
- 37e993b profile: URL prompts + tighter validation in add/modify (#35)
1.0.0-beta.1
First beta of the 1.0 line. Breaking release — every artifact-pulling resource changes its on-disk shape, and several CLI short flags change identity. Try it on a non-production workspace first.
Install:
npm i -g suprsend@beta·npx suprsend@beta· plainnpm i -g suprsendstill resolves to0.2.24.
Breaking — on-disk artifact layout
Every non-template resource moves to a plural top-level dir + per-item subdirectory. Pulled metadata files now embed an upstream $schema reference.
| Resource | Before | After |
|---|---|---|
| Workflow | workflow/{slug}.json |
workflows/{slug}/workflow.json |
| Schema | schema/{slug}.json (json_schema inline) |
schemas/{slug}/schema.json + schemas/{slug}/payload_schema.json |
| Event | event/event_schema_mapping.json (bundled) |
events/{slugified-name}/event.json |
| Preference categories | category/categories_preferences.json + category/translation/{locale}.json |
preference_categories/categories.json + preference_categories/translations/{locale}.json |
| Template translations | translation/{filename}.json |
translations/{filename}.json |
- Events use dual identity. Backend allows
/, spaces, etc.; pull slugifies the name to a directory handle and preserves the original verbatim inevent.json#name.mv events/old/ events/new/does NOT rename the event — editevent.json#nameinstead. - Schema validation runs client-side. Schema push (real and
--dry-run) compilespayload_schema.jsonagainst JSON Schema draft 2020-12 and rejects schemas whose roottypeis notobject.
Breaking — CLI short flags
Hard breaks; scripts using the dropped forms fail with unknown flag.
| Short | Old | New |
|---|---|---|
-m |
--commit-message |
--mode only |
-f |
--offset / --force |
dropped |
-l |
--limit / --locale |
--limit only |
-n |
--no-color |
--dry-run |
-F |
unused | --force (uniform) |
-S |
unused | --from (sync source) |
-q |
unused | --quiet (root-persistent) |
-j |
unused | --json (inline payload on push) |
Also: --commit is now a clean boolean everywhere (was string on some); --mode added to template list/get/pull; positional slug AND --slug flag both accepted everywhere; TTY-gated prompts (no more silent CI hangs); confirmations on destructive ops; JSON errors when stderr piped, with stable error codes (auth-missing-token, api-not-found, etc.) and exit codes 0/1/2/3/4/5/64.
New
suprsend templatecommand group — full CRUD with per-channel variant extraction, mock data, variant ordering.suprsend workspace list·suprsend env·suprsend completion bash|zsh|fish|powershell.- MCP server: dynamic workflow-trigger tools register concurrently (cold-start fix for large workspaces);
--workflowsacceptstag:{tag}selectors;list-toolsshows rich descriptions. - MCP Registry support — server published to registry.modelcontextprotocol.io on each stable release (skipped for this beta).
- Glama listing.
--dry-runon every destructive command (push / commit / sync / enable / disable).- Streaming template pull — large workspaces (~635 templates) went from 120s+ feeling frozen → ~45s with live
Pulled N/Totalprogress. - Per-item progress + summary blocks uniformly across push commands;
Wrote ... to ...log lines on pulls. - Push API errors prefixed with the on-disk path (e.g.
schemas/order_confirmation: failed to push: {reason}).
Notable fixes
translation list --include-content=truenow actually returns content (typed-decode bug).translation get {filename}andevent get {name}fetch a single item (were returning the whole workspace).schema listshowsnameinstead of the always-emptytitle.category pushpushes translations alongside categories regardless of--commit(matches docstring).category translation pushno longer silent-no-ops when onlyen.jsonis present.- Cobra's noisy
Usage:dump on every error is silenced.
Migration
Two paths. Both assume the new CLI is installed — verify with suprsend --version.
Path A — clean re-pull (recommended)
Backs everything up, re-pulls fresh in the new layout. Loses any uncommitted local edits.
mv suprsend suprsend.old
suprsend workflow pull
suprsend event pull
suprsend schema pull
suprsend category pull
suprsend translation pull
# verify the new layout looks right, then:
rm -rf suprsend.oldPath B — convert in place (preserves uncommitted edits)
Run each block from the repo root. Every block is guarded by a "source exists" check, so it's safe to re-run and safe to skip a resource that doesn't exist locally.
Workflows — pure mv
if [ -d workflow ]; then
mkdir -p workflows
find workflow -maxdepth 1 -type f -name '*.json' | while read -r f; do
slug=$(basename "$f" .json)
mkdir -p "workflows/$slug"
mv "$f" "workflows/$slug/workflow.json"
done
rmdir workflow 2>/dev/null || true
fiSchemas — splits each schema file into two; requires jq
Each schema/{slug}.json is split into:
schemas/{slug}/schema.json— metadata only (slug,name,description); readonly server fields (status,hash,version_no) and legacyis_enabledare stripped.schemas/{slug}/payload_schema.json— thejson_schemafield extracted; only written if the source had a non-nulljson_schema.
if [ -d schema ]; then
mkdir -p schemas
find schema -maxdepth 1 -type f -name '*.json' | while read -r f; do
slug=$(basename "$f" .json)
mkdir -p "schemas/$slug"
jq 'del(.json_schema, .status, .hash, .version_no, .is_enabled)' "$f" > "schemas/$slug/schema.json"
if jq -e '.json_schema != null' "$f" >/dev/null; then
jq '.json_schema' "$f" > "schemas/$slug/payload_schema.json"
fi
done
rm -rf schema
fiEvents — unbundle event_schema_mapping.json and slugify names; requires jq
Slugifies each event name to a shell-safe directory handle. Rule: optionally preserve a leading $, replace [^a-zA-Z0-9._-] with _, strip leading/trailing non-alphanumeric, truncate to 128. Original name preserved verbatim in event.json#name.
if [ -f event/event_schema_mapping.json ]; then
mkdir -p events
jq -c '.events[]' event/event_schema_mapping.json | while read -r ev; do
name=$(printf '%s' "$ev" | jq -r '.name')
case "$name" in
\$*) prefix='$'; body=${name#\$} ;;
*) prefix=''; body=$name ;;
esac
body=$(printf '%s' "$body" \
| sed -e 's/[^a-zA-Z0-9._-]/_/g' \
-e 's/^[^a-zA-Z0-9]*//' \
-e 's/[^a-zA-Z0-9]*$//' \
| cut -c1-127 \
| sed -e 's/[^a-zA-Z0-9]*$//')
if [ -z "$body" ]; then
printf 'skip: event name %q has no representable form — rename in SuprSend UI first\n' "$name" >&2
continue
fi
dir="$prefix$body"
if [ -e "events/$dir" ]; then
printf 'skip: event name %q slugifies to %q which already exists (collision) — rename in SuprSend UI first\n' "$name" "$dir" >&2
continue
fi
mkdir -p "events/$dir"
printf '%s' "$ev" | jq . > "events/$dir/event.json"
done
rm -rf event
fiPreference categories — rename dirs and files
if [ -d category ]; then
mkdir -p preference_categories/translations
[ -f category/categories_preferences.json ] \
&& mv category/categories_preferences.json preference_categories/categories.json
if [ -d category/translation ]; then
find category/translation -maxdepth 1 -type f -name '*.json' -exec mv {} preference_categories/translations/ \;
fi
rm -rf category
fiTemplate translations — pure directory rename
if [ -d translation ]; then
mv translation translations
fiAdd the $schema reference — required after Path B
After the structural moves above, each metadata file needs an upstream $schema URL. Easiest is to run suprsend {resource} pull once and let the CLI re-write them — but that overwrites any uncommitted local edits with server state. To preserve edits, use these jq snippets:
# workflows
find workflows -mindepth 2 -maxdepth 2 -type f -name workflow.json | while read -r f; do
jq 'if has("$schema") then . else {"$schema":"https://schema.suprsend.com/workflow/v1/schema.json"} + . end' "$f" > "$f.tmp" && mv "$f.tmp" "$f"
done
# events
find events -mindepth 2 -maxdepth 2 -type f -name event.json | while read -r f; do
jq 'if has("$schema") then . else {"$schema":"https://schema.suprsend.com/event/v1/schema.json"} + . end' "$f" > "$f.tmp" && mv "$f.tmp" "$f"
done
# schemas — metadata
find schemas -mindepth 2 -maxdepth 2 -type f -name schema.json | while read -r f; do
jq 'if has("$schema") then . else {"$schema":"https://schema.suprsend.com/schemas/v1/schema.json"} + . end' "$f" > "$f.tmp" && mv "$f.tmp" "$f"
done
# schemas — payload schemas (point at JSON Schema's own meta-schema)
find schemas -mindepth 2 -maxdepth 2 -type f -name payload_schema.json | while read -r f; do
jq 'if has("$schema") then . else {"$schema":"https://json-schema.org/draft/2020-12/schema"} + . end' "$f" > "$f.tmp" && mv "$f.tmp" "$f"
done
# preference-categories
if [ -f preference_categories/categories.json ]; then
f=preference_categories/categories.json
jq 'if has("$schema") then . else {"$schema":"https://schema.suprsend.com/preference_category/v1/schema.json"} + . end' "$f" > "$f.tmp" && mv "$f.tmp" "$f"
fi
# translations don't carry a $schema ref (no upstream schema exists)For CLI flag breakages, scripts will fail loudly with `unknown flag...
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
Changelog
- Upgraded dependencies
- Added support for generating SKILLS.md