[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6BZJEDWPVRJFFF42F7Y42GS":3,"skill-same:01M6BZJEDWPVRJFFF42F7Y42GS":51},{"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":24,"linkOnly":25,"markdownContent":26,"markdownBody":27,"frontMatter":28,"refName":29,"commitSha":30,"skillDirectory":31,"forksCount":32,"repositoryHtmlUrl":33,"repositoryHomepageUrl":34,"ownerHtmlUrl":35,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":36,"install":37,"resources":50},"01M6BZJEDWPVRJFFF42F7Y42GS","coding.make_function_private",null,"Identify private or public functions in a file and rename with underscore","causify-ai\u002Fhelpers","causify-ai","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F121828442?v=4","01M6BZFTHW2MQR7FWK8CDW0DRA","Causify.AI","01M6BZFTPJ193AB5N089Z82HQG",155,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Fcoding.make_function_private\u002FSKILL.md",[],[19,20,21,22,23],"coding","coding make function private","file","haiku","public","2026-11-10 10:12:30",false,"---\ndescription: Identify private or public functions in a file and rename with underscore\nmodel: haiku\n---\n\n# Goal\nFor each function `\u003CFUNC>` in the passed Python file `\u003CFILE>`, determine if it\nshould be private or public by checking if it's called by Python files or\nJupyter notebooks outside `\u003CFILE>`.\n\n# Conventions\n- Follow `## Mark Private Functions` in `.claude\u002Fskills\u002Fcoding.rules.md`\n\n# Definitions\n\n## External Files\n- **External files** = any Python file or Jupyter notebook outside the target\n  file\n  - Including:\n    - Sibling scripts in the same package (e.g., `notes_to_pdf.py` calling functions\n      from `lib_notes_to_pdf.py`)\n    - Parent\u002Fsibling modules that import from the target\n    - CLI entry point scripts\n  - Excluding\n    - Test files that test the target module, since a function is private even if\n      it's called by a test files\n\n- **Note:** Functions that form the public API of a library module should be\n  PUBLIC, even if they're not called from a `__main__` entry point. If a module\n  exports utility functions for use by other scripts in the package, those are\n  PUBLIC functions\n\n# Private Functions\n- If the function `\u003CFUNC>` is not called by any external file, then it should be\n  a private function and should be renamed and prepended with a `_`\n  - E.g., `def function` -> `def _function`\n  - Include only internal utility functions, helpers, and implementation details\n- Modify all the callers of the function `\u003CFUNC>` to use the new name\n\n- **Good** (function only called within its own file, so it is renamed private)\n  ```python\n  # lib_helper.py\n  def public_function():\n      _internal_helper()  # Only called within this file, so private.\n\n  def _internal_helper():\n      pass\n  ```\n\n# Public Functions\n- If the function `\u003CFUNC>` is called by external files, then it should be a\n  public function and its name must not start with `_`\n  - This includes functions in shared utility modules called by sibling scripts\n- Modify all callers (both external and internal) of the function to use the new\n  name\n\n- **Good** (function called by an external file, so it stays public)\n  ```python\n  # lib_notes_to_pdf.py\n  def preprocess_notes(file_name, prefix):  # Called by notes_to_pdf.py, so public.\n      _internal_step_1(file_name)  # Private helper.\n\n  def _internal_step_1(file_name):  # Only used within lib_notes_to_pdf.py, so private.\n      pass\n  ```\n\n# Workflow\n\n## Find All Functions\n- Find all functions in `\u003CFILE>`\n\n## Search for External Calls\n- For each function, search the entire codebase for external calls:\n  ```bash\n  grep -r \"\u003CFUNC>\" --include=\"*.py\" --include=\"*.ipynb\" --exclude=\"test_*.py\"\n  ```\n\n## Classify and Rename\n- Classify each function as public or private based on external usage\n- Rename functions and update all call sites (both files)\n- Verify the changes\n\n# Verification\n- [ ] Grep in the entire codebase to confirm all function calls were renamed\n      correctly\n      ```bash\n      grep -r \"old_name\\|new_name\" --include=\"*.py\" --include=\"*.ipynb\"\n      ```\n- [ ] Run pyright to verify type correctness of modified function invocations\n- [ ] Run unit tests for the modified files to ensure nothing broke\n","# Goal\nFor each function `\u003CFUNC>` in the passed Python file `\u003CFILE>`, determine if it\nshould be private or public by checking if it's called by Python files or\nJupyter notebooks outside `\u003CFILE>`.\n\n# Conventions\n- Follow `## Mark Private Functions` in `.claude\u002Fskills\u002Fcoding.rules.md`\n\n# Definitions\n\n## External Files\n- **External files** = any Python file or Jupyter notebook outside the target\n  file\n  - Including:\n    - Sibling scripts in the same package (e.g., `notes_to_pdf.py` calling functions\n      from `lib_notes_to_pdf.py`)\n    - Parent\u002Fsibling modules that import from the target\n    - CLI entry point scripts\n  - Excluding\n    - Test files that test the target module, since a function is private even if\n      it's called by a test files\n\n- **Note:** Functions that form the public API of a library module should be\n  PUBLIC, even if they're not called from a `__main__` entry point. If a module\n  exports utility functions for use by other scripts in the package, those are\n  PUBLIC functions\n\n# Private Functions\n- If the function `\u003CFUNC>` is not called by any external file, then it should be\n  a private function and should be renamed and prepended with a `_`\n  - E.g., `def function` -> `def _function`\n  - Include only internal utility functions, helpers, and implementation details\n- Modify all the callers of the function `\u003CFUNC>` to use the new name\n\n- **Good** (function only called within its own file, so it is renamed private)\n  ```python\n  # lib_helper.py\n  def public_function():\n      _internal_helper()  # Only called within this file, so private.\n\n  def _internal_helper():\n      pass\n  ```\n\n# Public Functions\n- If the function `\u003CFUNC>` is called by external files, then it should be a\n  public function and its name must not start with `_`\n  - This includes functions in shared utility modules called by sibling scripts\n- Modify all callers (both external and internal) of the function to use the new\n  name\n\n- **Good** (function called by an external file, so it stays public)\n  ```python\n  # lib_notes_to_pdf.py\n  def preprocess_notes(file_name, prefix):  # Called by notes_to_pdf.py, so public.\n      _internal_step_1(file_name)  # Private helper.\n\n  def _internal_step_1(file_name):  # Only used within lib_notes_to_pdf.py, so private.\n      pass\n  ```\n\n# Workflow\n\n## Find All Functions\n- Find all functions in `\u003CFILE>`\n\n## Search for External Calls\n- For each function, search the entire codebase for external calls:\n  ```bash\n  grep -r \"\u003CFUNC>\" --include=\"*.py\" --include=\"*.ipynb\" --exclude=\"test_*.py\"\n  ```\n\n## Classify and Rename\n- Classify each function as public or private based on external usage\n- Rename functions and update all call sites (both files)\n- Verify the changes\n\n# Verification\n- [ ] Grep in the entire codebase to confirm all function calls were renamed\n      correctly\n      ```bash\n      grep -r \"old_name\\|new_name\" --include=\"*.py\" --include=\"*.ipynb\"\n      ```\n- [ ] Run pyright to verify type correctness of modified function invocations\n- [ ] Run unit tests for the modified files to ensure nothing broke\n",{"model":22,"description":7},"master","39143a859859181eff7e774457997b5278fd9e99",".claude\u002Fskills\u002Fcoding.make_function_private",170,"https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers","https:\u002F\u002Fcausify.ai","https:\u002F\u002Fgithub.com\u002Fcausify-ai","2026-11-02 02:09:15",{"source":8,"skillName":5,"commands":38,"prompt":48,"zipAvailable":49},[39,42,45],{"tool":40,"command":41},"npx","npx skills add causify-ai\u002Fhelpers --skill coding.make_function_private",{"tool":43,"command":44},"bunx","bunx skills add causify-ai\u002Fhelpers --skill coding.make_function_private",{"tool":46,"command":47},"pnpm","pnpm dlx skills add causify-ai\u002Fhelpers --skill coding.make_function_private","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Fcoding.make_function_private\u002FSKILL.md",true,[],[52,70,86,97,106,115],{"skillNo":53,"name":54,"nameZh":6,"description":55,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":56,"categories":57,"keywords":63,"publishedAt":24},"01M6C9ZMM0XSXCHHABMJ9XB1JB","tutorial_in_60_mins.propagate_docker_changes","Sync tutorial and class-project Docker files to match project_template","https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Ftutorial_in_60_mins.propagate_docker_changes\u002FSKILL.md",[58],{"categoryNo":59,"categoryName":60,"taxonomyType":61,"taxonomyTypeDesc":62},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",[64,65,66,67,22,68,69],"tutorial in 60 mins propagate docker changes","tutorial","docker","files","template","sync",{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":79,"publishedAt":24},"01M6C9ZJK8QJ9FNCY39WVF3GMG","tutorial_in_60_mins.merge_markdown","Merge the content of a markdown file into a Jupyter notebook","https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Ftutorial_in_60_mins.merge_markdown\u002FSKILL.md",[76],{"categoryNo":77,"categoryName":78,"taxonomyType":61,"taxonomyTypeDesc":62},"01JBSEEDCAT000000000000002","文档处理",[80,81,65,82,83,22,21,84,85],"merge","tutorial in 60 mins merge markdown","markdown","jupyter","content","jupyter notebook",{"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":24},"01M6C9ZFYK13ZCT1E8BEEC4NG4","tutorial_in_60_mins.format","Format a directory to follow the \"Learn X in 60 Minutes\" tutorial conventions","https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Ftutorial_in_60_mins.format\u002FSKILL.md",[],[93,65,94,95,96,22],"tutorial in 60 mins format","format","directory","learn",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":103,"publishedAt":24},"01M6C9ZDKXSBKNKX7M3X4W38G5","tutorial_in_60_mins.create","Create a tutorial directory for the Learn X in 60 Minutes conventions","https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Ftutorial_in_60_mins.create\u002FSKILL.md",[],[104,65,105,95,96],"tutorial in 60 mins create","create",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":112,"publishedAt":24},"01M6BZS5Z0QE03WRS1TM3XJEY9","todo.reorg_in_progress","Reorganize ai_task_queue.md so in-progress tasks, not-started tasks, and mislabeled topic headers sit under the right H1 stage","https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Ftodo.reorg_in_progress\u002FSKILL.md",[],[113,114],"todo reorg in progress","tasks",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":24},"01M6BZS4CQZ6KK2KQ26SVB7QCS","todo.reorg_headers","Reorganize ai_task_queue.md .md so every H2 topic matches ALL TOPICS and every H3 task sits under the right topic, keeping its H1 stage","https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Ftodo.reorg_headers\u002FSKILL.md",[],[122],"todo reorg headers"]