harveyz-skill 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/bin/cli.js +20 -9
  3. package/bin/preview.mjs +1 -1
  4. package/lib/bundles.js +3 -3
  5. package/lib/installer.js +18 -3
  6. package/lib/targets.js +12 -2
  7. package/package.json +23 -21
  8. package/skills/creative/add-todo/SKILL.md +172 -0
  9. package/skills/{writing/capture-insight → creative/insight}/SKILL.md +1 -1
  10. package/skills/design/brand-scout/SKILL.md +387 -0
  11. package/skills/design/brand-scout/references/TEMPLATE.md +418 -0
  12. package/skills/design/style-build/SKILL.md +452 -0
  13. package/skills/design/style-build/references/FORMAT-MAPPING.md +231 -0
  14. package/skills/meta/npm-release/SKILL.md +15 -3
  15. package/skills/meta/opencode-runner/SKILL.md +117 -0
  16. package/skills/{data-extraction → research}/article-fetcher/references/__pycache__/article_utils.cpython-314.pyc +0 -0
  17. package/skills/{data-extraction → research}/url-extract/SKILL.md +1 -1
  18. package/skills/research/url-extract/references/__pycache__/article_utils.cpython-314.pyc +0 -0
  19. package/skills/{data-extraction → research}/url-extract/references/article_utils.py +79 -13
  20. package/skills/{data-extraction → research}/url-extract/scripts/playwright_xcom.py +30 -6
  21. package/skills/research/youtube-learner/SKILL.md +196 -0
  22. package/skills/writing/{mermaid-diagram → diagram}/SKILL.md +68 -24
  23. package/skills/writing/diagram/tests/bain-style-test.md +177 -0
  24. package/skills/writing/diagram/themes/bain.json +111 -0
  25. package/skills/writing/diagram/themes/bcg.json +112 -0
  26. package/skills/writing/diagram/themes/rb.json +46 -0
  27. package/skills/writing/diagram/themes/rolandberger.json +189 -0
  28. package/skills/writing/doc-forge/SKILL.md +208 -0
  29. package/skills/writing/doc-forge/assets/bain-style.json +86 -0
  30. package/skills/writing/doc-forge/assets/bain.css +134 -0
  31. package/skills/writing/doc-forge/assets/bcg-style.json +86 -0
  32. package/skills/writing/doc-forge/assets/bcg.css +219 -0
  33. package/skills/writing/doc-forge/assets/rolandberger-style.json +84 -0
  34. package/skills/writing/doc-forge/assets/rolandberger.css +149 -0
  35. package/skills/writing/doc-forge/assets/template.html +19 -0
  36. package/skills/writing/doc-forge/assets/thesis-style.json +60 -0
  37. package/skills/writing/doc-forge/assets/thesis.css +222 -0
  38. package/skills/writing/doc-forge/preview/style-preview.html +627 -0
  39. package/skills/writing/doc-forge/scripts/__pycache__/md_to_pdf.cpython-314.pyc +0 -0
  40. package/skills/writing/doc-forge/scripts/generate_style_preview.py +345 -0
  41. package/skills/writing/doc-forge/scripts/md_to_docx.py +606 -0
  42. package/skills/writing/doc-forge/scripts/md_to_pdf.py +145 -0
  43. package/skills/writing/doc-forge/tests/__pycache__/test_md_to_pdf.cpython-314-pytest-9.0.2.pyc +0 -0
  44. package/skills/writing/doc-forge/tests/fixtures/full-test-bain.docx +0 -0
  45. package/skills/writing/doc-forge/tests/fixtures/full-test-bain.pdf +0 -0
  46. package/skills/writing/doc-forge/tests/fixtures/full-test-bcg.docx +0 -0
  47. package/skills/writing/doc-forge/tests/fixtures/full-test-bcg.pdf +0 -0
  48. package/skills/writing/doc-forge/tests/fixtures/full-test-custom.docx +0 -0
  49. package/skills/writing/doc-forge/tests/fixtures/full-test-custom.pdf +0 -0
  50. package/skills/writing/doc-forge/tests/fixtures/full-test-rb.docx +0 -0
  51. package/skills/writing/doc-forge/tests/fixtures/full-test-rb.pdf +0 -0
  52. package/skills/writing/doc-forge/tests/fixtures/full-test-thesis.docx +0 -0
  53. package/skills/writing/doc-forge/tests/fixtures/full-test-thesis.pdf +0 -0
  54. package/skills/writing/doc-forge/tests/fixtures/full-test.md +307 -0
  55. package/skills/writing/doc-forge/tests/fixtures/sample.png +0 -0
  56. package/skills/writing/doc-forge/tests/test_md_to_pdf.py +76 -0
  57. package/skills-index.json +41 -36
  58. package/tools/hub/hub/__init__.py +0 -0
  59. package/tools/hub/hub/__main__.py +24 -0
  60. package/tools/hub/hub/__pycache__/__init__.cpython-314.pyc +0 -0
  61. package/tools/hub/hub/__pycache__/__main__.cpython-314.pyc +0 -0
  62. package/tools/hub/hub/cli/__init__.py +14 -0
  63. package/tools/hub/hub/cli/__pycache__/__init__.cpython-314.pyc +0 -0
  64. package/tools/hub/hub/cli/__pycache__/projects.cpython-314.pyc +0 -0
  65. package/tools/hub/hub/cli/__pycache__/tasks.cpython-314.pyc +0 -0
  66. package/tools/hub/hub/cli/projects.py +100 -0
  67. package/tools/hub/hub/cli/tasks.py +114 -0
  68. package/tools/hub/hub/core/__init__.py +0 -0
  69. package/tools/hub/hub/core/__pycache__/__init__.cpython-314.pyc +0 -0
  70. package/tools/hub/hub/core/__pycache__/db.cpython-314.pyc +0 -0
  71. package/tools/hub/hub/core/__pycache__/migrate.cpython-314.pyc +0 -0
  72. package/tools/hub/hub/core/__pycache__/projects.cpython-314.pyc +0 -0
  73. package/tools/hub/hub/core/__pycache__/tasks.cpython-314.pyc +0 -0
  74. package/tools/hub/hub/core/db.py +46 -0
  75. package/tools/hub/hub/core/migrate.py +49 -0
  76. package/tools/hub/hub/core/projects.py +65 -0
  77. package/tools/hub/hub/core/tasks.py +86 -0
  78. package/tools/hub/hub/tui/__init__.py +0 -0
  79. package/tools/hub/hub/tui/__pycache__/__init__.cpython-314.pyc +0 -0
  80. package/tools/hub/hub/tui/__pycache__/app.cpython-314.pyc +0 -0
  81. package/tools/hub/hub/tui/__pycache__/git.cpython-314.pyc +0 -0
  82. package/tools/hub/hub/tui/app.py +78 -0
  83. package/tools/hub/hub/tui/git.py +300 -0
  84. package/tools/hub/hub/tui/panels/__init__.py +0 -0
  85. package/tools/hub/hub/tui/panels/__pycache__/__init__.cpython-314.pyc +0 -0
  86. package/tools/hub/hub/tui/panels/__pycache__/git.cpython-314.pyc +0 -0
  87. package/tools/hub/hub/tui/panels/__pycache__/projects.cpython-314.pyc +0 -0
  88. package/tools/hub/hub/tui/panels/__pycache__/tasks.cpython-314.pyc +0 -0
  89. package/tools/hub/hub/tui/panels/git.py +118 -0
  90. package/tools/hub/hub/tui/panels/projects.py +58 -0
  91. package/tools/hub/hub/tui/panels/tasks.py +139 -0
  92. package/tools/hub/pyproject.toml +25 -0
  93. package/tools/hub/tests/__init__.py +0 -0
  94. package/tools/hub/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  95. package/tools/hub/tests/__pycache__/test_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  96. package/tools/hub/tests/__pycache__/test_db.cpython-314-pytest-9.0.2.pyc +0 -0
  97. package/tools/hub/tests/__pycache__/test_migrate.cpython-314-pytest-9.0.2.pyc +0 -0
  98. package/tools/hub/tests/__pycache__/test_projects.cpython-314-pytest-9.0.2.pyc +0 -0
  99. package/tools/hub/tests/__pycache__/test_tasks.cpython-314-pytest-9.0.2.pyc +0 -0
  100. package/tools/hub/tests/__pycache__/test_tui_app.cpython-314-pytest-9.0.2.pyc +0 -0
  101. package/tools/hub/tests/__pycache__/test_tui_git.cpython-314-pytest-9.0.2.pyc +0 -0
  102. package/tools/hub/tests/__pycache__/test_tui_git_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  103. package/tools/hub/tests/__pycache__/test_tui_projects_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  104. package/tools/hub/tests/__pycache__/test_tui_tasks_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  105. package/tools/hub/tests/test_cli.py +93 -0
  106. package/tools/hub/tests/test_db.py +35 -0
  107. package/tools/hub/tests/test_migrate.py +102 -0
  108. package/tools/hub/tests/test_projects.py +50 -0
  109. package/tools/hub/tests/test_tasks.py +74 -0
  110. package/tools/hub/tests/test_tui_app.py +66 -0
  111. package/tools/hub/tests/test_tui_git.py +58 -0
  112. package/tools/hub/tests/test_tui_git_panel.py +56 -0
  113. package/tools/hub/tests/test_tui_projects_panel.py +63 -0
  114. package/tools/hub/tests/test_tui_tasks_panel.py +136 -0
  115. package/tools/hub/tool.json +8 -0
  116. package/tools/p-launch/__pycache__/p_launch.cpython-314.pyc +0 -0
  117. package/tools/p-launch/p-launch.sh +3 -3
  118. package/tools/p-launch/p_launch.py +126 -3
  119. package/tools/p-launch/tests/__pycache__/test_p_launch.cpython-314-pytest-9.0.2.pyc +0 -0
  120. package/tools/p-launch/tests/__pycache__/test_p_launch.cpython-314-pytest-9.1.0.pyc +0 -0
  121. package/tools/p-launch/tests/test_p_launch.py +139 -0
  122. package/tools/p-launch/tool.json +1 -1
  123. package/tools/todo-tool/frontend/README.md +73 -0
  124. package/tools/todo-tool/frontend/components.json +25 -0
  125. package/tools/todo-tool/frontend/eslint.config.js +22 -0
  126. package/tools/todo-tool/frontend/index.html +13 -0
  127. package/tools/todo-tool/frontend/package-lock.json +6566 -0
  128. package/tools/todo-tool/frontend/package.json +42 -0
  129. package/tools/todo-tool/frontend/postcss.config.js +6 -0
  130. package/tools/todo-tool/frontend/public/favicon.svg +1 -0
  131. package/tools/todo-tool/frontend/public/icons.svg +24 -0
  132. package/tools/todo-tool/frontend/src/App.css +184 -0
  133. package/tools/todo-tool/frontend/src/App.tsx +78 -0
  134. package/tools/todo-tool/frontend/src/assets/hero.png +0 -0
  135. package/tools/todo-tool/frontend/src/assets/react.svg +1 -0
  136. package/tools/todo-tool/frontend/src/assets/vite.svg +1 -0
  137. package/tools/todo-tool/frontend/src/components/AddTaskDialog.tsx +92 -0
  138. package/tools/todo-tool/frontend/src/components/FilterBar.tsx +74 -0
  139. package/tools/todo-tool/frontend/src/components/TaskList.tsx +35 -0
  140. package/tools/todo-tool/frontend/src/components/TaskRow.tsx +44 -0
  141. package/tools/todo-tool/frontend/src/components/ui/badge.tsx +52 -0
  142. package/tools/todo-tool/frontend/src/components/ui/button.tsx +58 -0
  143. package/tools/todo-tool/frontend/src/components/ui/dialog.tsx +159 -0
  144. package/tools/todo-tool/frontend/src/components/ui/input.tsx +20 -0
  145. package/tools/todo-tool/frontend/src/components/ui/select.tsx +197 -0
  146. package/tools/todo-tool/frontend/src/index.css +90 -0
  147. package/tools/todo-tool/frontend/src/lib/api.ts +42 -0
  148. package/tools/todo-tool/frontend/src/lib/utils.ts +6 -0
  149. package/tools/todo-tool/frontend/src/main.tsx +10 -0
  150. package/tools/todo-tool/frontend/tailwind.config.js +66 -0
  151. package/tools/todo-tool/frontend/tsconfig.app.json +32 -0
  152. package/tools/todo-tool/frontend/tsconfig.json +7 -0
  153. package/tools/todo-tool/frontend/tsconfig.node.json +24 -0
  154. package/tools/todo-tool/frontend/vite.config.ts +17 -0
  155. package/tools/todo-tool/pyproject.toml +31 -0
  156. package/tools/todo-tool/tests/__init__.py +0 -0
  157. package/tools/todo-tool/tests/__pycache__/__init__.cpython-311.pyc +0 -0
  158. package/tools/todo-tool/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  159. package/tools/todo-tool/tests/__pycache__/test_api.cpython-311-pytest-9.0.2.pyc +0 -0
  160. package/tools/todo-tool/tests/__pycache__/test_api.cpython-311-pytest-9.0.3.pyc +0 -0
  161. package/tools/todo-tool/tests/__pycache__/test_api.cpython-314-pytest-9.0.2.pyc +0 -0
  162. package/tools/todo-tool/tests/__pycache__/test_cli.cpython-311-pytest-9.0.2.pyc +0 -0
  163. package/tools/todo-tool/tests/__pycache__/test_cli.cpython-311-pytest-9.0.3.pyc +0 -0
  164. package/tools/todo-tool/tests/__pycache__/test_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  165. package/tools/todo-tool/tests/__pycache__/test_cli.cpython-314.pyc +0 -0
  166. package/tools/todo-tool/tests/__pycache__/test_db.cpython-311-pytest-9.0.2.pyc +0 -0
  167. package/tools/todo-tool/tests/__pycache__/test_db.cpython-311-pytest-9.0.3.pyc +0 -0
  168. package/tools/todo-tool/tests/__pycache__/test_db.cpython-314-pytest-9.0.2.pyc +0 -0
  169. package/tools/todo-tool/tests/__pycache__/test_models.cpython-311-pytest-9.0.2.pyc +0 -0
  170. package/tools/todo-tool/tests/__pycache__/test_models.cpython-311-pytest-9.0.3.pyc +0 -0
  171. package/tools/todo-tool/tests/__pycache__/test_models.cpython-314-pytest-9.0.2.pyc +0 -0
  172. package/tools/todo-tool/tests/__pycache__/test_parser.cpython-311-pytest-9.0.3.pyc +0 -0
  173. package/tools/todo-tool/tests/__pycache__/test_parser.cpython-314-pytest-9.0.2.pyc +0 -0
  174. package/tools/todo-tool/tests/__pycache__/test_projects_index.cpython-311-pytest-9.0.3.pyc +0 -0
  175. package/tools/todo-tool/tests/__pycache__/test_sync.cpython-311-pytest-9.0.3.pyc +0 -0
  176. package/tools/todo-tool/tests/__pycache__/test_sync.cpython-314-pytest-9.0.2.pyc +0 -0
  177. package/tools/todo-tool/tests/test_api.py +229 -0
  178. package/tools/todo-tool/tests/test_cli.py +214 -0
  179. package/tools/todo-tool/tests/test_db.py +214 -0
  180. package/tools/todo-tool/tests/test_models.py +24 -0
  181. package/tools/todo-tool/tests/test_parser.py +120 -0
  182. package/tools/todo-tool/tests/test_projects_index.py +185 -0
  183. package/tools/todo-tool/tests/test_sync.py +101 -0
  184. package/tools/todo-tool/todo/__init__.py +0 -0
  185. package/tools/todo-tool/todo/__pycache__/__init__.cpython-311.pyc +0 -0
  186. package/tools/todo-tool/todo/__pycache__/__init__.cpython-314.pyc +0 -0
  187. package/tools/todo-tool/todo/__pycache__/cli.cpython-311.pyc +0 -0
  188. package/tools/todo-tool/todo/__pycache__/cli.cpython-314.pyc +0 -0
  189. package/tools/todo-tool/todo/__pycache__/db.cpython-311.pyc +0 -0
  190. package/tools/todo-tool/todo/__pycache__/db.cpython-314.pyc +0 -0
  191. package/tools/todo-tool/todo/__pycache__/models.cpython-311.pyc +0 -0
  192. package/tools/todo-tool/todo/__pycache__/models.cpython-314.pyc +0 -0
  193. package/tools/todo-tool/todo/__pycache__/parser.cpython-311.pyc +0 -0
  194. package/tools/todo-tool/todo/__pycache__/parser.cpython-314.pyc +0 -0
  195. package/tools/todo-tool/todo/__pycache__/projects_index.cpython-311.pyc +0 -0
  196. package/tools/todo-tool/todo/__pycache__/projects_index.cpython-314.pyc +0 -0
  197. package/tools/todo-tool/todo/__pycache__/server.cpython-311.pyc +0 -0
  198. package/tools/todo-tool/todo/__pycache__/server.cpython-314.pyc +0 -0
  199. package/tools/todo-tool/todo/cli.py +208 -0
  200. package/tools/todo-tool/todo/db.py +289 -0
  201. package/tools/todo-tool/todo/models.py +41 -0
  202. package/tools/todo-tool/todo/parser.py +122 -0
  203. package/tools/todo-tool/todo/projects_index.py +152 -0
  204. package/tools/todo-tool/todo/server.py +98 -0
  205. package/tools/todo-tool/todo/todo_format.yaml +29 -0
  206. package/tools/todo-tool/todo-tool.sh +23 -0
  207. package/tools/todo-tool/tool.json +12 -0
  208. package/tools/todo-tool/zshrc.snippet +4 -0
  209. package/skills/data-extraction/url-extract/references/__pycache__/article_utils.cpython-314.pyc +0 -0
  210. package/skills/superpowers-fork/brainstorming/SKILL.md +0 -148
  211. package/skills/superpowers-fork/executing-plans/SKILL.md +0 -104
  212. package/skills/superpowers-fork/systematic-debugging/SKILL.md +0 -217
  213. package/skills/superpowers-fork/using-git-worktrees/SKILL.md +0 -192
  214. package/skills/superpowers-fork/writing-plans/SKILL.md +0 -187
  215. package/skills/workflow/add-todo/SKILL.md +0 -205
  216. /package/skills/{harness → coding}/full-stack-debug-env/SKILL.md +0 -0
  217. /package/skills/{harness → coding}/full-stack-debug-env/evals/evals.json +0 -0
  218. /package/skills/{harness → coding}/full-stack-debug-env/references/README.md +0 -0
  219. /package/skills/{harness → coding}/full-stack-debug-env/references/tech-stacks/browser-spa.md +0 -0
  220. /package/skills/{harness → coding}/full-stack-debug-env/references/tech-stacks/docker-compose.md +0 -0
  221. /package/skills/{harness → coding}/full-stack-debug-env/references/tech-stacks/electron.md +0 -0
  222. /package/skills/{harness → coding}/full-stack-debug-env/references/tech-stacks/node-process.md +0 -0
  223. /package/skills/{harness → coding}/git-workflow-init/SKILL.md +0 -0
  224. /package/skills/{harness → coding}/git-workflow-init/references/acceptance-test.md +0 -0
  225. /package/skills/{harness → coding}/git-workflow-init/references/conflict-analysis.md +0 -0
  226. /package/skills/{harness → coding}/git-workflow-init/references/git-workflow-template.md +0 -0
  227. /package/skills/{harness → coding}/git-workflow-init/references/hook-templates.md +0 -0
  228. /package/skills/{harness → coding}/git-workflow-init/references/lock-file-format.md +0 -0
  229. /package/skills/{harness → coding}/git-workflow-init/references/render_docs.py +0 -0
  230. /package/skills/{harness → coding}/git-workflow-init/references/workflow-config.yml +0 -0
  231. /package/skills/{task → coding}/pm-task-dispatch/SKILL.md +0 -0
  232. /package/skills/{task → coding}/pm-task-dispatch/references/agent-mapping.md +0 -0
  233. /package/skills/{task → coding}/pm-task-dispatch/references/task-template.md +0 -0
  234. /package/skills/{task → coding}/task-close/SKILL.md +0 -0
  235. /package/skills/{task → coding}/task-close/references/output-templates.md +0 -0
  236. /package/skills/{analysis → meta}/git-cleanup/SKILL.md +0 -0
  237. /package/skills/{analysis → meta}/skill-analyzer/CHANGELOG.md +0 -0
  238. /package/skills/{analysis → meta}/skill-analyzer/SKILL.md +0 -0
  239. /package/skills/{analysis → meta}/skill-analyzer/references/evaluation-template.md +0 -0
  240. /package/skills/{analysis → meta}/skill-analyzer/references/output-template.md +0 -0
  241. /package/skills/{analysis → meta}/skill-analyzer/references/prohibitions.md +0 -0
  242. /package/skills/{data-extraction → research}/article-fetcher/SKILL.md +0 -0
  243. /package/skills/{data-extraction → research}/article-fetcher/references/article_utils.py +0 -0
  244. /package/skills/{data-extraction → research}/article-fetcher/references/file-format.md +0 -0
  245. /package/skills/{data-extraction → research}/article-fetcher/scripts/import_reading.py +0 -0
  246. /package/skills/{data-extraction → research}/article-fetcher/scripts/init_db.py +0 -0
  247. /package/skills/{data-extraction → research}/article-fetcher/scripts/playwright_web.py +0 -0
  248. /package/skills/{data-extraction → research}/article-fetcher/scripts/playwright_xcom.py +0 -0
  249. /package/skills/{data-extraction → research}/article-fetcher/scripts/url-index.db +0 -0
  250. /package/skills/{data-extraction → research}/article-fetcher/scripts/url-index.db.bak +0 -0
  251. /package/skills/{data-extraction → research}/article-fetcher/scripts/validate_article.py +0 -0
  252. /package/skills/{data-extraction → research}/article-fetcher/tests/test_security.py +0 -0
  253. /package/skills/{data-extraction → research}/article-fetcher/vars.json +0 -0
  254. /package/skills/{data-extraction → research}/url-extract/platforms/SKILL.claude.md +0 -0
  255. /package/skills/{data-extraction → research}/url-extract/platforms/SKILL.codex.md +0 -0
  256. /package/skills/{data-extraction → research}/url-extract/platforms/SKILL.hermes.md +0 -0
  257. /package/skills/{data-extraction → research}/url-extract/references/core-flow.md +0 -0
  258. /package/skills/{data-extraction → research}/url-extract/references/file-format.md +0 -0
  259. /package/skills/{data-extraction → research}/url-extract/scripts/dedup_check.py +0 -0
  260. /package/skills/{data-extraction → research}/url-extract/scripts/detect_chrome_profile.py +0 -0
  261. /package/skills/{data-extraction → research}/url-extract/scripts/playwright_web.py +0 -0
  262. /package/skills/{data-extraction → research}/url-extract/scripts/validate_article.py +0 -0
  263. /package/skills/{data-extraction → research}/url-extract/vars.json +0 -0
  264. /package/skills/{data-extraction → research}/vision-extract/SKILL.md +0 -0
  265. /package/skills/writing/{mermaid-diagram → diagram}/references/color-templates.md +0 -0
  266. /package/skills/writing/{mermaid-diagram → diagram}/references/flowchart.md +0 -0
  267. /package/skills/writing/{mermaid-diagram → diagram}/references/gantt-timeline.md +0 -0
  268. /package/skills/writing/{mermaid-diagram → diagram}/references/other-charts.md +0 -0
  269. /package/skills/writing/{mermaid-diagram → diagram}/references/sequence.md +0 -0
  270. /package/skills/writing/{mermaid-diagram → diagram}/references/statediagram.md +0 -0
  271. /package/skills/writing/{mermaid-diagram → diagram}/scripts/check_mermaid.py +0 -0
  272. /package/skills/{harness → writing}/diataxis-docs/SKILL.md +0 -0
  273. /package/skills/{harness → writing}/diataxis-docs/references/custom-categories.md +0 -0
  274. /package/skills/{harness → writing}/diataxis-docs/references/index-template.md +0 -0
  275. /package/skills/{harness → writing}/dir-manage/SKILL.md +0 -0
  276. /package/skills/{harness → writing}/dir-manage/references/built-in/diataxis.md +0 -0
  277. /package/skills/{harness → writing}/dir-manage/references/built-in/role-based.md +0 -0
  278. /package/skills/{harness → writing}/dir-manage/references/methodology-spec.md +0 -0
  279. /package/skills/{harness → writing}/migrate-specs/SKILL.md +0 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.14.0] - 2026-06-14
11
+
12
+ ### Added
13
+ - `hub` tool(`tools` bundle):个人开发者 OS,整合项目管理、git 状态追踪、任务系统,替代 p-launch + todo-tool
14
+ - Phase 1:core 库(SQLite DB、projects CRUD、tasks CRUD)+ CLI(`hub project`、`hub task` 子命令,支持 `--json` 输出)
15
+ - Phase 2:三栏 Textual TUI(ProjectsPanel | GitPanel | TasksPanel),支持键盘导航、git fetch、任务增删改、项目切换联动
16
+ - 首次启动自动从 todo-tool DB 迁移数据(`migrate.py`)
17
+ - 62 个测试覆盖 core、CLI、TUI 各层
18
+
19
+ ## [0.13.0] - 2026-06-12
20
+
21
+ ### Fixed
22
+ - `opencode-runner`:description 移除中文字符,符合 F3 英文规范
23
+ - `doc-forge`:测试 CSS 路径改为动态选取首个可用文件,不再依赖不存在的 `default.css`
24
+
25
+ ## [0.12.1] - 2026-06-10
26
+
10
27
  ## [0.12.0] - 2026-06-09
11
28
 
12
29
  ### Added
package/bin/cli.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import { select, input } from '@inquirer/prompts'
3
3
  import chalk from 'chalk'
4
4
  import { execSync, spawnSync } from 'child_process'
5
+ import { existsSync } from 'fs'
5
6
  import { createRequire } from 'module'
6
7
  import os from 'os'
7
8
  import path from 'path'
@@ -26,7 +27,7 @@ const jsonFlag = args.includes('--json')
26
27
  // ── Help ─────────────────────────────────────────────────────────────────────
27
28
  function printHelp() {
28
29
  console.log(`
29
- ${chalk.bold('hskill')} — skill manager for Claude Code, Cursor, Codex, OpenClaw, and Hermes v${version}
30
+ ${chalk.bold('hskill')} — skill manager for Claude Code, Cursor, Codex, OpenClaw, Hermes, and OpenCode v${version}
30
31
 
31
32
  ${chalk.cyan('Usage:')}
32
33
  hskill interactive install (requires TTY + fzf)
@@ -34,7 +35,7 @@ function printHelp() {
34
35
  hskill install --bundle <b> install a skill bundle
35
36
  hskill install --skill <s> install specific skill(s)
36
37
  hskill install --tool <t> install shell tool(s)
37
- hskill install --target <t> set target (claude/cursor/codex/openclaw/hermes/all)
38
+ hskill install --target <t> set target (claude/cursor/codex/openclaw/hermes/opencode/all)
38
39
  hskill install --scope <s> set scope: user (default) or project
39
40
  hskill install --force overwrite existing installs
40
41
  hskill list [--json] list available skills and bundles
@@ -86,7 +87,7 @@ if (args[0] === '--help' || args[0] === '-h') {
86
87
  { name: '--bundle', arg: '<name>', description: 'Install a skill bundle (comma-separated)' },
87
88
  { name: '--skill', arg: '<name>', description: 'Install specific skill(s) (comma-separated)' },
88
89
  { name: '--tool', arg: '<name>', description: 'Install shell tool(s) (comma-separated)' },
89
- { name: '--target', arg: '<target>', description: 'Install target', enum: ['claude','cursor','codex','openclaw','hermes','all'] },
90
+ { name: '--target', arg: '<target>', description: 'Install target', enum: ['claude','cursor','codex','openclaw','hermes','opencode','all'] },
90
91
  { name: '--scope', arg: '<scope>', description: 'Install scope', enum: ['user','project'], default: 'user' },
91
92
  { name: '--force', description: 'Overwrite existing installs' },
92
93
  ],
@@ -153,6 +154,15 @@ if (subcommand === 'update') {
153
154
  console.error(chalk.red(' ✗ Update failed. Try: npm update -g harveyz-skill'))
154
155
  process.exit(1)
155
156
  }
157
+ const legacyDir = path.join(os.homedir(), '.local', 'share', 'hskill')
158
+ if (existsSync(legacyDir)) {
159
+ console.log('')
160
+ console.log(chalk.yellow(' ⚠ Legacy data detected at ~/.local/share/hskill/'))
161
+ console.log(chalk.dim(' Run the migration script to move data to the new location:'))
162
+ console.log('')
163
+ console.log(' ' + chalk.bold.cyan('bash "$(npm root -g)/harveyz-skill/scripts/migrate-data-dir.sh"'))
164
+ console.log('')
165
+ }
156
166
  process.exit(0)
157
167
  }
158
168
 
@@ -221,7 +231,7 @@ if (subcommand === 'status' || subcommand === 'outdated') {
221
231
  })
222
232
 
223
233
  if (jsonFlag) {
224
- const targets = ['claude', 'cursor', 'codex', 'openclaw', 'hermes']
234
+ const targets = ['claude', 'cursor', 'codex', 'openclaw', 'hermes', 'opencode']
225
235
  const jsonSkills = skillRows.map(r => ({
226
236
  name: r.name,
227
237
  version: r.version,
@@ -253,7 +263,7 @@ if (subcommand === 'status' || subcommand === 'outdated') {
253
263
  process.exit(0)
254
264
  }
255
265
 
256
- const targets = ['claude', 'cursor', 'codex', 'openclaw', 'hermes']
266
+ const targets = ['claude', 'cursor', 'codex', 'openclaw', 'hermes', 'opencode']
257
267
 
258
268
  if (outdatedSkills.length) {
259
269
  console.log('\n ' + chalk.bold('SKILLS WITH UPDATES'))
@@ -438,7 +448,7 @@ if (subcommand === 'uninstall') {
438
448
  const scope = scopeArg2
439
449
  const selectedTargets = targetArg2
440
450
  ? [targetArg2]
441
- : ['claude', 'cursor', 'codex', 'openclaw', 'hermes']
451
+ : ['claude', 'cursor', 'codex', 'openclaw', 'hermes', 'opencode']
442
452
  const targets = resolveTargets(selectedTargets, scope)
443
453
 
444
454
  let anyRemoved = false
@@ -598,7 +608,7 @@ const scopeArg = scopeIdx !== -1 ? installArgs[scopeIdx + 1] : undefined
598
608
  const TOOL_BUNDLE_VALUES = new Set(TOOL_BUNDLE_CHOICES.map(c => c.value))
599
609
 
600
610
  // ── Two-step target→scope selector ───────────────────────────────────────────
601
- const ALL_SKILL_TARGETS = ['claude', 'cursor', 'codex', 'openclaw', 'hermes']
611
+ const ALL_SKILL_TARGETS = ['claude', 'cursor', 'codex', 'openclaw', 'hermes', 'opencode']
602
612
 
603
613
  function selectTargetThenScope() {
604
614
  // Step 1: platform (target)
@@ -608,7 +618,8 @@ function selectTargetThenScope() {
608
618
  'codex ~/.codex/skills/',
609
619
  'openclaw ~/.openclaw/skills/',
610
620
  'hermes ~/.hermes/skills/',
611
- 'all all 5 targets',
621
+ 'opencode ~/.config/opencode/skills/',
622
+ 'all all 6 targets',
612
623
  ].join('\n')
613
624
 
614
625
  const targetResult = spawnSync('fzf', [
@@ -1107,7 +1118,7 @@ try {
1107
1118
  // When only --skill is given and no --target, use the combined selector.
1108
1119
  if (targetArg) {
1109
1120
  const scope = scopeArg ?? 'user'
1110
- const selectedTargets = targetArg === 'all' ? ['claude', 'cursor', 'codex', 'openclaw', 'hermes'] : [targetArg]
1121
+ const selectedTargets = targetArg === 'all' ? ['claude', 'cursor', 'codex', 'openclaw', 'hermes', 'opencode'] : [targetArg]
1111
1122
  const targets = resolveTargets(selectedTargets, scope)
1112
1123
  console.log('')
1113
1124
  skillSummary = await installSkills(skillItems, targets, forceFlag)
package/bin/preview.mjs CHANGED
@@ -19,7 +19,7 @@ if (!skillName) process.exit(0)
19
19
  if (kind !== 'skill') {
20
20
  const home = os.homedir()
21
21
  const installedBin = path.join(home, '.local', 'bin', skillName)
22
- const installedMeta = path.join(home, '.local', 'share', 'hskill', 'tools', `${skillName}.json`)
22
+ const installedMeta = path.join(home, '.hskill', 'tools', `${skillName}.json`)
23
23
 
24
24
  function readToolMeta(jsonPath) {
25
25
  try {
package/lib/bundles.js CHANGED
@@ -3,7 +3,7 @@ import os from 'os'
3
3
  import { createRequire } from 'module'
4
4
  import path from 'path'
5
5
  import { fileURLToPath } from 'url'
6
- import { SKILL_TARGETS, USER_ONLY_TARGETS } from './targets.js'
6
+ import { SKILL_TARGETS, USER_ONLY_TARGETS, userSkillDir } from './targets.js'
7
7
 
8
8
  const require = createRequire(import.meta.url)
9
9
  const __dirname = path.dirname(fileURLToPath(import.meta.url))
@@ -154,7 +154,7 @@ export function checkInstalled(skillName, availableVersion) {
154
154
  const noneScope = Object.fromEntries(targets.map(t => [t, { version: '—', status: 'none' }]))
155
155
 
156
156
  return {
157
- user: checkScope(t => path.join(home, `.${t}`, 'skills')),
157
+ user: checkScope(t => userSkillDir(t)),
158
158
  project: cwd === home ? noneScope : checkScope(t =>
159
159
  USER_ONLY_TARGETS.has(t) ? null : path.join(cwd, `.${t}`, 'skills')
160
160
  ),
@@ -263,7 +263,7 @@ export function checkHookInstalled(hookName) {
263
263
 
264
264
  export { formatChoice, readVersion, readHookVersion }
265
265
 
266
- const HSKILL_TOOLS_DATA = path.join(os.homedir(), '.local', 'share', 'hskill', 'tools')
266
+ const HSKILL_TOOLS_DATA = path.join(os.homedir(), '.hskill', 'tools')
267
267
 
268
268
  function readToolMeta(jsonPath) {
269
269
  try {
package/lib/installer.js CHANGED
@@ -55,7 +55,7 @@ export async function installTools(tools, targetDir, force = false) {
55
55
  if (destExists && !force) {
56
56
  // Version-aware upgrade logic (mirrors skill behavior)
57
57
  const home = os.homedir()
58
- const dataDir = path.join(home, '.local', 'share', 'hskill', 'tools')
58
+ const dataDir = path.join(home, '.hskill', 'tools')
59
59
  const installedMeta = path.join(dataDir, `${toolName}.json`)
60
60
  const sourceMeta = path.join(srcPath, 'tool.json')
61
61
 
@@ -130,7 +130,7 @@ export async function installTools(tools, targetDir, force = false) {
130
130
  const content = await fs.readFile(scriptSrc, 'utf-8')
131
131
  await fs.writeFile(destPath, substituteVars(content, varsMap), { encoding: 'utf-8', mode: 0o755 })
132
132
 
133
- const dataDir = path.join(os.homedir(), '.local', 'share', 'hskill', 'tools')
133
+ const dataDir = path.join(os.homedir(), '.hskill', 'tools')
134
134
 
135
135
  const toolJsonSrc = path.join(srcPath, 'tool.json')
136
136
  if (await fs.pathExists(toolJsonSrc)) {
@@ -146,6 +146,21 @@ export async function installTools(tools, targetDir, force = false) {
146
146
  console.error(chalk.dim(` · Installed ${toolName}.py`))
147
147
  }
148
148
 
149
+ // Copy extra paths (files or dirs) declared in tool.json `extraPaths`
150
+ // Each entry is a relative path from the tool source; copied to ~/.hskill/tools/{toolName}/
151
+ try {
152
+ const toolMeta = await fs.readJson(path.join(srcPath, 'tool.json'))
153
+ for (const rel of (toolMeta.extraPaths ?? [])) {
154
+ const src = path.join(srcPath, rel)
155
+ const dest = path.join(dataDir, toolName, rel)
156
+ if (await fs.pathExists(src)) {
157
+ await fs.ensureDir(path.dirname(dest))
158
+ await fs.copy(src, dest, { overwrite: true })
159
+ console.error(chalk.dim(` · Installed ${toolName}/${rel}`))
160
+ }
161
+ }
162
+ } catch { /* tool.json missing or no extraPaths — skip silently */ }
163
+
149
164
  installed.push(toolName)
150
165
  await _patchZshrc(srcPath, toolName)
151
166
  } catch (err) {
@@ -537,7 +552,7 @@ export async function uninstallTool(toolName, opts = {}) {
537
552
  const { yes = false } = opts
538
553
  const home = os.homedir()
539
554
  const binPath = path.join(home, '.local', 'bin', toolName)
540
- const dataDir = path.join(home, '.local', 'share', 'hskill', 'tools')
555
+ const dataDir = path.join(home, '.hskill', 'tools')
541
556
  const jsonPath = path.join(dataDir, `${toolName}.json`)
542
557
  const pyPath = path.join(dataDir, `${toolName}.py`)
543
558
 
package/lib/targets.js CHANGED
@@ -1,13 +1,22 @@
1
1
  import os from 'os'
2
2
  import path from 'path'
3
3
 
4
- export const SKILL_TARGETS = ['claude', 'cursor', 'codex', 'openclaw', 'hermes']
4
+ export const SKILL_TARGETS = ['claude', 'cursor', 'codex', 'openclaw', 'hermes', 'opencode']
5
5
 
6
6
  export const USER_ONLY_TARGETS = new Set(['openclaw', 'hermes'])
7
7
 
8
+ // Targets whose user-level skill dir doesn't follow ~/.{name}/skills
9
+ const USER_DIR_OVERRIDES = {
10
+ opencode: path.join(os.homedir(), '.config', 'opencode', 'skills'),
11
+ }
12
+
13
+ export function userSkillDir(name) {
14
+ return USER_DIR_OVERRIDES[name] ?? path.join(os.homedir(), `.${name}`, 'skills')
15
+ }
16
+
8
17
  function skillDir(name, scope) {
9
18
  if (USER_ONLY_TARGETS.has(name) || scope !== 'project')
10
- return path.join(os.homedir(), `.${name}`, 'skills')
19
+ return userSkillDir(name)
11
20
  return path.join(process.cwd(), `.${name}`, 'skills')
12
21
  }
13
22
 
@@ -17,6 +26,7 @@ export const TARGETS = {
17
26
  codex: path.join(os.homedir(), '.codex', 'skills'),
18
27
  openclaw: path.join(os.homedir(), '.openclaw', 'skills'),
19
28
  hermes: path.join(os.homedir(), '.hermes', 'skills'),
29
+ opencode: path.join(os.homedir(), '.config', 'opencode', 'skills'),
20
30
  shell: path.join(os.homedir(), '.local', 'bin'),
21
31
  }
22
32
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "harveyz-skill",
3
- "version": "0.12.0",
3
+ "version": "0.14.0",
4
4
  "description": "Skill manager for Claude Code, Cursor, and Codex",
5
5
  "type": "module",
6
6
  "bin": {
@@ -16,31 +16,33 @@
16
16
  "bundles.json",
17
17
  "skills-index.json",
18
18
  "CHANGELOG.md",
19
- "skills/analysis/skill-analyzer/",
20
- "skills/harness/diataxis-docs/",
21
- "skills/harness/full-stack-debug-env/",
22
- "skills/superpowers-fork/brainstorming/",
23
- "skills/harness/git-workflow-init/",
24
- "skills/superpowers-fork/executing-plans/",
25
- "skills/superpowers-fork/systematic-debugging/",
26
- "skills/superpowers-fork/using-git-worktrees/",
27
- "skills/superpowers-fork/writing-plans/",
28
- "skills/task/pm-task-dispatch/",
29
- "skills/task/task-close/",
30
- "skills/data-extraction/article-fetcher/",
31
- "skills/data-extraction/url-extract/",
32
- "skills/data-extraction/vision-extract/",
33
- "skills/writing/mermaid-diagram/",
19
+ "skills/research/article-fetcher/",
20
+ "skills/research/url-extract/",
21
+ "skills/research/vision-extract/",
22
+ "skills/research/youtube-learner/",
23
+ "skills/creative/add-todo/",
24
+ "skills/creative/insight/",
25
+ "skills/coding/git-workflow-init/",
26
+ "skills/coding/full-stack-debug-env/",
27
+ "skills/coding/pm-task-dispatch/",
28
+ "skills/coding/task-close/",
29
+ "skills/writing/doc-forge/",
30
+ "skills/writing/diagram/",
31
+ "skills/writing/diataxis-docs/",
32
+ "skills/writing/dir-manage/",
33
+ "skills/writing/migrate-specs/",
34
+ "skills/design/brand-scout/",
35
+ "skills/design/style-build/",
34
36
  "skills/design/sync-design-html/",
35
- "skills/analysis/git-cleanup/",
37
+ "skills/meta/skill-analyzer/",
38
+ "skills/meta/git-cleanup/",
36
39
  "skills/meta/contribute-skill/",
37
- "skills/harness/migrate-specs/",
38
- "skills/workflow/add-todo/",
39
- "skills/harness/dir-manage/",
40
- "skills/writing/capture-insight/",
41
40
  "skills/meta/skill-publish/",
42
41
  "skills/meta/npm-release/",
42
+ "skills/meta/opencode-runner/",
43
43
  "tools/p-launch/",
44
+ "tools/todo-tool/",
45
+ "tools/hub/",
44
46
  "hooks/check-similar-branch/"
45
47
  ],
46
48
  "engines": {
@@ -0,0 +1,172 @@
1
+ ---
2
+ name: add-todo
3
+ version: "4.5.0"
4
+ user_invocable: true
5
+ description: "Add a new requirement, task, or feature request to any project's TODO.md — from any working directory. Triggers whenever the user wants to capture a new need — even phrased casually like 'we should do X later', 'add this to the backlog', 'note this down', 'remember to build X', 'we need to do Y at some point', or 'record this for later'."
6
+ ---
7
+
8
+ # 写入 TODO
9
+
10
+ 快速捕获需求:先用 2-3 个问题把需求说清楚,再根据完整的需求信息匹配项目、生成标题,最后写入 TODO.md。
11
+
12
+ ## 核心原则
13
+
14
+ **先把需求说清楚,再定项目归属。** 完整的需求描述是项目匹配最好的材料。问题只聚焦需求本身,不聚焦方案。够写一条清晰的任务条目就停,不要拖长。
15
+
16
+ ---
17
+
18
+ ## 阶段一 — 需求确认(2-3 轮)
19
+
20
+ **按需提问,已从上下文明确的直接跳过:**
21
+
22
+ 1. **需求** — 要解决什么问题、实现什么功能?(用户已清晰描述则复述确认即可)
23
+ 2. **紧急程度** — 有多急?(默认 P2,只在用户暗示紧急或不重要时调整)
24
+ 3. **背景** — 为什么现在提出来?(可选,有助于写出有上下文的描述)
25
+
26
+ **提问方式:**
27
+ - 每次只问一个问题
28
+ - 优先给选项而非开放题:"这个更像 (A) 缺失功能 还是 (B) 现有功能的问题?"
29
+ - 2 轮够用时不要凑到 3 轮
30
+
31
+ ---
32
+
33
+ ## 阶段二 — 确认项目归属
34
+
35
+ 需求收集完毕后,用 Read 工具读取项目注册表:
36
+
37
+ ```
38
+ ~/.hskill/todo-tool/PROJECTS.md
39
+ ```
40
+
41
+ 同时用 Bash 运行 `pwd` 获取当前目录。
42
+
43
+ ### 匹配逻辑
44
+
45
+ 综合以下信号推断候选项目:
46
+
47
+ 1. **当前目录**:`pwd` 输出是否是某个项目 `local_path` 的子路径 → 强信号
48
+ 2. **需求关键词 + 项目描述**:需求描述中的词汇是否与项目名或描述匹配 → 中信号
49
+ 3. **语义推断**:需求内容在哪个项目的业务范围内 → 弱信号
50
+
51
+ ### 确认策略
52
+
53
+ | 情况 | 行动 |
54
+ |------|------|
55
+ | 唯一高置信匹配 | 告知并请确认:"这是 **[项目名]** 的需求,对吗?" |
56
+ | 2-3 个候选 | 列出候选,请用户选择 |
57
+ | 无匹配或不确定 | 展示完整项目列表,让用户选 |
58
+
59
+ > **谨慎原则**:宁可多问一次,不写入错误项目。
60
+
61
+ ### 生成标题
62
+
63
+ 项目确认后,根据完整需求生成任务标题:
64
+
65
+ - 祈使句,动词开头,直接说明要做什么
66
+ - ≤20 字,超出则提炼核心、去掉修饰语
67
+ - 足够具体,让人一眼看出任务核心,避免泛泛的"优化"、"修复"
68
+ - 不堆砌细节,只抓最关键的区分点
69
+
70
+ **示例:**
71
+ - ✗ "优化系统" → ✓ "重构视频解析模块以支持多格式输入"
72
+ - ✗ "修复 bug" → ✓ "修复字幕导出时 UTF-8 编码乱码"
73
+ - ✗ "添加功能" → ✓ "为 add-todo skill 添加 SQLite 持久化层"
74
+
75
+ 展示摘要等用户确认:
76
+ > "记录为:**[项目名]** — [生成的标题],[优先级]。确认吗?"
77
+
78
+ ---
79
+
80
+ ## 阶段三 — 写入 TODO.md
81
+
82
+ ### 确定文件路径
83
+
84
+ 从阶段二确认的项目的 `local_path` 取出路径,TODO.md 位于 `{local_path}/TODO.md`。
85
+
86
+ 若该项目无 `local_path`,询问用户本地目录,写入后提示注册:
87
+ ```bash
88
+ todo project set-path [项目名] [本地路径]
89
+ ```
90
+
91
+ ### 切换到 chore/todo 分支
92
+
93
+ 在写入前,在项目目录操作 git:
94
+
95
+ ```bash
96
+ cd {local_path}
97
+
98
+ # 1. 记录当前分支
99
+ ORIGINAL_BRANCH=$(git rev-parse --abbrev-ref HEAD)
100
+
101
+ # 2. 确定 staging 基准分支(用于创建 chore/todo 及事后合并目标)
102
+ if git show-ref --verify --quiet refs/heads/staging; then
103
+ BASE_BRANCH=staging
104
+ else
105
+ BASE_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null \
106
+ | sed 's@^refs/remotes/origin/@@' || echo "main")
107
+ fi
108
+
109
+ # 3. 切换到 chore/todo(不存在则从 BASE_BRANCH 创建)
110
+ if git show-ref --verify --quiet refs/heads/chore/todo; then
111
+ git checkout chore/todo
112
+ else
113
+ git checkout -b chore/todo "$BASE_BRANCH"
114
+ fi
115
+ ```
116
+
117
+ **非 git 仓库**:若 `local_path` 不在 git 仓库中,跳过此步骤,直接写入文件。
118
+
119
+ **BRANCH_GUARD hook**:执行 `git checkout -b chore/todo` 时,BRANCH_GUARD hook 可能会提示与其他分支语义相似。`chore/todo` 是永久追踪分支,不是功能分支,**直接确认新建,忽略相似分支警告**,继续执行后续步骤。
120
+
121
+ ### 重复检查
122
+
123
+ 加载文件,扫描是否有语义重叠的已有条目。若有:
124
+ > "发现可能重叠的条目:**[已有标题]**。这是同一件事还是独立需求?"
125
+
126
+ 由用户决定:跳过、替换或独立写入。
127
+
128
+ ### 写入格式
129
+
130
+ 追加到 `## 🚧 待开发` 末尾:
131
+
132
+ ```markdown
133
+ ### [任务标题(≤20 字)]
134
+ **优先级**: P? | **日期**: YYYY-MM-DD
135
+
136
+ [描述:做什么、为什么。不写怎么做。篇幅以说清楚为准,不限长短。]
137
+
138
+ ---
139
+ ```
140
+
141
+ 文件不存在则创建,初始结构:
142
+
143
+ ```markdown
144
+ # TODO / Backlog
145
+
146
+ ## 🚧 待开发
147
+
148
+ ## ✅ 已完成
149
+ ```
150
+
151
+ ### 提交、合并到 staging、切回原分支
152
+
153
+ 写入后在项目目录执行:
154
+
155
+ ```bash
156
+ cd {local_path}
157
+
158
+ # 1. 在 chore/todo 上提交
159
+ git add TODO.md
160
+ git commit -m "todo: add [任务标题]"
161
+
162
+ # 2. 合并到 staging(或主分支)
163
+ git checkout "$BASE_BRANCH"
164
+ git merge --no-ff chore/todo -m "Merge chore/todo: add [任务标题]"
165
+
166
+ # 3. 切回原分支
167
+ git checkout "$ORIGINAL_BRANCH"
168
+ ```
169
+
170
+ 完成后确认:
171
+
172
+ > "✅ 已将 **[任务标题]** 写入 `{local_path}/TODO.md`,提交到 `chore/todo`,合并到 `$BASE_BRANCH`,当前回到 `$ORIGINAL_BRANCH`。"
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: capture-insight
2
+ name: insight
3
3
  version: "1.1.0"
4
4
  user_invocable: true
5
5
  description: "Capture and record a fleeting insight or observation. Triggers immediately when the user expresses an observation, judgment, or idea — phrases like 'I noticed', 'just an observation', 'record this', 'insight', 'I have a judgment', or tossing out an opinionated thought. Distinct from 'I have an idea to execute' (that's a task). Clarifies the core with 2-3 quick Q&As, then saves to the insights/ folder. Trigger early — insights are fragile."