@waoooo/claude-skills 1.0.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 (264) hide show
  1. package/README.md +48 -0
  2. package/package.json +28 -0
  3. package/registry.json +431 -0
  4. package/skills/acceptance-review/SKILL.md +537 -0
  5. package/skills/all-plan/SKILL.md +19 -0
  6. package/skills/all-plan/references/flow.md +750 -0
  7. package/skills/api-docs-generate/SKILL.md +204 -0
  8. package/skills/api-docs-generate/assets/templates/api.mdx +140 -0
  9. package/skills/api-docs-generate/scripts/generate-api-docs.ts +308 -0
  10. package/skills/ask/SKILL.md +42 -0
  11. package/skills/autonew/SKILL.md +34 -0
  12. package/skills/capability-analyze/SKILL.md +300 -0
  13. package/skills/capability-analyze/scripts/analyze-capabilities.ts +531 -0
  14. package/skills/capability-docs-generate/SKILL.md +155 -0
  15. package/skills/capability-docs-generate/assets/templates/capability.mdx +271 -0
  16. package/skills/capability-docs-generate/scripts/generate-capability-docs.ts +358 -0
  17. package/skills/capability-tree-query/SKILL.md +112 -0
  18. package/skills/capability-tree-query/scripts/build-capability-tree.ts +402 -0
  19. package/skills/changelog-generator/SKILL.md +104 -0
  20. package/skills/continue/SKILL.md +39 -0
  21. package/skills/continue/agents/openai.yaml +3 -0
  22. package/skills/creating-skills/SKILL.md +158 -0
  23. package/skills/creating-skills/references/official_best_practices.md +128 -0
  24. package/skills/creating-skills/references/skill_examples.md +199 -0
  25. package/skills/docx/LICENSE.txt +30 -0
  26. package/skills/docx/SKILL.md +197 -0
  27. package/skills/docx/docx-js.md +350 -0
  28. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  29. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  30. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  31. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  32. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  33. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  34. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  35. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  36. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  37. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  38. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  39. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  40. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  41. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  42. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  43. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  44. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  45. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  46. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  47. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  48. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  49. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  50. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  51. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  52. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  53. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  54. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  55. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  56. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  57. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  58. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  59. package/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
  60. package/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  61. package/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  62. package/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  63. package/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  64. package/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  65. package/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  66. package/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  67. package/skills/docx/ooxml/scripts/pack.py +159 -0
  68. package/skills/docx/ooxml/scripts/unpack.py +29 -0
  69. package/skills/docx/ooxml/scripts/validate.py +69 -0
  70. package/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
  71. package/skills/docx/ooxml/scripts/validation/base.py +951 -0
  72. package/skills/docx/ooxml/scripts/validation/docx.py +274 -0
  73. package/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
  74. package/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
  75. package/skills/docx/ooxml.md +610 -0
  76. package/skills/docx/scripts/__init__.py +1 -0
  77. package/skills/docx/scripts/document.py +1276 -0
  78. package/skills/docx/scripts/templates/comments.xml +3 -0
  79. package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  80. package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  81. package/skills/docx/scripts/templates/commentsIds.xml +3 -0
  82. package/skills/docx/scripts/templates/people.xml +3 -0
  83. package/skills/docx/scripts/utilities.py +374 -0
  84. package/skills/git-branch-create/SKILL.md +170 -0
  85. package/skills/git-branch-merge/SKILL.md +176 -0
  86. package/skills/git-commit/SKILL.md +56 -0
  87. package/skills/git-commit/references/commit_examples.md +311 -0
  88. package/skills/github-actions-trigger/SKILL.md +367 -0
  89. package/skills/github-issue-create/SKILL.md +294 -0
  90. package/skills/github-pr-creation/SKILL.md +137 -0
  91. package/skills/github-pr-creation/references/pr_templates.md +187 -0
  92. package/skills/github-pr-merge/SKILL.md +112 -0
  93. package/skills/github-pr-review/SKILL.md +110 -0
  94. package/skills/github-pr-review/references/severity_guide.md +168 -0
  95. package/skills/job-create/SKILL.md +294 -0
  96. package/skills/job-create/scripts/create-job.ts +105 -0
  97. package/skills/job-workflow/SKILL.md +212 -0
  98. package/skills/keyword-extract/SKILL.md +229 -0
  99. package/skills/mcp-builder/LICENSE.txt +202 -0
  100. package/skills/mcp-builder/SKILL.md +236 -0
  101. package/skills/mcp-builder/reference/evaluation.md +602 -0
  102. package/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
  103. package/skills/mcp-builder/reference/node_mcp_server.md +970 -0
  104. package/skills/mcp-builder/reference/python_mcp_server.md +719 -0
  105. package/skills/mcp-builder/scripts/connections.py +151 -0
  106. package/skills/mcp-builder/scripts/evaluation.py +373 -0
  107. package/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  108. package/skills/mcp-builder/scripts/requirements.txt +2 -0
  109. package/skills/mdx-to-openspec/SKILL.md +827 -0
  110. package/skills/mdx-to-openspec/scripts/mdx-to-openspec.ts +320 -0
  111. package/skills/mounted/SKILL.md +20 -0
  112. package/skills/multi-model-review/SKILL.md +459 -0
  113. package/skills/notion-automation/SKILL.md +215 -0
  114. package/skills/openspec-review/SKILL.md +513 -0
  115. package/skills/pdf/LICENSE.txt +30 -0
  116. package/skills/pdf/SKILL.md +294 -0
  117. package/skills/pdf/forms.md +205 -0
  118. package/skills/pdf/reference.md +612 -0
  119. package/skills/pdf/scripts/check_bounding_boxes.py +70 -0
  120. package/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
  121. package/skills/pdf/scripts/check_fillable_fields.py +12 -0
  122. package/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  123. package/skills/pdf/scripts/create_validation_image.py +41 -0
  124. package/skills/pdf/scripts/extract_form_field_info.py +152 -0
  125. package/skills/pdf/scripts/fill_fillable_fields.py +114 -0
  126. package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  127. package/skills/pend/SKILL.md +33 -0
  128. package/skills/ping/SKILL.md +39 -0
  129. package/skills/pptx/LICENSE.txt +30 -0
  130. package/skills/pptx/SKILL.md +484 -0
  131. package/skills/pptx/html2pptx.md +625 -0
  132. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  133. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  134. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  135. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  136. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  137. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  138. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  139. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  140. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  141. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  142. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  143. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  144. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  145. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  146. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  147. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  148. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  149. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  150. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  151. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  152. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  153. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  154. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  155. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  156. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  157. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  158. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  159. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  160. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  161. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  162. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  163. package/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  164. package/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  165. package/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  166. package/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  167. package/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  168. package/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  169. package/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  170. package/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  171. package/skills/pptx/ooxml/scripts/pack.py +159 -0
  172. package/skills/pptx/ooxml/scripts/unpack.py +29 -0
  173. package/skills/pptx/ooxml/scripts/validate.py +69 -0
  174. package/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
  175. package/skills/pptx/ooxml/scripts/validation/base.py +951 -0
  176. package/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
  177. package/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
  178. package/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
  179. package/skills/pptx/ooxml.md +427 -0
  180. package/skills/pptx/scripts/html2pptx.js +979 -0
  181. package/skills/pptx/scripts/inventory.py +1020 -0
  182. package/skills/pptx/scripts/rearrange.py +231 -0
  183. package/skills/pptx/scripts/replace.py +385 -0
  184. package/skills/pptx/scripts/thumbnail.py +450 -0
  185. package/skills/progress-update/SKILL.md +394 -0
  186. package/skills/progress-update/scripts/update-progress.ts +221 -0
  187. package/skills/release-automation/SKILL.md +306 -0
  188. package/skills/requirement-parse/SKILL.md +212 -0
  189. package/skills/requirement-parse/scripts/infer-builder-config.ts +346 -0
  190. package/skills/requirement-parse/scripts/merge-requirements.ts +228 -0
  191. package/skills/requirement-parse/scripts/parse-docs.ts +206 -0
  192. package/skills/requirement-parse/scripts/parse-openspec.ts +168 -0
  193. package/skills/roadmap-docs-generate/SKILL.md +483 -0
  194. package/skills/roadmap-docs-generate/assets/templates/ROADMAP.mdx +75 -0
  195. package/skills/roadmap-docs-generate/assets/templates/ROADMAP.mdx.template +330 -0
  196. package/skills/roadmap-docs-generate/assets/templates/TODO.mdx +56 -0
  197. package/skills/roadmap-docs-generate/assets/templates/TODO.mdx.template +363 -0
  198. package/skills/roadmap-docs-generate/scripts/json-to-mdx.ts +445 -0
  199. package/skills/roadmap-docs-generate/scripts/json-to-mdx.ts.backup +411 -0
  200. package/skills/roadmap-generate/SKILL.md +396 -0
  201. package/skills/roadmap-generate/scripts/generate-roadmap.ts +496 -0
  202. package/skills/skill-creator/LICENSE.txt +202 -0
  203. package/skills/skill-creator/SKILL.md +356 -0
  204. package/skills/skill-creator/references/output-patterns.md +82 -0
  205. package/skills/skill-creator/references/workflows.md +28 -0
  206. package/skills/skill-creator/scripts/init_skill.py +303 -0
  207. package/skills/skill-creator/scripts/package_skill.py +110 -0
  208. package/skills/skill-creator/scripts/quick_validate.py +95 -0
  209. package/skills/spec-generate/SKILL.md +408 -0
  210. package/skills/spec-generate/scripts/generate-specs.ts +538 -0
  211. package/skills/spec-generate/scripts/generate-tasks.ts +174 -0
  212. package/skills/specs-review/SKILL.md +370 -0
  213. package/skills/task-execute/SKILL.md +399 -0
  214. package/skills/task-update-status/SKILL.md +349 -0
  215. package/skills/task-update-status/scripts/update-task-status.ts +192 -0
  216. package/skills/task-verify/SKILL.md +407 -0
  217. package/skills/ui-ux-pro-max/SKILL.md +386 -0
  218. package/skills/ui-ux-pro-max/data/charts.csv +26 -0
  219. package/skills/ui-ux-pro-max/data/colors.csv +97 -0
  220. package/skills/ui-ux-pro-max/data/icons.csv +101 -0
  221. package/skills/ui-ux-pro-max/data/landing.csv +31 -0
  222. package/skills/ui-ux-pro-max/data/products.csv +97 -0
  223. package/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  224. package/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  225. package/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  226. package/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  227. package/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  228. package/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  229. package/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  230. package/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  231. package/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  232. package/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  233. package/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  234. package/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  235. package/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  236. package/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  237. package/skills/ui-ux-pro-max/data/styles.csv +68 -0
  238. package/skills/ui-ux-pro-max/data/typography.csv +58 -0
  239. package/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  240. package/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  241. package/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
  242. package/skills/ui-ux-pro-max/scripts/core.py +253 -0
  243. package/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
  244. package/skills/ui-ux-pro-max/scripts/search.py +114 -0
  245. package/skills/vercel-automation/SKILL.md +226 -0
  246. package/skills/webapp-testing/LICENSE.txt +202 -0
  247. package/skills/webapp-testing/SKILL.md +96 -0
  248. package/skills/webapp-testing/examples/console_logging.py +35 -0
  249. package/skills/webapp-testing/examples/element_discovery.py +40 -0
  250. package/skills/webapp-testing/examples/static_html_automation.py +33 -0
  251. package/skills/webapp-testing/scripts/with_server.py +106 -0
  252. package/skills/worktree-manager/SKILL.md +725 -0
  253. package/skills/worktree-manager/config.json +15 -0
  254. package/skills/worktree-manager/scripts/allocate-ports.sh +100 -0
  255. package/skills/worktree-manager/scripts/cleanup.sh +185 -0
  256. package/skills/worktree-manager/scripts/launch-agent.sh +155 -0
  257. package/skills/worktree-manager/scripts/register.sh +125 -0
  258. package/skills/worktree-manager/scripts/release-ports.sh +48 -0
  259. package/skills/worktree-manager/scripts/status.sh +169 -0
  260. package/skills/worktree-manager/scripts/sync.sh +168 -0
  261. package/skills/worktree-manager/templates/worktree.json +23 -0
  262. package/skills/xlsx/LICENSE.txt +30 -0
  263. package/skills/xlsx/SKILL.md +289 -0
  264. package/skills/xlsx/recalc.py +178 -0
@@ -0,0 +1,445 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Convert JSON planning files to MDX documentation format
4
+ *
5
+ * This script converts:
6
+ * - roadmap.json → ROADMAP.mdx
7
+ * - global-todo.json → TODO.mdx
8
+ *
9
+ * Uses template files from assets/templates/ with {{variable}} placeholders
10
+ *
11
+ * Usage:
12
+ * npx tsx json-to-mdx.ts \
13
+ * --roadmap <roadmap.json> \
14
+ * --todo <global-todo.json> \
15
+ * --output <output-dir>
16
+ */
17
+
18
+ import fs from 'fs';
19
+ import path from 'path';
20
+ import { fileURLToPath } from 'url';
21
+
22
+ const __filename = fileURLToPath(import.meta.url);
23
+ const __dirname = path.dirname(__filename);
24
+
25
+ // Load project config
26
+ const projectRoot = path.resolve(__dirname, '../../../..');
27
+ const projectConfigPath = path.join(projectRoot, 'project.config.json');
28
+ const projectConfig = JSON.parse(fs.readFileSync(projectConfigPath, 'utf-8'));
29
+
30
+ // ============================================================================
31
+ // Types
32
+ // ============================================================================
33
+
34
+ interface RoadmapData {
35
+ version: string;
36
+ generatedAt: string;
37
+ summary: {
38
+ totalTasks: number;
39
+ completedTasks: number;
40
+ inProgressTasks: number;
41
+ pendingTasks: number;
42
+ totalEstimatedHours: number;
43
+ completedHours: number;
44
+ remainingHours: number;
45
+ };
46
+ jobs: Array<{
47
+ jobId: string;
48
+ name: string;
49
+ status: string;
50
+ createdAt: string;
51
+ progress: {
52
+ totalTasks: number;
53
+ completed: number;
54
+ inProgress: number;
55
+ pending: number;
56
+ percentage: number;
57
+ };
58
+ estimatedHours: number;
59
+ remainingHours: number;
60
+ }>;
61
+ timeline: Array<{
62
+ date: string;
63
+ jobs: string[];
64
+ tasksCompleted: number;
65
+ hoursSpent: number;
66
+ }>;
67
+ milestones: Array<{
68
+ name: string;
69
+ targetDate: string;
70
+ description?: string;
71
+ completed?: boolean;
72
+ }>;
73
+ }
74
+
75
+ interface TodoData {
76
+ version: string;
77
+ generatedAt: string;
78
+ summary: {
79
+ totalTasks: number;
80
+ highPriority: number;
81
+ mediumPriority: number;
82
+ lowPriority: number;
83
+ };
84
+ tasks: Array<{
85
+ taskId: string;
86
+ jobId: string;
87
+ jobName: string;
88
+ title: string;
89
+ priority: string;
90
+ status: string;
91
+ estimatedHours: number;
92
+ dependencies: string[];
93
+ blockedBy: string[];
94
+ canStartNow: boolean;
95
+ }>;
96
+ readyToStart: string[];
97
+ blocked: string[];
98
+ }
99
+
100
+ // ============================================================================
101
+ // CLI Arguments
102
+ // ============================================================================
103
+
104
+ function parseArgs() {
105
+ const args = process.argv.slice(2);
106
+ const result: any = {};
107
+
108
+ for (let i = 0; i < args.length; i += 2) {
109
+ const key = args[i].replace('--', '');
110
+ const value = args[i + 1];
111
+ result[key] = value;
112
+ }
113
+
114
+ return {
115
+ roadmapPath: result.roadmap || 'exports/generated/roadmap.json',
116
+ todoPath: result.todo || 'exports/generated/global-todo.json',
117
+ outputDir: result.output || path.join(projectConfig.defaults.docsPath, 'planning'),
118
+ };
119
+ }
120
+
121
+ // ============================================================================
122
+ // Template Loading
123
+ // ============================================================================
124
+
125
+ function loadTemplate(templateName: string): string {
126
+ const templatePath = path.join(__dirname, '../assets/templates', templateName);
127
+ if (!fs.existsSync(templatePath)) {
128
+ throw new Error(`Template not found: ${templatePath}`);
129
+ }
130
+ return fs.readFileSync(templatePath, 'utf-8');
131
+ }
132
+
133
+ // ============================================================================
134
+ // Variable Replacement
135
+ // ============================================================================
136
+
137
+ function replaceVariables(template: string, variables: Record<string, string>): string {
138
+ let result = template;
139
+ for (const [key, value] of Object.entries(variables)) {
140
+ const regex = new RegExp(`\\{\\{${key}\\}\\}`, 'g');
141
+ result = result.replace(regex, value);
142
+ }
143
+ return result;
144
+ }
145
+
146
+ // ============================================================================
147
+ // ROADMAP Generation
148
+ // ============================================================================
149
+
150
+ function generateJobCards(jobs: RoadmapData['jobs']): string {
151
+ const statusEmoji: Record<string, string> = {
152
+ pending: '⏳',
153
+ in_progress: '🔄',
154
+ completed: '✅',
155
+ failed: '❌'
156
+ };
157
+
158
+ return jobs.map(job => {
159
+ return ` <Card title="${job.name}" icon="briefcase" href="/planning/${job.name}">
160
+ ${statusEmoji[job.status] || '⏳'} **状态**: ${job.status}
161
+
162
+ **进度**: ${job.progress.percentage}% (${job.progress.completed}/${job.progress.totalTasks} 任务完成)
163
+ **预计工时**: ${job.estimatedHours}h
164
+ **剩余工时**: ${job.remainingHours}h
165
+ **创建时间**: ${job.createdAt.slice(0, 10)}
166
+ </Card>`;
167
+ }).join('\n\n');
168
+ }
169
+
170
+ function generateTimeline(timeline: RoadmapData['timeline']): string {
171
+ if (!timeline || timeline.length === 0) {
172
+ return '暂无时间线数据';
173
+ }
174
+
175
+ return timeline.map(item => {
176
+ return `### ${item.date}
177
+
178
+ - **任务完成**: ${item.tasksCompleted} 个
179
+ - **工时消耗**: ${item.hoursSpent}h
180
+ - **相关 Job**: ${item.jobs.join(', ')}`;
181
+ }).join('\n\n');
182
+ }
183
+
184
+ function generateMilestones(milestones: RoadmapData['milestones']): string {
185
+ if (!milestones || milestones.length === 0) {
186
+ return '暂无里程碑数据';
187
+ }
188
+
189
+ return milestones.map(milestone => {
190
+ const status = milestone.completed ? '✅' : '⏳';
191
+ return `### ${status} ${milestone.name}
192
+
193
+ - **目标日期**: ${milestone.targetDate}
194
+ ${milestone.description ? `- **说明**: ${milestone.description}` : ''}`;
195
+ }).join('\n\n');
196
+ }
197
+
198
+ function generateRoadmapMdx(roadmapData: RoadmapData): string {
199
+ const template = loadTemplate('ROADMAP.mdx');
200
+
201
+ const { summary } = roadmapData;
202
+ const completionRate = summary.totalTasks > 0
203
+ ? Math.floor((summary.completedTasks / summary.totalTasks) * 100)
204
+ : 0;
205
+
206
+ const remainingDays = Math.ceil(summary.remainingHours / 8);
207
+
208
+ const variables = {
209
+ lastUpdated: new Date().toISOString().slice(0, 10),
210
+ version: roadmapData.version,
211
+ totalTasks: summary.totalTasks.toString(),
212
+ completedTasks: summary.completedTasks.toString(),
213
+ inProgressTasks: summary.inProgressTasks.toString(),
214
+ pendingTasks: summary.pendingTasks.toString(),
215
+ completionRate: completionRate.toString(),
216
+ totalEstimatedHours: summary.totalEstimatedHours.toString(),
217
+ completedHours: summary.completedHours.toString(),
218
+ remainingHours: summary.remainingHours.toString(),
219
+ remainingDays: remainingDays.toString(),
220
+ timeline: generateTimeline(roadmapData.timeline),
221
+ milestones: generateMilestones(roadmapData.milestones),
222
+ generatedAt: new Date().toISOString().slice(0, 10),
223
+ sourceGeneratedAt: roadmapData.generatedAt,
224
+ };
225
+
226
+ return replaceVariables(template, variables);
227
+ }
228
+
229
+ // ============================================================================
230
+ // TODO Generation
231
+ // ============================================================================
232
+
233
+ function generateTaskSection(tasks: TodoData['tasks'], priority: string): string {
234
+ const filtered = tasks.filter(t => t.priority === priority);
235
+
236
+ if (filtered.length === 0) {
237
+ return '';
238
+ }
239
+
240
+ const priorityEmoji: Record<string, string> = {
241
+ high: '🔴',
242
+ medium: '🟡',
243
+ low: '🟢'
244
+ };
245
+
246
+ const priorityName: Record<string, string> = {
247
+ high: '高优先级',
248
+ medium: '中优先级',
249
+ low: '低优先级'
250
+ };
251
+
252
+ const taskList = filtered.map(task => {
253
+ const blockedText = task.blockedBy.length > 0
254
+ ? ` 🚫 **被阻塞**: ${task.blockedBy.join(', ')}`
255
+ : '';
256
+
257
+ return `### ${task.title}
258
+
259
+ - **Job**: ${task.jobName}
260
+ - **预计工时**: ${task.estimatedHours}h
261
+ - **状态**: ${task.status}${blockedText}`;
262
+ }).join('\n\n');
263
+
264
+ return `## ${priorityEmoji[priority]} ${priorityName[priority]} (${filtered.length} 个任务)
265
+
266
+ ${taskList}`;
267
+ }
268
+
269
+ function generateReadyToStartSection(tasks: TodoData['tasks'], readyIds: string[]): string {
270
+ const readyTasks = tasks.filter(t => readyIds.includes(t.taskId));
271
+
272
+ if (readyTasks.length === 0) {
273
+ return '## ✅ 可立即开始的任务\n\n暂无可立即开始的任务';
274
+ }
275
+
276
+ const taskList = readyTasks.map(task => {
277
+ return `### ${task.title}
278
+
279
+ - **Job**: ${task.jobName}
280
+ - **优先级**: ${task.priority}
281
+ - **预计工时**: ${task.estimatedHours}h`;
282
+ }).join('\n\n');
283
+
284
+ return `## ✅ 可立即开始的任务 (${readyTasks.length} 个)
285
+
286
+ ${taskList}`;
287
+ }
288
+
289
+ function generateBlockedSection(tasks: TodoData['tasks'], blockedIds: string[]): string {
290
+ const blockedTasks = tasks.filter(t => blockedIds.includes(t.taskId));
291
+
292
+ if (blockedTasks.length === 0) {
293
+ return '## 🚫 被阻塞的任务\n\n暂无被阻塞的任务';
294
+ }
295
+
296
+ const taskList = blockedTasks.map(task => {
297
+ return `### ${task.title}
298
+
299
+ - **Job**: ${task.jobName}
300
+ - **优先级**: ${task.priority}
301
+ - **被阻塞原因**: ${task.blockedBy.join(', ')}`;
302
+ }).join('\n\n');
303
+
304
+ return `## 🚫 被阻塞的任务 (${blockedTasks.length} 个)
305
+
306
+ ${taskList}`;
307
+ }
308
+
309
+ function generateTodoMdx(todoData: TodoData): string {
310
+ const template = loadTemplate('TODO.mdx');
311
+
312
+ const { summary, tasks } = todoData;
313
+
314
+ // Group tasks by Job
315
+ const tasksByJob: Record<string, TodoData['tasks']> = {};
316
+ for (const task of tasks) {
317
+ if (!tasksByJob[task.jobName]) {
318
+ tasksByJob[task.jobName] = [];
319
+ }
320
+ tasksByJob[task.jobName].push(task);
321
+ }
322
+
323
+ // Generate Job sections
324
+ const jobSections = Object.entries(tasksByJob).map(([jobName, jobTasks]) => {
325
+ // Group by priority
326
+ const highPriority = jobTasks.filter(t => t.priority === 'high');
327
+ const mediumPriority = jobTasks.filter(t => t.priority === 'medium');
328
+ const lowPriority = jobTasks.filter(t => t.priority === 'low');
329
+
330
+ const generateTaskList = (tasks: TodoData['tasks']) => {
331
+ return tasks.map(task => {
332
+ const checkbox = task.status === 'completed' ? '[x]' : '[ ]';
333
+ const blockedText = task.blockedBy.length > 0 ? ' 🚫 被阻塞' : '';
334
+ return `- ${checkbox} ${task.title} (${task.estimatedHours}h)${blockedText}`;
335
+ }).join('\n');
336
+ };
337
+
338
+ let sections = [];
339
+
340
+ if (highPriority.length > 0) {
341
+ sections.push(`### 🔴 高优先级\n\n${generateTaskList(highPriority)}`);
342
+ }
343
+
344
+ if (mediumPriority.length > 0) {
345
+ sections.push(`### 🟡 中优先级\n\n${generateTaskList(mediumPriority)}`);
346
+ }
347
+
348
+ if (lowPriority.length > 0) {
349
+ sections.push(`### 🟢 低优先级\n\n${generateTaskList(lowPriority)}`);
350
+ }
351
+
352
+ return `## 📋 ${jobName}\n\n${sections.join('\n\n---\n\n')}`;
353
+ }).join('\n\n---\n\n');
354
+
355
+ const variables = {
356
+ lastUpdated: new Date().toISOString().slice(0, 10),
357
+ version: todoData.version,
358
+ totalTasks: summary.totalTasks.toString(),
359
+ highPriority: summary.highPriority.toString(),
360
+ mediumPriority: summary.mediumPriority.toString(),
361
+ lowPriority: summary.lowPriority.toString(),
362
+ jobSections: jobSections,
363
+ generatedAt: new Date().toISOString().slice(0, 10),
364
+ sourceGeneratedAt: todoData.generatedAt,
365
+ };
366
+
367
+ return replaceVariables(template, variables);
368
+ }
369
+
370
+ // ============================================================================
371
+ // Main
372
+ // ============================================================================
373
+
374
+ async function main() {
375
+ console.log('🚀 Converting JSON to MDX...\n');
376
+
377
+ const { roadmapPath, todoPath, outputDir } = parseArgs();
378
+
379
+ // Step 1: Load JSON files
380
+ console.log('📥 Step 1/3: Loading JSON files...');
381
+
382
+ let roadmapData: RoadmapData | null = null;
383
+ let todoData: TodoData | null = null;
384
+
385
+ if (fs.existsSync(roadmapPath)) {
386
+ roadmapData = JSON.parse(fs.readFileSync(roadmapPath, 'utf-8'));
387
+ console.log(` ✅ Loaded: ${roadmapPath}`);
388
+ } else {
389
+ console.log(` ⚠️ Not found: ${roadmapPath}`);
390
+ }
391
+
392
+ if (fs.existsSync(todoPath)) {
393
+ todoData = JSON.parse(fs.readFileSync(todoPath, 'utf-8'));
394
+ console.log(` ✅ Loaded: ${todoPath}`);
395
+ } else {
396
+ console.log(` ⚠️ Not found: ${todoPath}`);
397
+ }
398
+
399
+ console.log('');
400
+
401
+ // Step 2: Generate MDX
402
+ console.log('📝 Step 2/3: Generating MDX...');
403
+
404
+ const outputs: Array<{ path: string; content: string }> = [];
405
+
406
+ if (roadmapData) {
407
+ const roadmapMdx = generateRoadmapMdx(roadmapData);
408
+ outputs.push({
409
+ path: path.join(outputDir, 'ROADMAP.mdx'),
410
+ content: roadmapMdx,
411
+ });
412
+ console.log(' ✅ Generated ROADMAP.mdx');
413
+ }
414
+
415
+ if (todoData) {
416
+ const todoMdx = generateTodoMdx(todoData);
417
+ outputs.push({
418
+ path: path.join(outputDir, 'TODO.mdx'),
419
+ content: todoMdx,
420
+ });
421
+ console.log(' ✅ Generated TODO.mdx');
422
+ }
423
+
424
+ console.log('');
425
+
426
+ // Step 3: Write files
427
+ console.log('💾 Step 3/3: Writing files...');
428
+
429
+ for (const output of outputs) {
430
+ // outputDir is relative to project root
431
+ const absolutePath = path.resolve(projectRoot, output.path);
432
+ fs.mkdirSync(path.dirname(absolutePath), { recursive: true });
433
+ fs.writeFileSync(absolutePath, output.content, 'utf-8');
434
+ console.log(` ✅ Written: ${absolutePath}`);
435
+ }
436
+
437
+ console.log('');
438
+ console.log('🎉 Done!');
439
+ console.log(`\n📂 Output directory: ${path.resolve(projectRoot, outputDir)}`);
440
+ }
441
+
442
+ main().catch(error => {
443
+ console.error('❌ Error:', error.message);
444
+ process.exit(1);
445
+ });