patch-creation
A utility to inject custom behavior into Claude Code's CLI by applying and registering code patches.
Install
mkdir -p .claude/skills/patch-creation && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/4681" && unzip -o skill.zip -d .claude/skills/patch-creation && rm skill.zipInstalls to .claude/skills/patch-creation
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Create and register new patches for tweakcc. Use when adding new customizations to Claude Code.Key capabilities
- →Create patch files for tweakcc
- →Register patches in index.ts
- →Define patch groups
- →Add configuration types
- →Implement patch logic
How it works
Patches identify specific code patterns in the minified CLI source and inject or replace them with new behavior.
Inputs & outputs
When to use patch-creation
- →Inject custom features into Claude Code
- →Register new configuration settings
- →Apply hotfixes to the CLI internals
About this skill
Patch Creation & Registration
Overview
Patches are code modifications applied to Claude Code's cli.js (or native binary). Each patch finds specific patterns in the minified code and replaces/injects new behavior.
Creating a New Patch
1. Create the patch file
Create src/patches/myPatch.ts:
// Please see the note about writing patches in ./index
import { showDiff } from './index';
/**
* Description of what this patch does.
*
* CC X.Y.Z:
* ```diff
* // Show before/after of the code change
* -oldCode
* +newCode
* ```
*/
export const writeMyPatch = (
file: string,
configValue: string // Add parameters as needed
): string | null => {
// Pattern to find in minified code
// IMPORTANT: Use [$\w]+ for identifiers (not \w+) because $ is valid in JS identifiers
// IMPORTANT: Start patterns with a boundary char (,;}{) for HIGH performance (e.g. 1.5s -> 30ms)
const pattern = /,somePattern([$\w]+)/;
const match = file.match(pattern);
if (!match || match.index === undefined) {
console.error('patch: myPatch: failed to find pattern');
return null;
}
const replacement = `,newCode${match[1]}`;
const startIndex = match.index;
const endIndex = startIndex + match[0].length;
const newFile =
file.slice(0, startIndex) + replacement + file.slice(endIndex);
showDiff(file, newFile, replacement, startIndex, endIndex);
return newFile;
};
2. Add config type (if patch is configurable)
Edit src/types.ts - add to MiscConfig or create a new interface:
export interface MiscConfig {
// ... existing fields ...
myNewSetting: string | null; // null = disabled
}
3. Add default value
Edit src/defaultSettings.ts:
misc: {
// ... existing fields ...
myNewSetting: null, // or a sensible default
},
4. Register in index.ts
Edit src/patches/index.ts:
4a. Add import:
import { writeMyPatch } from './myPatch';
4b. Add patch definition (in PATCH_DEFINITIONS array):
{
id: 'my-patch',
name: 'My patch',
group: PatchGroup.FEATURES, // or ALWAYS_APPLIED, MISC_CONFIGURABLE
description: 'What this patch does for the user',
},
4c. Add patch implementation (in patchImplementations object):
'my-patch': {
fn: c => writeMyPatch(c, config.settings.misc!.myNewSetting!),
condition: !!config.settings.misc?.myNewSetting,
},
5. Add UI (optional)
Edit src/ui/components/MiscView.tsx to add a toggle or input for the setting.
Key Files
| File | Purpose |
|---|---|
src/patches/*.ts | Individual patch implementations |
src/patches/index.ts | Patch registry, definitions, and application logic |
src/types.ts | Config type definitions (MiscConfig, etc.) |
src/defaultSettings.ts | Default values for all settings |
src/ui/components/MiscView.tsx | UI for misc settings |
Registration Checklist
When adding a new patch, update these locations:
-
src/patches/myPatch.ts- Create the patch file with exported function -
src/types.ts- Add config type (if configurable) -
src/defaultSettings.ts- Add default value (if configurable) -
src/patches/index.ts:- Import the patch function
- Add to
PATCH_DEFINITIONSarray (id, name, group, description) - Add to
patchImplementationsobject (fn, condition)
-
src/ui/components/MiscView.tsx- Add UI controls (optional)
Patch Groups
PatchGroup.ALWAYS_APPLIED- Core patches that are always appliedPatchGroup.MISC_CONFIGURABLE- User-configurable misc settingsPatchGroup.FEATURES- Feature patches that can be enabled/disabled
Pattern Writing Tips
-
Use
[$\w]+for identifiers - Not\w+, because$is valid in JS identifiers and common in minified code -
Start patterns with boundary characters - Use
,,;,{,}at the start to dramatically speed up matching (can reduce 1.5s to 30ms) -
Don't use
\bfor word boundaries - It doesn't treat$as a word character, so\b[$\w]+won't match,$= -
Extract function bodies carefully - Count braces to find matching
}when you need the full function -
Use
showDiff()for debugging - Always call it to log what the patch is changing -
Return
nullon failure - Let the patch system know the patch couldn't be applied -
Handle multiple CC versions - Code patterns may change between versions; try multiple patterns if needed
Example: Simple Toggle Patch
// Bypass a feature flag check
const pattern = /function [$\w]+\(\)\{return [$\w]+\("my_feature_flag"/;
const match = file.match(pattern);
if (!match || match.index === undefined) {
console.error('patch: myPatch: failed to find feature flag');
return null;
}
const insertIndex = match.index + match[0].indexOf('{') + 1;
const insertion = 'return true;';
const newFile =
file.slice(0, insertIndex) + insertion + file.slice(insertIndex);
showDiff(file, newFile, insertion, insertIndex, insertIndex);
return newFile;
Example: Replace a Value
// Replace a hardcoded value
const pattern = /(someConfig=)\d+(;)/;
const match = file.match(pattern);
if (!match || match.index === undefined) {
console.error('patch: myPatch: failed to find config value');
return null;
}
const replacement = match[1] + newValue + match[2];
const startIndex = match.index;
const endIndex = startIndex + match[0].length;
const newFile = file.slice(0, startIndex) + replacement + file.slice(endIndex);
showDiff(file, newFile, replacement, startIndex, endIndex);
return newFile;
Testing
- Run
npm run buildto compile - Run
npx tweakcc --applyto apply patches - Check console output for patch success/failure
- Run Claude Code to verify behavior
When not to use it
- →Modifying core CLI logic without a pattern
- →Applying patches without testing
Prerequisites
Limitations
- →Requires valid JS identifier patterns
- →Patterns may break between CLI versions
How it compares
This approach uses programmatic pattern matching and registration rather than manual binary editing.
Compared to similar skills
patch-creation side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| patch-creation (this skill) | 1 | 6mo | No flags | Advanced |
| typescript-expert | 10 | 6mo | Review | Advanced |
| agent-coder | 3 | 6mo | No flags | Intermediate |
| functional | 3 | 2mo | No flags | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by Piebald-AI
View all by Piebald-AI →You might also like
typescript-expert
davila7
TypeScript and JavaScript expert with deep knowledge of type-level programming, performance optimization, monorepo management, migration strategies, and modern tooling. Use PROACTIVELY for any TypeScript/JavaScript issues including complex type gymnastics, build performance, debugging, and architectural decisions. If a specialized expert is a better fit, I will recommend switching and stop.
agent-coder
ruvnet
Agent skill for coder - invoke with $agent-coder
functional
citypaul
Functional programming patterns with immutable data. Use when writing logic or data transformations.
modern-javascript-patterns
sickn33
Master ES6+ features including async/await, destructuring, spread operators, arrow functions, promises, modules, iterators, generators, and functional programming patterns for writing clean, efficient JavaScript code. Use when refactoring legacy code, implementing modern patterns, or optimizing JavaScript applications.
migrate-honcho-ts
plastic-labs
Migrates Honcho TypeScript SDK code from v1.6.0 to v2.0.0. Use when upgrading @honcho-ai/sdk, fixing breaking changes after upgrade, or when errors mention removed APIs like .core, getConfig, observations, or snake_case properties.
agent-implementer-sparc-coder
ruvnet
Agent skill for implementer-sparc-coder - invoke with $agent-implementer-sparc-coder