@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,411 @@
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
+ jobCards: generateJobCards(roadmapData.jobs),
221
+ timeline: generateTimeline(roadmapData.timeline),
222
+ milestones: generateMilestones(roadmapData.milestones),
223
+ generatedAt: new Date().toISOString().slice(0, 10),
224
+ sourceGeneratedAt: roadmapData.generatedAt,
225
+ };
226
+
227
+ return replaceVariables(template, variables);
228
+ }
229
+
230
+ // ============================================================================
231
+ // TODO Generation
232
+ // ============================================================================
233
+
234
+ function generateTaskSection(tasks: TodoData['tasks'], priority: string): string {
235
+ const filtered = tasks.filter(t => t.priority === priority);
236
+
237
+ if (filtered.length === 0) {
238
+ return '';
239
+ }
240
+
241
+ const priorityEmoji: Record<string, string> = {
242
+ high: '🔴',
243
+ medium: '🟡',
244
+ low: '🟢'
245
+ };
246
+
247
+ const priorityName: Record<string, string> = {
248
+ high: '高优先级',
249
+ medium: '中优先级',
250
+ low: '低优先级'
251
+ };
252
+
253
+ const taskList = filtered.map(task => {
254
+ const blockedText = task.blockedBy.length > 0
255
+ ? ` 🚫 **被阻塞**: ${task.blockedBy.join(', ')}`
256
+ : '';
257
+
258
+ return `### ${task.title}
259
+
260
+ - **Job**: ${task.jobName}
261
+ - **预计工时**: ${task.estimatedHours}h
262
+ - **状态**: ${task.status}${blockedText}`;
263
+ }).join('\n\n');
264
+
265
+ return `## ${priorityEmoji[priority]} ${priorityName[priority]} (${filtered.length} 个任务)
266
+
267
+ ${taskList}`;
268
+ }
269
+
270
+ function generateReadyToStartSection(tasks: TodoData['tasks'], readyIds: string[]): string {
271
+ const readyTasks = tasks.filter(t => readyIds.includes(t.taskId));
272
+
273
+ if (readyTasks.length === 0) {
274
+ return '## ✅ 可立即开始的任务\n\n暂无可立即开始的任务';
275
+ }
276
+
277
+ const taskList = readyTasks.map(task => {
278
+ return `### ${task.title}
279
+
280
+ - **Job**: ${task.jobName}
281
+ - **优先级**: ${task.priority}
282
+ - **预计工时**: ${task.estimatedHours}h`;
283
+ }).join('\n\n');
284
+
285
+ return `## ✅ 可立即开始的任务 (${readyTasks.length} 个)
286
+
287
+ ${taskList}`;
288
+ }
289
+
290
+ function generateBlockedSection(tasks: TodoData['tasks'], blockedIds: string[]): string {
291
+ const blockedTasks = tasks.filter(t => blockedIds.includes(t.taskId));
292
+
293
+ if (blockedTasks.length === 0) {
294
+ return '## 🚫 被阻塞的任务\n\n暂无被阻塞的任务';
295
+ }
296
+
297
+ const taskList = blockedTasks.map(task => {
298
+ return `### ${task.title}
299
+
300
+ - **Job**: ${task.jobName}
301
+ - **优先级**: ${task.priority}
302
+ - **被阻塞原因**: ${task.blockedBy.join(', ')}`;
303
+ }).join('\n\n');
304
+
305
+ return `## 🚫 被阻塞的任务 (${blockedTasks.length} 个)
306
+
307
+ ${taskList}`;
308
+ }
309
+
310
+ function generateTodoMdx(todoData: TodoData): string {
311
+ const template = loadTemplate('TODO.mdx');
312
+
313
+ const { summary, tasks, readyToStart, blocked } = todoData;
314
+
315
+ const variables = {
316
+ lastUpdated: new Date().toISOString().slice(0, 10),
317
+ version: todoData.version,
318
+ totalTasks: summary.totalTasks.toString(),
319
+ highPriority: summary.highPriority.toString(),
320
+ mediumPriority: summary.mediumPriority.toString(),
321
+ lowPriority: summary.lowPriority.toString(),
322
+ readyToStartCount: readyToStart.length.toString(),
323
+ blockedCount: blocked.length.toString(),
324
+ highPrioritySection: generateTaskSection(tasks, 'high'),
325
+ mediumPrioritySection: generateTaskSection(tasks, 'medium'),
326
+ lowPrioritySection: generateTaskSection(tasks, 'low'),
327
+ readyToStartSection: generateReadyToStartSection(tasks, readyToStart),
328
+ blockedSection: generateBlockedSection(tasks, blocked),
329
+ generatedAt: new Date().toISOString().slice(0, 10),
330
+ sourceGeneratedAt: todoData.generatedAt,
331
+ };
332
+
333
+ return replaceVariables(template, variables);
334
+ }
335
+
336
+ // ============================================================================
337
+ // Main
338
+ // ============================================================================
339
+
340
+ async function main() {
341
+ console.log('🚀 Converting JSON to MDX...\n');
342
+
343
+ const { roadmapPath, todoPath, outputDir } = parseArgs();
344
+
345
+ // Step 1: Load JSON files
346
+ console.log('📥 Step 1/3: Loading JSON files...');
347
+
348
+ let roadmapData: RoadmapData | null = null;
349
+ let todoData: TodoData | null = null;
350
+
351
+ if (fs.existsSync(roadmapPath)) {
352
+ roadmapData = JSON.parse(fs.readFileSync(roadmapPath, 'utf-8'));
353
+ console.log(` ✅ Loaded: ${roadmapPath}`);
354
+ } else {
355
+ console.log(` ⚠️ Not found: ${roadmapPath}`);
356
+ }
357
+
358
+ if (fs.existsSync(todoPath)) {
359
+ todoData = JSON.parse(fs.readFileSync(todoPath, 'utf-8'));
360
+ console.log(` ✅ Loaded: ${todoPath}`);
361
+ } else {
362
+ console.log(` ⚠️ Not found: ${todoPath}`);
363
+ }
364
+
365
+ console.log('');
366
+
367
+ // Step 2: Generate MDX
368
+ console.log('📝 Step 2/3: Generating MDX...');
369
+
370
+ const outputs: Array<{ path: string; content: string }> = [];
371
+
372
+ if (roadmapData) {
373
+ const roadmapMdx = generateRoadmapMdx(roadmapData);
374
+ outputs.push({
375
+ path: path.join(outputDir, 'ROADMAP.mdx'),
376
+ content: roadmapMdx,
377
+ });
378
+ console.log(' ✅ Generated ROADMAP.mdx');
379
+ }
380
+
381
+ if (todoData) {
382
+ const todoMdx = generateTodoMdx(todoData);
383
+ outputs.push({
384
+ path: path.join(outputDir, 'TODO.mdx'),
385
+ content: todoMdx,
386
+ });
387
+ console.log(' ✅ Generated TODO.mdx');
388
+ }
389
+
390
+ console.log('');
391
+
392
+ // Step 3: Write files
393
+ console.log('💾 Step 3/3: Writing files...');
394
+
395
+ for (const output of outputs) {
396
+ // outputDir is relative to project root
397
+ const absolutePath = path.resolve(projectRoot, output.path);
398
+ fs.mkdirSync(path.dirname(absolutePath), { recursive: true });
399
+ fs.writeFileSync(absolutePath, output.content, 'utf-8');
400
+ console.log(` ✅ Written: ${absolutePath}`);
401
+ }
402
+
403
+ console.log('');
404
+ console.log('🎉 Done!');
405
+ console.log(`\n📂 Output directory: ${path.resolve(projectRoot, outputDir)}`);
406
+ }
407
+
408
+ main().catch(error => {
409
+ console.error('❌ Error:', error.message);
410
+ process.exit(1);
411
+ });