srgn CLI
Overview
Use this skill to convert user intent into precise srgn commands with safe defaults.
Focus on CLI workflows for search, transformation, scoped migrations, and lint-like checks.
Workflow Decision Tree
- •Classify the request.
- •Search only: no content changes expected.
- •Transform in stream: stdin/stdout pipeline usage.
- •Transform files: in-place updates over globs.
- •Identify scope strategy.
- •Regex scope only.
- •Language scope only.
- •Combined language + regex scope.
- •Custom tree-sitter query scope.
- •Identify action strategy.
- •Replacement (positional replacement argument after
--). - •Composable actions (
--upper,--lower,--titlecase,--normalize,--symbols,--german). - •Standalone actions (
-d,-s).
- •Replacement (positional replacement argument after
- •Apply safety controls.
- •Prefer
--dry-runfor file operations. - •Keep globs quoted.
- •Add
--fail-no-fileswhen missing files should fail CI.
- •Prefer
- •Choose output mode.
- •Human-readable (default tty).
- •Machine-readable (
--stdout-detection force-pipe).
- •Validate behavior.
- •Confirm expected match count.
- •Confirm no out-of-scope edits.
- •Re-run with stricter scope if needed.
Safety Protocol
- •Default to non-destructive behavior first.
- •Prefer stdin-based or search-mode examples before in-place rewrites.
- •For file edits, require preview path.
- •Use
--dry-runfirst. - •Then run the same command without
--dry-runonly after confirmation.
- •Use
- •Protect shell parsing boundaries.
- •Quote regex.
- •Quote globs:
--glob '**/*.py'. - •Use
--before replacement values.
- •Use the narrowest scope that solves the task.
- •Prefer language scope + anchored regex over broad regex-only replacement.
- •Treat
-dand-sas high-risk operations.- •Always provide explicit scope for them.
Command Construction Template
Use this template when building commands:
bash
srgn [LANGUAGE_SCOPE_FLAGS...] [GLOBAL_FLAGS...] [ACTION_FLAGS...] [SCOPE_REGEX] -- [REPLACEMENT]
Build incrementally:
- •Scope first.
- •Example:
--python 'imports'
- •Example:
- •Regex filter second.
- •Example:
'^old_pkg'
- •Example:
- •Action third.
- •Replacement:
-- 'new_pkg' - •Or composable flag:
--upper
- •Replacement:
- •File mode flags fourth (if needed).
- •
--glob '**/*.py' --dry-run
- •
- •CI behavior last.
- •
--fail-anyor--fail-none
- •
High-Value Task Recipes
- •Rename module imports in Python only:
bash
srgn --python 'imports' '^old_pkg' --glob '**/*.py' --dry-run -- 'new_pkg'
- •Convert
printcalls to logging in Python call-sites only:
bash
srgn --python 'function-calls' '^print$' --glob '**/*.py' --dry-run -- 'logging.info'
- •Rename Rust
useprefixes without touching strings/comments:
bash
srgn --rust 'uses' '^good_company' --glob '**/*.rs' --dry-run -- 'better_company'
- •Remove C# comments only:
bash
srgn --csharp 'comments' -d '.*'
- •Search for Rust
unsafelanguage keyword usage only:
bash
srgn --rust 'unsafe'
- •Fail CI if undesirable pattern appears in Python docstrings:
bash
srgn --python 'doc-strings' --fail-any 'param.+type'
- •Force machine-readable output for downstream parsers:
bash
srgn --python 'strings' --stdout-detection force-pipe '(foo|bar)'
- •Preview multi-file changes with deterministic ordering:
bash
srgn --typescript 'imports' '^legacy-lib' --glob 'src/**/*.ts' --sorted --dry-run -- 'modern-lib'
For broader, categorized examples, load references/cli-cookbook.md.
Failure and Debug Playbook
- •No matches when matches are expected.
- •Verify language scope and prepared query name.
- •Remove regex temporarily to test scope alone.
- •Add
--stdout-detection force-pipeto inspect exact matched columns.
- •Too many matches.
- •Anchor regex (
^...$) where possible. - •Narrow from generic language scope to a specific prepared query.
- •Anchor regex (
- •Wrong files targeted.
- •Confirm
--globpattern and shell quoting. - •Add
--fail-no-filesin CI to catch empty globs.
- •Confirm
- •Unclear behavior across multiple language scopes.
- •Default is intersection (left-to-right narrowing).
- •Use
-jfor OR behavior.
- •Special characters misinterpreted as regex.
- •Use
--literal-stringwhen literal matching is intended.
- •Use
Reference Loading Guide
Load reference files based on request type:
- •
references/cli-cookbook.md- •Load for routine command construction and practical recipes.
- •
references/language-scopes.md- •Load for prepared query selection by language.
- •
references/advanced-patterns.md- •Load for custom queries, capture substitutions, join semantics, and CI failure modes.
- •
references/deepwiki-recursive-notes.md- •Load for complete DeepWiki-derived background and architecture context.
Intent-to-Command Map
Use this map to respond quickly:
- •"Rename imports safely"
- •Use language import scope + anchored regex +
--glob ... --dry-run.
- •Use language import scope + anchored regex +
- •"Update function calls only"
- •Use language call-site scope (for example
--python 'function-calls') + exact name regex.
- •Use language call-site scope (for example
- •"Only comments/docstrings"
- •Use prepared comment/docstring scopes, add
-jonly when OR semantics are required.
- •Use prepared comment/docstring scopes, add
- •"CI should fail if pattern appears"
- •Use scoped search +
--fail-any.
- •Use scoped search +
- •"CI should fail if required pattern is missing"
- •Use scoped search +
--fail-none.
- •Use scoped search +
- •"I need parseable output"
- •Use
--stdout-detection force-pipe.
- •Use
- •"Regex escaping is painful"
- •Use
--literal-stringand explicit replacement via--.
- •Use
Execution Checklist
Before returning a final command, verify:
- •Scope is minimal and syntax-aware where possible.
- •Replacement argument is after
--(if replacement is used). - •Globs are quoted.
- •
--dry-runis present for file edits unless user requested direct apply. - •Join semantics are explicit when multiple language scopes are used (
-jvs default intersect). - •Failure flags align with user intent (
--fail-any,--fail-none,--fail-no-files). - •Output mode is explicit if user needs machine parsing.