[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7145ZMSY2B441T4KMSGQ2H7":3,"skill-same:01M7145ZMSY2B441T4KMSGQ2H7":61},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":14,"repositoryHtmlUrl":44,"repositoryHomepageUrl":6,"ownerHtmlUrl":45,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":46,"install":47,"resources":60},"01M7145ZMSY2B441T4KMSGQ2H7","odoo-migration-helper",null,"Step-by-step guide for migrating Odoo custom modules between versions (v14→v15→v16→v17). Covers API changes, deprecated methods, and view migration.","sapsapshen\u002Fai-memory-router","sapsapshen","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F20347959?v=4","01M6XDQEF1DP50DKF37H81J3J5","shenmian","01M6XDQEJPE41Y3DT2763X8ZJN",0,"MIT","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fcopilot\u002Fodoo-migration-helper\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"helper","odoo","migration","migration helper","odoo migration helper","guide","deprecated","safe","api changes","changes","self","api","custom","methods","for","view","modules","2026-11-10 10:12:30",false,"---\nname: odoo-migration-helper\ndescription: \"Step-by-step guide for migrating Odoo custom modules between versions (v14→v15→v16→v17). Covers API changes, deprecated methods, and view migration.\"\nrisk: safe\nsource: \"self\"\n---\n\n# Odoo Migration Helper\n\n## Overview\n\nMigrating Odoo modules between major versions requires careful handling of API changes, deprecated methods, renamed fields, and new view syntax. This skill guides you through the migration process systematically, covering the most common breaking changes between versions.\n\n## When to Use This Skill\n\n- Upgrading a custom module from Odoo 14\u002F15\u002F16 to a newer version.\n- Getting a checklist of things to check before running `odoo-upgrade`.\n- Fixing deprecation warnings after a version upgrade.\n- Understanding what changed between two specific Odoo versions.\n\n## How It Works\n\n1. **Activate**: Mention `@odoo-migration-helper`, specify your source and target versions, and paste your module code.\n2. **Analyze**: Receive a list of breaking changes with before\u002Fafter code fixes.\n3. **Validate**: Get a migration checklist specific to your module's features.\n\n## Key Migration Changes by Version\n\n### Odoo 16 → 17\n\n| Topic | Old (v16) | New (v17) |\n|---|---|---|\n| View visibility | `attrs=\"{'invisible': [...]}\"` | `invisible=\"condition\"` |\n| Chatter | `\u003Cdiv class=\"oe_chatter\">` | `\u003Cchatter\u002F>` |\n| Required\u002FReadonly | `attrs=\"{'required': [...]}\"` | `required=\"condition\"` |\n| Python minimum | 3.10 | 3.10+ |\n| JS modules | Legacy `define(['web.core'])` | ES module `import` syntax |\n\n### Odoo 15 → 16\n\n| Topic | Old (v15) | New (v16) |\n|---|---|---|\n| Website published flag | `website_published = True` | `is_published = True` |\n| Mail aliases | `alias_domain` on company | Moved to `mail.alias.domain` model |\n| Report render | `_render_qweb_pdf()` | `_render_qweb_pdf()` (same, but signature changed) |\n| Accounting move | `account.move.line` grouping | Line aggregation rules updated |\n| Email threading | `mail_thread_id` | Deprecated; use `message_ids` |\n\n## Examples\n\n### Example 1: Migrate `attrs` visibility to Odoo 17\n\n```xml\n\u003C!-- v16 — domain-based attrs -->\n\u003Cfield name=\"discount\" attrs=\"{'invisible': [('product_type', '!=', 'service')]}\"\u002F>\n\u003Cfield name=\"discount\" attrs=\"{'required': [('state', '=', 'sale')]}\"\u002F>\n\n\u003C!-- v17 — inline Python expressions -->\n\u003Cfield name=\"discount\" invisible=\"product_type != 'service'\"\u002F>\n\u003Cfield name=\"discount\" required=\"state == 'sale'\"\u002F>\n```\n\n### Example 2: Migrate Chatter block\n\n```xml\n\u003C!-- v16 -->\n\u003Cdiv class=\"oe_chatter\">\n    \u003Cfield name=\"message_follower_ids\"\u002F>\n    \u003Cfield name=\"activity_ids\"\u002F>\n    \u003Cfield name=\"message_ids\"\u002F>\n\u003C\u002Fdiv>\n\n\u003C!-- v17 -->\n\u003Cchatter\u002F>\n```\n\n### Example 3: Migrate website_published flag (v15 → v16)\n\n```python\n# v15\nrecord.website_published = True\n\n# v16+\nrecord.is_published = True\n```\n\n## Best Practices\n\n- ✅ **Do:** Test with `--update=your_module` on each version before pushing to production.\n- ✅ **Do:** Use the official [Odoo Upgrade Guide](https:\u002F\u002Fupgrade.odoo.com\u002F) to get an automated pre-upgrade analysis report.\n- ✅ **Do:** Check OCA migration notes and the module's `HISTORY.rst` for community modules.\n- ✅ **Do:** Run `npm run validate` after migration to catch manifest or frontmatter issues early.\n- ❌ **Don't:** Skip intermediate versions — go v14→v15→v16→v17 sequentially; never jump.\n- ❌ **Don't:** Forget to update `version` in `__manifest__.py` (e.g., `17.0.1.0.0`).\n- ❌ **Don't:** Assume OCA modules are migration-ready; check their GitHub branch for the target version.\n\n## Limitations\n\n- Covers **v14 through v17** only — does not address v13 or older (pre-manifest era has fundamentally different module structure).\n- The **Odoo.sh automated upgrade** path has additional steps not covered here; refer to Odoo.sh documentation.\n- **Enterprise-specific modules** (e.g., `account_accountant`, `sign`) may have undocumented breaking changes; test on a staging environment with Enterprise license.\n- JavaScript OWL component migration (v15 Legacy → v16 OWL) is a complex topic not fully covered by this skill.\n","# Odoo Migration Helper\n\n## Overview\n\nMigrating Odoo modules between major versions requires careful handling of API changes, deprecated methods, renamed fields, and new view syntax. This skill guides you through the migration process systematically, covering the most common breaking changes between versions.\n\n## When to Use This Skill\n\n- Upgrading a custom module from Odoo 14\u002F15\u002F16 to a newer version.\n- Getting a checklist of things to check before running `odoo-upgrade`.\n- Fixing deprecation warnings after a version upgrade.\n- Understanding what changed between two specific Odoo versions.\n\n## How It Works\n\n1. **Activate**: Mention `@odoo-migration-helper`, specify your source and target versions, and paste your module code.\n2. **Analyze**: Receive a list of breaking changes with before\u002Fafter code fixes.\n3. **Validate**: Get a migration checklist specific to your module's features.\n\n## Key Migration Changes by Version\n\n### Odoo 16 → 17\n\n| Topic | Old (v16) | New (v17) |\n|---|---|---|\n| View visibility | `attrs=\"{'invisible': [...]}\"` | `invisible=\"condition\"` |\n| Chatter | `\u003Cdiv class=\"oe_chatter\">` | `\u003Cchatter\u002F>` |\n| Required\u002FReadonly | `attrs=\"{'required': [...]}\"` | `required=\"condition\"` |\n| Python minimum | 3.10 | 3.10+ |\n| JS modules | Legacy `define(['web.core'])` | ES module `import` syntax |\n\n### Odoo 15 → 16\n\n| Topic | Old (v15) | New (v16) |\n|---|---|---|\n| Website published flag | `website_published = True` | `is_published = True` |\n| Mail aliases | `alias_domain` on company | Moved to `mail.alias.domain` model |\n| Report render | `_render_qweb_pdf()` | `_render_qweb_pdf()` (same, but signature changed) |\n| Accounting move | `account.move.line` grouping | Line aggregation rules updated |\n| Email threading | `mail_thread_id` | Deprecated; use `message_ids` |\n\n## Examples\n\n### Example 1: Migrate `attrs` visibility to Odoo 17\n\n```xml\n\u003C!-- v16 — domain-based attrs -->\n\u003Cfield name=\"discount\" attrs=\"{'invisible': [('product_type', '!=', 'service')]}\"\u002F>\n\u003Cfield name=\"discount\" attrs=\"{'required': [('state', '=', 'sale')]}\"\u002F>\n\n\u003C!-- v17 — inline Python expressions -->\n\u003Cfield name=\"discount\" invisible=\"product_type != 'service'\"\u002F>\n\u003Cfield name=\"discount\" required=\"state == 'sale'\"\u002F>\n```\n\n### Example 2: Migrate Chatter block\n\n```xml\n\u003C!-- v16 -->\n\u003Cdiv class=\"oe_chatter\">\n    \u003Cfield name=\"message_follower_ids\"\u002F>\n    \u003Cfield name=\"activity_ids\"\u002F>\n    \u003Cfield name=\"message_ids\"\u002F>\n\u003C\u002Fdiv>\n\n\u003C!-- v17 -->\n\u003Cchatter\u002F>\n```\n\n### Example 3: Migrate website_published flag (v15 → v16)\n\n```python\n# v15\nrecord.website_published = True\n\n# v16+\nrecord.is_published = True\n```\n\n## Best Practices\n\n- ✅ **Do:** Test with `--update=your_module` on each version before pushing to production.\n- ✅ **Do:** Use the official [Odoo Upgrade Guide](https:\u002F\u002Fupgrade.odoo.com\u002F) to get an automated pre-upgrade analysis report.\n- ✅ **Do:** Check OCA migration notes and the module's `HISTORY.rst` for community modules.\n- ✅ **Do:** Run `npm run validate` after migration to catch manifest or frontmatter issues early.\n- ❌ **Don't:** Skip intermediate versions — go v14→v15→v16→v17 sequentially; never jump.\n- ❌ **Don't:** Forget to update `version` in `__manifest__.py` (e.g., `17.0.1.0.0`).\n- ❌ **Don't:** Assume OCA modules are migration-ready; check their GitHub branch for the target version.\n\n## Limitations\n\n- Covers **v14 through v17** only — does not address v13 or older (pre-manifest era has fundamentally different module structure).\n- The **Odoo.sh automated upgrade** path has additional steps not covered here; refer to Odoo.sh documentation.\n- **Enterprise-specific modules** (e.g., `account_accountant`, `sign`) may have undocumented breaking changes; test on a staging environment with Enterprise license.\n- JavaScript OWL component migration (v15 Legacy → v16 OWL) is a complex topic not fully covered by this skill.\n",{"name":5,"risk":26,"source":29,"description":7},"main","7a38d8e7073e61c16eda85681cb32fb68a8657a5","skills-store\u002Fcopilot\u002Fodoo-migration-helper","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router","https:\u002F\u002Fgithub.com\u002Fsapsapshen","2026-04-14 21:12:12",{"source":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add sapsapshen\u002Fai-memory-router --skill odoo-migration-helper",{"tool":53,"command":54},"bunx","bunx skills add sapsapshen\u002Fai-memory-router --skill odoo-migration-helper",{"tool":56,"command":57},"pnpm","pnpm dlx skills add sapsapshen\u002Fai-memory-router --skill odoo-migration-helper","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fcopilot\u002Fodoo-migration-helper\u002FSKILL.md",true,[],[62,86,111,121,134,153],{"skillNo":63,"name":64,"nameZh":6,"description":65,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":73,"publishedAt":36},"01M71ATQRKG48SH06FQ697T5G9","wechat-search","Search WeChat Official Account articles using OpenClaw's web search and fetch capabilities with compliance-focused design.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fwechat-search-release\u002FSKILL.md",[68],{"categoryNo":69,"categoryName":70,"taxonomyType":71,"taxonomyTypeDesc":72},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[74,75,76,77,78,79,80,81,82,83,84,85],"wechat search","wechat","search","capabilities","openclaw","design","web search","compliance","web","official","fetch","with",{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":92,"publishedAt":36},"01M71ATNAVGZB35PFYM2GC5N00","trend-tap","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend tap', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-tap\u002FSKILL.md",[],[93,94,95,96,97,98,76,99,100,101,102,103,104,105,106,107,108,109,110,30],"trend","trend tap","tap","api keys","Bash","time","trending","hacker","aggregator","do","when","brew","live","data","google","install","read","across",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":117,"publishedAt":36},"01M71ATJ9AM5KM15AA8PS302EB","trend-radar","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend pulse', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-radar\u002FSKILL.md",[],[118,119,93,104,105,106,107,97,76,109,120,110,30,103,101,100,99,108,98,96],"trend radar","radar","pulse",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":127,"publishedAt":36},"01M71ATGF095N3EJM9G8SD0BB5","tech-news-daily","每日科技新闻汇——从全球多个 RSS 源抓取最新科技新闻，翻译（英→中）、去重、排版成每日简报。当用户询问科技新闻、科技新鲜事、每日科技、技术动态、Daily Tech News 或类似表达时触发此技能。","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftech-news-daily\u002FSKILL.md",[],[128,129,130,131,132,133],"news","tech","tech news daily","daily","rss","翻译",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":145,"publishedAt":36},"01M71ATFAEAMQ17M70NQNY7SR8","summarize","Summarize URLs or files with the summarize CLI (web, PDFs, images, audio, YouTube).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsummarize\u002FSKILL.md",[140],{"categoryNo":141,"categoryName":142,"taxonomyType":143,"taxonomyTypeDesc":144},"01JBSEEDCAT000000000000021","资料检索与研究","SCENARIO","使用场景",[136,82,146,147,148,85,104,149,150,151,95,152,108],"Audio","cli","youtube","images","https","files","pdfs",{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":159,"publishedAt":36},"01M71ATDNS3R0M4H936PACQAWZ","sonoscli","Control Sonos speakers (discover\u002Fstatus\u002Fplay\u002Fvolume\u002Fgroup).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsonoscli\u002FSKILL.md",[],[155,160,161,162,108,163,150,164,165,166,167,168],"status","play","go","latest","github","discover","control","cmd","volume"]