Bundles live in ~/.flowly/skill-bundles/ (profile-scoped: $FLOWLY_HOME/skill-bundles/ under a non-default profile).
File format
~/.flowly/skill-bundles/<slug>.yaml:
name: Research Tools # β slug "research-tools"; defaults to file stem
description: "Web research workflow" # optional
instruction: "Always cite sources" # optional, appended to every invocation
skills: # required, non-empty list of skill names
- web-search
- arxiv| Field | Required | Notes |
|---|---|---|
name | No | Becomes the /slug (case-insensitively canonicalized). Defaults to the file stem. |
description | No | Shown in the composed header. |
instruction | No | Appended as a footer on every invocation. |
skills | Yes | Non-empty list of skill names (strings). |
skills, malformed YAML, or a non-mapping root cause the file to be skipped with a warning β never a crash. Duplicate bundle slugs keep the first scanned and warn.
How /slug works
When a user turn begins with /, Flowly tries to expand it. Resolution order is bundle first, then individual skill β a /slug resolves to a same-named bundle before a same-named skill.
A bundle match rewrites the message into a single composed payload for that turn:
- A header:
[BUNDLE] name β descriptionplus the list of loaded skills. - Each referenced skill's stripped body, joined by
---. - The bundle
instructionfooter (if set). - A
[Note]listing any skills that could not load. - The user's original input as
[Task].
Bundles are stateless: the composed content is injected for that one turn only. Missing or unavailable skills are skipped, not fatal.
A bare /<skill-name> (no matching bundle) instead expands a single skill and surfaces its supporting files, telling the agent to call skill_view(name, file_path=β¦) for detail.
creation does no name check β flowly bundles create will happily write a bundle whose slug collides with a built-in command, another bundle, or a plugin command. The reserved-name guard works the other way: at expansion time it stops a skill from shadowing a built-in command or a bundle, so the bundle (resolved first) always wins.
CLI: flowly bundles
| Command | Description |
|---|---|
flowly bundles list | List defined bundles. |
flowly bundles show <slug> | Show a bundle's skills and metadata. |
flowly bundles create <name> [-s SKILL β¦] [-d DESC] [-i INSTRUCTION] [--force] [--interactive] | Create a bundle file. |
flowly bundles delete <slug> [-y] | Delete a bundle. |
flowly bundles reload | Force-drop the bundle cache and re-read the directory. |
flowly bundles create research-tools -s web-search -s arxiv -d "Web research workflow"
flowly bundles list
flowly bundles show research-tools
flowly bundles reload
flowly bundles delete research-tools -yBundle files are cached by an mtime fingerprint over the directory and each *.yaml; the cache refreshes automatically on change, and reload forces it.
Invoking and managing bundles
There is no /bundles slash command. Trigger a bundle from any channel with /<bundle-slug>; manage them with the flowly bundles CLI above.