Studio Source Control logo

Studio Source Control

Organization
serac-labs
studio-source-control

Drive a scoped application's linked git repository from the instance — what has to be true before Source Control works at all, the commit-then-push order, stashes and branches over /api/sn_source_control, and when this replaces update sets rather than sitting next to them.

Overview

Publisherserac-labs
Repositoryserac
Skill namestudio-source-control
Stars
78
Forks
26
Bundled files
Instructions only
LicenseApache-2.0
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by serac-labs on GitHub. Read the source before you install it.

Installation

Install the Studio Source Control AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/serac-labs/serac.git /tmp/serac
mkdir -p .claude/skills
cp -r /tmp/serac/packages/skills/studio-source-control .claude/skills/studio-source-control
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Studio Source Control in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Studio Source Control on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Studio Source Control is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Studio Source Control

A scoped application can be linked to a git repository, after which its records are committed and pushed like code. snow_source_control drives that over /api/sn_source_control.

This is not the Fluent toolchain. The fluent-* skills are about building an app from a local SDK project; this is the platform's own git integration, reached from inside the instance. Both end up in a repository and they are different routes.

Before it works at all

Source Control fails in ways that look like tool bugs when any of these is missing. Check them first:

  1. The app is scoped. Global-scope artefacts cannot be linked. sys_app with a scope like x_company_module.
  2. The app is linked to a repository. Done once, in Studio (Source Control → Link to Source Control). Nothing here creates the link.
  3. Credentials exist on the instance. A sys_repo_credential record holding the repo credential — a PAT for GitHub/GitLab, not a password. Pass its alias as credentials_alias when the remote needs auth.
  4. The Source Control plugin is active and the instance can reach the remote outbound. On a restricted network that means a MID server, and the failure is a timeout rather than a 401.

Confirm the link before anything else:

javascript
await snow_query_table({ table: "sys_app", query: "scope=x_acme_ops",
                         fields: "sys_id,name,scope,sys_class_name" })
await snow_source_control({ action: "status", app_scope: "x_acme_ops" })

status on an unlinked app is the fastest way to find out you are not where you think you are.

Commit, then push — they are separate

The order is git's, not ServiceNow's, and the tool does not merge the two:

javascript
// 1. what changed in the working copy
await snow_source_control({ action: "status", app_scope: "x_acme_ops" })

// 2. commit it locally, with a message
await snow_source_control({ action: "commit", app_scope: "x_acme_ops",
                            commit_message: "fix: widen the assignment lookup" })

// 3. and only then send it to the remote
await snow_source_control({ action: "push", app_scope: "x_acme_ops", credentials_alias: "acme-github" })

A commit that is never pushed lives only on that instance. This is the most common confusion: the change looks committed, the repository does not have it, and a second developer's pull overwrites it.

pull applies remote changes onto the working copy. Pull before you start, not after you have edited — a conflict here is resolved record by record in the UI, not by the tool.

Branches and stashes

javascript
await snow_source_control({ action: "branch", branch_action: "list", app_scope: "x_acme_ops" })
await snow_source_control({ action: "branch", branch_action: "create",
                            branch_name: "feature/wider-lookup", from_branch: "main",
                            app_scope: "x_acme_ops" })
await snow_source_control({ action: "branch", branch_action: "switch",
                            branch_name: "feature/wider-lookup", app_scope: "x_acme_ops" })

Switching a branch changes the records on the instance. This is the part that has no local-git equivalent: there is one working copy and it is the application on that instance. Switching branches mid-session changes what every other user of that instance sees. Do it on a development instance, never on one anybody is testing against.

stash is the escape hatch when a switch refuses because the working copy is dirty:

javascript
await snow_source_control({ action: "stash", stash_action: "create", stash_name: "wip",
                            stash_message: "half-done lookup change", app_scope: "x_acme_ops" })
// … switch, do something else, switch back …
await snow_source_control({ action: "stash", stash_action: "apply", stash_name: "wip",
                            app_scope: "x_acme_ops" })

diff takes an optional record_sys_id for one record, or nothing for the whole working copy. Read it before committing — the working copy contains every change any user made on that instance since the last commit, not only yours.

Source control or update sets

Not both for the same artefacts. Pick per application:

Source controlUpdate sets
Scopeone scoped appanything, including global
Unita commita set of sys_update_xml rows
Historythe repository'sthe instance's
Merginggit merge, per branchlast write wins on retrieve
Rollbackcheck out an earlier commitback out the set

An app under source control should not also be moved by update sets — you get two histories that disagree about what shipped, and an update set applied over a linked app leaves the working copy dirty against a commit nobody made.

Global-scope work stays on update sets regardless; it cannot be linked. Most real instances therefore run both, on different artefacts. update-set-workflow covers that half.

The DevOps tools around it

snow_track_deployment, snow_create_devops_pipeline, snow_create_devops_change, snow_get_devops_insights and snow_velocity_tracking sit on the sn_devops_* tables. They record and report on deployments — they do not perform them, and they are independent of whether the app is linked to a repository. Reach for them when the question is "what shipped and when", not "put this code somewhere".

Verify before you trust it

The tool's own description says its paths are best-effort against the published Source Control REST docs and want live-instance verification. That is accurate, and it shows in the implementation: status, branch list and stash list fall back to reading sys_repo_status, sys_repo_branch and sys_repo_stash directly when the REST path 404s, because some releases expose them as records instead.

Practically: run status first on any instance you have not used this on. If it comes back from the fallback path, the read actions work and the write actions are the ones to try carefully — commit something trivial and check the repository before relying on push in a pipeline.

Related

  • update-set-workflow — the other way to move changes, and the right one for global scope.
  • scoped-apps — what makes an application scoped in the first place.
  • fluent-development — building an app from a local SDK project, a different route to the same repo.

Frequently asked questions

What does the Studio Source Control AI skill do?

Drive a scoped application's linked git repository from the instance — what has to be true before Source Control works at all, the commit-then-push order, stashes and branches over /api/sn_source_control, and when this replaces update sets rather than sitting next to them.

Why use Studio Source Control on TypingMind?

Because you install it once and use it with any model. Studio Source Control is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Studio Source Control in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/serac-labs/serac/tree/main/packages/skills/studio-source-control. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Studio Source Control?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Studio Source Control?

As many as you like. As long as a model supports skills, you can use Studio Source Control with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Studio Source Control AI skill free?

Yes. It is published on GitHub by serac-labs under the Apache-2.0 license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇