{"id":"9352da74-57c4-4df0-8243-87108bd13763","shortId":"nNQ84T","kind":"skill","title":"jahro-migration","tagline":"Analyzes existing debug systems (IMGUI menus, custom loggers, cheat frameworks, performance HUDs) and generates incremental migration plans to Jahro equivalents. Use when the user wants to replace a custom debug UI, migrate from an existing console or cheat system, switch to Jahr","description":"# Jahro Migration\n\nHelp users migrate from custom debug tools to Jahro. Analyze existing code, classify what to replace/keep/adapt, and generate migrated code incrementally.\n\n## Migration Decision Guide\n\nWhen the user shares their existing debug code, classify each component:\n\n| What are you migrating? | Jahro Replacement | Action |\n|:------------------------|:-----------------|:-------|\n| IMGUI debug buttons (`OnGUI` + `GUI.Button`) | `[JahroCommand]` + Visual Mode | Replace — Visual Mode provides a better button UI |\n| Canvas-based debug UI | `[JahroCommand]` + Visual Mode | Replace — eliminates UI maintenance |\n| Custom command parser (string → command) | `[JahroCommand]` + Text Mode | Replace — Jahro handles parsing and type conversion |\n| Cheat code system (dictionary/registry) | `[JahroCommand]` with groups | Replace — typed parameters, auto-discovery |\n| Custom Debug.Log wrapper | Remove or keep | Jahro intercepts `Debug.Log` automatically — wrapper often unnecessary |\n| Performance HUD (FPS, memory overlay) | `[JahroWatch]` groups | Replace — Watcher provides organized monitoring |\n| File-based logger | Keep | Jahro doesn't write to files — keep if file logging is needed |\n| Custom Inspector/Editor tools | Evaluate | May complement Jahro — keep if Editor-only tools |\n| Analytics-based logging | Keep | Different purpose — Jahro is for debugging, not analytics |\n\n## Migration Workflow\n\n1. **User shares existing debug code** — ask to see the files or point to the classes\n2. **Classify each component** using the decision guide above\n3. **Generate a migration plan**: what to replace, what to keep, what to adapt, effort estimate\n4. **Generate migrated code** — file by file, side by side with original\n5. **Support incremental migration** — old and new can coexist\n6. **VERIFY at each step** — \"Enter Play Mode, confirm migrated commands appear in Jahro\"\n\n## Pattern: IMGUI Debug Menu → Jahro Commands\n\n### Before (IMGUI)\n\n```csharp\npublic class DebugMenu : MonoBehaviour\n{\n    private bool showMenu;\n\n    void OnGUI()\n    {\n        if (GUI.Button(new Rect(10, 10, 100, 30), \"Toggle\"))\n            showMenu = !showMenu;\n        if (!showMenu) return;\n\n        if (GUI.Button(new Rect(10, 50, 150, 30), \"God Mode\"))\n            Player.GodMode = true;\n        if (GUI.Button(new Rect(10, 90, 150, 30), \"Add 1000 Gold\"))\n            Player.Gold += 1000;\n        if (GUI.Button(new Rect(10, 130, 150, 30), \"Skip Level\"))\n            LevelManager.SkipToNext();\n\n        GUI.Label(new Rect(10, 170, 200, 30), $\"FPS: {1f/Time.deltaTime:F0}\");\n        GUI.Label(new Rect(10, 200, 200, 30), $\"Health: {Player.Health}\");\n    }\n}\n```\n\n### After (Jahro)\n\n```csharp\nusing JahroConsole;\nusing UnityEngine;\n\npublic class DebugCommands : MonoBehaviour\n{\n    [JahroCommand(\"god-mode\", \"Cheats\", \"Enable god mode\")]\n    public static void GodMode() => Player.GodMode = true;\n\n    [JahroCommand(\"add-gold\", \"Cheats\", \"Add 1000 gold\")]\n    public static void AddGold() => Player.Gold += 1000;\n\n    [JahroCommand(\"skip-level\", \"Game\", \"Skip to next level\")]\n    public static void SkipLevel() => LevelManager.SkipToNext();\n\n    [JahroWatch(\"FPS\", \"Performance\")]\n    public static string FPS => (1f / Time.unscaledDeltaTime).ToString(\"F0\");\n\n    [JahroWatch(\"Health\", \"Player\")]\n    public static int Health => Player.Health;\n}\n```\n\n**What changed:**\n- `GUI.Button` actions → `[JahroCommand]` static methods\n- `GUI.Label` monitors → `[JahroWatch]` static properties\n- `OnGUI` class can be deleted after migration\n- Visual Mode replaces the custom button UI — no IMGUI maintenance\n- No `RegisterObject` needed since everything is static\n\n### Parameterized version\n\nIf the original had user input (e.g., text field for gold amount):\n\n```csharp\n[JahroCommand(\"add-gold\", \"Cheats\", \"Add gold to player\")]\npublic static void AddGold(int amount) => Player.Gold += amount;\n```\n\nVisual Mode auto-generates an input field; Text Mode accepts `add-gold 500`.\n\n## Pattern: Custom Logger → Jahro (Usually Remove)\n\n### Before\n\n```csharp\npublic static class GameLogger\n{\n    public static void Log(string category, string message)\n        => Debug.Log($\"[{category}] {message}\");\n    public static void LogWarning(string category, string message)\n        => Debug.LogWarning($\"[{category}] {message}\");\n    public static void LogError(string category, string message)\n        => Debug.LogError($\"[{category}] {message}\");\n}\n```\n\n### After\n\n**No migration needed.** Jahro automatically intercepts all `Debug.Log`, `Debug.LogWarning`, and `Debug.LogError` calls. The logs appear in Jahro's console with filtering and search.\n\n**Decision:**\n- If the wrapper only formats messages → **remove it** (Jahro shows full messages)\n- If the wrapper adds categorization you rely on → **keep it** (Jahro still captures the output)\n- If the wrapper writes to files → **keep it** (Jahro doesn't do file logging)\n\nThere is no `Jahro.Log()` API — Jahro works by intercepting Unity's logging system.\n\n## Pattern: Cheat Command System → Jahro Commands\n\n### Before\n\n```csharp\npublic class CheatManager\n{\n    private Dictionary<string, Action<string[]>> cheats = new();\n\n    public void RegisterCheat(string name, Action<string[]> handler)\n        => cheats[name] = handler;\n\n    public void Execute(string input)\n    {\n        var parts = input.Split(' ');\n        if (cheats.TryGetValue(parts[0], out var handler))\n            handler(parts[1..]);\n    }\n}\n\n// Registration:\n// mgr.RegisterCheat(\"god\", _ => Player.GodMode = true);\n// mgr.RegisterCheat(\"gold\", args => Player.Gold += int.Parse(args[0]));\n// mgr.RegisterCheat(\"tp\", args => Player.Teleport(\n//     float.Parse(args[0]), float.Parse(args[1]), float.Parse(args[2])));\n```\n\n### After (attribute-based)\n\n```csharp\nusing JahroConsole;\nusing UnityEngine;\n\npublic class Cheats : MonoBehaviour\n{\n    [JahroCommand(\"god-mode\", \"Cheats\", \"Enable god mode\")]\n    public void GodMode() => Player.GodMode = true;\n\n    [JahroCommand(\"add-gold\", \"Cheats\", \"Add gold\")]\n    public void AddGold(int amount) => Player.Gold += amount;\n\n    [JahroCommand(\"teleport\", \"Cheats\", \"Teleport to position\")]\n    public void Teleport(Vector3 position) => Player.Teleport(position);\n\n    void OnEnable()  => Jahro.RegisterObject(this);\n    void OnDisable() => Jahro.UnregisterObject(this);\n}\n```\n\n### After (dynamic registration, if keeping runtime flexibility)\n\n```csharp\nvoid Start()\n{\n    Jahro.RegisterCommand(\"god-mode\", \"Cheats\", \"Enable god mode\",\n        () => Player.GodMode = true);\n    Jahro.RegisterCommand<int>(\"add-gold\", \"Cheats\", \"Add gold\",\n        amount => Player.Gold += amount);\n    Jahro.RegisterCommand<float, float, float>(\"teleport\", \"Cheats\", \"Teleport to X Y Z\",\n        (x, y, z) => Player.Teleport(new Vector3(x, y, z)));\n}\n```\n\n**What changed:**\n- String-based `Action<string[]>` → typed parameters (`int`, `float`, `Vector3`)\n- Manual `string.Split` + `int.Parse` → Jahro handles type conversion\n- Dictionary registry → attribute discovery or `RegisterCommand`\n- Custom input UI → Jahro's Text Mode (autocomplete) and Visual Mode (forms)\n- `CheatManager` class can be removed after migration\n\n## Pattern: Performance HUD → Jahro Watcher\n\n### Before\n\n```csharp\nvoid OnGUI()\n{\n    GUI.Label(new Rect(10, 10, 200, 30), $\"FPS: {1f/Time.deltaTime:F0}\");\n    GUI.Label(new Rect(10, 40, 200, 30), $\"Memory: {GetMemoryMB():F1} MB\");\n    GUI.Label(new Rect(10, 70, 200, 30), $\"Objects: {FindObjectsOfType<GameObject>().Length}\");\n}\n```\n\n### After\n\n```csharp\npublic static class PerfMonitor\n{\n    [JahroWatch(\"FPS\", \"Performance\", \"Frames per second\")]\n    public static string FPS => (1f / Time.unscaledDeltaTime).ToString(\"F0\");\n\n    [JahroWatch(\"Memory\", \"Performance\", \"Managed memory usage\")]\n    public static string Memory => $\"{GC.GetTotalMemory(false) / 1024f / 1024f:F1} MB\";\n\n    [JahroWatch(\"Object Count\", \"Performance\", \"Active GameObjects\")]\n    public static int ObjectCount => Object.FindObjectsOfType<GameObject>().Length;\n}\n```\n\n**Advantage:** Watcher only reads values when the tab is open — the `OnGUI` version runs every frame. For expensive queries like `FindObjectsOfType`, consider caching.\n\n## Incremental Migration\n\nOld and new systems can coexist during transition:\n\n1. **Add Jahro commands** alongside existing debug UI\n2. **Verify** commands work in Jahro console\n3. **Remove old UI code** for the migrated features\n4. **Repeat** until all features are migrated\n5. **Remove the old debug system** classes when done\n\nThis avoids a big-bang migration and lets the team validate each step.\n\n## Migration Effort Estimates\n\n| Component | Effort | Notes |\n|:----------|:-------|:------|\n| IMGUI buttons → JahroCommand | Low | One attribute per button, remove OnGUI |\n| Canvas debug UI → JahroCommand | Low-Medium | Remove UI prefab + code, add attributes |\n| Custom command parser → JahroCommand | Medium | Rewrite registrations with typed params |\n| Performance HUD → JahroWatch | Low | Replace labels with watch attributes |\n| Custom logger → (remove) | Very Low | Just remove, Jahro intercepts Debug.Log |\n| Cheat system with persistence | Medium | Migrate commands, keep save/load logic separately |\n\n## Contextual Awareness\n\n| Pattern in code | Suggestion |\n|:---------------|:-----------|\n| `OnGUI()` with debug buttons or labels | Migrate to JahroCommand + JahroWatch |\n| Custom command dictionary/registry | Migrate to JahroCommand attributes |\n| `Debug.Log` wrapper class | Explain auto-interception, suggest removal |\n| Performance overlay (FPS, memory) | Migrate to JahroWatch |\n| Custom input field for commands | Replace with Jahro Text Mode |\n\n## Verification\n\nAfter each migration step:\n\n> **Verify:** Enter Play Mode → press ~ → confirm migrated commands appear in the Commands tab and migrated watchers appear in the Watcher tab. Test executing a command. Then verify the old debug UI can be removed without breaking anything.\n\nIf migrated features don't appear, check the jahro-troubleshooting skill.","tags":["jahro","migration","unity","agent","skills","jahro-console","agent-skills","ai-assistant","ai-coding","claude-code","cursor","debugging"],"capabilities":["skill","source-jahro-console","skill-jahro-migration","topic-agent-skills","topic-ai-assistant","topic-ai-coding","topic-claude-code","topic-cursor","topic-debugging","topic-gamedev","topic-in-game-console","topic-jahro","topic-logging","topic-unity","topic-unity-package"],"categories":["unity-agent-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/jahro-console/unity-agent-skills/jahro-migration","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add jahro-console/unity-agent-skills","source_repo":"https://github.com/jahro-console/unity-agent-skills","install_from":"skills.sh"}},"qualityScore":"0.456","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 12 github stars · SKILL.md body (9,975 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:07:09.130Z","embedding":null,"createdAt":"2026-04-23T13:04:13.762Z","updatedAt":"2026-05-18T19:07:09.130Z","lastSeenAt":"2026-05-18T19:07:09.130Z","tsv":"'0':698,716,723 '1':216,704,726,1006 '10':314,315,328,340,353,363,373,897,898,907,918 '100':316 '1000':345,348,410,417 '1024f':957,958 '130':354 '150':330,342,355 '170':364 '1f':439,941 '1f/time.deltatime':368,902 '2':232,729,1014 '200':365,374,375,899,909,920 '3':241,1021 '30':317,331,343,356,366,376,900,910,921 '4':257,1030 '40':908 '5':269,1037 '50':329 '500':533 '6':278 '70':919 '90':341 'accept':529 'action':89,454,672,681,846 'activ':965 'adapt':254 'add':344,406,409,504,507,531,619,758,761,813,816,1007,1087 'add-gold':405,503,530,757,812 'addgold':415,514,765 'advantag':973 'alongsid':1010 'amount':500,516,518,767,769,818,820 'analyt':202,213 'analytics-bas':201 'analyz':4,57 'anyth':1219 'api':649 'appear':289,594,1191,1199,1225 'arg':712,715,719,722,725,728 'ask':222 'attribut':732,862,1071,1088,1107,1151 'attribute-bas':731 'auto':144,522,1157 'auto-discoveri':143 'auto-gener':521 'auto-intercept':1156 'autocomplet':873 'automat':155,584 'avoid':1047 'awar':1130 'bang':1051 'base':108,173,203,733,845 'better':103 'big':1050 'big-bang':1049 'bool':306 'break':1218 'button':92,104,475,1067,1073,1138 'cach':995 'call':591 'canva':107,1076 'canvas-bas':106 'captur':628 'categor':620 'categori':551,555,562,566,573,577 'chang':452,842 'cheat':12,41,133,394,408,506,659,674,684,741,747,760,772,805,815,826,1118 'cheatmanag':668,878 'cheats.trygetvalue':696 'check':1226 'class':231,302,387,464,544,667,740,879,929,1043,1154 'classifi':60,80,233 'code':59,67,79,134,221,260,1025,1086,1133 'coexist':277,1003 'command':119,122,288,297,660,663,1009,1016,1090,1124,1146,1172,1190,1194,1207 'complement':193 'compon':82,235,1063 'confirm':286,1188 'consid':994 'consol':39,598,1020 'contextu':1129 'convers':132,859 'count':963 'csharp':300,381,501,541,665,734,798,891,926 'custom':10,32,52,118,146,188,474,535,866,1089,1108,1145,1168 'debug':6,33,53,78,91,109,211,220,294,1012,1041,1077,1137,1212 'debug.log':147,154,554,587,1117,1152 'debug.logerror':576,590 'debug.logwarning':565,588 'debugcommand':388 'debugmenu':303 'decis':70,238,603 'delet':467 'dictionari':670,860 'dictionary/registry':136,1147 'differ':206 'discoveri':145,863 'doesn':177,640 'done':1045 'dynam':792 'e.g':495 'editor':198 'editor-on':197 'effort':255,1061,1064 'elimin':115 'enabl':395,748,806 'enter':283,1184 'equival':23 'estim':256,1062 'evalu':191 'everi':987 'everyth':484 'execut':689,1205 'exist':5,38,58,77,219,1011 'expens':990 'explain':1155 'f0':369,442,903,944 'f1':913,959 'fals':956 'featur':1029,1034,1222 'field':497,526,1170 'file':172,181,184,226,261,263,636,643 'file-bas':171 'filter':600 'findobjectsoftyp':923,993 'flexibl':797 'float':822,823,824,851 'float.parse':721,724,727 'form':877 'format':608 'fps':161,367,433,438,901,932,940,1163 'frame':934,988 'framework':13 'full':614 'game':422 'gamelogg':545 'gameobject':966 'gc.gettotalmemory':955 'generat':17,65,242,258,523 'getmemorymb':912 'god':332,392,396,707,745,749,803,807 'god-mod':391,744,802 'godmod':401,753 'gold':346,407,411,499,505,508,532,711,759,762,814,817 'group':139,165 'gui.button':94,311,325,337,350,453 'gui.label':360,370,458,894,904,915 'guid':71,239 'handl':128,857 'handler':683,686,701,702 'health':377,444,449 'help':48 'hud':15,160,887,1100 'imgui':8,90,293,299,478,1066 'increment':18,68,271,996 'input':494,525,691,867,1169 'input.split':694 'inspector/editor':189 'int':448,515,766,850,969 'int.parse':714,855 'intercept':153,585,653,1116,1158 'jahr':45 'jahro':2,22,46,56,87,127,152,176,194,208,291,296,380,537,583,596,612,626,639,650,662,856,869,888,1008,1019,1115,1175,1229 'jahro-migr':1 'jahro-troubleshoot':1228 'jahro.log':648 'jahro.registercommand':801,811,821 'jahro.registerobject':785 'jahro.unregisterobject':789 'jahrocommand':95,111,123,137,390,404,418,455,502,743,756,770,1068,1079,1092,1143,1150 'jahroconsol':383,736 'jahrowatch':164,432,443,460,931,945,961,1101,1144,1167 'keep':151,175,182,195,205,251,624,637,795,1125 'label':1104,1140 'length':924,972 'let':1054 'level':358,421,426 'levelmanager.skiptonext':359,431 'like':992 'log':185,204,549,593,644,656 'logerror':571 'logger':11,174,536,1109 'logic':1127 'logwarn':560 'low':1069,1081,1102,1112 'low-medium':1080 'mainten':117,479 'manag':948 'manual':853 'may':192 'mb':914,960 'medium':1082,1093,1122 'memori':162,911,946,949,954,1164 'menu':295 'menus':9 'messag':553,556,564,567,575,578,609,615 'method':457 'mgr.registercheat':706,710,717 'migrat':3,19,35,47,50,66,69,86,214,244,259,272,287,469,581,884,997,1028,1036,1052,1060,1123,1141,1148,1165,1181,1189,1197,1221 'mode':97,100,113,125,285,333,393,397,471,520,528,746,750,804,808,872,876,1177,1186 'monitor':170,459 'monobehaviour':304,389,742 'name':680,685 'need':187,482,582 'new':275,312,326,338,351,361,371,675,836,895,905,916,1000 'next':425 'note':1065 'object':922,962 'object.findobjectsoftype':971 'objectcount':970 'often':157 'old':273,998,1023,1040,1211 'ondis':788 'one':1070 'onen':784 'ongui':93,309,463,893,984,1075,1135 'open':982 'organ':169 'origin':268,491 'output':630 'overlay':163,1162 'param':1098 'paramet':142,849 'parameter':487 'pars':129 'parser':120,1091 'part':693,697,703 'pattern':292,534,658,885,1131 'per':935,1072 'perfmonitor':930 'perform':14,159,434,886,933,947,964,1099,1161 'persist':1121 'plan':20,245 'play':284,1185 'player':445,510 'player.godmode':334,402,708,754,809 'player.gold':347,416,517,713,768,819 'player.health':378,450 'player.teleport':720,781,835 'point':228 'posit':775,780,782 'prefab':1085 'press':1187 'privat':305,669 'properti':462 'provid':101,168 'public':301,386,398,412,427,435,446,511,542,546,557,568,666,676,687,739,751,763,776,927,937,951,967 'purpos':207 'queri':991 'read':976 'rect':313,327,339,352,362,372,896,906,917 'registercheat':678 'registercommand':865 'registerobject':481 'registr':705,793,1095 'registri':861 'reli':622 'remov':149,539,610,882,1022,1038,1074,1083,1110,1114,1160,1216 'repeat':1031 'replac':30,88,98,114,126,140,166,248,472,1103,1173 'replace/keep/adapt':63 'return':323 'rewrit':1094 'run':986 'runtim':796 'save/load':1126 'search':602 'second':936 'see':224 'separ':1128 'share':75,218 'show':613 'showmenu':307,319,320,322 'side':264,266 'sinc':483 'skill':1231 'skill-jahro-migration' 'skip':357,420,423 'skip-level':419 'skiplevel':430 'source-jahro-console' 'start':800 'static':399,413,428,436,447,456,461,486,512,543,547,558,569,928,938,952,968 'step':282,1059,1182 'still':627 'string':121,437,550,552,561,563,572,574,671,673,679,682,690,844,847,939,953 'string-bas':843 'string.split':854 'suggest':1134,1159 'support':270 'switch':43 'system':7,42,135,657,661,1001,1042,1119 'tab':980,1195,1203 'team':1056 'teleport':771,773,778,825,827 'test':1204 'text':124,496,527,871,1176 'time.unscaleddeltatime':440,942 'toggl':318 'tool':54,190,200 'topic-agent-skills' 'topic-ai-assistant' 'topic-ai-coding' 'topic-claude-code' 'topic-cursor' 'topic-debugging' 'topic-gamedev' 'topic-in-game-console' 'topic-jahro' 'topic-logging' 'topic-unity' 'topic-unity-package' 'tostr':441,943 'tp':718 'transit':1005 'troubleshoot':1230 'true':335,403,709,755,810 'type':131,141,848,858,1097 'ui':34,105,110,116,476,868,1013,1024,1078,1084,1213 'uniti':654 'unityengin':385,738 'unnecessari':158 'usag':950 'use':24,236,382,384,735,737 'user':27,49,74,217,493 'usual':538 'valid':1057 'valu':977 'var':692,700 'vector3':779,837,852 'verif':1178 'verifi':279,1015,1183,1209 'version':488,985 'visual':96,99,112,470,519,875 'void':308,400,414,429,513,548,559,570,677,688,752,764,777,783,787,799,892 'want':28 'watch':1106 'watcher':167,889,974,1198,1202 'without':1217 'work':651,1017 'workflow':215 'wrapper':148,156,606,618,633,1153 'write':179,634 'x':829,832,838 'y':830,833,839 'z':831,834,840","prices":[{"id":"b94b0d31-a422-42c2-8067-21281536ddcc","listingId":"9352da74-57c4-4df0-8243-87108bd13763","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"jahro-console","category":"unity-agent-skills","install_from":"skills.sh"},"createdAt":"2026-04-23T13:04:13.762Z"}],"sources":[{"listingId":"9352da74-57c4-4df0-8243-87108bd13763","source":"github","sourceId":"jahro-console/unity-agent-skills/jahro-migration","sourceUrl":"https://github.com/jahro-console/unity-agent-skills/tree/main/skills/jahro-migration","isPrimary":false,"firstSeenAt":"2026-04-23T13:04:13.762Z","lastSeenAt":"2026-05-18T19:07:09.130Z"}],"details":{"listingId":"9352da74-57c4-4df0-8243-87108bd13763","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"jahro-console","slug":"jahro-migration","github":{"repo":"jahro-console/unity-agent-skills","stars":12,"topics":["agent-skills","ai-assistant","ai-coding","claude-code","cursor","debugging","gamedev","in-game-console","jahro","logging","unity","unity-package","unity3d"],"license":"mit","html_url":"https://github.com/jahro-console/unity-agent-skills","pushed_at":"2026-03-20T15:39:45Z","description":"Agent skills for AI-assisted Unity debugging — structured logging, runtime commands, variable watching, and more","skill_md_sha":"1881b159398f1d026a2881366cd271678c2fe901","skill_md_path":"skills/jahro-migration/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/jahro-console/unity-agent-skills/tree/main/skills/jahro-migration"},"layout":"multi","source":"github","category":"unity-agent-skills","frontmatter":{"name":"jahro-migration","description":"Analyzes existing debug systems (IMGUI menus, custom loggers, cheat frameworks, performance HUDs) and generates incremental migration plans to Jahro equivalents. Use when the user wants to replace a custom debug UI, migrate from an existing console or cheat system, switch to Jahro, or has OnGUI debug code they want to modernize."},"skills_sh_url":"https://skills.sh/jahro-console/unity-agent-skills/jahro-migration"},"updatedAt":"2026-05-18T19:07:09.130Z"}}