@hasna/skills 0.0.2 → 0.0.3

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 (387) hide show
  1. package/bin/index.js +253 -715
  2. package/bin/mcp.js +221 -683
  3. package/package.json +1 -1
  4. package/src/cli/cli.test.ts +14 -14
  5. package/src/cli/index.tsx +1 -1
  6. package/src/lib/installer.test.ts +41 -41
  7. package/src/lib/registry.test.ts +10 -10
  8. package/src/lib/registry.ts +10 -472
  9. package/src/lib/skillinfo.test.ts +12 -12
  10. package/src/mcp/index.ts +1 -1
  11. package/skills/skill-architecture-docs/CLAUDE.md +0 -19
  12. package/skills/skill-architecture-docs/package.json +0 -32
  13. package/skills/skill-architecture-docs/src/index.ts +0 -543
  14. package/skills/skill-auto-format/CLAUDE.md +0 -19
  15. package/skills/skill-auto-format/package.json +0 -32
  16. package/skills/skill-auto-format/src/index.ts +0 -103
  17. package/skills/skill-auto-format/tsconfig.json +0 -14
  18. package/skills/skill-brainstorm/README.md +0 -17
  19. package/skills/skill-brainstorm/install.sh +0 -112
  20. package/skills/skill-brainstorm/src/auth.ts +0 -49
  21. package/skills/skill-brainstorm/src/installer.ts +0 -324
  22. package/skills/skill-brainstorm/src/skill-install.ts +0 -205
  23. package/skills/skill-browser-agent/CLAUDE.md +0 -19
  24. package/skills/skill-browser-agent/package.json +0 -32
  25. package/skills/skill-browser-agent/src/index.ts +0 -626
  26. package/skills/skill-browser-agent/tsconfig.json +0 -14
  27. package/skills/skill-browseruse/LICENSE +0 -21
  28. package/skills/skill-browseruse/README.md +0 -27
  29. package/skills/skill-browseruse/SKILL.md +0 -113
  30. package/skills/skill-browseruse/install.sh +0 -112
  31. package/skills/skill-browseruse/package.json +0 -31
  32. package/skills/skill-browseruse/src/auth.ts +0 -49
  33. package/skills/skill-browseruse/src/installer.ts +0 -324
  34. package/skills/skill-browseruse/src/skill-install.ts +0 -174
  35. package/skills/skill-calculate/LICENSE +0 -21
  36. package/skills/skill-calculate/README.md +0 -17
  37. package/skills/skill-calculate/install.sh +0 -112
  38. package/skills/skill-calculate/package.json +0 -31
  39. package/skills/skill-calculate/src/auth.ts +0 -49
  40. package/skills/skill-calculate/src/installer.ts +0 -324
  41. package/skills/skill-calculate/src/skill-install.ts +0 -205
  42. package/skills/skill-chromedevtools/LICENSE +0 -21
  43. package/skills/skill-chromedevtools/README.md +0 -27
  44. package/skills/skill-chromedevtools/SKILL.md +0 -110
  45. package/skills/skill-chromedevtools/install.sh +0 -112
  46. package/skills/skill-chromedevtools/package.json +0 -31
  47. package/skills/skill-chromedevtools/src/auth.ts +0 -49
  48. package/skills/skill-chromedevtools/src/installer.ts +0 -324
  49. package/skills/skill-chromedevtools/src/skill-install.ts +0 -174
  50. package/skills/skill-companyguide/LICENSE +0 -21
  51. package/skills/skill-companyguide/README.md +0 -17
  52. package/skills/skill-companyguide/install.sh +0 -112
  53. package/skills/skill-companyguide/package.json +0 -31
  54. package/skills/skill-companyguide/src/auth.ts +0 -49
  55. package/skills/skill-companyguide/src/installer.ts +0 -324
  56. package/skills/skill-companyguide/src/skill-install.ts +0 -205
  57. package/skills/skill-compose-gmail/tsconfig.json +0 -14
  58. package/skills/skill-context7/LICENSE +0 -21
  59. package/skills/skill-context7/README.md +0 -27
  60. package/skills/skill-context7/SKILL.md +0 -103
  61. package/skills/skill-context7/install.sh +0 -112
  62. package/skills/skill-context7/package.json +0 -31
  63. package/skills/skill-context7/src/auth.ts +0 -49
  64. package/skills/skill-context7/src/installer.ts +0 -324
  65. package/skills/skill-context7/src/skill-install.ts +0 -174
  66. package/skills/skill-crawl/LICENSE +0 -21
  67. package/skills/skill-crawl/README.md +0 -17
  68. package/skills/skill-crawl/install.sh +0 -112
  69. package/skills/skill-crawl/package.json +0 -31
  70. package/skills/skill-crawl/src/auth.ts +0 -49
  71. package/skills/skill-crawl/src/installer.ts +0 -324
  72. package/skills/skill-crawl/src/skill-install.ts +0 -205
  73. package/skills/skill-csv-transformer/CLAUDE.md +0 -19
  74. package/skills/skill-csv-transformer/package.json +0 -32
  75. package/skills/skill-csv-transformer/src/index.ts +0 -81
  76. package/skills/skill-csv-transformer/tsconfig.json +0 -14
  77. package/skills/skill-debug/LICENSE +0 -21
  78. package/skills/skill-debug/README.md +0 -17
  79. package/skills/skill-debug/install.sh +0 -112
  80. package/skills/skill-debug/package.json +0 -31
  81. package/skills/skill-debug/src/auth.ts +0 -49
  82. package/skills/skill-debug/src/installer.ts +0 -324
  83. package/skills/skill-debug/src/skill-install.ts +0 -205
  84. package/skills/skill-deep-research/CLAUDE.md +0 -19
  85. package/skills/skill-deep-research/package.json +0 -32
  86. package/skills/skill-deep-research/src/index.ts +0 -1149
  87. package/skills/skill-deep-research/tsconfig.json +0 -14
  88. package/skills/skill-dns-manager/CLAUDE.md +0 -19
  89. package/skills/skill-dns-manager/package.json +0 -32
  90. package/skills/skill-dns-manager/src/index.ts +0 -92
  91. package/skills/skill-dns-manager/tsconfig.json +0 -14
  92. package/skills/skill-download/LICENSE +0 -21
  93. package/skills/skill-download/README.md +0 -17
  94. package/skills/skill-download/install.sh +0 -112
  95. package/skills/skill-download/package.json +0 -31
  96. package/skills/skill-download/src/auth.ts +0 -49
  97. package/skills/skill-download/src/installer.ts +0 -324
  98. package/skills/skill-download/src/skill-install.ts +0 -205
  99. package/skills/skill-exa/LICENSE +0 -21
  100. package/skills/skill-exa/README.md +0 -26
  101. package/skills/skill-exa/SKILL.md +0 -92
  102. package/skills/skill-exa/install.sh +0 -112
  103. package/skills/skill-exa/package.json +0 -31
  104. package/skills/skill-exa/src/auth.ts +0 -49
  105. package/skills/skill-exa/src/installer.ts +0 -324
  106. package/skills/skill-exa/src/skill-install.ts +0 -174
  107. package/skills/skill-filesearch/LICENSE +0 -21
  108. package/skills/skill-filesearch/README.md +0 -17
  109. package/skills/skill-filesearch/install.sh +0 -112
  110. package/skills/skill-filesearch/package.json +0 -31
  111. package/skills/skill-filesearch/src/auth.ts +0 -49
  112. package/skills/skill-filesearch/src/installer.ts +0 -324
  113. package/skills/skill-filesearch/src/skill-install.ts +0 -205
  114. package/skills/skill-fill/LICENSE +0 -21
  115. package/skills/skill-fill/README.md +0 -17
  116. package/skills/skill-fill/install.sh +0 -112
  117. package/skills/skill-fill/package.json +0 -31
  118. package/skills/skill-fill/src/auth.ts +0 -49
  119. package/skills/skill-fill/src/installer.ts +0 -324
  120. package/skills/skill-fill/src/skill-install.ts +0 -205
  121. package/skills/skill-generate-audio/CLAUDE.md +0 -3
  122. package/skills/skill-generate-audio/SKILL.md +0 -53
  123. package/skills/skill-generate-audio/package.json +0 -30
  124. package/skills/skill-generate-audio/src/index.ts +0 -656
  125. package/skills/skill-generate-audio/tsconfig.json +0 -18
  126. package/skills/skill-generate-readme/CLAUDE.md +0 -19
  127. package/skills/skill-generate-readme/package.json +0 -32
  128. package/skills/skill-generate-readme/src/index.ts +0 -867
  129. package/skills/skill-generate-readme/tsconfig.json +0 -14
  130. package/skills/skill-generate-slides/CLAUDE.md +0 -19
  131. package/skills/skill-generate-slides/package.json +0 -32
  132. package/skills/skill-generate-slides/src/ai.ts +0 -140
  133. package/skills/skill-generate-slides/src/cli.ts +0 -161
  134. package/skills/skill-generate-slides/src/export.ts +0 -65
  135. package/skills/skill-generate-slides/src/index.ts +0 -1417
  136. package/skills/skill-generate-slides/src/layout.ts +0 -31
  137. package/skills/skill-generate-slides/src/parse.ts +0 -282
  138. package/skills/skill-generate-slides/src/render.ts +0 -711
  139. package/skills/skill-generate-slides/tsconfig.json +0 -14
  140. package/skills/skill-get-api-docs/CLAUDE.md +0 -19
  141. package/skills/skill-get-api-docs/package.json +0 -32
  142. package/skills/skill-get-api-docs/src/index.ts +0 -1176
  143. package/skills/skill-get-api-docs/tsconfig.json +0 -14
  144. package/skills/skill-googledrive/LICENSE +0 -21
  145. package/skills/skill-googledrive/README.md +0 -27
  146. package/skills/skill-googledrive/SKILL.md +0 -140
  147. package/skills/skill-googledrive/install.sh +0 -112
  148. package/skills/skill-googledrive/package.json +0 -31
  149. package/skills/skill-googledrive/src/auth.ts +0 -49
  150. package/skills/skill-googledrive/src/installer.ts +0 -324
  151. package/skills/skill-googledrive/src/skill-install.ts +0 -174
  152. package/skills/skill-grant-compliance-scanner/CLAUDE.md +0 -19
  153. package/skills/skill-grant-compliance-scanner/package.json +0 -32
  154. package/skills/skill-grant-compliance-scanner/src/index.ts +0 -94
  155. package/skills/skill-grant-compliance-scanner/tsconfig.json +0 -14
  156. package/skills/skill-hubsearch/LICENSE +0 -21
  157. package/skills/skill-hubsearch/README.md +0 -17
  158. package/skills/skill-hubsearch/install.sh +0 -112
  159. package/skills/skill-hubsearch/package.json +0 -31
  160. package/skills/skill-hubsearch/src/auth.ts +0 -49
  161. package/skills/skill-hubsearch/src/installer.ts +0 -324
  162. package/skills/skill-hubsearch/src/skill-install.ts +0 -205
  163. package/skills/skill-implementation-architecture/CLAUDE.md +0 -19
  164. package/skills/skill-implementation-architecture/package.json +0 -32
  165. package/skills/skill-implementation-architecture/src/index.ts +0 -460
  166. package/skills/skill-implementation-architecture/tsconfig.json +0 -14
  167. package/skills/skill-implementation-audit/CLAUDE.md +0 -19
  168. package/skills/skill-implementation-audit/package.json +0 -32
  169. package/skills/skill-implementation-audit/src/index.ts +0 -502
  170. package/skills/skill-implementation-audit/tsconfig.json +0 -14
  171. package/skills/skill-implementation-cost/CLAUDE.md +0 -19
  172. package/skills/skill-implementation-cost/package.json +0 -32
  173. package/skills/skill-implementation-cost/src/index.ts +0 -873
  174. package/skills/skill-implementation-cost/tsconfig.json +0 -14
  175. package/skills/skill-implementation-dispatch/CLAUDE.md +0 -19
  176. package/skills/skill-implementation-dispatch/package.json +0 -32
  177. package/skills/skill-implementation-dispatch/src/index.ts +0 -390
  178. package/skills/skill-implementation-dispatch/tsconfig.json +0 -14
  179. package/skills/skill-implementation-hook/CLAUDE.md +0 -19
  180. package/skills/skill-implementation-hook/package.json +0 -32
  181. package/skills/skill-implementation-hook/src/index.ts +0 -787
  182. package/skills/skill-implementation-hook/tsconfig.json +0 -14
  183. package/skills/skill-implementation-index/CLAUDE.md +0 -19
  184. package/skills/skill-implementation-index/package.json +0 -32
  185. package/skills/skill-implementation-index/src/index.ts +0 -767
  186. package/skills/skill-implementation-index/tsconfig.json +0 -14
  187. package/skills/skill-implementation-init/CLAUDE.md +0 -19
  188. package/skills/skill-implementation-init/package.json +0 -32
  189. package/skills/skill-implementation-init/src/index.ts +0 -378
  190. package/skills/skill-implementation-init/tsconfig.json +0 -14
  191. package/skills/skill-implementation-memento/CLAUDE.md +0 -19
  192. package/skills/skill-implementation-memento/package.json +0 -32
  193. package/skills/skill-implementation-memento/src/index.ts +0 -442
  194. package/skills/skill-implementation-memento/tsconfig.json +0 -14
  195. package/skills/skill-linear/LICENSE +0 -21
  196. package/skills/skill-linear/README.md +0 -28
  197. package/skills/skill-linear/SKILL.md +0 -94
  198. package/skills/skill-linear/install.sh +0 -112
  199. package/skills/skill-linear/package.json +0 -31
  200. package/skills/skill-linear/src/auth.ts +0 -49
  201. package/skills/skill-linear/src/installer.ts +0 -324
  202. package/skills/skill-linear/src/skill-install.ts +0 -174
  203. package/skills/skill-mail/LICENSE +0 -21
  204. package/skills/skill-mail/README.md +0 -17
  205. package/skills/skill-mail/install.sh +0 -112
  206. package/skills/skill-mail/package.json +0 -31
  207. package/skills/skill-mail/src/auth.ts +0 -49
  208. package/skills/skill-mail/src/installer.ts +0 -324
  209. package/skills/skill-mail/src/skill-install.ts +0 -205
  210. package/skills/skill-manage-gmail/CLAUDE.md +0 -19
  211. package/skills/skill-manage-gmail/package.json +0 -32
  212. package/skills/skill-manage-gmail/src/index.ts +0 -504
  213. package/skills/skill-manage-gmail/tsconfig.json +0 -14
  214. package/skills/skill-merch-mockup-factory/CLAUDE.md +0 -19
  215. package/skills/skill-merch-mockup-factory/package.json +0 -32
  216. package/skills/skill-merch-mockup-factory/src/index.ts +0 -296
  217. package/skills/skill-merch-mockup-factory/tsconfig.json +0 -14
  218. package/skills/skill-message/LICENSE +0 -21
  219. package/skills/skill-message/README.md +0 -17
  220. package/skills/skill-message/install.sh +0 -112
  221. package/skills/skill-message/package.json +0 -31
  222. package/skills/skill-message/src/auth.ts +0 -49
  223. package/skills/skill-message/src/installer.ts +0 -324
  224. package/skills/skill-message/src/skill-install.ts +0 -205
  225. package/skills/skill-newsletter-campaign-planner/CLAUDE.md +0 -19
  226. package/skills/skill-newsletter-campaign-planner/package.json +0 -32
  227. package/skills/skill-newsletter-campaign-planner/src/index.ts +0 -252
  228. package/skills/skill-newsletter-campaign-planner/tsconfig.json +0 -14
  229. package/skills/skill-notify/LICENSE +0 -21
  230. package/skills/skill-notify/README.md +0 -17
  231. package/skills/skill-notify/install.sh +0 -112
  232. package/skills/skill-notify/package.json +0 -31
  233. package/skills/skill-notify/src/auth.ts +0 -49
  234. package/skills/skill-notify/src/installer.ts +0 -324
  235. package/skills/skill-notify/src/skill-install.ts +0 -205
  236. package/skills/skill-notion/LICENSE +0 -21
  237. package/skills/skill-notion/README.md +0 -27
  238. package/skills/skill-notion/SKILL.md +0 -115
  239. package/skills/skill-notion/install.sh +0 -112
  240. package/skills/skill-notion/package.json +0 -31
  241. package/skills/skill-notion/src/auth.ts +0 -49
  242. package/skills/skill-notion/src/installer.ts +0 -324
  243. package/skills/skill-notion/src/skill-install.ts +0 -174
  244. package/skills/skill-parse-pdf/CLAUDE.md +0 -19
  245. package/skills/skill-parse-pdf/package.json +0 -32
  246. package/skills/skill-parse-pdf/src/index.ts +0 -581
  247. package/skills/skill-parse-pdf/tsconfig.json +0 -14
  248. package/skills/skill-playwright/LICENSE +0 -21
  249. package/skills/skill-playwright/README.md +0 -27
  250. package/skills/skill-playwright/SKILL.md +0 -116
  251. package/skills/skill-playwright/install.sh +0 -112
  252. package/skills/skill-playwright/package.json +0 -31
  253. package/skills/skill-playwright/src/auth.ts +0 -49
  254. package/skills/skill-playwright/src/installer.ts +0 -324
  255. package/skills/skill-playwright/src/skill-install.ts +0 -174
  256. package/skills/skill-projectbuild/LICENSE +0 -21
  257. package/skills/skill-projectbuild/README.md +0 -17
  258. package/skills/skill-projectbuild/install.sh +0 -112
  259. package/skills/skill-projectbuild/package.json +0 -31
  260. package/skills/skill-projectbuild/src/auth.ts +0 -49
  261. package/skills/skill-projectbuild/src/installer.ts +0 -324
  262. package/skills/skill-projectbuild/src/skill-install.ts +0 -205
  263. package/skills/skill-read-gmail/CLAUDE.md +0 -19
  264. package/skills/skill-read-gmail/package.json +0 -32
  265. package/skills/skill-read-gmail/src/index.ts +0 -343
  266. package/skills/skill-read-gmail/tsconfig.json +0 -14
  267. package/skills/skill-remember/LICENSE +0 -21
  268. package/skills/skill-remember/README.md +0 -17
  269. package/skills/skill-remember/install.sh +0 -112
  270. package/skills/skill-remember/package.json +0 -31
  271. package/skills/skill-remember/src/auth.ts +0 -49
  272. package/skills/skill-remember/src/installer.ts +0 -324
  273. package/skills/skill-remember/src/skill-install.ts +0 -205
  274. package/skills/skill-schedule/README.md +0 -17
  275. package/skills/skill-schedule/install.sh +0 -112
  276. package/skills/skill-schedule/src/auth.ts +0 -49
  277. package/skills/skill-schedule/src/installer.ts +0 -324
  278. package/skills/skill-schedule/src/skill-install.ts +0 -205
  279. package/skills/skill-search/LICENSE +0 -21
  280. package/skills/skill-search/README.md +0 -17
  281. package/skills/skill-search/install.sh +0 -112
  282. package/skills/skill-search/package.json +0 -31
  283. package/skills/skill-search/src/auth.ts +0 -49
  284. package/skills/skill-search/src/installer.ts +0 -324
  285. package/skills/skill-search/src/skill-install.ts +0 -205
  286. package/skills/skill-shadcn/LICENSE +0 -21
  287. package/skills/skill-shadcn/README.md +0 -27
  288. package/skills/skill-shadcn/SKILL.md +0 -113
  289. package/skills/skill-shadcn/install.sh +0 -112
  290. package/skills/skill-shadcn/package.json +0 -31
  291. package/skills/skill-shadcn/src/auth.ts +0 -49
  292. package/skills/skill-shadcn/src/installer.ts +0 -324
  293. package/skills/skill-shadcn/src/skill-install.ts +0 -174
  294. package/skills/skill-shadcn-theme/CLAUDE.md +0 -19
  295. package/skills/skill-shadcn-theme/package.json +0 -32
  296. package/skills/skill-shadcn-theme/src/index.ts +0 -16
  297. package/skills/skill-shadcn-theme/tsconfig.json +0 -14
  298. package/skills/skill-social-template-kit/CLAUDE.md +0 -19
  299. package/skills/skill-social-template-kit/package.json +0 -32
  300. package/skills/skill-social-template-kit/src/index.ts +0 -303
  301. package/skills/skill-social-template-kit/tsconfig.json +0 -14
  302. package/skills/skill-summarize/LICENSE +0 -21
  303. package/skills/skill-summarize/README.md +0 -17
  304. package/skills/skill-summarize/install.sh +0 -112
  305. package/skills/skill-summarize/package.json +0 -31
  306. package/skills/skill-summarize/src/auth.ts +0 -49
  307. package/skills/skill-summarize/src/installer.ts +0 -324
  308. package/skills/skill-summarize/src/skill-install.ts +0 -205
  309. package/skills/skill-sync/LICENSE +0 -21
  310. package/skills/skill-sync/README.md +0 -17
  311. package/skills/skill-sync/install.sh +0 -112
  312. package/skills/skill-sync/package.json +0 -31
  313. package/skills/skill-sync/src/auth.ts +0 -49
  314. package/skills/skill-sync/src/installer.ts +0 -324
  315. package/skills/skill-sync/src/skill-install.ts +0 -205
  316. package/skills/skill-time-blocking-orchestrator/CLAUDE.md +0 -19
  317. package/skills/skill-time-blocking-orchestrator/package.json +0 -32
  318. package/skills/skill-time-blocking-orchestrator/src/index.ts +0 -328
  319. package/skills/skill-time-blocking-orchestrator/tsconfig.json +0 -14
  320. package/skills/skill-transform/.env.example +0 -2
  321. package/skills/skill-transform/LICENSE +0 -21
  322. package/skills/skill-transform/README.md +0 -17
  323. package/skills/skill-transform/SKILL.md +0 -127
  324. package/skills/skill-transform/install.sh +0 -112
  325. package/skills/skill-transform/package.json +0 -37
  326. package/skills/skill-transform/src/auth.ts +0 -49
  327. package/skills/skill-transform/src/http-client.ts +0 -128
  328. package/skills/skill-transform/src/index-http.ts +0 -111
  329. package/skills/skill-transform/src/index-local.ts +0 -368
  330. package/skills/skill-transform/src/index.ts +0 -111
  331. package/skills/skill-transform/src/installer.ts +0 -324
  332. package/skills/skill-transform/src/skill-install.ts +0 -205
  333. package/skills/skill-transform/src/transformers/ai-transformer.ts +0 -202
  334. package/skills/skill-transform/src/transformers/format-detector.ts +0 -147
  335. package/skills/skill-transform/src/types.ts +0 -95
  336. package/skills/skill-transform/tsconfig.json +0 -18
  337. package/skills/skill-translate/LICENSE +0 -21
  338. package/skills/skill-translate/README.md +0 -17
  339. package/skills/skill-translate/install.sh +0 -112
  340. package/skills/skill-translate/package.json +0 -31
  341. package/skills/skill-translate/src/auth.ts +0 -49
  342. package/skills/skill-translate/src/installer.ts +0 -324
  343. package/skills/skill-translate/src/skill-install.ts +0 -205
  344. package/skills/skill-vendor-comparison-coach/CLAUDE.md +0 -19
  345. package/skills/skill-vendor-comparison-coach/package.json +0 -32
  346. package/skills/skill-vendor-comparison-coach/src/index.ts +0 -337
  347. package/skills/skill-vendor-comparison-coach/tsconfig.json +0 -14
  348. package/skills/skill-videodownload/.env.example +0 -5
  349. package/skills/skill-videodownload/CLAUDE.md +0 -64
  350. package/skills/skill-videodownload/LICENSE +0 -21
  351. package/skills/skill-videodownload/README.md +0 -166
  352. package/skills/skill-videodownload/package.json +0 -49
  353. package/skills/skill-videodownload/src/commands/config.ts +0 -89
  354. package/skills/skill-videodownload/src/commands/download.ts +0 -61
  355. package/skills/skill-videodownload/src/commands/info.ts +0 -83
  356. package/skills/skill-videodownload/src/commands/list.ts +0 -84
  357. package/skills/skill-videodownload/src/lib/downloader.ts +0 -270
  358. package/skills/skill-videodownload/src/lib/storage.ts +0 -167
  359. package/skills/skill-videodownload/src/types/index.ts +0 -64
  360. package/skills/skill-videodownload/src/utils/logger.ts +0 -49
  361. package/skills/skill-videodownload/src/utils/paths.ts +0 -94
  362. package/skills/skill-videodownload/tsconfig.json +0 -17
  363. package/skills/skill-voiceover/.env.example +0 -5
  364. package/skills/skill-voiceover/CLAUDE.md +0 -40
  365. package/skills/skill-voiceover/LICENSE +0 -21
  366. package/skills/skill-voiceover/README.md +0 -64
  367. package/skills/skill-voiceover/package.json +0 -43
  368. package/skills/skill-voiceover/src/commands/config.ts +0 -38
  369. package/skills/skill-voiceover/src/commands/generate.ts +0 -37
  370. package/skills/skill-voiceover/src/commands/voices.ts +0 -33
  371. package/skills/skill-voiceover/src/lib/generator.ts +0 -159
  372. package/skills/skill-voiceover/src/lib/storage.ts +0 -55
  373. package/skills/skill-voiceover/src/types/index.ts +0 -55
  374. package/skills/skill-voiceover/src/utils/logger.ts +0 -30
  375. package/skills/skill-voiceover/src/utils/paths.ts +0 -22
  376. package/skills/skill-voiceover/tsconfig.json +0 -17
  377. package/skills/skill-websearch/LICENSE +0 -21
  378. package/skills/skill-websearch/README.md +0 -17
  379. package/skills/skill-websearch/install.sh +0 -112
  380. package/skills/skill-websearch/package.json +0 -31
  381. package/skills/skill-websearch/src/auth.ts +0 -49
  382. package/skills/skill-websearch/src/installer.ts +0 -324
  383. package/skills/skill-websearch/src/skill-install.ts +0 -205
  384. /package/skills/{skill-compose-gmail → skill-gmail}/CLAUDE.md +0 -0
  385. /package/skills/{skill-compose-gmail → skill-gmail}/package.json +0 -0
  386. /package/skills/{skill-compose-gmail → skill-gmail}/src/index.ts +0 -0
  387. /package/skills/{skill-architecture-docs → skill-gmail}/tsconfig.json +0 -0
@@ -1,767 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import * as fs from "fs";
4
- import * as path from "path";
5
- import minimist from "minimist";
6
-
7
- // Types
8
- interface TodoItem {
9
- id: string;
10
- slug: string;
11
- title: string;
12
- status: string;
13
- priority: string;
14
- assignee?: string;
15
- due?: string;
16
- tags: string[];
17
- created: string;
18
- updated: string;
19
- format: "md" | "json";
20
- filename: string;
21
- }
22
-
23
- interface PlanItem {
24
- id: string;
25
- slug: string;
26
- title: string;
27
- status: string;
28
- owner?: string;
29
- phases: string[];
30
- start?: string;
31
- end?: string;
32
- tags: string[];
33
- created: string;
34
- updated: string;
35
- filename: string;
36
- }
37
-
38
- interface AuditItem {
39
- id: string;
40
- slug: string;
41
- title: string;
42
- category: string;
43
- status: string;
44
- scope?: string;
45
- auditor?: string;
46
- findings: number;
47
- tags: string[];
48
- created: string;
49
- updated: string;
50
- filename: string;
51
- }
52
-
53
- interface ArchitectureItem {
54
- id: string;
55
- slug: string;
56
- title: string;
57
- status: string;
58
- date: string;
59
- filename: string;
60
- }
61
-
62
- interface MementoItem {
63
- id: string;
64
- slug: string;
65
- title: string;
66
- category: string;
67
- tags: string[];
68
- created: string;
69
- updated: string;
70
- filename: string;
71
- }
72
-
73
- // Parse command line arguments
74
- const args = minimist(process.argv.slice(2), {
75
- string: ["only", "sort"],
76
- boolean: ["reverse", "include-completed", "stats", "help"],
77
- default: {
78
- sort: "date",
79
- reverse: false,
80
- "include-completed": true,
81
- stats: true,
82
- },
83
- alias: {
84
- o: "only",
85
- s: "sort",
86
- r: "reverse",
87
- h: "help",
88
- },
89
- });
90
-
91
- // Show help
92
- if (args.help) {
93
- console.log(`
94
- Implementation Indexes - Regenerate index files from existing data
95
-
96
- Usage:
97
- skills run implementation-indexes [options]
98
-
99
- Options:
100
- -o, --only <type> Rebuild only: todos, plans, audits, architecture, mementos
101
- -s, --sort <by> Sort by: date, status, priority, name (default: date)
102
- -r, --reverse Reverse sort order
103
- --include-completed Include completed items (default: true)
104
- --stats Show statistics summary (default: true)
105
- -h, --help Show this help
106
-
107
- Examples:
108
- skills run implementation-index
109
- skills run implementation-index -- --only todos
110
- skills run implementation-index -- --only mementos
111
- skills run implementation-index -- --sort priority --reverse
112
- `);
113
- process.exit(0);
114
- }
115
-
116
- // Find .implementation directory
117
- function findImplementationDir(): string | null {
118
- // Use SKILLS_CWD if available (user's working directory from remote execution)
119
- let currentDir = process.env.SKILLS_CWD || process.cwd();
120
-
121
- while (currentDir !== path.dirname(currentDir)) {
122
- const implDir = path.join(currentDir, ".implementation");
123
- if (fs.existsSync(implDir)) {
124
- return implDir;
125
- }
126
- currentDir = path.dirname(currentDir);
127
- }
128
-
129
- return null;
130
- }
131
-
132
- const implDir = findImplementationDir();
133
-
134
- if (!implDir) {
135
- console.error("Error: .implementation directory not found");
136
- console.error("Run 'skills run implementation-init' first to create the folder structure");
137
- process.exit(1);
138
- }
139
-
140
- // Get project name from parent directory
141
- const projectName = path.basename(path.dirname(implDir));
142
- const timestamp = new Date().toISOString().split("T")[0];
143
-
144
- // Parse markdown frontmatter-style metadata
145
- function parseMarkdownMeta(content: string): Record<string, string> {
146
- const meta: Record<string, string> = {};
147
- const lines = content.split("\n");
148
-
149
- for (const line of lines) {
150
- const match = line.match(/^-\s*\*\*([^*]+)\*\*:\s*(.+)$/);
151
- if (match) {
152
- const key = match[1].toLowerCase().trim();
153
- const value = match[2].trim().replace(/`/g, "");
154
- meta[key] = value;
155
- }
156
- }
157
-
158
- return meta;
159
- }
160
-
161
- // Parse todos
162
- function parseTodos(): TodoItem[] {
163
- const todos: TodoItem[] = [];
164
- const jsonDir = path.join(implDir, "data", "todos", "json");
165
- const mdDir = path.join(implDir, "data", "todos", "md");
166
-
167
- // Parse JSON todos
168
- if (fs.existsSync(jsonDir)) {
169
- const files = fs.readdirSync(jsonDir).filter((f) => f.endsWith(".json") && f.startsWith("todo_"));
170
- for (const file of files) {
171
- try {
172
- const content = fs.readFileSync(path.join(jsonDir, file), "utf-8");
173
- const data = JSON.parse(content);
174
- todos.push({
175
- id: data.id || file.replace(".json", ""),
176
- slug: data.slug || "",
177
- title: data.title || "",
178
- status: data.status || "pending",
179
- priority: data.priority || "medium",
180
- assignee: data.assignee,
181
- due: data.due,
182
- tags: data.tags || [],
183
- created: data.created || "",
184
- updated: data.updated || "",
185
- format: "json",
186
- filename: file,
187
- });
188
- } catch (e) {
189
- console.error(`Warning: Could not parse ${file}`);
190
- }
191
- }
192
- }
193
-
194
- // Parse MD todos
195
- if (fs.existsSync(mdDir)) {
196
- const files = fs.readdirSync(mdDir).filter((f) => f.endsWith(".md") && f.startsWith("todo_"));
197
- for (const file of files) {
198
- try {
199
- const content = fs.readFileSync(path.join(mdDir, file), "utf-8");
200
- const meta = parseMarkdownMeta(content);
201
- const titleMatch = content.match(/^#\s*Todo:\s*(.+)$/m);
202
-
203
- todos.push({
204
- id: meta.id || file.replace(".md", ""),
205
- slug: meta.slug || "",
206
- title: titleMatch ? titleMatch[1].trim() : "",
207
- status: meta.status || "pending",
208
- priority: meta.priority || "medium",
209
- assignee: meta.assignee,
210
- due: meta.due,
211
- tags: meta.tags ? meta.tags.split(",").map((t) => t.trim()) : [],
212
- created: meta.created || "",
213
- updated: meta.updated || "",
214
- format: "md",
215
- filename: file,
216
- });
217
- } catch (e) {
218
- console.error(`Warning: Could not parse ${file}`);
219
- }
220
- }
221
- }
222
-
223
- return todos;
224
- }
225
-
226
- // Parse plans
227
- function parsePlans(): PlanItem[] {
228
- const plans: PlanItem[] = [];
229
- const plansDir = path.join(implDir, "data", "plans");
230
-
231
- if (!fs.existsSync(plansDir)) return plans;
232
-
233
- const files = fs.readdirSync(plansDir).filter((f) => f.endsWith(".md") && f.startsWith("plan_"));
234
- for (const file of files) {
235
- try {
236
- const content = fs.readFileSync(path.join(plansDir, file), "utf-8");
237
- const meta = parseMarkdownMeta(content);
238
- const titleMatch = content.match(/^#\s*Plan:\s*(.+)$/m);
239
-
240
- // Count phases
241
- const phaseMatches = content.match(/^###\s*Phase\s+\d+/gm) || [];
242
-
243
- plans.push({
244
- id: meta.id || file.replace(".md", ""),
245
- slug: meta.slug || "",
246
- title: titleMatch ? titleMatch[1].trim() : "",
247
- status: meta.status || "draft",
248
- owner: meta.owner,
249
- phases: new Array(phaseMatches.length).fill(""),
250
- start: meta.start,
251
- end: meta.end,
252
- tags: meta.tags ? meta.tags.split(",").map((t) => t.trim()) : [],
253
- created: meta.created || "",
254
- updated: meta.updated || "",
255
- filename: file,
256
- });
257
- } catch (e) {
258
- console.error(`Warning: Could not parse ${file}`);
259
- }
260
- }
261
-
262
- return plans;
263
- }
264
-
265
- // Parse audits
266
- function parseAudits(): AuditItem[] {
267
- const audits: AuditItem[] = [];
268
- const auditsDir = path.join(implDir, "data", "audits");
269
-
270
- if (!fs.existsSync(auditsDir)) return audits;
271
-
272
- const files = fs.readdirSync(auditsDir).filter((f) => f.endsWith(".md") && f.startsWith("audit_"));
273
- for (const file of files) {
274
- try {
275
- const content = fs.readFileSync(path.join(auditsDir, file), "utf-8");
276
- const meta = parseMarkdownMeta(content);
277
- const titleMatch = content.match(/^#\s*Audit:\s*(.+)$/m);
278
-
279
- // Count findings (look for table rows that aren't headers or "No findings")
280
- const findingsMatches = content.match(/^\|\s*[A-Z0-9_-]+\s*\|/gm) || [];
281
- const findings = findingsMatches.filter((m) => !m.includes("No ") && !m.includes("ID")).length;
282
-
283
- audits.push({
284
- id: meta.id || file.replace(".md", ""),
285
- slug: meta.slug || "",
286
- title: titleMatch ? titleMatch[1].trim() : "",
287
- category: meta.category || "general",
288
- status: meta.status || "in_progress",
289
- scope: meta.scope,
290
- auditor: meta.auditor,
291
- findings,
292
- tags: meta.tags ? meta.tags.split(",").map((t) => t.trim()) : [],
293
- created: meta.created || "",
294
- updated: meta.updated || "",
295
- filename: file,
296
- });
297
- } catch (e) {
298
- console.error(`Warning: Could not parse ${file}`);
299
- }
300
- }
301
-
302
- return audits;
303
- }
304
-
305
- // Parse architecture
306
- function parseArchitecture(): ArchitectureItem[] {
307
- const items: ArchitectureItem[] = [];
308
- const archDir = path.join(implDir, "data", "architecture");
309
-
310
- if (!fs.existsSync(archDir)) return items;
311
-
312
- const files = fs.readdirSync(archDir).filter((f) => f.endsWith(".md") && !f.startsWith("."));
313
- for (const file of files) {
314
- try {
315
- const content = fs.readFileSync(path.join(archDir, file), "utf-8");
316
- const meta = parseMarkdownMeta(content);
317
- const titleMatch = content.match(/^#\s*(?:ADR|Architecture):\s*(.+)$/m) || content.match(/^#\s*(.+)$/m);
318
-
319
- // Extract ID from filename or generate one
320
- const idMatch = file.match(/^(adr_\d{5}|arch_\d{5})/);
321
- const id = idMatch ? idMatch[1] : file.replace(".md", "");
322
-
323
- items.push({
324
- id,
325
- slug: meta.slug || file.replace(".md", "").replace(/^(adr|arch)_\d{5}_/, ""),
326
- title: titleMatch ? titleMatch[1].trim() : file.replace(".md", ""),
327
- status: meta.status || "proposed",
328
- date: meta.created || meta.date || "",
329
- filename: file,
330
- });
331
- } catch (e) {
332
- console.error(`Warning: Could not parse ${file}`);
333
- }
334
- }
335
-
336
- return items;
337
- }
338
-
339
- // Parse mementos
340
- function parseMementos(): MementoItem[] {
341
- const mementos: MementoItem[] = [];
342
- const mementosDir = path.join(implDir, "data", "mementos");
343
-
344
- if (!fs.existsSync(mementosDir)) return mementos;
345
-
346
- const files = fs.readdirSync(mementosDir).filter((f) => f.endsWith(".md") && f.startsWith("memento_"));
347
- for (const file of files) {
348
- try {
349
- const content = fs.readFileSync(path.join(mementosDir, file), "utf-8");
350
- const meta = parseMarkdownMeta(content);
351
- const titleMatch = content.match(/^#\s*Memento:\s*(.+)$/m);
352
-
353
- mementos.push({
354
- id: meta.id || file.replace(".md", ""),
355
- slug: meta.slug || "",
356
- title: titleMatch ? titleMatch[1].trim() : "",
357
- category: meta.category || "note",
358
- tags: meta.tags ? meta.tags.split(",").map((t) => t.trim()) : [],
359
- created: meta.created || "",
360
- updated: meta.updated || "",
361
- filename: file,
362
- });
363
- } catch (e) {
364
- console.error(`Warning: Could not parse ${file}`);
365
- }
366
- }
367
-
368
- return mementos;
369
- }
370
-
371
- // Sort items
372
- function sortItems<T extends { created?: string; status?: string; priority?: string; title?: string; slug?: string }>(
373
- items: T[],
374
- sortBy: string,
375
- reverse: boolean
376
- ): T[] {
377
- const priorityOrder: Record<string, number> = { critical: 0, high: 1, medium: 2, low: 3 };
378
- const statusOrder: Record<string, number> = { in_progress: 0, pending: 1, draft: 2, blocked: 3, completed: 4, reviewed: 5 };
379
-
380
- const sorted = [...items].sort((a, b) => {
381
- let comparison = 0;
382
-
383
- switch (sortBy) {
384
- case "date":
385
- comparison = (b.created || "").localeCompare(a.created || "");
386
- break;
387
- case "status":
388
- comparison = (statusOrder[a.status || ""] || 99) - (statusOrder[b.status || ""] || 99);
389
- break;
390
- case "priority":
391
- comparison = (priorityOrder[(a as any).priority || ""] || 99) - (priorityOrder[(b as any).priority || ""] || 99);
392
- break;
393
- case "name":
394
- comparison = (a.title || a.slug || "").localeCompare(b.title || b.slug || "");
395
- break;
396
- default:
397
- comparison = (b.created || "").localeCompare(a.created || "");
398
- }
399
-
400
- return reverse ? -comparison : comparison;
401
- });
402
-
403
- return sorted;
404
- }
405
-
406
- // Generate TODOS.md
407
- function generateTodosIndex(todos: TodoItem[]): string {
408
- const sorted = sortItems(todos, args.sort, args.reverse);
409
- const active = sorted.filter((t) => t.status !== "completed");
410
- const completed = sorted.filter((t) => t.status === "completed");
411
-
412
- let content = `# Todos Index\n\n`;
413
- content += `**Project:** ${projectName}\n`;
414
- content += `**Updated:** ${timestamp}\n\n`;
415
-
416
- // Summary
417
- if (args.stats) {
418
- const statusCounts: Record<string, number> = {};
419
- for (const todo of todos) {
420
- statusCounts[todo.status] = (statusCounts[todo.status] || 0) + 1;
421
- }
422
-
423
- content += `## Summary\n\n`;
424
- content += `| Status | Count |\n`;
425
- content += `|--------|-------|\n`;
426
- for (const [status, count] of Object.entries(statusCounts).sort()) {
427
- content += `| ${status} | ${count} |\n`;
428
- }
429
- content += `| **Total** | **${todos.length}** |\n\n`;
430
-
431
- // Priority breakdown
432
- const priorityCounts: Record<string, number> = {};
433
- for (const todo of active) {
434
- priorityCounts[todo.priority] = (priorityCounts[todo.priority] || 0) + 1;
435
- }
436
- if (Object.keys(priorityCounts).length > 0) {
437
- content += `### By Priority (Active)\n\n`;
438
- content += `| Priority | Count |\n`;
439
- content += `|----------|-------|\n`;
440
- const priorityOrder = ["critical", "high", "medium", "low"];
441
- for (const priority of priorityOrder) {
442
- if (priorityCounts[priority]) {
443
- content += `| ${priority} | ${priorityCounts[priority]} |\n`;
444
- }
445
- }
446
- content += `\n`;
447
- }
448
- }
449
-
450
- // Active todos
451
- content += `## Active Todos\n\n`;
452
- if (active.length === 0) {
453
- content += `No active todos.\n\n`;
454
- } else {
455
- content += `| ID | Slug | Title | Status | Priority | Assignee | Due | Created |\n`;
456
- content += `|----|------|-------|--------|----------|----------|-----|--------|\n`;
457
- for (const todo of active) {
458
- content += `| ${todo.id} | ${todo.slug} | ${todo.title} | ${todo.status} | ${todo.priority} | ${todo.assignee || "-"} | ${todo.due || "-"} | ${todo.created} |\n`;
459
- }
460
- content += `\n`;
461
- }
462
-
463
- // Completed todos
464
- if (args["include-completed"] && completed.length > 0) {
465
- content += `## Completed Todos\n\n`;
466
- content += `| ID | Slug | Title | Completed |\n`;
467
- content += `|----|------|-------|----------|\n`;
468
- for (const todo of completed) {
469
- content += `| ${todo.id} | ${todo.slug} | ${todo.title} | ${todo.updated || todo.created} |\n`;
470
- }
471
- content += `\n`;
472
- }
473
-
474
- content += `---\n\n*Generated by implementation-indexes*\n`;
475
-
476
- return content;
477
- }
478
-
479
- // Generate PLANS.md
480
- function generatePlansIndex(plans: PlanItem[]): string {
481
- const sorted = sortItems(plans, args.sort, args.reverse);
482
- const active = sorted.filter((p) => p.status !== "completed" && p.status !== "cancelled");
483
- const completed = sorted.filter((p) => p.status === "completed");
484
-
485
- let content = `# Plans Index\n\n`;
486
- content += `**Project:** ${projectName}\n`;
487
- content += `**Updated:** ${timestamp}\n\n`;
488
-
489
- // Summary
490
- if (args.stats) {
491
- const statusCounts: Record<string, number> = {};
492
- for (const plan of plans) {
493
- statusCounts[plan.status] = (statusCounts[plan.status] || 0) + 1;
494
- }
495
-
496
- content += `## Summary\n\n`;
497
- content += `| Status | Count |\n`;
498
- content += `|--------|-------|\n`;
499
- for (const [status, count] of Object.entries(statusCounts).sort()) {
500
- content += `| ${status} | ${count} |\n`;
501
- }
502
- content += `| **Total** | **${plans.length}** |\n\n`;
503
- }
504
-
505
- // Active plans
506
- content += `## Active Plans\n\n`;
507
- if (active.length === 0) {
508
- content += `No active plans.\n\n`;
509
- } else {
510
- content += `| ID | Slug | Title | Status | Owner | Phases | Start | End | Created |\n`;
511
- content += `|----|------|-------|--------|-------|--------|-------|-----|--------|\n`;
512
- for (const plan of active) {
513
- content += `| ${plan.id} | ${plan.slug} | ${plan.title} | ${plan.status} | ${plan.owner || "-"} | ${plan.phases.length} | ${plan.start || "-"} | ${plan.end || "-"} | ${plan.created} |\n`;
514
- }
515
- content += `\n`;
516
- }
517
-
518
- // Completed plans
519
- if (args["include-completed"] && completed.length > 0) {
520
- content += `## Completed Plans\n\n`;
521
- content += `| ID | Slug | Title | Owner | Completed |\n`;
522
- content += `|----|------|-------|-------|----------|\n`;
523
- for (const plan of completed) {
524
- content += `| ${plan.id} | ${plan.slug} | ${plan.title} | ${plan.owner || "-"} | ${plan.updated || plan.created} |\n`;
525
- }
526
- content += `\n`;
527
- }
528
-
529
- content += `---\n\n*Generated by implementation-indexes*\n`;
530
-
531
- return content;
532
- }
533
-
534
- // Generate AUDITS.md
535
- function generateAuditsIndex(audits: AuditItem[]): string {
536
- const sorted = sortItems(audits, args.sort, args.reverse);
537
-
538
- let content = `# Audits Index\n\n`;
539
- content += `**Project:** ${projectName}\n`;
540
- content += `**Updated:** ${timestamp}\n\n`;
541
-
542
- // Summary
543
- if (args.stats) {
544
- const categoryCounts: Record<string, { count: number; findings: number }> = {};
545
- for (const audit of audits) {
546
- if (!categoryCounts[audit.category]) {
547
- categoryCounts[audit.category] = { count: 0, findings: 0 };
548
- }
549
- categoryCounts[audit.category].count++;
550
- categoryCounts[audit.category].findings += audit.findings;
551
- }
552
-
553
- const totalFindings = audits.reduce((sum, a) => sum + a.findings, 0);
554
-
555
- content += `## Summary\n\n`;
556
- content += `| Category | Count | Findings |\n`;
557
- content += `|----------|-------|----------|\n`;
558
- for (const [category, data] of Object.entries(categoryCounts).sort()) {
559
- content += `| ${category} | ${data.count} | ${data.findings} |\n`;
560
- }
561
- content += `| **Total** | **${audits.length}** | **${totalFindings}** |\n\n`;
562
-
563
- // Status breakdown
564
- const statusCounts: Record<string, number> = {};
565
- for (const audit of audits) {
566
- statusCounts[audit.status] = (statusCounts[audit.status] || 0) + 1;
567
- }
568
- content += `### By Status\n\n`;
569
- content += `| Status | Count |\n`;
570
- content += `|--------|-------|\n`;
571
- for (const [status, count] of Object.entries(statusCounts).sort()) {
572
- content += `| ${status} | ${count} |\n`;
573
- }
574
- content += `\n`;
575
- }
576
-
577
- // All audits
578
- content += `## Recent Audits\n\n`;
579
- if (sorted.length === 0) {
580
- content += `No audits yet.\n\n`;
581
- } else {
582
- content += `| ID | Slug | Title | Category | Status | Auditor | Findings | Created |\n`;
583
- content += `|----|------|-------|----------|--------|---------|----------|--------|\n`;
584
- for (const audit of sorted) {
585
- content += `| ${audit.id} | ${audit.slug} | ${audit.title} | ${audit.category} | ${audit.status} | ${audit.auditor || "-"} | ${audit.findings} | ${audit.created} |\n`;
586
- }
587
- content += `\n`;
588
- }
589
-
590
- content += `---\n\n*Generated by implementation-indexes*\n`;
591
-
592
- return content;
593
- }
594
-
595
- // Generate ARCHITECTURE.md
596
- function generateArchitectureIndex(items: ArchitectureItem[]): string {
597
- const sorted = sortItems(items, args.sort, args.reverse);
598
-
599
- let content = `# Architecture Index\n\n`;
600
- content += `**Project:** ${projectName}\n`;
601
- content += `**Updated:** ${timestamp}\n\n`;
602
-
603
- // Summary
604
- if (args.stats) {
605
- const statusCounts: Record<string, number> = {};
606
- for (const item of items) {
607
- statusCounts[item.status] = (statusCounts[item.status] || 0) + 1;
608
- }
609
-
610
- content += `## Summary\n\n`;
611
- content += `| Status | Count |\n`;
612
- content += `|--------|-------|\n`;
613
- for (const [status, count] of Object.entries(statusCounts).sort()) {
614
- content += `| ${status} | ${count} |\n`;
615
- }
616
- content += `| **Total** | **${items.length}** |\n\n`;
617
- }
618
-
619
- // All items
620
- content += `## Architecture Decision Records\n\n`;
621
- if (sorted.length === 0) {
622
- content += `No architecture decision records yet.\n\n`;
623
- } else {
624
- content += `| ID | Slug | Title | Status | Date |\n`;
625
- content += `|----|------|-------|--------|------|\n`;
626
- for (const item of sorted) {
627
- content += `| ${item.id} | ${item.slug} | ${item.title} | ${item.status} | ${item.date || "-"} |\n`;
628
- }
629
- content += `\n`;
630
- }
631
-
632
- content += `---\n\n*Generated by implementation-index*\n`;
633
-
634
- return content;
635
- }
636
-
637
- // Generate MEMENTOS.md
638
- function generateMementosIndex(mementos: MementoItem[]): string {
639
- const sorted = sortItems(mementos, args.sort, args.reverse);
640
-
641
- let content = `# Mementos Index\n\n`;
642
- content += `**Project:** ${projectName}\n`;
643
- content += `**Updated:** ${timestamp}\n\n`;
644
-
645
- // Summary
646
- if (args.stats) {
647
- const categoryCounts: Record<string, number> = {};
648
- for (const memento of mementos) {
649
- categoryCounts[memento.category] = (categoryCounts[memento.category] || 0) + 1;
650
- }
651
-
652
- content += `## Summary\n\n`;
653
- content += `| Category | Count |\n`;
654
- content += `|----------|-------|\n`;
655
- for (const [category, count] of Object.entries(categoryCounts).sort()) {
656
- content += `| ${category} | ${count} |\n`;
657
- }
658
- content += `| **Total** | **${mementos.length}** |\n\n`;
659
- }
660
-
661
- // All mementos
662
- content += `## Recent Mementos\n\n`;
663
- if (sorted.length === 0) {
664
- content += `No mementos yet.\n\n`;
665
- } else {
666
- content += `| ID | Slug | Title | Category | Created |\n`;
667
- content += `|----|------|-------|----------|--------|\n`;
668
- for (const memento of sorted) {
669
- content += `| ${memento.id} | ${memento.slug} | ${memento.title} | ${memento.category} | ${memento.created} |\n`;
670
- }
671
- content += `\n`;
672
- }
673
-
674
- content += `---\n\n*Generated by implementation-index*\n`;
675
-
676
- return content;
677
- }
678
-
679
- // Main execution
680
- async function main(): Promise<void> {
681
- console.log(`\nImplementation Indexes`);
682
- console.log(`======================\n`);
683
- console.log(`Project: ${projectName}`);
684
- console.log(`Sort by: ${args.sort}${args.reverse ? " (reversed)" : ""}\n`);
685
-
686
- const only = args.only as string | undefined;
687
- const indexesDir = path.join(implDir, "data", "indexes");
688
-
689
- if (!fs.existsSync(indexesDir)) {
690
- fs.mkdirSync(indexesDir, { recursive: true });
691
- }
692
-
693
- let todosCount = 0;
694
- let plansCount = 0;
695
- let auditsCount = 0;
696
- let archCount = 0;
697
- let mementosCount = 0;
698
-
699
- // Rebuild TODOS.md
700
- if (!only || only === "todos") {
701
- console.log(`Scanning todos...`);
702
- const todos = parseTodos();
703
- todosCount = todos.length;
704
- const content = generateTodosIndex(todos);
705
- fs.writeFileSync(path.join(indexesDir, "TODOS.md"), content);
706
- console.log(` Found ${todos.length} todos`);
707
- console.log(` Updated: TODOS.md`);
708
- }
709
-
710
- // Rebuild PLANS.md
711
- if (!only || only === "plans") {
712
- console.log(`Scanning plans...`);
713
- const plans = parsePlans();
714
- plansCount = plans.length;
715
- const content = generatePlansIndex(plans);
716
- fs.writeFileSync(path.join(indexesDir, "PLANS.md"), content);
717
- console.log(` Found ${plans.length} plans`);
718
- console.log(` Updated: PLANS.md`);
719
- }
720
-
721
- // Rebuild AUDITS.md
722
- if (!only || only === "audits") {
723
- console.log(`Scanning audits...`);
724
- const audits = parseAudits();
725
- auditsCount = audits.length;
726
- const content = generateAuditsIndex(audits);
727
- fs.writeFileSync(path.join(indexesDir, "AUDITS.md"), content);
728
- console.log(` Found ${audits.length} audits`);
729
- console.log(` Updated: AUDITS.md`);
730
- }
731
-
732
- // Rebuild ARCHITECTURE.md
733
- if (!only || only === "architecture") {
734
- console.log(`Scanning architecture...`);
735
- const items = parseArchitecture();
736
- archCount = items.length;
737
- const content = generateArchitectureIndex(items);
738
- fs.writeFileSync(path.join(indexesDir, "ARCHITECTURE.md"), content);
739
- console.log(` Found ${items.length} architecture records`);
740
- console.log(` Updated: ARCHITECTURE.md`);
741
- }
742
-
743
- // Rebuild MEMENTOS.md
744
- if (!only || only === "mementos") {
745
- console.log(`Scanning mementos...`);
746
- const mementos = parseMementos();
747
- mementosCount = mementos.length;
748
- const content = generateMementosIndex(mementos);
749
- fs.writeFileSync(path.join(indexesDir, "MEMENTOS.md"), content);
750
- console.log(` Found ${mementos.length} mementos`);
751
- console.log(` Updated: MEMENTOS.md`);
752
- }
753
-
754
- console.log(`\n${"=".repeat(40)}`);
755
- console.log(`\nIndexes regenerated successfully!`);
756
- console.log(`\nSummary:`);
757
- if (!only || only === "todos") console.log(` Todos: ${todosCount}`);
758
- if (!only || only === "plans") console.log(` Plans: ${plansCount}`);
759
- if (!only || only === "audits") console.log(` Audits: ${auditsCount}`);
760
- if (!only || only === "architecture") console.log(` Architecture: ${archCount}`);
761
- if (!only || only === "mementos") console.log(` Mementos: ${mementosCount}`);
762
- }
763
-
764
- main().catch((error) => {
765
- console.error(`Error: ${error.message}`);
766
- process.exit(1);
767
- });