[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-apache-cayenne-model-naming":3,"mdc-pak3fw-key":42,"related-org-apache-cayenne-model-naming":1354,"related-repo-apache-cayenne-model-naming":1495},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":37,"sourceUrl":40,"mdContent":41},"cayenne-model-naming","clean up Cayenne object-layer names","Use this skill to clean up Object-layer names in a Cayenne DataMap — ObjEntity, ObjAttribute, and ObjRelationship names, plus DbRelationship names (the first-class unit of relationship cleanup — every FK has one whether or not an ObjRelationship was generated; the ObjRelationship name is synced to it when one exists) — so they read as descriptive, consistent Java. Trigger on phrases like 'clean up the model names', 'fix the entity names', 'these names look ugly', 'make the names descriptive', 'normalize the ObjEntity\u002Fattribute\u002Frelationship names', 'why is this relationship called team1', 'rename entities to be consistent', 'the import produced Gametype instead of GameType'. Invoke it on an explicit user request, or as a manual follow-up after a `cayenne-db-import` to polish the just-imported additions — it is never triggered automatically. IMPORTANT: this is a LIGHT polish pass — CayenneModeler's reverse-engineering already produces good names for the common case; only improve the specific things its deterministic algorithm cannot (run-together names with no separators like `gametype`, meaningless numbered names like `team1` from multiple relationships between two tables, and a common entity prefix that leaks into relationship names like `aaOrders`). Do NOT rewrite names that are already correct. This is Obj-layer naming polish; for structural model edits use `cayenne-modeling`, and for regenerating classes afterward use `cayenne-cgen`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"apache","Apache Software Foundation","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fapache.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Java","java","tag",{"name":17,"slug":18,"type":15},"Database","database",{"name":20,"slug":21,"type":15},"ORM","orm",{"name":23,"slug":24,"type":15},"Data Modeling","data-modeling",343,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fcayenne","2026-07-22T05:35:32.342548",null,137,[31,18,14,32,33,34,35,36],"cayenne","library","network-client","network-server","web-framework","xml",{"repoUrl":26,"stars":25,"forks":29,"topics":38,"description":39},[31,18,14,32,33,34,35,36],"Mirror of Apache Cayenne","https:\u002F\u002Fgithub.com\u002Fapache\u002Fcayenne\u002Ftree\u002FHEAD\u002Fai-plugin\u002Fskills\u002Fcayenne-model-naming","---\nname: cayenne-model-naming\ndescription: \"Use this skill to clean up Object-layer names in a Cayenne DataMap — ObjEntity, ObjAttribute, and ObjRelationship names, plus DbRelationship names (the first-class unit of relationship cleanup — every FK has one whether or not an ObjRelationship was generated; the ObjRelationship name is synced to it when one exists) — so they read as descriptive, consistent Java. Trigger on phrases like 'clean up the model names', 'fix the entity names', 'these names look ugly', 'make the names descriptive', 'normalize the ObjEntity\u002Fattribute\u002Frelationship names', 'why is this relationship called team1', 'rename entities to be consistent', 'the import produced Gametype instead of GameType'. Invoke it on an explicit user request, or as a manual follow-up after a `cayenne-db-import` to polish the just-imported additions — it is never triggered automatically. IMPORTANT: this is a LIGHT polish pass — CayenneModeler's reverse-engineering already produces good names for the common case; only improve the specific things its deterministic algorithm cannot (run-together names with no separators like `gametype`, meaningless numbered names like `team1` from multiple relationships between two tables, and a common entity prefix that leaks into relationship names like `aaOrders`). Do NOT rewrite names that are already correct. This is Obj-layer naming polish; for structural model edits use `cayenne-modeling`, and for regenerating classes afterward use `cayenne-cgen`.\"\n---\n\n\u003C!--\n\tLicensed to the Apache Software Foundation (ASF) under one\n\tor more contributor license agreements.  See the NOTICE file\n\tdistributed with this work for additional information\n\tregarding copyright ownership.  The ASF licenses this file\n\tto you under the Apache License, Version 2.0 (the\n\t\"License\"); you may not use this file except in compliance\n\twith the License.  You may obtain a copy of the License at\n\t\n\thttps:\u002F\u002Fwww.apache.org\u002Flicenses\u002FLICENSE-2.0\n\t\n\tUnless required by applicable law or agreed to in writing,\n\tsoftware distributed under the License is distributed on an\n\t\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n\tKIND, either express or implied.  See the License for the\n\tspecific language governing permissions and limitations\n\tunder the License.   \n-->\n# cayenne-model-naming\n\nPolish the Object-layer names in a Cayenne DataMap so they look like idiomatic Java. This runs on top\nof the names CayenneModeler's reverse engineering already produced — which are **good for the common\ncase**. Your job is a surgical touch-up of the few names its deterministic algorithm can't get right,\n**not** a rewrite. If a name is already a clean camelCase\u002FPascalCase transliteration of its DB element\nwith the right cardinality, leave it exactly as it is.\n\n## Required reading\n\n- `${CLAUDE_PLUGIN_ROOT}\u002Freferences\u002Fmodel-naming-conventions.md` — the deterministic baseline (what's\n  already correct and must be left alone) and the specific gaps where your judgment adds value.\n- `${CLAUDE_PLUGIN_ROOT}\u002Freferences\u002Fmodel-naming-rename-safety.md` — the cross-reference checklist for\n  every rename, so a rename never leaves a dangling reference.\n- `${CLAUDE_PLUGIN_ROOT}\u002Freferences\u002Fdatamap-schema.md` — element shapes for `*.map.xml`.\n- `${CLAUDE_PLUGIN_ROOT}\u002Freferences\u002Fproject-layout.md` — locate the project descriptor and DataMap.\n\n## Step 1 — Determine scope: changed elements vs the entire model\n\nThere are two modes, and picking the right one is the most important decision in this skill:\n\n- **Changed-only** (the default, e.g. when the user runs this after a `cayenne-db-import`) — only\n  inspect the names on newly-added or just-modified elements. Everything else in the model was\n  presumably reviewed already; don't churn it.\n- **Entire model** (rare) — inspect every Obj element. Use this **only** when the user explicitly asks\n  for it (\"clean up the whole model\", \"normalize all the names\", \"go over every entity\").\n\n`dbimport_run` does **not** report which entities changed (it reports change counts though, so use it as an extra\nhint), so detect the changed set with git. Run these from the repo containing the DataMap file:\n\n```bash\n# Is the DataMap under version control at all?\ngit -C \u003Crepo-dir> rev-parse --is-inside-work-tree\n\n# What did the import change (unstaged), and did anything get staged already?\ngit -C \u003Crepo-dir> diff -- \u003Cpath\u002Fto\u002Fdatamap>.map.xml\ngit -C \u003Crepo-dir> diff --cached -- \u003Cpath\u002Fto\u002Fdatamap>.map.xml\n```\n\nFrom the diff, collect the added\u002Fmodified `\u003Cobj-entity>`, `\u003Cobj-attribute>`, `\u003Cobj-relationship>`, and\n`\u003Cdb-relationship>` lines — that added\u002Fchanged set is your scope. Notes:\n\n- If `git diff` is empty but the file is tracked, there's nothing new to clean — say so and stop\n  (unless the user asked for an entire-model pass).\n- If the file is **untracked \u002F brand-new** (no prior version in `HEAD`), every element is effectively\n  \"new\" — treat it as an entire-model pass, but tell the user that's why.\n- **Fallback:** if it's not a git repository, or git isn't available, you can't scope by diff — fall\n  back to the entire model and tell the user you couldn't narrow it down.\n\n## Step 2 — Find the names worth changing (and only those)\n\nFor each in-scope element, compare against `model-naming-conventions.md`. **Most names will already be\ncorrect — leave them.** Flag only the cases the deterministic generator can't handle:\n\n1. **Run-together names with no separators** — `gametype` → `GameType`, `dateofbirth` → `dateOfBirth`.\n   Split on a real word boundary you're confident about; never invent one.\n2. **Numbered collision names** (`projects` \u002F `projects1`, `people` \u002F `people1`) from more than one\n   relationship between the same two tables. The generator resolves the common cases itself: to-one\n   names are FK-based even without an `_ID` suffix (`HOME_TEAM_ID` → `homeTeam`, `BIRTH_COUNTRY` →\n   `birthCountry`), and to-many names pick up a FK role qualifier when the FK embeds the source\n   entity name, even one sans a common table prefix (`HOME_TEAM_ID` → `homeGames`; `home_team_id`\n   referencing `aa_team` → `homeGames` too). What still collides: to-many collections whose FK role is\n   unrelated to the entity name (`MANAGER_ID` \u002F `AUDITOR_ID` → `projects` \u002F `projects1` — rename by\n   role: `managedProjects` \u002F `auditedProjects`), and — in models imported by older Cayenne versions —\n   to-one ends whose FK columns lack an `_ID` suffix and collapsed to `employee` \u002F `employee1`.\n3. **A common entity prefix leaking into relationship names** — when every entity shares a prefix\n   that was **kept** on the class names (`AaCustomer`, `AaOrder`), the prefix can leak into\n   relationship names. The generator already keeps it out of to-many names (the leading `_`-tokens\n   shared by the source and target table names are dropped → `orders`, not `aaOrders`); what leaks is\n   to-one names built from prefixed FK columns (`AA_CUSTOMER_ID` → `aaCustomer`) and to-many names in\n   models imported by older Cayenne versions (`aaOrders`). Strip the prefix from those relationship\n   names (`customer`, `orders`); a relationship is a role\u002Fproperty, and the prefix is noise there.\n   **Leave the entity names alone** — the prefix on classes is the user's choice, and renaming\n   entities regenerates classes.\n4. **Other clear, defensible improvements** — illegal identifiers (digit-leading names; Java\n   keywords are fine — cgen escapes them — and properties clashing with base-class getters like\n   `class` \u002F `objectId` are auto-qualified with the entity name by the generator, though older\n   imports may carry them raw), lost acronym casing, obvious cryptic abbreviations applied\n   consistently, plural-table-to-singular-entity. Conservative by default; when unsure, leave the\n   baseline name and ask.\n\nRelationship cleanup is anchored on the **DbRelationship** — it's the first-class citizen, since\nevery FK has one whether or not an ObjRelationship was generated on top. The rules above (run-together,\nnumbered collisions, prefix leak) apply to DbRelationship names directly, derived from their own DB\nmetadata (FK column for to-one, pluralized target DbEntity for to-many). When an ObjRelationship *is*\nbuilt on a DbRelationship, keep the two names **in sync** — rename both together, per direction.\nDbRelationships with no ObjRelationship (an ungenerated reverse direction, a skipped FK, a hop inside\na flattened many-to-many) are cleaned the same way — don't skip them. Any rename must update every\n`db-relationship-path` segment that names it (see Step 4).\n\n## Step 3 — Present the rename plan\n\nShow the user a table of `old → new` grouped by entity, plus the mirrored DbRelationship renames, and\nstate plainly what you're **leaving alone** so it's clear this isn't a blanket rewrite.\n\n- **Entire-model mode, or any rename of a name already referenced by user Java\u002Fqueries** → confirm\n  before applying. Renaming an ObjEntity regenerates its class and can break existing code.\n- **Changed-only, right after an import** (new elements not referenced anywhere yet) → low risk; apply\n  and report, but still list every rename you made.\n\nIf there are many domain abbreviations to expand, ask the user for a glossary rather than guessing.\n\n## Step 4 — Apply the renames safely\n\nEdit the `*.map.xml`. For **every** rename, walk the matching checklist in\n`model-naming-rename-safety.md` and update all references in the same edit:\n\n- ObjEntity → `className`, every `obj-relationship` `source`\u002F`target`, query `root-name`, EJBQL,\n  `result-entity`.\n- ObjRelationship → prefetch\u002Fexpression\u002FEJBQL paths (its `db-relationship-path` is unaffected).\n- ObjAttribute → qualifier\u002Fordering\u002FEJBQL paths (its `db-attribute-path` is unaffected).\n- DbRelationship → every `db-relationship-path` segment that names it, including inside dotted\n  flattened chains. This holds whether or not the DbRelationship backs an ObjRelationship — a\n  standalone DbRelationship can still be named as a segment in another entity's flattened path.\n\nKeep every name unique within its scope, and preserve the file's existing formatting and element\norder.\n\n## Step 5 — Validate and hand off\n\n- Re-walk the cross-reference checklist: does every `source`\u002F`target`, `root-name`, `db-relationship-path`\n  segment, and `className` still resolve?\n- Hand off to `cayenne-cgen` to (re)generate the Java classes with the final names. **Naming must\n  happen before cgen** — if classes were already generated with the old names, point out the now-stale\n  `.java` files so the user can regenerate\u002Fdelete them.\n\n## Anti-patterns\n\n- **Don't rewrite names the generator already got right.** A camelCase attribute, a PascalCase entity,\n  a plural to-many, an FK-derived to-one — all fine. This is polish, not a redo.\n- **Don't clean the entire model when only an import changed things.** Scope with `git diff`; default\n  to changed-only.\n- **Don't invent word splits.** Split `gametype` → `GameType` only when the boundary is real; don't\n  break single words (`status`, `metadata`).\n- **Don't guess abbreviation expansions.** Ask for a glossary when a model is full of them.\n- **Don't rename an ObjEntity without updating `className`, every reference, and regenerating** — a\n  bare rename orphans the old class and dangles relationship `source`\u002F`target` and query `root-name`.\n- **Don't rename a DbRelationship without fixing every `db-relationship-path` segment**, including\n  flattened chains on other entities.\n- **Don't skip a DbRelationship just because it has no ObjRelationship.** Standalone DbRelationships\n  are in scope — clean them on their own merits from their DB metadata, not by mirroring.\n- **Don't repoint `db-attribute-path` \u002F `db-relationship-path` targets.** You rename the element; you\n  never change what a path points to.\n- **Don't run cgen yourself.** Hand off to `cayenne-cgen`.\n",{"data":43,"body":44},{"name":4,"description":6},{"type":45,"children":46},"root",[47,54,75,82,140,146,151,189,206,417,453,499,505,525,870,905,911,931,954,959,965,992,1083,1088,1094,1162,1168,1348],{"type":48,"tag":49,"props":50,"children":51},"element","h1",{"id":4},[52],{"type":53,"value":4},"text",{"type":48,"tag":55,"props":56,"children":57},"p",{},[58,60,66,68,73],{"type":53,"value":59},"Polish the Object-layer names in a Cayenne DataMap so they look like idiomatic Java. This runs on top\nof the names CayenneModeler's reverse engineering already produced — which are ",{"type":48,"tag":61,"props":62,"children":63},"strong",{},[64],{"type":53,"value":65},"good for the common\ncase",{"type":53,"value":67},". Your job is a surgical touch-up of the few names its deterministic algorithm can't get right,\n",{"type":48,"tag":61,"props":69,"children":70},{},[71],{"type":53,"value":72},"not",{"type":53,"value":74}," a rewrite. If a name is already a clean camelCase\u002FPascalCase transliteration of its DB element\nwith the right cardinality, leave it exactly as it is.",{"type":48,"tag":76,"props":77,"children":79},"h2",{"id":78},"required-reading",[80],{"type":53,"value":81},"Required reading",{"type":48,"tag":83,"props":84,"children":85},"ul",{},[86,99,110,129],{"type":48,"tag":87,"props":88,"children":89},"li",{},[90,97],{"type":48,"tag":91,"props":92,"children":94},"code",{"className":93},[],[95],{"type":53,"value":96},"${CLAUDE_PLUGIN_ROOT}\u002Freferences\u002Fmodel-naming-conventions.md",{"type":53,"value":98}," — the deterministic baseline (what's\nalready correct and must be left alone) and the specific gaps where your judgment adds value.",{"type":48,"tag":87,"props":100,"children":101},{},[102,108],{"type":48,"tag":91,"props":103,"children":105},{"className":104},[],[106],{"type":53,"value":107},"${CLAUDE_PLUGIN_ROOT}\u002Freferences\u002Fmodel-naming-rename-safety.md",{"type":53,"value":109}," — the cross-reference checklist for\nevery rename, so a rename never leaves a dangling reference.",{"type":48,"tag":87,"props":111,"children":112},{},[113,119,121,127],{"type":48,"tag":91,"props":114,"children":116},{"className":115},[],[117],{"type":53,"value":118},"${CLAUDE_PLUGIN_ROOT}\u002Freferences\u002Fdatamap-schema.md",{"type":53,"value":120}," — element shapes for ",{"type":48,"tag":91,"props":122,"children":124},{"className":123},[],[125],{"type":53,"value":126},"*.map.xml",{"type":53,"value":128},".",{"type":48,"tag":87,"props":130,"children":131},{},[132,138],{"type":48,"tag":91,"props":133,"children":135},{"className":134},[],[136],{"type":53,"value":137},"${CLAUDE_PLUGIN_ROOT}\u002Freferences\u002Fproject-layout.md",{"type":53,"value":139}," — locate the project descriptor and DataMap.",{"type":48,"tag":76,"props":141,"children":143},{"id":142},"step-1-determine-scope-changed-elements-vs-the-entire-model",[144],{"type":53,"value":145},"Step 1 — Determine scope: changed elements vs the entire model",{"type":48,"tag":55,"props":147,"children":148},{},[149],{"type":53,"value":150},"There are two modes, and picking the right one is the most important decision in this skill:",{"type":48,"tag":83,"props":152,"children":153},{},[154,172],{"type":48,"tag":87,"props":155,"children":156},{},[157,162,164,170],{"type":48,"tag":61,"props":158,"children":159},{},[160],{"type":53,"value":161},"Changed-only",{"type":53,"value":163}," (the default, e.g. when the user runs this after a ",{"type":48,"tag":91,"props":165,"children":167},{"className":166},[],[168],{"type":53,"value":169},"cayenne-db-import",{"type":53,"value":171},") — only\ninspect the names on newly-added or just-modified elements. Everything else in the model was\npresumably reviewed already; don't churn it.",{"type":48,"tag":87,"props":173,"children":174},{},[175,180,182,187],{"type":48,"tag":61,"props":176,"children":177},{},[178],{"type":53,"value":179},"Entire model",{"type":53,"value":181}," (rare) — inspect every Obj element. Use this ",{"type":48,"tag":61,"props":183,"children":184},{},[185],{"type":53,"value":186},"only",{"type":53,"value":188}," when the user explicitly asks\nfor it (\"clean up the whole model\", \"normalize all the names\", \"go over every entity\").",{"type":48,"tag":55,"props":190,"children":191},{},[192,198,200,204],{"type":48,"tag":91,"props":193,"children":195},{"className":194},[],[196],{"type":53,"value":197},"dbimport_run",{"type":53,"value":199}," does ",{"type":48,"tag":61,"props":201,"children":202},{},[203],{"type":53,"value":72},{"type":53,"value":205}," report which entities changed (it reports change counts though, so use it as an extra\nhint), so detect the changed set with git. Run these from the repo containing the DataMap file:",{"type":48,"tag":207,"props":208,"children":213},"pre",{"className":209,"code":210,"language":211,"meta":212,"style":212},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Is the DataMap under version control at all?\ngit -C \u003Crepo-dir> rev-parse --is-inside-work-tree\n\n# What did the import change (unstaged), and did anything get staged already?\ngit -C \u003Crepo-dir> diff -- \u003Cpath\u002Fto\u002Fdatamap>.map.xml\ngit -C \u003Crepo-dir> diff --cached -- \u003Cpath\u002Fto\u002Fdatamap>.map.xml\n","bash","",[214],{"type":48,"tag":91,"props":215,"children":216},{"__ignoreMap":212},[217,229,277,287,296,356],{"type":48,"tag":218,"props":219,"children":222},"span",{"class":220,"line":221},"line",1,[223],{"type":48,"tag":218,"props":224,"children":226},{"style":225},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[227],{"type":53,"value":228},"# Is the DataMap under version control at all?\n",{"type":48,"tag":218,"props":230,"children":232},{"class":220,"line":231},2,[233,239,245,251,256,262,267,272],{"type":48,"tag":218,"props":234,"children":236},{"style":235},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[237],{"type":53,"value":238},"git",{"type":48,"tag":218,"props":240,"children":242},{"style":241},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[243],{"type":53,"value":244}," -C",{"type":48,"tag":218,"props":246,"children":248},{"style":247},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[249],{"type":53,"value":250}," \u003C",{"type":48,"tag":218,"props":252,"children":253},{"style":241},[254],{"type":53,"value":255},"repo-di",{"type":48,"tag":218,"props":257,"children":259},{"style":258},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[260],{"type":53,"value":261},"r",{"type":48,"tag":218,"props":263,"children":264},{"style":247},[265],{"type":53,"value":266},">",{"type":48,"tag":218,"props":268,"children":269},{"style":241},[270],{"type":53,"value":271}," rev-parse",{"type":48,"tag":218,"props":273,"children":274},{"style":241},[275],{"type":53,"value":276}," --is-inside-work-tree\n",{"type":48,"tag":218,"props":278,"children":280},{"class":220,"line":279},3,[281],{"type":48,"tag":218,"props":282,"children":284},{"emptyLinePlaceholder":283},true,[285],{"type":53,"value":286},"\n",{"type":48,"tag":218,"props":288,"children":290},{"class":220,"line":289},4,[291],{"type":48,"tag":218,"props":292,"children":293},{"style":225},[294],{"type":53,"value":295},"# What did the import change (unstaged), and did anything get staged already?\n",{"type":48,"tag":218,"props":297,"children":299},{"class":220,"line":298},5,[300,304,308,312,316,320,324,329,334,338,343,347,351],{"type":48,"tag":218,"props":301,"children":302},{"style":235},[303],{"type":53,"value":238},{"type":48,"tag":218,"props":305,"children":306},{"style":241},[307],{"type":53,"value":244},{"type":48,"tag":218,"props":309,"children":310},{"style":247},[311],{"type":53,"value":250},{"type":48,"tag":218,"props":313,"children":314},{"style":241},[315],{"type":53,"value":255},{"type":48,"tag":218,"props":317,"children":318},{"style":258},[319],{"type":53,"value":261},{"type":48,"tag":218,"props":321,"children":322},{"style":247},[323],{"type":53,"value":266},{"type":48,"tag":218,"props":325,"children":326},{"style":241},[327],{"type":53,"value":328}," diff",{"type":48,"tag":218,"props":330,"children":331},{"style":241},[332],{"type":53,"value":333}," --",{"type":48,"tag":218,"props":335,"children":336},{"style":247},[337],{"type":53,"value":250},{"type":48,"tag":218,"props":339,"children":340},{"style":241},[341],{"type":53,"value":342},"path\u002Fto\u002Fdatama",{"type":48,"tag":218,"props":344,"children":345},{"style":258},[346],{"type":53,"value":55},{"type":48,"tag":218,"props":348,"children":349},{"style":247},[350],{"type":53,"value":266},{"type":48,"tag":218,"props":352,"children":353},{"style":241},[354],{"type":53,"value":355},".map.xml\n",{"type":48,"tag":218,"props":357,"children":359},{"class":220,"line":358},6,[360,364,368,372,376,380,384,388,393,397,401,405,409,413],{"type":48,"tag":218,"props":361,"children":362},{"style":235},[363],{"type":53,"value":238},{"type":48,"tag":218,"props":365,"children":366},{"style":241},[367],{"type":53,"value":244},{"type":48,"tag":218,"props":369,"children":370},{"style":247},[371],{"type":53,"value":250},{"type":48,"tag":218,"props":373,"children":374},{"style":241},[375],{"type":53,"value":255},{"type":48,"tag":218,"props":377,"children":378},{"style":258},[379],{"type":53,"value":261},{"type":48,"tag":218,"props":381,"children":382},{"style":247},[383],{"type":53,"value":266},{"type":48,"tag":218,"props":385,"children":386},{"style":241},[387],{"type":53,"value":328},{"type":48,"tag":218,"props":389,"children":390},{"style":241},[391],{"type":53,"value":392}," --cached",{"type":48,"tag":218,"props":394,"children":395},{"style":241},[396],{"type":53,"value":333},{"type":48,"tag":218,"props":398,"children":399},{"style":247},[400],{"type":53,"value":250},{"type":48,"tag":218,"props":402,"children":403},{"style":241},[404],{"type":53,"value":342},{"type":48,"tag":218,"props":406,"children":407},{"style":258},[408],{"type":53,"value":55},{"type":48,"tag":218,"props":410,"children":411},{"style":247},[412],{"type":53,"value":266},{"type":48,"tag":218,"props":414,"children":415},{"style":241},[416],{"type":53,"value":355},{"type":48,"tag":55,"props":418,"children":419},{},[420,422,428,430,436,437,443,445,451],{"type":53,"value":421},"From the diff, collect the added\u002Fmodified ",{"type":48,"tag":91,"props":423,"children":425},{"className":424},[],[426],{"type":53,"value":427},"\u003Cobj-entity>",{"type":53,"value":429},", ",{"type":48,"tag":91,"props":431,"children":433},{"className":432},[],[434],{"type":53,"value":435},"\u003Cobj-attribute>",{"type":53,"value":429},{"type":48,"tag":91,"props":438,"children":440},{"className":439},[],[441],{"type":53,"value":442},"\u003Cobj-relationship>",{"type":53,"value":444},", and\n",{"type":48,"tag":91,"props":446,"children":448},{"className":447},[],[449],{"type":53,"value":450},"\u003Cdb-relationship>",{"type":53,"value":452}," lines — that added\u002Fchanged set is your scope. Notes:",{"type":48,"tag":83,"props":454,"children":455},{},[456,469,489],{"type":48,"tag":87,"props":457,"children":458},{},[459,461,467],{"type":53,"value":460},"If ",{"type":48,"tag":91,"props":462,"children":464},{"className":463},[],[465],{"type":53,"value":466},"git diff",{"type":53,"value":468}," is empty but the file is tracked, there's nothing new to clean — say so and stop\n(unless the user asked for an entire-model pass).",{"type":48,"tag":87,"props":470,"children":471},{},[472,474,479,481,487],{"type":53,"value":473},"If the file is ",{"type":48,"tag":61,"props":475,"children":476},{},[477],{"type":53,"value":478},"untracked \u002F brand-new",{"type":53,"value":480}," (no prior version in ",{"type":48,"tag":91,"props":482,"children":484},{"className":483},[],[485],{"type":53,"value":486},"HEAD",{"type":53,"value":488},"), every element is effectively\n\"new\" — treat it as an entire-model pass, but tell the user that's why.",{"type":48,"tag":87,"props":490,"children":491},{},[492,497],{"type":48,"tag":61,"props":493,"children":494},{},[495],{"type":53,"value":496},"Fallback:",{"type":53,"value":498}," if it's not a git repository, or git isn't available, you can't scope by diff — fall\nback to the entire model and tell the user you couldn't narrow it down.",{"type":48,"tag":76,"props":500,"children":502},{"id":501},"step-2-find-the-names-worth-changing-and-only-those",[503],{"type":53,"value":504},"Step 2 — Find the names worth changing (and only those)",{"type":48,"tag":55,"props":506,"children":507},{},[508,510,516,518,523],{"type":53,"value":509},"For each in-scope element, compare against ",{"type":48,"tag":91,"props":511,"children":513},{"className":512},[],[514],{"type":53,"value":515},"model-naming-conventions.md",{"type":53,"value":517},". ",{"type":48,"tag":61,"props":519,"children":520},{},[521],{"type":53,"value":522},"Most names will already be\ncorrect — leave them.",{"type":53,"value":524}," Flag only the cases the deterministic generator can't handle:",{"type":48,"tag":526,"props":527,"children":528},"ol",{},[529,569,746,845],{"type":48,"tag":87,"props":530,"children":531},{},[532,537,539,545,547,553,554,560,561,567],{"type":48,"tag":61,"props":533,"children":534},{},[535],{"type":53,"value":536},"Run-together names with no separators",{"type":53,"value":538}," — ",{"type":48,"tag":91,"props":540,"children":542},{"className":541},[],[543],{"type":53,"value":544},"gametype",{"type":53,"value":546}," → ",{"type":48,"tag":91,"props":548,"children":550},{"className":549},[],[551],{"type":53,"value":552},"GameType",{"type":53,"value":429},{"type":48,"tag":91,"props":555,"children":557},{"className":556},[],[558],{"type":53,"value":559},"dateofbirth",{"type":53,"value":546},{"type":48,"tag":91,"props":562,"children":564},{"className":563},[],[565],{"type":53,"value":566},"dateOfBirth",{"type":53,"value":568},".\nSplit on a real word boundary you're confident about; never invent one.",{"type":48,"tag":87,"props":570,"children":571},{},[572,577,579,585,587,593,594,600,601,607,609,615,617,623,624,630,631,637,639,645,647,652,653,659,661,667,669,675,676,681,683,689,690,696,697,702,703,708,710,716,717,723,725,730,732,738,739,745],{"type":48,"tag":61,"props":573,"children":574},{},[575],{"type":53,"value":576},"Numbered collision names",{"type":53,"value":578}," (",{"type":48,"tag":91,"props":580,"children":582},{"className":581},[],[583],{"type":53,"value":584},"projects",{"type":53,"value":586}," \u002F ",{"type":48,"tag":91,"props":588,"children":590},{"className":589},[],[591],{"type":53,"value":592},"projects1",{"type":53,"value":429},{"type":48,"tag":91,"props":595,"children":597},{"className":596},[],[598],{"type":53,"value":599},"people",{"type":53,"value":586},{"type":48,"tag":91,"props":602,"children":604},{"className":603},[],[605],{"type":53,"value":606},"people1",{"type":53,"value":608},") from more than one\nrelationship between the same two tables. The generator resolves the common cases itself: to-one\nnames are FK-based even without an ",{"type":48,"tag":91,"props":610,"children":612},{"className":611},[],[613],{"type":53,"value":614},"_ID",{"type":53,"value":616}," suffix (",{"type":48,"tag":91,"props":618,"children":620},{"className":619},[],[621],{"type":53,"value":622},"HOME_TEAM_ID",{"type":53,"value":546},{"type":48,"tag":91,"props":625,"children":627},{"className":626},[],[628],{"type":53,"value":629},"homeTeam",{"type":53,"value":429},{"type":48,"tag":91,"props":632,"children":634},{"className":633},[],[635],{"type":53,"value":636},"BIRTH_COUNTRY",{"type":53,"value":638}," →\n",{"type":48,"tag":91,"props":640,"children":642},{"className":641},[],[643],{"type":53,"value":644},"birthCountry",{"type":53,"value":646},"), and to-many names pick up a FK role qualifier when the FK embeds the source\nentity name, even one sans a common table prefix (",{"type":48,"tag":91,"props":648,"children":650},{"className":649},[],[651],{"type":53,"value":622},{"type":53,"value":546},{"type":48,"tag":91,"props":654,"children":656},{"className":655},[],[657],{"type":53,"value":658},"homeGames",{"type":53,"value":660},"; ",{"type":48,"tag":91,"props":662,"children":664},{"className":663},[],[665],{"type":53,"value":666},"home_team_id",{"type":53,"value":668},"\nreferencing ",{"type":48,"tag":91,"props":670,"children":672},{"className":671},[],[673],{"type":53,"value":674},"aa_team",{"type":53,"value":546},{"type":48,"tag":91,"props":677,"children":679},{"className":678},[],[680],{"type":53,"value":658},{"type":53,"value":682}," too). What still collides: to-many collections whose FK role is\nunrelated to the entity name (",{"type":48,"tag":91,"props":684,"children":686},{"className":685},[],[687],{"type":53,"value":688},"MANAGER_ID",{"type":53,"value":586},{"type":48,"tag":91,"props":691,"children":693},{"className":692},[],[694],{"type":53,"value":695},"AUDITOR_ID",{"type":53,"value":546},{"type":48,"tag":91,"props":698,"children":700},{"className":699},[],[701],{"type":53,"value":584},{"type":53,"value":586},{"type":48,"tag":91,"props":704,"children":706},{"className":705},[],[707],{"type":53,"value":592},{"type":53,"value":709}," — rename by\nrole: ",{"type":48,"tag":91,"props":711,"children":713},{"className":712},[],[714],{"type":53,"value":715},"managedProjects",{"type":53,"value":586},{"type":48,"tag":91,"props":718,"children":720},{"className":719},[],[721],{"type":53,"value":722},"auditedProjects",{"type":53,"value":724},"), and — in models imported by older Cayenne versions —\nto-one ends whose FK columns lack an ",{"type":48,"tag":91,"props":726,"children":728},{"className":727},[],[729],{"type":53,"value":614},{"type":53,"value":731}," suffix and collapsed to ",{"type":48,"tag":91,"props":733,"children":735},{"className":734},[],[736],{"type":53,"value":737},"employee",{"type":53,"value":586},{"type":48,"tag":91,"props":740,"children":742},{"className":741},[],[743],{"type":53,"value":744},"employee1",{"type":53,"value":128},{"type":48,"tag":87,"props":747,"children":748},{},[749,754,756,761,763,769,770,776,778,784,786,792,794,800,802,808,809,815,817,822,824,830,831,836,838,843],{"type":48,"tag":61,"props":750,"children":751},{},[752],{"type":53,"value":753},"A common entity prefix leaking into relationship names",{"type":53,"value":755}," — when every entity shares a prefix\nthat was ",{"type":48,"tag":61,"props":757,"children":758},{},[759],{"type":53,"value":760},"kept",{"type":53,"value":762}," on the class names (",{"type":48,"tag":91,"props":764,"children":766},{"className":765},[],[767],{"type":53,"value":768},"AaCustomer",{"type":53,"value":429},{"type":48,"tag":91,"props":771,"children":773},{"className":772},[],[774],{"type":53,"value":775},"AaOrder",{"type":53,"value":777},"), the prefix can leak into\nrelationship names. The generator already keeps it out of to-many names (the leading ",{"type":48,"tag":91,"props":779,"children":781},{"className":780},[],[782],{"type":53,"value":783},"_",{"type":53,"value":785},"-tokens\nshared by the source and target table names are dropped → ",{"type":48,"tag":91,"props":787,"children":789},{"className":788},[],[790],{"type":53,"value":791},"orders",{"type":53,"value":793},", not ",{"type":48,"tag":91,"props":795,"children":797},{"className":796},[],[798],{"type":53,"value":799},"aaOrders",{"type":53,"value":801},"); what leaks is\nto-one names built from prefixed FK columns (",{"type":48,"tag":91,"props":803,"children":805},{"className":804},[],[806],{"type":53,"value":807},"AA_CUSTOMER_ID",{"type":53,"value":546},{"type":48,"tag":91,"props":810,"children":812},{"className":811},[],[813],{"type":53,"value":814},"aaCustomer",{"type":53,"value":816},") and to-many names in\nmodels imported by older Cayenne versions (",{"type":48,"tag":91,"props":818,"children":820},{"className":819},[],[821],{"type":53,"value":799},{"type":53,"value":823},"). Strip the prefix from those relationship\nnames (",{"type":48,"tag":91,"props":825,"children":827},{"className":826},[],[828],{"type":53,"value":829},"customer",{"type":53,"value":429},{"type":48,"tag":91,"props":832,"children":834},{"className":833},[],[835],{"type":53,"value":791},{"type":53,"value":837},"); a relationship is a role\u002Fproperty, and the prefix is noise there.\n",{"type":48,"tag":61,"props":839,"children":840},{},[841],{"type":53,"value":842},"Leave the entity names alone",{"type":53,"value":844}," — the prefix on classes is the user's choice, and renaming\nentities regenerates classes.",{"type":48,"tag":87,"props":846,"children":847},{},[848,853,855,861,862,868],{"type":48,"tag":61,"props":849,"children":850},{},[851],{"type":53,"value":852},"Other clear, defensible improvements",{"type":53,"value":854}," — illegal identifiers (digit-leading names; Java\nkeywords are fine — cgen escapes them — and properties clashing with base-class getters like\n",{"type":48,"tag":91,"props":856,"children":858},{"className":857},[],[859],{"type":53,"value":860},"class",{"type":53,"value":586},{"type":48,"tag":91,"props":863,"children":865},{"className":864},[],[866],{"type":53,"value":867},"objectId",{"type":53,"value":869}," are auto-qualified with the entity name by the generator, though older\nimports may carry them raw), lost acronym casing, obvious cryptic abbreviations applied\nconsistently, plural-table-to-singular-entity. Conservative by default; when unsure, leave the\nbaseline name and ask.",{"type":48,"tag":55,"props":871,"children":872},{},[873,875,880,882,888,890,895,897,903],{"type":53,"value":874},"Relationship cleanup is anchored on the ",{"type":48,"tag":61,"props":876,"children":877},{},[878],{"type":53,"value":879},"DbRelationship",{"type":53,"value":881}," — it's the first-class citizen, since\nevery FK has one whether or not an ObjRelationship was generated on top. The rules above (run-together,\nnumbered collisions, prefix leak) apply to DbRelationship names directly, derived from their own DB\nmetadata (FK column for to-one, pluralized target DbEntity for to-many). When an ObjRelationship ",{"type":48,"tag":883,"props":884,"children":885},"em",{},[886],{"type":53,"value":887},"is",{"type":53,"value":889},"\nbuilt on a DbRelationship, keep the two names ",{"type":48,"tag":61,"props":891,"children":892},{},[893],{"type":53,"value":894},"in sync",{"type":53,"value":896}," — rename both together, per direction.\nDbRelationships with no ObjRelationship (an ungenerated reverse direction, a skipped FK, a hop inside\na flattened many-to-many) are cleaned the same way — don't skip them. Any rename must update every\n",{"type":48,"tag":91,"props":898,"children":900},{"className":899},[],[901],{"type":53,"value":902},"db-relationship-path",{"type":53,"value":904}," segment that names it (see Step 4).",{"type":48,"tag":76,"props":906,"children":908},{"id":907},"step-3-present-the-rename-plan",[909],{"type":53,"value":910},"Step 3 — Present the rename plan",{"type":48,"tag":55,"props":912,"children":913},{},[914,916,922,924,929],{"type":53,"value":915},"Show the user a table of ",{"type":48,"tag":91,"props":917,"children":919},{"className":918},[],[920],{"type":53,"value":921},"old → new",{"type":53,"value":923}," grouped by entity, plus the mirrored DbRelationship renames, and\nstate plainly what you're ",{"type":48,"tag":61,"props":925,"children":926},{},[927],{"type":53,"value":928},"leaving alone",{"type":53,"value":930}," so it's clear this isn't a blanket rewrite.",{"type":48,"tag":83,"props":932,"children":933},{},[934,944],{"type":48,"tag":87,"props":935,"children":936},{},[937,942],{"type":48,"tag":61,"props":938,"children":939},{},[940],{"type":53,"value":941},"Entire-model mode, or any rename of a name already referenced by user Java\u002Fqueries",{"type":53,"value":943}," → confirm\nbefore applying. Renaming an ObjEntity regenerates its class and can break existing code.",{"type":48,"tag":87,"props":945,"children":946},{},[947,952],{"type":48,"tag":61,"props":948,"children":949},{},[950],{"type":53,"value":951},"Changed-only, right after an import",{"type":53,"value":953}," (new elements not referenced anywhere yet) → low risk; apply\nand report, but still list every rename you made.",{"type":48,"tag":55,"props":955,"children":956},{},[957],{"type":53,"value":958},"If there are many domain abbreviations to expand, ask the user for a glossary rather than guessing.",{"type":48,"tag":76,"props":960,"children":962},{"id":961},"step-4-apply-the-renames-safely",[963],{"type":53,"value":964},"Step 4 — Apply the renames safely",{"type":48,"tag":55,"props":966,"children":967},{},[968,970,975,977,982,984,990],{"type":53,"value":969},"Edit the ",{"type":48,"tag":91,"props":971,"children":973},{"className":972},[],[974],{"type":53,"value":126},{"type":53,"value":976},". For ",{"type":48,"tag":61,"props":978,"children":979},{},[980],{"type":53,"value":981},"every",{"type":53,"value":983}," rename, walk the matching checklist in\n",{"type":48,"tag":91,"props":985,"children":987},{"className":986},[],[988],{"type":53,"value":989},"model-naming-rename-safety.md",{"type":53,"value":991}," and update all references in the same edit:",{"type":48,"tag":83,"props":993,"children":994},{},[995,1047,1059,1071],{"type":48,"tag":87,"props":996,"children":997},{},[998,1000,1006,1008,1014,1016,1022,1024,1030,1032,1038,1040,1046],{"type":53,"value":999},"ObjEntity → ",{"type":48,"tag":91,"props":1001,"children":1003},{"className":1002},[],[1004],{"type":53,"value":1005},"className",{"type":53,"value":1007},", every ",{"type":48,"tag":91,"props":1009,"children":1011},{"className":1010},[],[1012],{"type":53,"value":1013},"obj-relationship",{"type":53,"value":1015}," ",{"type":48,"tag":91,"props":1017,"children":1019},{"className":1018},[],[1020],{"type":53,"value":1021},"source",{"type":53,"value":1023},"\u002F",{"type":48,"tag":91,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":53,"value":1029},"target",{"type":53,"value":1031},", query ",{"type":48,"tag":91,"props":1033,"children":1035},{"className":1034},[],[1036],{"type":53,"value":1037},"root-name",{"type":53,"value":1039},", EJBQL,\n",{"type":48,"tag":91,"props":1041,"children":1043},{"className":1042},[],[1044],{"type":53,"value":1045},"result-entity",{"type":53,"value":128},{"type":48,"tag":87,"props":1048,"children":1049},{},[1050,1052,1057],{"type":53,"value":1051},"ObjRelationship → prefetch\u002Fexpression\u002FEJBQL paths (its ",{"type":48,"tag":91,"props":1053,"children":1055},{"className":1054},[],[1056],{"type":53,"value":902},{"type":53,"value":1058}," is unaffected).",{"type":48,"tag":87,"props":1060,"children":1061},{},[1062,1064,1070],{"type":53,"value":1063},"ObjAttribute → qualifier\u002Fordering\u002FEJBQL paths (its ",{"type":48,"tag":91,"props":1065,"children":1067},{"className":1066},[],[1068],{"type":53,"value":1069},"db-attribute-path",{"type":53,"value":1058},{"type":48,"tag":87,"props":1072,"children":1073},{},[1074,1076,1081],{"type":53,"value":1075},"DbRelationship → every ",{"type":48,"tag":91,"props":1077,"children":1079},{"className":1078},[],[1080],{"type":53,"value":902},{"type":53,"value":1082}," segment that names it, including inside dotted\nflattened chains. This holds whether or not the DbRelationship backs an ObjRelationship — a\nstandalone DbRelationship can still be named as a segment in another entity's flattened path.",{"type":48,"tag":55,"props":1084,"children":1085},{},[1086],{"type":53,"value":1087},"Keep every name unique within its scope, and preserve the file's existing formatting and element\norder.",{"type":48,"tag":76,"props":1089,"children":1091},{"id":1090},"step-5-validate-and-hand-off",[1092],{"type":53,"value":1093},"Step 5 — Validate and hand off",{"type":48,"tag":83,"props":1095,"children":1096},{},[1097,1134],{"type":48,"tag":87,"props":1098,"children":1099},{},[1100,1102,1107,1108,1113,1114,1119,1120,1125,1127,1132],{"type":53,"value":1101},"Re-walk the cross-reference checklist: does every ",{"type":48,"tag":91,"props":1103,"children":1105},{"className":1104},[],[1106],{"type":53,"value":1021},{"type":53,"value":1023},{"type":48,"tag":91,"props":1109,"children":1111},{"className":1110},[],[1112],{"type":53,"value":1029},{"type":53,"value":429},{"type":48,"tag":91,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":53,"value":1037},{"type":53,"value":429},{"type":48,"tag":91,"props":1121,"children":1123},{"className":1122},[],[1124],{"type":53,"value":902},{"type":53,"value":1126},"\nsegment, and ",{"type":48,"tag":91,"props":1128,"children":1130},{"className":1129},[],[1131],{"type":53,"value":1005},{"type":53,"value":1133}," still resolve?",{"type":48,"tag":87,"props":1135,"children":1136},{},[1137,1139,1145,1147,1152,1154,1160],{"type":53,"value":1138},"Hand off to ",{"type":48,"tag":91,"props":1140,"children":1142},{"className":1141},[],[1143],{"type":53,"value":1144},"cayenne-cgen",{"type":53,"value":1146}," to (re)generate the Java classes with the final names. ",{"type":48,"tag":61,"props":1148,"children":1149},{},[1150],{"type":53,"value":1151},"Naming must\nhappen before cgen",{"type":53,"value":1153}," — if classes were already generated with the old names, point out the now-stale\n",{"type":48,"tag":91,"props":1155,"children":1157},{"className":1156},[],[1158],{"type":53,"value":1159},".java",{"type":53,"value":1161}," files so the user can regenerate\u002Fdelete them.",{"type":48,"tag":76,"props":1163,"children":1165},{"id":1164},"anti-patterns",[1166],{"type":53,"value":1167},"Anti-patterns",{"type":48,"tag":83,"props":1169,"children":1170},{},[1171,1181,1198,1236,1246,1282,1299,1309,1332],{"type":48,"tag":87,"props":1172,"children":1173},{},[1174,1179],{"type":48,"tag":61,"props":1175,"children":1176},{},[1177],{"type":53,"value":1178},"Don't rewrite names the generator already got right.",{"type":53,"value":1180}," A camelCase attribute, a PascalCase entity,\na plural to-many, an FK-derived to-one — all fine. This is polish, not a redo.",{"type":48,"tag":87,"props":1182,"children":1183},{},[1184,1189,1191,1196],{"type":48,"tag":61,"props":1185,"children":1186},{},[1187],{"type":53,"value":1188},"Don't clean the entire model when only an import changed things.",{"type":53,"value":1190}," Scope with ",{"type":48,"tag":91,"props":1192,"children":1194},{"className":1193},[],[1195],{"type":53,"value":466},{"type":53,"value":1197},"; default\nto changed-only.",{"type":48,"tag":87,"props":1199,"children":1200},{},[1201,1206,1208,1213,1214,1219,1221,1227,1228,1234],{"type":48,"tag":61,"props":1202,"children":1203},{},[1204],{"type":53,"value":1205},"Don't invent word splits.",{"type":53,"value":1207}," Split ",{"type":48,"tag":91,"props":1209,"children":1211},{"className":1210},[],[1212],{"type":53,"value":544},{"type":53,"value":546},{"type":48,"tag":91,"props":1215,"children":1217},{"className":1216},[],[1218],{"type":53,"value":552},{"type":53,"value":1220}," only when the boundary is real; don't\nbreak single words (",{"type":48,"tag":91,"props":1222,"children":1224},{"className":1223},[],[1225],{"type":53,"value":1226},"status",{"type":53,"value":429},{"type":48,"tag":91,"props":1229,"children":1231},{"className":1230},[],[1232],{"type":53,"value":1233},"metadata",{"type":53,"value":1235},").",{"type":48,"tag":87,"props":1237,"children":1238},{},[1239,1244],{"type":48,"tag":61,"props":1240,"children":1241},{},[1242],{"type":53,"value":1243},"Don't guess abbreviation expansions.",{"type":53,"value":1245}," Ask for a glossary when a model is full of them.",{"type":48,"tag":87,"props":1247,"children":1248},{},[1249,1261,1263,1268,1269,1274,1276,1281],{"type":48,"tag":61,"props":1250,"children":1251},{},[1252,1254,1259],{"type":53,"value":1253},"Don't rename an ObjEntity without updating ",{"type":48,"tag":91,"props":1255,"children":1257},{"className":1256},[],[1258],{"type":53,"value":1005},{"type":53,"value":1260},", every reference, and regenerating",{"type":53,"value":1262}," — a\nbare rename orphans the old class and dangles relationship ",{"type":48,"tag":91,"props":1264,"children":1266},{"className":1265},[],[1267],{"type":53,"value":1021},{"type":53,"value":1023},{"type":48,"tag":91,"props":1270,"children":1272},{"className":1271},[],[1273],{"type":53,"value":1029},{"type":53,"value":1275}," and query ",{"type":48,"tag":91,"props":1277,"children":1279},{"className":1278},[],[1280],{"type":53,"value":1037},{"type":53,"value":128},{"type":48,"tag":87,"props":1283,"children":1284},{},[1285,1297],{"type":48,"tag":61,"props":1286,"children":1287},{},[1288,1290,1295],{"type":53,"value":1289},"Don't rename a DbRelationship without fixing every ",{"type":48,"tag":91,"props":1291,"children":1293},{"className":1292},[],[1294],{"type":53,"value":902},{"type":53,"value":1296}," segment",{"type":53,"value":1298},", including\nflattened chains on other entities.",{"type":48,"tag":87,"props":1300,"children":1301},{},[1302,1307],{"type":48,"tag":61,"props":1303,"children":1304},{},[1305],{"type":53,"value":1306},"Don't skip a DbRelationship just because it has no ObjRelationship.",{"type":53,"value":1308}," Standalone DbRelationships\nare in scope — clean them on their own merits from their DB metadata, not by mirroring.",{"type":48,"tag":87,"props":1310,"children":1311},{},[1312,1330],{"type":48,"tag":61,"props":1313,"children":1314},{},[1315,1317,1322,1323,1328],{"type":53,"value":1316},"Don't repoint ",{"type":48,"tag":91,"props":1318,"children":1320},{"className":1319},[],[1321],{"type":53,"value":1069},{"type":53,"value":586},{"type":48,"tag":91,"props":1324,"children":1326},{"className":1325},[],[1327],{"type":53,"value":902},{"type":53,"value":1329}," targets.",{"type":53,"value":1331}," You rename the element; you\nnever change what a path points to.",{"type":48,"tag":87,"props":1333,"children":1334},{},[1335,1340,1342,1347],{"type":48,"tag":61,"props":1336,"children":1337},{},[1338],{"type":53,"value":1339},"Don't run cgen yourself.",{"type":53,"value":1341}," Hand off to ",{"type":48,"tag":91,"props":1343,"children":1345},{"className":1344},[],[1346],{"type":53,"value":1144},{"type":53,"value":128},{"type":48,"tag":1349,"props":1350,"children":1351},"style",{},[1352],{"type":53,"value":1353},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1355,"total":1494},[1356,1374,1388,1401,1414,1427,1436,1446,1456,1463,1473,1483],{"slug":1357,"name":1357,"fn":1358,"description":1359,"org":1360,"tags":1361,"stars":1371,"repoUrl":1372,"updatedAt":1373},"datafusion-python","write Apache DataFusion Python code","Use when the user is writing datafusion-python (Apache DataFusion Python bindings) DataFrame or SQL code. Covers imports, data loading, DataFrame operations, expression building, SQL-to-DataFrame mappings, idiomatic patterns, and common pitfalls.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1362,1365,1368],{"name":1363,"slug":1364,"type":15},"Data Analysis","data-analysis",{"name":1366,"slug":1367,"type":15},"Python","python",{"name":1369,"slug":1370,"type":15},"SQL","sql",593,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fdatafusion-python","2026-07-12T08:36:04.957626",{"slug":1375,"name":1375,"fn":1376,"description":1377,"org":1378,"tags":1379,"stars":1385,"repoUrl":1386,"updatedAt":1387},"bydbql","generate and execute BanyanDB BydbQL queries","Generate, validate, and optionally execute read-only BanyanDB BydbQL for STREAM, MEASURE, TRACE, and PROPERTY resources. Use when the user asks to query BanyanDB, translate natural language to BydbQL, inspect BanyanDB schema or data, validate BydbQL, or fetch raw BanyanDB records.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1380,1383,1384],{"name":1381,"slug":1382,"type":15},"Analytics","analytics",{"name":17,"slug":18,"type":15},{"name":1369,"slug":1370,"type":15},344,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fskywalking-banyandb","2026-07-12T08:31:01.294423",{"slug":1389,"name":1389,"fn":1390,"description":1391,"org":1392,"tags":1393,"stars":1385,"repoUrl":1386,"updatedAt":1400},"compiling","compile and build BanyanDB projects","Compile and build the SkyWalking BanyanDB project. Use when the user asks to compile, build, or generate code for this project.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1394,1397],{"name":1395,"slug":1396,"type":15},"Build","build",{"name":1398,"slug":1399,"type":15},"Engineering","engineering","2026-07-12T08:31:06.373309",{"slug":1402,"name":1402,"fn":1403,"description":1404,"org":1405,"tags":1406,"stars":1385,"repoUrl":1386,"updatedAt":1413},"gh-pull-request","create GitHub pull requests for BanyanDB","Create a GitHub pull request for SkyWalking BanyanDB. Use when the user asks to create a PR, submit changes, or open a pull request.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1407,1410],{"name":1408,"slug":1409,"type":15},"GitHub","github",{"name":1411,"slug":1412,"type":15},"Pull Requests","pull-requests","2026-07-12T08:31:03.792415",{"slug":1415,"name":1415,"fn":1416,"description":1417,"org":1418,"tags":1419,"stars":1385,"repoUrl":1386,"updatedAt":1426},"vendor-update","update Go and Node.js vendor dependencies","Upgrade Go\u002FNode.js vendor dependencies and sync tool versions. Use whenever the user says \"upgrade dependencies\", \"update vendors\", \"vendor update\", \"run vendor-upgrade\", \"bump dependencies\", \"update packages\", or asks to run the `vendor-update` Make target. This skill also checks `scripts\u002Fbuild\u002Fversion.mk` after upgrading to see if any tracked tool versions need updating too, and removes stale binaries from `bin\u002F` when versions change.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1420,1423],{"name":1421,"slug":1422,"type":15},"Go","go",{"name":1424,"slug":1425,"type":15},"Node.js","node-js","2026-07-12T08:31:02.555555",{"slug":1144,"name":1144,"fn":1428,"description":1429,"org":1430,"tags":1431,"stars":25,"repoUrl":26,"updatedAt":1435},"generate Cayenne entity Java classes","Use this skill whenever the user wants to (re)generate Cayenne entity Java classes from a DataMap. Trigger on phrases like 'generate Java classes', 'regenerate entities', 'run cgen', 'create the entity classes', 'why is the Artist class missing fields', 'where did the `_Abstract*` classes come from', 'sync the entity classes with the model', or any request to materialize Java from the DataMap. Also trigger as a follow-up after modeling changes (someone added an entity, attribute, or relationship and now the Java side is stale). This skill exclusively uses the `mcp__cayenne__cgen_run` MCP tool — it does NOT use `mvn cayenne:cgen` or the Gradle cgen task.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1432,1433,1434],{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},"2026-07-12T08:32:33.575211",{"slug":169,"name":169,"fn":1437,"description":1438,"org":1439,"tags":1440,"stars":25,"repoUrl":26,"updatedAt":1445},"import database schema into Cayenne DataMaps","Use this skill when the user wants to import database schema metadata into a Cayenne DataMap — the *model\u002Fmapping only*, not names or Java classes. Trigger on phrases like 'reverse engineer the database', 'import the schema', 'generate a DataMap from my DB', 'add the new tables from the DB into the model', 'import the customer table', 'create entities from these tables', or any request to read database metadata to populate or update a DataMap's XML. This is for *full schema* or *bulk table* import; one-off a-la-carte entity additions belong in the cayenne-modeling skill. IMPORTANT — scope: this imports the mapping ONLY; it does not clean up the Object-layer names or (re)generate Java classes. When the user wants their whole project brought in line with the DB ('sync my project with the database', 'my schema changed, update everything', 'update my entities\u002Fclasses from the DB'), that is the end-to-end `cayenne-full-db-sync` skill, which runs this import and then name cleanup and class generation. To regenerate classes alone use `cayenne-cgen`. The skill runs reverse engineering directly via the `mcp__cayenne__dbimport_run` MCP tool when a DBConnector is already configured; otherwise it opens the CayenneModeler GUI via `mcp__cayenne__open_project` to configure the connection first.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1441,1442,1443,1444],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":1369,"slug":1370,"type":15},"2026-07-19T05:40:33.655062",{"slug":1447,"name":1447,"fn":1448,"description":1449,"org":1450,"tags":1451,"stars":25,"repoUrl":26,"updatedAt":1455},"cayenne-full-db-sync","synchronize Cayenne projects with database","Use this skill when the user wants to bring their WHOLE Cayenne project in line with the database in one shot — the mapping, the Object-layer names, and the generated Java classes together. This is the end-to-end 'sync with the DB' workflow, and it orchestrates three skills in order: `cayenne-db-import` (import schema metadata into the DataMap) → `cayenne-model-naming` (polish the just-imported names) → `cayenne-cgen` (regenerate Java classes). Trigger on holistic phrases like 'sync my project with the database', 'sync with the DB', 'my schema changed, update everything', 'update my entities\u002Fclasses from the database', 'reverse engineer and regenerate the classes', 'import the new tables and rebuild the entities', 'full DB sync', 'bring the model and classes up to date with the DB'. The distinguishing signal is scope: the user wants the whole project (mapping + names + Java code), not just one stage. For the *model\u002Fmapping only* (no name cleanup, no class generation) use `cayenne-db-import`; to (re)generate classes alone use `cayenne-cgen`; to clean names alone use `cayenne-model-naming`. Uses the `mcp__cayenne__dbimport_run` and `mcp__cayenne__cgen_run` MCP tools via the sub-skills; does NOT use Maven or Gradle goals.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1452,1453,1454],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},"2026-07-19T06:03:49.112969",{"slug":4,"name":4,"fn":5,"description":6,"org":1457,"tags":1458,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1459,1460,1461,1462],{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"slug":1464,"name":1464,"fn":1465,"description":1466,"org":1467,"tags":1468,"stars":25,"repoUrl":26,"updatedAt":1472},"cayenne-modeler","manage Cayenne projects with CayenneModeler","Use this skill when the user explicitly wants to open CayenneModeler (the GUI) on a Cayenne project, or when the modeling task is inherently visual — reverse engineering (delegated to cayenne-db-import), bulk relationship layout, multi-entity visual refactoring. Trigger on phrases like 'open the Modeler', 'open in CayenneModeler', 'launch the GUI', 'edit visually', 'show me the project in the Modeler'. Do NOT trigger as a fallback for ordinary a-la-carte XML edits — those belong in the cayenne-modeling skill, which is faster and doesn't require the user to context-switch.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1469,1470,1471],{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},"2026-07-12T08:32:37.199428",{"slug":1474,"name":1474,"fn":1475,"description":1476,"org":1477,"tags":1478,"stars":25,"repoUrl":26,"updatedAt":1482},"cayenne-modeling","edit and extend Cayenne ORM models","Use this skill whenever the user wants to edit, inspect, or extend the Cayenne ORM model in a project — adding or modifying entities, attributes, relationships, embeddables, named queries, stored procedures, or DataNodes. Trigger on phrases like 'add an ObjEntity', 'add a DbEntity', 'add a relationship', 'expose this column as an attribute', 'create a new DataMap', 'add a named query', 'create an embeddable', 'add a stored procedure', 'change the attribute type', 'mark this column as nullable', 'rename this entity', or any mention of a Cayenne `*.map.xml` or `cayenne-*.xml` file. Also trigger when the user references modeling concepts (ObjEntity, DbEntity, ObjAttribute, DbAttribute, ObjRelationship, DbRelationship, Embeddable, dbEntityName, deleteRule, db-attribute-path, db-relationship-path, defaultPackage) in the context of a Cayenne-using app. This is the *primary* skill for a-la-carte ORM model manipulation — direct XML edits, not the Modeler GUI.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1479,1480,1481],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},"2026-07-19T05:40:32.6889",{"slug":1484,"name":1484,"fn":1485,"description":1486,"org":1487,"tags":1488,"stars":25,"repoUrl":26,"updatedAt":1493},"cayenne-query","write and modify Cayenne database queries","Use this skill whenever the user wants to write or modify a Cayenne query — fetching entities by criteria, joining, prefetching to avoid N+1, ordering, paginating, aggregating, or running raw SQL through Cayenne. Trigger on phrases like 'query for X', 'fetch all artists where ...', 'write an ObjectSelect', 'use SQLSelect', 'use SelectById', 'add a prefetch', 'get distinct values', 'count rows', 'find by ID', 'load by primary key', 'build a Cayenne expression', 'why am I getting N+1', 'how do I paginate', 'select a single column', 'select columns into a DTO', 'named query in the DataMap'. Do NOT trigger for modeling changes (use cayenne-modeling) or runtime bootstrap (use cayenne-runtime).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1489,1490,1491,1492],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":1369,"slug":1370,"type":15},"2026-07-12T08:32:35.072322",108,{"items":1496,"total":1542},[1497,1503,1510,1516,1523,1529,1535],{"slug":1144,"name":1144,"fn":1428,"description":1429,"org":1498,"tags":1499,"stars":25,"repoUrl":26,"updatedAt":1435},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1500,1501,1502],{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"slug":169,"name":169,"fn":1437,"description":1438,"org":1504,"tags":1505,"stars":25,"repoUrl":26,"updatedAt":1445},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1506,1507,1508,1509],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":1369,"slug":1370,"type":15},{"slug":1447,"name":1447,"fn":1448,"description":1449,"org":1511,"tags":1512,"stars":25,"repoUrl":26,"updatedAt":1455},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1513,1514,1515],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":1517,"tags":1518,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1519,1520,1521,1522],{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"slug":1464,"name":1464,"fn":1465,"description":1466,"org":1524,"tags":1525,"stars":25,"repoUrl":26,"updatedAt":1472},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1526,1527,1528],{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"slug":1474,"name":1474,"fn":1475,"description":1476,"org":1530,"tags":1531,"stars":25,"repoUrl":26,"updatedAt":1482},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1532,1533,1534],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"slug":1484,"name":1484,"fn":1485,"description":1486,"org":1536,"tags":1537,"stars":25,"repoUrl":26,"updatedAt":1493},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1538,1539,1540,1541],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":1369,"slug":1370,"type":15},8]