GSAP in Vue, Nuxt and Svelte
greensock/gsap-skills
Shows how to use GSAP in Vue, Nuxt, Svelte and other lifecycle-based frameworks: create after mount, scope selectors to the component, and revert on unmount.
Write finished Calliope story content — beats, cast, screenplay scenes, shot clips, continuity requirements — into an existing Calliope project through the calliope-cli bridge.
$ npx skills add benjiyaya/Calliope --skill calliope -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install benjiyaya/Calliope calliope --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/benjiyaya/Calliope.git skills-src && mkdir -p .claude/skills && cp -r skills-src/calliope-backend/skills_opencode/calliope .claude/skills/calliope && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "calliope" agent skill from https://github.com/benjiyaya/Calliope/tree/main/calliope-backend/skills_opencode/calliope into .claude/skills/calliope/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "calliope", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/benjiyaya/Calliope/tree/main/calliope-backend/skills_opencode/calliopeType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add benjiyaya/Calliope --skill calliope -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install benjiyaya/Calliope calliope --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/benjiyaya/Calliope.git skills-src && mkdir -p .agents/skills && cp -r skills-src/calliope-backend/skills_opencode/calliope .agents/skills/calliope && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "calliope" agent skill from https://github.com/benjiyaya/Calliope/tree/main/calliope-backend/skills_opencode/calliope into .agents/skills/calliope/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "calliope", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add benjiyaya/Calliope --skill calliope -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install benjiyaya/Calliope calliope --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/benjiyaya/Calliope.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/calliope-backend/skills_opencode/calliope .cursor/skills/calliope && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "calliope" agent skill from https://github.com/benjiyaya/Calliope/tree/main/calliope-backend/skills_opencode/calliope into .cursor/skills/calliope/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "calliope", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/benjiyaya/Calliope.git --path calliope-backend/skills_opencode/calliope--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add benjiyaya/Calliope --skill calliope -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install benjiyaya/Calliope calliope --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/benjiyaya/Calliope.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/calliope-backend/skills_opencode/calliope .gemini/skills/calliope && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "calliope" agent skill from https://github.com/benjiyaya/Calliope/tree/main/calliope-backend/skills_opencode/calliope into .gemini/skills/calliope/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "calliope", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install benjiyaya/Calliope calliopeInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add benjiyaya/Calliope --skill calliope -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/benjiyaya/Calliope.git skills-src && mkdir -p .github/skills && cp -r skills-src/calliope-backend/skills_opencode/calliope .github/skills/calliope && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "calliope" agent skill from https://github.com/benjiyaya/Calliope/tree/main/calliope-backend/skills_opencode/calliope into .github/skills/calliope/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "calliope", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add benjiyaya/Calliope --skill calliope -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install benjiyaya/Calliope calliope --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/benjiyaya/Calliope.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/calliope-backend/skills_opencode/calliope .opencode/skills/calliope && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "calliope" agent skill from https://github.com/benjiyaya/Calliope/tree/main/calliope-backend/skills_opencode/calliope into .opencode/skills/calliope/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "calliope", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
calliopeWrite finished Calliope story content — beats, cast, screenplay scenes, shot clips, continuity requirements — into an existing Calliope project through the calliope-cli bridge.
Calliope is an agent skill from benjiyaya/Calliope. Write finished Calliope story content — beats, cast, screenplay scenes, shot clips, continuity requirements — into an existing Calliope project through the calliope-cli bridge. Use when a Calliope project needs story content authored or revised, especially a novel whose source text already sits in the project's Story idea field, or anything too long for Calliope's built-in agent to write in one pass. Triggers: "写故事线", "读小说原文", "生成剧本", "分镜", "story beats", "screenplay", "break into clips", "continuity…
Its SKILL.md is about 5.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Writing & Content, covering Creative writing and fiction and Frontend development. It works with ComfyUI and SvelteKit. The repository describes itself as: Local-first AI Idea-to-video studio — FastAPI + SvelteKit + ComfyUI. The licence is MIT.
Read from SKILL.md and the folder at commit 0a75919. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are bash and json).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Calliope loads about 5.5k tokens when it runs. Until then it costs about 170 tokens; SKILL.md has 2,500 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from benjiyaya/Calliope at commit 0a75919, republished under its MIT licence (© benjiyaya). 2,500 words, ~5,479 tokens.
.claude/skills/calliope/SKILL.md (or your agent's skills folder).The CLI is the only way content enters a Calliope project from outside the web UI. It writes finished text: beats, cast, scenes, clips, continuity requirements, and the source novel itself. It never calls a model, never touches images or video, and never deletes anything.
Read → hash → write → verify. Every time, for every group.
The user edits in the web UI while you work. A write built on a read from ten minutes ago silently overwrites their edit. So:
calliope-cli project hash --project 7 --json # fingerprints, right now
calliope-cli story list --project 7 --json # the content you are acting on
calliope-cli story append --project 7 --file b.json \
--expect-hash <the story_beats value from step 1>--expect-hash is what makes this safe. It is compared inside the write
transaction, so nothing can slip in between the check and the write. Skip it only
for project create.
calliope-cli project list --json # id, title, status, counts
calliope-cli project show --project 7 --json--json and --dry-run go at the end of the line, as above. They are also
accepted in front of the command path — calliope-cli --json project list gives
identical output. Prefer the trailing form; it reads as one command.
project show returns counts and the plan state. The source text is not
included — add --with-idea when you need it, because a novel is 34k+ chars and
plan next summaries must stay readable.
The long-form novel lives in projects.idea. Do not load all of it:
calliope-cli project source --project 7 --from-chars 0 --to-chars 8000 --json
calliope-cli project source --project 7 --grep "老陈" --context-lines 4 --jsonBoth return an object, not a bare string: {text, chars, lines, is_long, from_chars, to_chars, truncated}, or {chars, lines, is_long, matches} for
--grep. chars is the size of the whole text even when you read a window, and
is_long is true past 2000 characters. Each --grep hit carries line,
context_before, context_after, and the list is capped at 200 — re-grep with a
narrower needle rather than trying to page it.
Slice by character offset or grep, repeatedly, until you have what you need. Then
close the loop with context set requirements.
Writing a novel in? Use a file, always:
calliope-cli project set --project 7 --idea-file novel.txtNever pass a multi-line novel to --idea. calliope-cli.bat goes through
cmd.exe, and %* re-expansion treats a raw newline as the end of the command
line — everything after it is dropped, exit code still 0. You would write a
truncated novel and lose the rest of your flags with no error. --idea is only
safe for a single line. (--idea-file - reads stdin, which is also fine.)
Giving both --idea and --idea-file is exit 2: they name the same column.
ingest_mode is set once, at project create --ingest-mode external. It is not
editable afterwards — check project show rather than trying to change it.
Do not decide this yourself. The CLI knows the ordering and why:
calliope-cli plan next --project 7 --json{
"project_id": 7,
"step": "cast.upsert",
"why": "beats exist but no cast; scenes reference characters by name",
"counts": {"story_beats": 24, "characters": 0, "scenes": 0, "clips": 0},
"plan_state": "missing",
"basis_hash": "…",
"hint": "calliope-cli schema show cast upsert"
}step is one of:
step | do this |
|---|---|
story.append | write the beat list from the source text |
cast.upsert | write characters, locations, items |
script.append | write scenes |
clips.append | expand scenes into shots (see targets for scene ids) |
context.set | write overview + requirements (the ledger is not yet authored) |
render | stop — everything is written; the user renders in the web UI |
clips.append and context.set also return targets (the scene ids still to
shoot). Any step may return a note — anything true but not a reason to stop
what you were doing. plan next never gates on a note; it also uses one to report
a gapped or duplicated beat sequence (story order has the detail). When several
notes apply they are joined with " | ".
The order is beats → cast → script → clips → continuity, and it is not negotiable: a scene names characters by name, and a continuity ledger describes shots that must already exist.
Never guess a field name. schema show is generated from the same Pydantic
models the validator uses, so it cannot drift:
calliope-cli schema show # every group/verb
calliope-cli schema show story # the verbs in one group
calliope-cli schema show story append # {group, verb, accepts, payload, schema}
calliope-cli schema validate --group story --verb append --file b.jsonThe inner schema is the JSON Schema; payload says whether the file is an
array or an object. Where a field takes a closed set of keys rather than free
strings — context set's ledger buckets — schema carries it as
propertyNames.enum and x-allowed-keys, matching what the validator
enforces. An unknown group or verb is exit 4, not an empty object.
schema validate checks a payload without writing. Use it before any batch you
are unsure about — it costs one process and catches every field mistake at once.
Compact reference (* = required):
story append / replace-range -> [array] title*, description, order_index
story update -> flags --beat-id --title --description --order-index
cast upsert -> [array] name*, kind(character|location|item), role, age,
appearance, personality, description, reference_image_path
cast update -> flags --entity-id --kind --role --age --appearance
--personality --description
--reference-image-path
--portrait-path --sheet-path --consistency-prompt
(last three: clear a stale ref with "" only)
script append / replace-range -> [array] heading, action, dialog, duration_sec,
order_index, location_id, characters[]
script update -> flags --scene-id --heading --action --dialog
--duration-sec --order-index --location-id
clips append / replace-range -> [array] description, shot_size, duration_sec,
order_index, dialog_lines_covered[]
clips update -> flags --clip-id --description --shot-size
--duration-sec --order-index --dialog-lines-covered
context set -> [object] overview{}, requirements{}
project set -> flags --title --idea --idea-file --genre --tone
--target-duration --status --cover-pathupdate verbs take flags, not a payload file. The others take --file, and
--file - reads stdin if you already hold the JSON.
story append → beat_ids, script append →
scene_ids, clips append → clip_ids, cast upsert → results, one
{id, name, kind, action} per entry where action is created / updated /
unchanged. Only cast upsert tells you whether anything actually changed,
because it is the only one that is an upsert by name.--dialog-lines-covered is comma-separated: --dialog-lines-covered 1,3,7.--entity-id is a row id or the exact name. Renaming is not supported —
name is the upsert identity, and changing it would orphan the scene's
references to that character.cast list comes back grouped by table — {"characters": [...], "locations": [...], "items": [...]} — and each row carries its own kind.
script list does not include a scene's characters; read one scene with
script get --scene-id N, which nests its clips under clips.--portrait-path / --sheet-path / --consistency-prompt point at images the
user generated in the web UI. The CLI has no renderer and will not invent them;
the only accepted value is "", to clear a stale reference.script update cannot change which characters are in a scene. characters is
settable only when the scene is created — use script replace-range on that
scene if the cast actually changed.shot_size is a closed list, exact spellingwide · medium · closeUp · insert · overShoulder
closeup is rejected, not normalised. The CLI does not guess which of two
camelCase spellings you meant, because a whitelist that later gains a value
differing only by case would make the guess silently wrong. "" is the one
accepted empty form — it means "unset".
clip_path, workflow_id, video_settings_json, chain_from_prev,
video_node_id, render_status, portrait_path (from a payload), and every
bookkeeping column a payload has no business naming — id, project_id,
created_at, scene_id — are rejected with exit 2. Those belong to the render
pipeline or to the CLI's own addressing. If you need one changed, the user does
it in the web UI.
order_index is the awkward one: schema show lists it for every group, but
only beats honour it. Scenes and clips take it and overwrite it with a dense
append order. See the two sections below before sending one.
The common shape of this work: some third-party skill turns the novel into an intermediate artifact, and you then write that into Calliope. Fully supported. One rule covers it:
The intermediate artifact's shape is your problem. Calliope's shape belongs to
schema.
That skill may emit markdown, its own JSON, prose — anything. The CLI has never heard of its format and will not try to. Ask the CLI for the shape, then convert in your own context:
# 1. ask what the shape is -- never infer it from the upstream output,
# and never reverse-engineer it from what `get` happens to return
calliope-cli schema show story replace-range
calliope-cli schema validate --group story --verb replace-range --file beats.json
# 2. fingerprint the rows you are about to overwrite
calliope-cli project hash --project 7 --json
# 3. dry-run first: it prints both sides plus the invariant preflight
calliope-cli story replace-range --project 7 --from-index 1 --to-index 999 \
--file beats.json --expect-hash <story_beats hash> --dry-run
# 4. same line without --dry-runDo not hand the upstream artifact to --file unchanged. Four habits it
reliably has are all caught, and catching them is the design working, not an
obstacle to route around:
| Upstream habit | What the CLI says |
|---|---|
| a character name that is not in the cast | exit 2, naming it: unknown character '安'; write it with \cast upsert --kind character` first` |
"closeup" | exit 2 — the list is closed and case-exact (see above) |
dialog_lines_covered as "12,14" | exit 2 — it is a list of ints |
id / project_id / created_at in the payload | exit 2 — those are the CLI's to set |
So when a write comes back exit 2, fix the conversion, not the CLI. There is no flag to loosen validation and there will not be one: a payload that reached the database half-converted would look like a success that silently did nothing.
One upstream habit gets through, so watch it yourself: order_index. It is
listed in schema show for every group, so an artifact that carries positions
looks perfectly valid — and the three groups then disagree about what it means:
| Group | an explicit order_index | what tells you |
|---|---|---|
story (beats) | honoured, stored as sent | story order reports the hole afterwards |
script (scenes) | overwritten with a dense append order | nothing |
clips | overwritten with a dense order within the scene | nothing |
An upstream artifact numbered 1, 3, 7 therefore becomes three beats at 1, 3, 7 with holes 2, 4, 5, 6 — not a rejection, and not what a dense list would
have been. After writing beats, run story order --project 7 --json and read the
holes and duplicates. For scenes and clips the safest move is to strip
order_index from the artifact during conversion and let append order speak.
Compatibility is a property of the CLI boundary, not of this skill. Whatever the upstream produced — valid, nearly valid, or prose — either it validates or it never enters the database.
Do not route [CARRY] constraints through the third-party skill. It rewrites
descriptions, reorders, and "improves" copy; constraint lines do not survive
that. Append them after conversion, or accept that upstream has no idea the
constraint exists.
One thing the CLI being used instead of the built-in generators means: those generators refuse a source text over 2,000 characters (exit 422), because they would spend a real call on text they cannot use and return beats that quietly ignore it. Nothing here refuses — writing a novel's worth of beats is the point.
[CARRY] blockcontext set writes only two things — overview and requirements. It
deliberately cannot write per-shot continuity, because
ensure_continuity_plan rebuilds the whole plan whenever the board moves and
would discard anything stored there.
Per-clip constraints go in clips.description instead, after a [CARRY] marker
line:
[{
"description": "**closeUp.** Ann's hand closes around the lantern.\n[CARRY] The lantern stays lit from here on.\nHer left glove is missing from the second shot onward.",
"shot_size": "closeUp",
"dialog_lines_covered": [12]
}]The block is everything from the marker line to the end of the description — a constraint is a paragraph, not a sentence, so it is never truncated. Everything before the marker is the shot description proper.
Read them back with:
calliope-cli shots list --project 7 --carry --json
calliope-cli clips list --project 7 --scene 3 --jsonscript append and clips append renumber to a dense 1..N. There are no gaps
and order_index always matches position, so you never have to compute it — and
if you send one anyway, it is overwritten rather than honoured.
replace-range --from-index A --to-index B replaces that inclusive slice and
renumbers. An empty replacement is rejected — use update to delete a row.clips are scoped by --scene, which takes a position or an id.Every scene already has one auto-generated clip with an empty description, so
"the scene has clips" does not mean "the scene is written". plan next counts
that correctly and hands you the scene ids in targets.
Scenes and clips are forced dense. Beats are not, because the web UI is also
allowed to leave a gap and a half-written beat list is normal mid-project. A beat
may also land on a position you chose — order_index: 9 in a story append
payload is stored as 9, and the next untargeted beat follows it to 10, so one
invented number leaves 2..8 missing.
So story list can legitimately come back with 1, 9, 10, and story append
extends from the tail, which means the gap does not heal itself.
calliope-cli story order --project 7 --json{
"counts": {"rows": 3, "distinct": 3, "min": 1, "max": 4},
"dense": false,
"duplicates": [],
"holes": [3]
}duplicates is the dangerous one: two rows claim the same order_index, reads
order by (order_index, id), so you get an order you did not write. plan next
reports both in its note when it finds them — read that note before using a
position in replace-range, because "replace beat 3" means something different
when no beat 3 exists.
context set and staleness — two different flagscalliope-cli context get --project 7 --json| field | means |
|---|---|
authored | the ledger has content in overview / requirements — your half |
stale | the derived shots no longer match the board — the model's half |
basis_hash | the board as it is right now |
stored_based_on | what the derived plan was computed from |
context set does not reset based_on, and it must not: based_on is the
model's record of what it computed shots from. Blessing it would make the web UI
trust a per-shot plan that no longer matches the script. Only
ensure_continuity_plan can move it, and it needs the model.
So do not read stale: true as "my work is unfinished" — it will stay true
forever through the CLI. plan next gates on authored instead, which is why it
reaches render instead of asking you to rewrite the ledger on every pass. When
it gets there with a stale plan it says so in note, and that is a web UI action.
Writing a novel in? Its exact bytes matter, so they are stored verbatim:
project set --idea-file does not strip whitespace, and project source reports
chars for the whole text regardless of the window you read.
| exit | meaning | do this |
|---|---|---|
| 2 | your payload is wrong | read stderr, it names the field; schema validate first |
| 3 | the content moved since you read it | re-read, re-apply on top of what is there now |
| 4 | no such project / row | check the id with project list |
| 5 | policy refusal | should be unreachable from here; if you hit it, stop and report it |
Exit 3 is not a retry with the same payload. Someone edited that row — probably the user in the web UI. Re-read, merge, write again.
Drift is reported per table, so projects moving tells you nothing about
story_beats. Check the table named in stderr.
Every write is recorded with before-images, in the same transaction as the change itself. Append-only; there is no prune verb.
calliope-cli log list --project 7 --limit 20 --json
calliope-cli log list --command-filter "story append" --json
calliope-cli log show --entry-id 412 --json # full before/afterUse it to answer "what did you change", and to find out whether a row you thought was stale was changed by you or by the user.
project delete; there is no
flag that enables one. If asked to, say the web UI has to do it.cli/ can reach llm.generate or
ensure_continuity_plan. If you want generation, that is the web UI.# 0. where am I?
calliope-cli project list --json
calliope-cli plan next --project 7 --json
# 1. what does it want? what shape does it take?
calliope-cli schema show story append
# 2. check my payload before writing 40 beats
calliope-cli schema validate --group story --verb append --file beats.json
# 3. fingerprint, then read what is actually there
calliope-cli project hash --project 7 --json
calliope-cli story list --project 7 --json
# 4. write, guarded
calliope-cli story append --project 7 --file beats.json \
--expect-hash 4f2a9c1e8b7d6053
# 5. confirm, and see what landed
calliope-cli story list --project 7 --json
calliope-cli log list --project 7 --limit 1 --json
# 6. next?
calliope-cli plan next --project 7 --json--dry-run on any write prints both sides without touching anything. Use it when
a batch is large or the target is not obvious.
calliope-cli is not on PATH: a bare calliope-cli ... comes back as
"not recognized". The entry point is calliope-cli.bat at the repo root — the
directory that also holds calliope-backend/. Two ways to reach it:
cd <repo root> # once per shell
.\calliope-cli.bat project list --json # cmd: calliope-cli.bator by full path from any working directory:
D:\checkout\Calliope\calliope-cli.bat project list --json.
Every bare calliope-cli ... in this file means .\calliope-cli.bat.
The working directory matters only for finding the bat. The bat locates its own Python from its own position, and the config locates the database from the package's own position — both absolute — so the CLI and a running web UI point at the same database wherever you invoked it from. That is intentional: it is what makes the drift guard meaningful, and it is also why you must read immediately before writing.
The bat sets the code page to UTF-8 itself, so Chinese in --idea or a payload
file survives the round trip.
© benjiyaya, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in calliope-backend/skills_opencode/calliope of benjiyaya/Calliope.
Open the folder on GitHubat commit 0a75919
Calliope next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Calliope this skillbenjiyaya/Calliope | 242 | — | ~5.5k | Automated safety check: Pass | MIT | |
| GSAP in Vue, Nuxt and Sveltegreensock/gsap-skills | 16k | 3 repos | ~2.6k | Automated safety check: Pass | MIT | |
| Svelte Core Best Practicesrilldata/rill | 2.9k | 4 repos | ~1.8k | Automated safety check: Pass | Apache-2.0 | |
| Character Refseternityspring/shuohao-skills | 4.3k | — | ~1.7k | Automated safety check: Warn | Apache-2.0 | |
| Live UX PolishEveryInc/compound-engineering-plugin | 25k | — | ~777 | Automated safety check: Pass | MIT | |
| Managing TranslationsComfy-Org/workflow_templates | 1.3k | — | ~992 | Automated safety check: Pass | MIT |
greensock/gsap-skills
Shows how to use GSAP in Vue, Nuxt, Svelte and other lifecycle-based frameworks: create after mount, scope selectors to the component, and revert on unmount.
rilldata/rill
Rules for writing idiomatic Svelte 5 code: when to reach for runes like state, derived and effect, and how to handle props, attachments and bindings.
eternityspring/shuohao-skills
给任何故事里的角色真出参考图(小说改编、自己原创的故事、单独设计一个角色都行,不需要小说原文): 一段话描述角色,拆成分层字段、补全后确认, 先出一张正面全身锚点,其余视图(大头照、90° 侧面、背面、细节、45° 大头照)都只参考这张锚点, 按需分档出图。每张图带标识、可单独重出,重出后自动标出哪些图过期。
EveryInc/compound-engineering-plugin
Collects your feedback on a running feature, typed or spoken and drawn in the browser, and turns it into focused UX fixes saved as local commits.
Comfy-Org/workflow_templates
Manages internationalization and translations for ComfyUI workflow templates.
jtydhr88/comfyui-custom-node-skills
Guide to writing JavaScript extensions for the ComfyUI frontend from custom nodes, covering lifecycle hooks, widgets, sidebar tabs, commands, settings, toasts and dialogs.
benjiyaya/Calliope
A skill your agent uses when the user asks to build, pose, frame, or ANIMATE a 3D scene in Build Scene — characters, primitives, shot framing, keyframe motion, or exporting a blockout as a…
benjiyaya/Calliope
A skill your agent uses when writing or improving character image prompts — sheets, portraits, and reference images that stay consistent across scenes.
benjiyaya/Calliope
A skill your agent uses when turning a Calliope scene into a video job — chaining from a previous clip, ordering reference images, or picking duration settings.
benjiyaya/Calliope
A skill your agent uses when making MiniMax H3 video prompts from media + ideas.
Categories
Write finished Calliope story content — beats, cast, screenplay scenes, shot clips, continuity requirements — into an existing Calliope project through the calliope-cli bridge. Calliope is an agent skill from benjiyaya/Calliope. Write finished Calliope story content — beats, cast, screenplay scenes, shot clips, continuity requirements — into an existing Calliope project through the calliope-cli bridge.
Calliope fits situations like: A Calliope project needs story content authored; especially a novel whose source text already sits in the projects Story idea field; anything too long for Calliopes built-in agent to write in one pass.
Run `npx skills add benjiyaya/Calliope --skill calliope -a claude-code`. Or copy the skill folder (calliope-backend/skills_opencode/calliope in benjiyaya/Calliope) into .claude/skills/calliope in your project. Claude Code loads it when a task matches its description.
Run `npx skills add benjiyaya/Calliope --skill calliope -a codex`. Or copy the skill folder (calliope-backend/skills_opencode/calliope in benjiyaya/Calliope) into .agents/skills/calliope in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add benjiyaya/Calliope --skill calliope -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/calliope, .gemini/skills/calliope, .github/skills/calliope and .opencode/skills/calliope in your project.
SKILL.md names no scripts, command-line tools or credentials: Calliope is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Calliope is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.5k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Calliope: GSAP in Vue, Nuxt and Svelte (greensock/gsap-skills, 16k stars), Svelte Core Best Practices (rilldata/rill, 2.9k stars), Character Refs (eternityspring/shuohao-skills, 4.3k stars) and Live UX Polish (EveryInc/compound-engineering-plugin, 25k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
benjiyaya (a GitHub user) maintains it in benjiyaya/Calliope, which has 242 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on October 7, 2026.
Source: benjiyaya/Calliope on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.