@shirokuma-library/shirokuma-docs 0.1.0-alpha.5

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.

Potentially problematic release.


This version of @shirokuma-library/shirokuma-docs might be problematic. Click here for more details.

Files changed (753) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +308 -0
  3. package/README.md +308 -0
  4. package/THIRD_PARTY_NOTICES.md +18 -0
  5. package/bin/shirokuma-docs +2 -0
  6. package/dist/analyzers/details-test-analysis.d.ts +31 -0
  7. package/dist/analyzers/details-test-analysis.d.ts.map +1 -0
  8. package/dist/analyzers/details-test-analysis.js +172 -0
  9. package/dist/analyzers/details-test-analysis.js.map +1 -0
  10. package/dist/analyzers/feature-map-builder.d.ts +20 -0
  11. package/dist/analyzers/feature-map-builder.d.ts.map +1 -0
  12. package/dist/analyzers/feature-map-builder.js +154 -0
  13. package/dist/analyzers/feature-map-builder.js.map +1 -0
  14. package/dist/analyzers/feature-map-references.d.ts +34 -0
  15. package/dist/analyzers/feature-map-references.d.ts.map +1 -0
  16. package/dist/analyzers/feature-map-references.js +249 -0
  17. package/dist/analyzers/feature-map-references.js.map +1 -0
  18. package/dist/analyzers/reference-analyzer.d.ts +95 -0
  19. package/dist/analyzers/reference-analyzer.d.ts.map +1 -0
  20. package/dist/analyzers/reference-analyzer.js +372 -0
  21. package/dist/analyzers/reference-analyzer.js.map +1 -0
  22. package/dist/commands/adr.d.ts +26 -0
  23. package/dist/commands/adr.d.ts.map +1 -0
  24. package/dist/commands/adr.js +129 -0
  25. package/dist/commands/adr.js.map +1 -0
  26. package/dist/commands/api-tools.d.ts +83 -0
  27. package/dist/commands/api-tools.d.ts.map +1 -0
  28. package/dist/commands/api-tools.js +775 -0
  29. package/dist/commands/api-tools.js.map +1 -0
  30. package/dist/commands/coverage.d.ts +139 -0
  31. package/dist/commands/coverage.d.ts.map +1 -0
  32. package/dist/commands/coverage.js +481 -0
  33. package/dist/commands/coverage.js.map +1 -0
  34. package/dist/commands/deps.d.ts +24 -0
  35. package/dist/commands/deps.d.ts.map +1 -0
  36. package/dist/commands/deps.js +211 -0
  37. package/dist/commands/deps.js.map +1 -0
  38. package/dist/commands/details-context.d.ts +38 -0
  39. package/dist/commands/details-context.d.ts.map +1 -0
  40. package/dist/commands/details-context.js +193 -0
  41. package/dist/commands/details-context.js.map +1 -0
  42. package/dist/commands/details-types.d.ts +315 -0
  43. package/dist/commands/details-types.d.ts.map +1 -0
  44. package/dist/commands/details-types.js +7 -0
  45. package/dist/commands/details-types.js.map +1 -0
  46. package/dist/commands/details.d.ts +24 -0
  47. package/dist/commands/details.d.ts.map +1 -0
  48. package/dist/commands/details.js +299 -0
  49. package/dist/commands/details.js.map +1 -0
  50. package/dist/commands/discussion-templates.d.ts +26 -0
  51. package/dist/commands/discussion-templates.d.ts.map +1 -0
  52. package/dist/commands/discussion-templates.js +270 -0
  53. package/dist/commands/discussion-templates.js.map +1 -0
  54. package/dist/commands/discussions.d.ts +31 -0
  55. package/dist/commands/discussions.d.ts.map +1 -0
  56. package/dist/commands/discussions.js +743 -0
  57. package/dist/commands/discussions.js.map +1 -0
  58. package/dist/commands/feature-map-types.d.ts +294 -0
  59. package/dist/commands/feature-map-types.d.ts.map +1 -0
  60. package/dist/commands/feature-map-types.js +8 -0
  61. package/dist/commands/feature-map-types.js.map +1 -0
  62. package/dist/commands/feature-map.d.ts +30 -0
  63. package/dist/commands/feature-map.d.ts.map +1 -0
  64. package/dist/commands/feature-map.js +137 -0
  65. package/dist/commands/feature-map.js.map +1 -0
  66. package/dist/commands/generate.d.ts +16 -0
  67. package/dist/commands/generate.d.ts.map +1 -0
  68. package/dist/commands/generate.js +88 -0
  69. package/dist/commands/generate.js.map +1 -0
  70. package/dist/commands/gh-discussions.d.ts +31 -0
  71. package/dist/commands/gh-discussions.d.ts.map +1 -0
  72. package/dist/commands/gh-discussions.js +743 -0
  73. package/dist/commands/gh-discussions.js.map +1 -0
  74. package/dist/commands/gh-issues-pr.d.ts +74 -0
  75. package/dist/commands/gh-issues-pr.d.ts.map +1 -0
  76. package/dist/commands/gh-issues-pr.js +417 -0
  77. package/dist/commands/gh-issues-pr.js.map +1 -0
  78. package/dist/commands/gh-issues.d.ts +90 -0
  79. package/dist/commands/gh-issues.d.ts.map +1 -0
  80. package/dist/commands/gh-issues.js +1297 -0
  81. package/dist/commands/gh-issues.js.map +1 -0
  82. package/dist/commands/gh-projects.d.ts +54 -0
  83. package/dist/commands/gh-projects.d.ts.map +1 -0
  84. package/dist/commands/gh-projects.js +966 -0
  85. package/dist/commands/gh-projects.js.map +1 -0
  86. package/dist/commands/gh-repo.d.ts +18 -0
  87. package/dist/commands/gh-repo.d.ts.map +1 -0
  88. package/dist/commands/gh-repo.js +253 -0
  89. package/dist/commands/gh-repo.js.map +1 -0
  90. package/dist/commands/github-data.d.ts +67 -0
  91. package/dist/commands/github-data.d.ts.map +1 -0
  92. package/dist/commands/github-data.js +361 -0
  93. package/dist/commands/github-data.js.map +1 -0
  94. package/dist/commands/i18n.d.ts +102 -0
  95. package/dist/commands/i18n.d.ts.map +1 -0
  96. package/dist/commands/i18n.js +829 -0
  97. package/dist/commands/i18n.js.map +1 -0
  98. package/dist/commands/impact.d.ts +14 -0
  99. package/dist/commands/impact.d.ts.map +1 -0
  100. package/dist/commands/impact.js +263 -0
  101. package/dist/commands/impact.js.map +1 -0
  102. package/dist/commands/init.d.ts +53 -0
  103. package/dist/commands/init.d.ts.map +1 -0
  104. package/dist/commands/init.js +429 -0
  105. package/dist/commands/init.js.map +1 -0
  106. package/dist/commands/issues-pr.d.ts +74 -0
  107. package/dist/commands/issues-pr.d.ts.map +1 -0
  108. package/dist/commands/issues-pr.js +417 -0
  109. package/dist/commands/issues-pr.js.map +1 -0
  110. package/dist/commands/issues.d.ts +76 -0
  111. package/dist/commands/issues.d.ts.map +1 -0
  112. package/dist/commands/issues.js +1285 -0
  113. package/dist/commands/issues.js.map +1 -0
  114. package/dist/commands/link-docs.d.ts +21 -0
  115. package/dist/commands/link-docs.d.ts.map +1 -0
  116. package/dist/commands/link-docs.js +990 -0
  117. package/dist/commands/link-docs.js.map +1 -0
  118. package/dist/commands/lint-annotations.d.ts +28 -0
  119. package/dist/commands/lint-annotations.d.ts.map +1 -0
  120. package/dist/commands/lint-annotations.js +511 -0
  121. package/dist/commands/lint-annotations.js.map +1 -0
  122. package/dist/commands/lint-code.d.ts +26 -0
  123. package/dist/commands/lint-code.d.ts.map +1 -0
  124. package/dist/commands/lint-code.js +428 -0
  125. package/dist/commands/lint-code.js.map +1 -0
  126. package/dist/commands/lint-coverage.d.ts +33 -0
  127. package/dist/commands/lint-coverage.d.ts.map +1 -0
  128. package/dist/commands/lint-coverage.js +379 -0
  129. package/dist/commands/lint-coverage.js.map +1 -0
  130. package/dist/commands/lint-docs.d.ts +23 -0
  131. package/dist/commands/lint-docs.d.ts.map +1 -0
  132. package/dist/commands/lint-docs.js +338 -0
  133. package/dist/commands/lint-docs.js.map +1 -0
  134. package/dist/commands/lint-structure.d.ts +38 -0
  135. package/dist/commands/lint-structure.d.ts.map +1 -0
  136. package/dist/commands/lint-structure.js +350 -0
  137. package/dist/commands/lint-structure.js.map +1 -0
  138. package/dist/commands/lint-tests.d.ts +25 -0
  139. package/dist/commands/lint-tests.d.ts.map +1 -0
  140. package/dist/commands/lint-tests.js +105 -0
  141. package/dist/commands/lint-tests.js.map +1 -0
  142. package/dist/commands/lint-workflow.d.ts +36 -0
  143. package/dist/commands/lint-workflow.d.ts.map +1 -0
  144. package/dist/commands/lint-workflow.js +255 -0
  145. package/dist/commands/lint-workflow.js.map +1 -0
  146. package/dist/commands/overview.d.ts +21 -0
  147. package/dist/commands/overview.d.ts.map +1 -0
  148. package/dist/commands/overview.js +1300 -0
  149. package/dist/commands/overview.js.map +1 -0
  150. package/dist/commands/packages.d.ts +107 -0
  151. package/dist/commands/packages.d.ts.map +1 -0
  152. package/dist/commands/packages.js +308 -0
  153. package/dist/commands/packages.js.map +1 -0
  154. package/dist/commands/portal-nextjs.d.ts +23 -0
  155. package/dist/commands/portal-nextjs.d.ts.map +1 -0
  156. package/dist/commands/portal-nextjs.js +336 -0
  157. package/dist/commands/portal-nextjs.js.map +1 -0
  158. package/dist/commands/portal.d.ts +24 -0
  159. package/dist/commands/portal.d.ts.map +1 -0
  160. package/dist/commands/portal.js +16 -0
  161. package/dist/commands/portal.js.map +1 -0
  162. package/dist/commands/projects.d.ts +54 -0
  163. package/dist/commands/projects.d.ts.map +1 -0
  164. package/dist/commands/projects.js +969 -0
  165. package/dist/commands/projects.js.map +1 -0
  166. package/dist/commands/repo-pairs.d.ts +19 -0
  167. package/dist/commands/repo-pairs.d.ts.map +1 -0
  168. package/dist/commands/repo-pairs.js +529 -0
  169. package/dist/commands/repo-pairs.js.map +1 -0
  170. package/dist/commands/repo.d.ts +18 -0
  171. package/dist/commands/repo.d.ts.map +1 -0
  172. package/dist/commands/repo.js +253 -0
  173. package/dist/commands/repo.js.map +1 -0
  174. package/dist/commands/schema.d.ts +49 -0
  175. package/dist/commands/schema.d.ts.map +1 -0
  176. package/dist/commands/schema.js +830 -0
  177. package/dist/commands/schema.js.map +1 -0
  178. package/dist/commands/screenshots.d.ts +203 -0
  179. package/dist/commands/screenshots.d.ts.map +1 -0
  180. package/dist/commands/screenshots.js +1234 -0
  181. package/dist/commands/screenshots.js.map +1 -0
  182. package/dist/commands/search-index.d.ts +83 -0
  183. package/dist/commands/search-index.d.ts.map +1 -0
  184. package/dist/commands/search-index.js +389 -0
  185. package/dist/commands/search-index.js.map +1 -0
  186. package/dist/commands/session.d.ts +153 -0
  187. package/dist/commands/session.d.ts.map +1 -0
  188. package/dist/commands/session.js +1243 -0
  189. package/dist/commands/session.js.map +1 -0
  190. package/dist/commands/test-cases-types.d.ts +154 -0
  191. package/dist/commands/test-cases-types.d.ts.map +1 -0
  192. package/dist/commands/test-cases-types.js +7 -0
  193. package/dist/commands/test-cases-types.js.map +1 -0
  194. package/dist/commands/test-cases.d.ts +28 -0
  195. package/dist/commands/test-cases.d.ts.map +1 -0
  196. package/dist/commands/test-cases.js +192 -0
  197. package/dist/commands/test-cases.js.map +1 -0
  198. package/dist/commands/typedoc.d.ts +21 -0
  199. package/dist/commands/typedoc.d.ts.map +1 -0
  200. package/dist/commands/typedoc.js +192 -0
  201. package/dist/commands/typedoc.js.map +1 -0
  202. package/dist/commands/update-skills.d.ts +56 -0
  203. package/dist/commands/update-skills.d.ts.map +1 -0
  204. package/dist/commands/update-skills.js +620 -0
  205. package/dist/commands/update-skills.js.map +1 -0
  206. package/dist/generators/details-entity-pages.d.ts +40 -0
  207. package/dist/generators/details-entity-pages.d.ts.map +1 -0
  208. package/dist/generators/details-entity-pages.js +301 -0
  209. package/dist/generators/details-entity-pages.js.map +1 -0
  210. package/dist/generators/details-html.d.ts +23 -0
  211. package/dist/generators/details-html.d.ts.map +1 -0
  212. package/dist/generators/details-html.js +324 -0
  213. package/dist/generators/details-html.js.map +1 -0
  214. package/dist/generators/details-module-page.d.ts +33 -0
  215. package/dist/generators/details-module-page.d.ts.map +1 -0
  216. package/dist/generators/details-module-page.js +408 -0
  217. package/dist/generators/details-module-page.js.map +1 -0
  218. package/dist/generators/details-styles.d.ts +39 -0
  219. package/dist/generators/details-styles.d.ts.map +1 -0
  220. package/dist/generators/details-styles.js +409 -0
  221. package/dist/generators/details-styles.js.map +1 -0
  222. package/dist/generators/feature-map-html.d.ts +66 -0
  223. package/dist/generators/feature-map-html.d.ts.map +1 -0
  224. package/dist/generators/feature-map-html.js +569 -0
  225. package/dist/generators/feature-map-html.js.map +1 -0
  226. package/dist/generators/feature-map-styles.d.ts +39 -0
  227. package/dist/generators/feature-map-styles.d.ts.map +1 -0
  228. package/dist/generators/feature-map-styles.js +449 -0
  229. package/dist/generators/feature-map-styles.js.map +1 -0
  230. package/dist/generators/test-cases-hierarchy.d.ts +21 -0
  231. package/dist/generators/test-cases-hierarchy.d.ts.map +1 -0
  232. package/dist/generators/test-cases-hierarchy.js +336 -0
  233. package/dist/generators/test-cases-hierarchy.js.map +1 -0
  234. package/dist/generators/test-cases-main.d.ts +20 -0
  235. package/dist/generators/test-cases-main.d.ts.map +1 -0
  236. package/dist/generators/test-cases-main.js +439 -0
  237. package/dist/generators/test-cases-main.js.map +1 -0
  238. package/dist/generators/test-cases-styles.d.ts +64 -0
  239. package/dist/generators/test-cases-styles.d.ts.map +1 -0
  240. package/dist/generators/test-cases-styles.js +1277 -0
  241. package/dist/generators/test-cases-styles.js.map +1 -0
  242. package/dist/index.d.ts +13 -0
  243. package/dist/index.d.ts.map +1 -0
  244. package/dist/index.js +517 -0
  245. package/dist/index.js.map +1 -0
  246. package/dist/lint/annotation-lint.d.ts +198 -0
  247. package/dist/lint/annotation-lint.d.ts.map +1 -0
  248. package/dist/lint/annotation-lint.js +510 -0
  249. package/dist/lint/annotation-lint.js.map +1 -0
  250. package/dist/lint/annotation-types.d.ts +161 -0
  251. package/dist/lint/annotation-types.d.ts.map +1 -0
  252. package/dist/lint/annotation-types.js +31 -0
  253. package/dist/lint/annotation-types.js.map +1 -0
  254. package/dist/lint/code-types.d.ts +135 -0
  255. package/dist/lint/code-types.d.ts.map +1 -0
  256. package/dist/lint/code-types.js +25 -0
  257. package/dist/lint/code-types.js.map +1 -0
  258. package/dist/lint/coverage-types.d.ts +128 -0
  259. package/dist/lint/coverage-types.d.ts.map +1 -0
  260. package/dist/lint/coverage-types.js +24 -0
  261. package/dist/lint/coverage-types.js.map +1 -0
  262. package/dist/lint/docs-types.d.ts +214 -0
  263. package/dist/lint/docs-types.d.ts.map +1 -0
  264. package/dist/lint/docs-types.js +18 -0
  265. package/dist/lint/docs-types.js.map +1 -0
  266. package/dist/lint/formatters/index.d.ts +14 -0
  267. package/dist/lint/formatters/index.d.ts.map +1 -0
  268. package/dist/lint/formatters/index.js +28 -0
  269. package/dist/lint/formatters/index.js.map +1 -0
  270. package/dist/lint/formatters/json.d.ts +11 -0
  271. package/dist/lint/formatters/json.d.ts.map +1 -0
  272. package/dist/lint/formatters/json.js +12 -0
  273. package/dist/lint/formatters/json.js.map +1 -0
  274. package/dist/lint/formatters/summary.d.ts +11 -0
  275. package/dist/lint/formatters/summary.d.ts.map +1 -0
  276. package/dist/lint/formatters/summary.js +37 -0
  277. package/dist/lint/formatters/summary.js.map +1 -0
  278. package/dist/lint/formatters/terminal.d.ts +11 -0
  279. package/dist/lint/formatters/terminal.d.ts.map +1 -0
  280. package/dist/lint/formatters/terminal.js +99 -0
  281. package/dist/lint/formatters/terminal.js.map +1 -0
  282. package/dist/lint/index.d.ts +18 -0
  283. package/dist/lint/index.d.ts.map +1 -0
  284. package/dist/lint/index.js +103 -0
  285. package/dist/lint/index.js.map +1 -0
  286. package/dist/lint/rules/annotation-required.d.ts +35 -0
  287. package/dist/lint/rules/annotation-required.d.ts.map +1 -0
  288. package/dist/lint/rules/annotation-required.js +127 -0
  289. package/dist/lint/rules/annotation-required.js.map +1 -0
  290. package/dist/lint/rules/code-rules.d.ts +12 -0
  291. package/dist/lint/rules/code-rules.d.ts.map +1 -0
  292. package/dist/lint/rules/code-rules.js +11 -0
  293. package/dist/lint/rules/code-rules.js.map +1 -0
  294. package/dist/lint/rules/describe-coverage.d.ts +8 -0
  295. package/dist/lint/rules/describe-coverage.d.ts.map +1 -0
  296. package/dist/lint/rules/describe-coverage.js +43 -0
  297. package/dist/lint/rules/describe-coverage.js.map +1 -0
  298. package/dist/lint/rules/duplicate-testdoc.d.ts +8 -0
  299. package/dist/lint/rules/duplicate-testdoc.d.ts.map +1 -0
  300. package/dist/lint/rules/duplicate-testdoc.js +38 -0
  301. package/dist/lint/rules/duplicate-testdoc.js.map +1 -0
  302. package/dist/lint/rules/index.d.ts +29 -0
  303. package/dist/lint/rules/index.d.ts.map +1 -0
  304. package/dist/lint/rules/index.js +55 -0
  305. package/dist/lint/rules/index.js.map +1 -0
  306. package/dist/lint/rules/server-action-structure.d.ts +37 -0
  307. package/dist/lint/rules/server-action-structure.d.ts.map +1 -0
  308. package/dist/lint/rules/server-action-structure.js +151 -0
  309. package/dist/lint/rules/server-action-structure.js.map +1 -0
  310. package/dist/lint/rules/skipped-test-report.d.ts +11 -0
  311. package/dist/lint/rules/skipped-test-report.d.ts.map +1 -0
  312. package/dist/lint/rules/skipped-test-report.js +31 -0
  313. package/dist/lint/rules/skipped-test-report.js.map +1 -0
  314. package/dist/lint/rules/structure-rules.d.ts +67 -0
  315. package/dist/lint/rules/structure-rules.d.ts.map +1 -0
  316. package/dist/lint/rules/structure-rules.js +615 -0
  317. package/dist/lint/rules/structure-rules.js.map +1 -0
  318. package/dist/lint/rules/testdoc-japanese.d.ts +8 -0
  319. package/dist/lint/rules/testdoc-japanese.d.ts.map +1 -0
  320. package/dist/lint/rules/testdoc-japanese.js +31 -0
  321. package/dist/lint/rules/testdoc-japanese.js.map +1 -0
  322. package/dist/lint/rules/testdoc-min-length.d.ts +8 -0
  323. package/dist/lint/rules/testdoc-min-length.d.ts.map +1 -0
  324. package/dist/lint/rules/testdoc-min-length.js +31 -0
  325. package/dist/lint/rules/testdoc-min-length.js.map +1 -0
  326. package/dist/lint/rules/testdoc-required.d.ts +8 -0
  327. package/dist/lint/rules/testdoc-required.d.ts.map +1 -0
  328. package/dist/lint/rules/testdoc-required.js +27 -0
  329. package/dist/lint/rules/testdoc-required.js.map +1 -0
  330. package/dist/lint/rules/workflow-branch-naming.d.ts +20 -0
  331. package/dist/lint/rules/workflow-branch-naming.d.ts.map +1 -0
  332. package/dist/lint/rules/workflow-branch-naming.js +85 -0
  333. package/dist/lint/rules/workflow-branch-naming.js.map +1 -0
  334. package/dist/lint/rules/workflow-commit-format.d.ts +27 -0
  335. package/dist/lint/rules/workflow-commit-format.d.ts.map +1 -0
  336. package/dist/lint/rules/workflow-commit-format.js +92 -0
  337. package/dist/lint/rules/workflow-commit-format.js.map +1 -0
  338. package/dist/lint/rules/workflow-issue-fields.d.ts +24 -0
  339. package/dist/lint/rules/workflow-issue-fields.d.ts.map +1 -0
  340. package/dist/lint/rules/workflow-issue-fields.js +89 -0
  341. package/dist/lint/rules/workflow-issue-fields.js.map +1 -0
  342. package/dist/lint/rules/workflow-main-protection.d.ts +32 -0
  343. package/dist/lint/rules/workflow-main-protection.d.ts.map +1 -0
  344. package/dist/lint/rules/workflow-main-protection.js +114 -0
  345. package/dist/lint/rules/workflow-main-protection.js.map +1 -0
  346. package/dist/lint/structure-types.d.ts +216 -0
  347. package/dist/lint/structure-types.d.ts.map +1 -0
  348. package/dist/lint/structure-types.js +96 -0
  349. package/dist/lint/structure-types.js.map +1 -0
  350. package/dist/lint/types.d.ts +154 -0
  351. package/dist/lint/types.d.ts.map +1 -0
  352. package/dist/lint/types.js +21 -0
  353. package/dist/lint/types.js.map +1 -0
  354. package/dist/lint/workflow-types.d.ts +90 -0
  355. package/dist/lint/workflow-types.d.ts.map +1 -0
  356. package/dist/lint/workflow-types.js +7 -0
  357. package/dist/lint/workflow-types.js.map +1 -0
  358. package/dist/md/analyzer/index.d.ts +46 -0
  359. package/dist/md/analyzer/index.d.ts.map +1 -0
  360. package/dist/md/analyzer/index.js +288 -0
  361. package/dist/md/analyzer/index.js.map +1 -0
  362. package/dist/md/builder/index.d.ts +91 -0
  363. package/dist/md/builder/index.d.ts.map +1 -0
  364. package/dist/md/builder/index.js +446 -0
  365. package/dist/md/builder/index.js.map +1 -0
  366. package/dist/md/cli/analyze.d.ts +11 -0
  367. package/dist/md/cli/analyze.d.ts.map +1 -0
  368. package/dist/md/cli/analyze.js +118 -0
  369. package/dist/md/cli/analyze.js.map +1 -0
  370. package/dist/md/cli/build.d.ts +11 -0
  371. package/dist/md/cli/build.d.ts.map +1 -0
  372. package/dist/md/cli/build.js +74 -0
  373. package/dist/md/cli/build.js.map +1 -0
  374. package/dist/md/cli/extract.d.ts +25 -0
  375. package/dist/md/cli/extract.d.ts.map +1 -0
  376. package/dist/md/cli/extract.js +230 -0
  377. package/dist/md/cli/extract.js.map +1 -0
  378. package/dist/md/cli/index.d.ts +3 -0
  379. package/dist/md/cli/index.d.ts.map +1 -0
  380. package/dist/md/cli/index.js +99 -0
  381. package/dist/md/cli/index.js.map +1 -0
  382. package/dist/md/cli/lint.d.ts +11 -0
  383. package/dist/md/cli/lint.d.ts.map +1 -0
  384. package/dist/md/cli/lint.js +165 -0
  385. package/dist/md/cli/lint.js.map +1 -0
  386. package/dist/md/cli/list.d.ts +16 -0
  387. package/dist/md/cli/list.d.ts.map +1 -0
  388. package/dist/md/cli/list.js +85 -0
  389. package/dist/md/cli/list.js.map +1 -0
  390. package/dist/md/cli/program.d.ts +11 -0
  391. package/dist/md/cli/program.d.ts.map +1 -0
  392. package/dist/md/cli/program.js +104 -0
  393. package/dist/md/cli/program.js.map +1 -0
  394. package/dist/md/cli/validate.d.ts +8 -0
  395. package/dist/md/cli/validate.d.ts.map +1 -0
  396. package/dist/md/cli/validate.js +82 -0
  397. package/dist/md/cli/validate.js.map +1 -0
  398. package/dist/md/constants.d.ts +69 -0
  399. package/dist/md/constants.d.ts.map +1 -0
  400. package/dist/md/constants.js +69 -0
  401. package/dist/md/constants.js.map +1 -0
  402. package/dist/md/extractor/index.d.ts +57 -0
  403. package/dist/md/extractor/index.d.ts.map +1 -0
  404. package/dist/md/extractor/index.js +359 -0
  405. package/dist/md/extractor/index.js.map +1 -0
  406. package/dist/md/index.d.ts +26 -0
  407. package/dist/md/index.d.ts.map +1 -0
  408. package/dist/md/index.js +30 -0
  409. package/dist/md/index.js.map +1 -0
  410. package/dist/md/linter/index.d.ts +20 -0
  411. package/dist/md/linter/index.d.ts.map +1 -0
  412. package/dist/md/linter/index.js +412 -0
  413. package/dist/md/linter/index.js.map +1 -0
  414. package/dist/md/linter/token-optimizer.d.ts +66 -0
  415. package/dist/md/linter/token-optimizer.d.ts.map +1 -0
  416. package/dist/md/linter/token-optimizer.js +292 -0
  417. package/dist/md/linter/token-optimizer.js.map +1 -0
  418. package/dist/md/lister/index.d.ts +42 -0
  419. package/dist/md/lister/index.d.ts.map +1 -0
  420. package/dist/md/lister/index.js +317 -0
  421. package/dist/md/lister/index.js.map +1 -0
  422. package/dist/md/parser/heading-numbers.d.ts +43 -0
  423. package/dist/md/parser/heading-numbers.d.ts.map +1 -0
  424. package/dist/md/parser/heading-numbers.js +97 -0
  425. package/dist/md/parser/heading-numbers.js.map +1 -0
  426. package/dist/md/parser/section-meta.d.ts +50 -0
  427. package/dist/md/parser/section-meta.d.ts.map +1 -0
  428. package/dist/md/parser/section-meta.js +212 -0
  429. package/dist/md/parser/section-meta.js.map +1 -0
  430. package/dist/md/parser/template.d.ts +56 -0
  431. package/dist/md/parser/template.d.ts.map +1 -0
  432. package/dist/md/parser/template.js +122 -0
  433. package/dist/md/parser/template.js.map +1 -0
  434. package/dist/md/plugins/loader.d.ts +15 -0
  435. package/dist/md/plugins/loader.d.ts.map +1 -0
  436. package/dist/md/plugins/loader.js +80 -0
  437. package/dist/md/plugins/loader.js.map +1 -0
  438. package/dist/md/plugins/normalize-headings.d.ts +43 -0
  439. package/dist/md/plugins/normalize-headings.d.ts.map +1 -0
  440. package/dist/md/plugins/normalize-headings.js +51 -0
  441. package/dist/md/plugins/normalize-headings.js.map +1 -0
  442. package/dist/md/plugins/normalize-whitespace.d.ts +46 -0
  443. package/dist/md/plugins/normalize-whitespace.d.ts.map +1 -0
  444. package/dist/md/plugins/normalize-whitespace.js +86 -0
  445. package/dist/md/plugins/normalize-whitespace.js.map +1 -0
  446. package/dist/md/plugins/remove-badges.d.ts +36 -0
  447. package/dist/md/plugins/remove-badges.d.ts.map +1 -0
  448. package/dist/md/plugins/remove-badges.js +59 -0
  449. package/dist/md/plugins/remove-badges.js.map +1 -0
  450. package/dist/md/plugins/remove-comments.d.ts +27 -0
  451. package/dist/md/plugins/remove-comments.d.ts.map +1 -0
  452. package/dist/md/plugins/remove-comments.js +40 -0
  453. package/dist/md/plugins/remove-comments.js.map +1 -0
  454. package/dist/md/plugins/remove-duplicates.d.ts +40 -0
  455. package/dist/md/plugins/remove-duplicates.d.ts.map +1 -0
  456. package/dist/md/plugins/remove-duplicates.js +72 -0
  457. package/dist/md/plugins/remove-duplicates.js.map +1 -0
  458. package/dist/md/plugins/remove-internal-links.d.ts +38 -0
  459. package/dist/md/plugins/remove-internal-links.d.ts.map +1 -0
  460. package/dist/md/plugins/remove-internal-links.js +66 -0
  461. package/dist/md/plugins/remove-internal-links.js.map +1 -0
  462. package/dist/md/plugins/strip-heading-numbers.d.ts +35 -0
  463. package/dist/md/plugins/strip-heading-numbers.d.ts.map +1 -0
  464. package/dist/md/plugins/strip-heading-numbers.js +59 -0
  465. package/dist/md/plugins/strip-heading-numbers.js.map +1 -0
  466. package/dist/md/plugins/strip-section-meta.d.ts +37 -0
  467. package/dist/md/plugins/strip-section-meta.d.ts.map +1 -0
  468. package/dist/md/plugins/strip-section-meta.js +62 -0
  469. package/dist/md/plugins/strip-section-meta.js.map +1 -0
  470. package/dist/md/types/config.d.ts +260 -0
  471. package/dist/md/types/config.d.ts.map +1 -0
  472. package/dist/md/types/config.js +156 -0
  473. package/dist/md/types/config.js.map +1 -0
  474. package/dist/md/types/document.d.ts +37 -0
  475. package/dist/md/types/document.d.ts.map +1 -0
  476. package/dist/md/types/document.js +2 -0
  477. package/dist/md/types/document.js.map +1 -0
  478. package/dist/md/types/validation.d.ts +107 -0
  479. package/dist/md/types/validation.d.ts.map +1 -0
  480. package/dist/md/types/validation.js +2 -0
  481. package/dist/md/types/validation.js.map +1 -0
  482. package/dist/md/utils/code-blocks.d.ts +136 -0
  483. package/dist/md/utils/code-blocks.d.ts.map +1 -0
  484. package/dist/md/utils/code-blocks.js +178 -0
  485. package/dist/md/utils/code-blocks.js.map +1 -0
  486. package/dist/md/utils/config.d.ts +10 -0
  487. package/dist/md/utils/config.d.ts.map +1 -0
  488. package/dist/md/utils/config.js +99 -0
  489. package/dist/md/utils/config.js.map +1 -0
  490. package/dist/md/utils/file-collector.d.ts +78 -0
  491. package/dist/md/utils/file-collector.d.ts.map +1 -0
  492. package/dist/md/utils/file-collector.js +100 -0
  493. package/dist/md/utils/file-collector.js.map +1 -0
  494. package/dist/md/utils/markdown.d.ts +18 -0
  495. package/dist/md/utils/markdown.d.ts.map +1 -0
  496. package/dist/md/utils/markdown.js +93 -0
  497. package/dist/md/utils/markdown.js.map +1 -0
  498. package/dist/md/utils/remark.d.ts +91 -0
  499. package/dist/md/utils/remark.d.ts.map +1 -0
  500. package/dist/md/utils/remark.js +125 -0
  501. package/dist/md/utils/remark.js.map +1 -0
  502. package/dist/md/utils/tokens.d.ts +9 -0
  503. package/dist/md/utils/tokens.d.ts.map +1 -0
  504. package/dist/md/utils/tokens.js +31 -0
  505. package/dist/md/utils/tokens.js.map +1 -0
  506. package/dist/md/validator/index.d.ts +40 -0
  507. package/dist/md/validator/index.d.ts.map +1 -0
  508. package/dist/md/validator/index.js +289 -0
  509. package/dist/md/validator/index.js.map +1 -0
  510. package/dist/parsers/details-jsdoc.d.ts +46 -0
  511. package/dist/parsers/details-jsdoc.d.ts.map +1 -0
  512. package/dist/parsers/details-jsdoc.js +262 -0
  513. package/dist/parsers/details-jsdoc.js.map +1 -0
  514. package/dist/parsers/details-zod.d.ts +22 -0
  515. package/dist/parsers/details-zod.d.ts.map +1 -0
  516. package/dist/parsers/details-zod.js +145 -0
  517. package/dist/parsers/details-zod.js.map +1 -0
  518. package/dist/parsers/drizzle-schema.d.ts +92 -0
  519. package/dist/parsers/drizzle-schema.d.ts.map +1 -0
  520. package/dist/parsers/drizzle-schema.js +376 -0
  521. package/dist/parsers/drizzle-schema.js.map +1 -0
  522. package/dist/parsers/feature-map-tags.d.ts +45 -0
  523. package/dist/parsers/feature-map-tags.d.ts.map +1 -0
  524. package/dist/parsers/feature-map-tags.js +292 -0
  525. package/dist/parsers/feature-map-tags.js.map +1 -0
  526. package/dist/parsers/feature-map-type-extraction.d.ts +62 -0
  527. package/dist/parsers/feature-map-type-extraction.d.ts.map +1 -0
  528. package/dist/parsers/feature-map-type-extraction.js +347 -0
  529. package/dist/parsers/feature-map-type-extraction.js.map +1 -0
  530. package/dist/parsers/feature-map-utils.d.ts +34 -0
  531. package/dist/parsers/feature-map-utils.d.ts.map +1 -0
  532. package/dist/parsers/feature-map-utils.js +101 -0
  533. package/dist/parsers/feature-map-utils.js.map +1 -0
  534. package/dist/parsers/jsdoc-common.d.ts +209 -0
  535. package/dist/parsers/jsdoc-common.d.ts.map +1 -0
  536. package/dist/parsers/jsdoc-common.js +655 -0
  537. package/dist/parsers/jsdoc-common.js.map +1 -0
  538. package/dist/parsers/jsdoc.d.ts +76 -0
  539. package/dist/parsers/jsdoc.d.ts.map +1 -0
  540. package/dist/parsers/jsdoc.js +238 -0
  541. package/dist/parsers/jsdoc.js.map +1 -0
  542. package/dist/parsers/screenshot-annotations.d.ts +96 -0
  543. package/dist/parsers/screenshot-annotations.d.ts.map +1 -0
  544. package/dist/parsers/screenshot-annotations.js +227 -0
  545. package/dist/parsers/screenshot-annotations.js.map +1 -0
  546. package/dist/parsers/test-annotations.d.ts +46 -0
  547. package/dist/parsers/test-annotations.d.ts.map +1 -0
  548. package/dist/parsers/test-annotations.js +393 -0
  549. package/dist/parsers/test-annotations.js.map +1 -0
  550. package/dist/parsers/test-categorization.d.ts +42 -0
  551. package/dist/parsers/test-categorization.d.ts.map +1 -0
  552. package/dist/parsers/test-categorization.js +182 -0
  553. package/dist/parsers/test-categorization.js.map +1 -0
  554. package/dist/parsers/zod-schema.d.ts +105 -0
  555. package/dist/parsers/zod-schema.d.ts.map +1 -0
  556. package/dist/parsers/zod-schema.js +270 -0
  557. package/dist/parsers/zod-schema.js.map +1 -0
  558. package/dist/utils/action-inference.d.ts +23 -0
  559. package/dist/utils/action-inference.d.ts.map +1 -0
  560. package/dist/utils/action-inference.js +36 -0
  561. package/dist/utils/action-inference.js.map +1 -0
  562. package/dist/utils/app-inference.d.ts +31 -0
  563. package/dist/utils/app-inference.d.ts.map +1 -0
  564. package/dist/utils/app-inference.js +41 -0
  565. package/dist/utils/app-inference.js.map +1 -0
  566. package/dist/utils/auto-infer.d.ts +93 -0
  567. package/dist/utils/auto-infer.d.ts.map +1 -0
  568. package/dist/utils/auto-infer.js +184 -0
  569. package/dist/utils/auto-infer.js.map +1 -0
  570. package/dist/utils/config.d.ts +709 -0
  571. package/dist/utils/config.d.ts.map +1 -0
  572. package/dist/utils/config.js +504 -0
  573. package/dist/utils/config.js.map +1 -0
  574. package/dist/utils/file.d.ts +46 -0
  575. package/dist/utils/file.d.ts.map +1 -0
  576. package/dist/utils/file.js +103 -0
  577. package/dist/utils/file.js.map +1 -0
  578. package/dist/utils/formatters.d.ts +111 -0
  579. package/dist/utils/formatters.d.ts.map +1 -0
  580. package/dist/utils/formatters.js +164 -0
  581. package/dist/utils/formatters.js.map +1 -0
  582. package/dist/utils/gh-config.d.ts +99 -0
  583. package/dist/utils/gh-config.d.ts.map +1 -0
  584. package/dist/utils/gh-config.js +247 -0
  585. package/dist/utils/gh-config.js.map +1 -0
  586. package/dist/utils/github.d.ts +98 -0
  587. package/dist/utils/github.d.ts.map +1 -0
  588. package/dist/utils/github.js +295 -0
  589. package/dist/utils/github.js.map +1 -0
  590. package/dist/utils/html.d.ts +107 -0
  591. package/dist/utils/html.d.ts.map +1 -0
  592. package/dist/utils/html.js +376 -0
  593. package/dist/utils/html.js.map +1 -0
  594. package/dist/utils/i18n.d.ts +40 -0
  595. package/dist/utils/i18n.d.ts.map +1 -0
  596. package/dist/utils/i18n.js +148 -0
  597. package/dist/utils/i18n.js.map +1 -0
  598. package/dist/utils/logger.d.ts +20 -0
  599. package/dist/utils/logger.d.ts.map +1 -0
  600. package/dist/utils/logger.js +49 -0
  601. package/dist/utils/logger.js.map +1 -0
  602. package/dist/utils/project-fields.d.ts +71 -0
  603. package/dist/utils/project-fields.d.ts.map +1 -0
  604. package/dist/utils/project-fields.js +318 -0
  605. package/dist/utils/project-fields.js.map +1 -0
  606. package/dist/utils/repo-pairs.d.ts +94 -0
  607. package/dist/utils/repo-pairs.d.ts.map +1 -0
  608. package/dist/utils/repo-pairs.js +196 -0
  609. package/dist/utils/repo-pairs.js.map +1 -0
  610. package/dist/utils/route-inference.d.ts +81 -0
  611. package/dist/utils/route-inference.d.ts.map +1 -0
  612. package/dist/utils/route-inference.js +137 -0
  613. package/dist/utils/route-inference.js.map +1 -0
  614. package/dist/utils/setup-check.d.ts +34 -0
  615. package/dist/utils/setup-check.d.ts.map +1 -0
  616. package/dist/utils/setup-check.js +136 -0
  617. package/dist/utils/setup-check.js.map +1 -0
  618. package/dist/utils/shirokumaignore.d.ts +55 -0
  619. package/dist/utils/shirokumaignore.d.ts.map +1 -0
  620. package/dist/utils/shirokumaignore.js +94 -0
  621. package/dist/utils/shirokumaignore.js.map +1 -0
  622. package/dist/utils/skills-repo.d.ts +353 -0
  623. package/dist/utils/skills-repo.d.ts.map +1 -0
  624. package/dist/utils/skills-repo.js +793 -0
  625. package/dist/utils/skills-repo.js.map +1 -0
  626. package/dist/utils/status-workflow.d.ts +54 -0
  627. package/dist/utils/status-workflow.d.ts.map +1 -0
  628. package/dist/utils/status-workflow.js +103 -0
  629. package/dist/utils/status-workflow.js.map +1 -0
  630. package/dist/validators/frontmatter.d.ts +41 -0
  631. package/dist/validators/frontmatter.d.ts.map +1 -0
  632. package/dist/validators/frontmatter.js +117 -0
  633. package/dist/validators/frontmatter.js.map +1 -0
  634. package/dist/validators/link-checker.d.ts +48 -0
  635. package/dist/validators/link-checker.d.ts.map +1 -0
  636. package/dist/validators/link-checker.js +108 -0
  637. package/dist/validators/link-checker.js.map +1 -0
  638. package/dist/validators/markdown-structure.d.ts +50 -0
  639. package/dist/validators/markdown-structure.d.ts.map +1 -0
  640. package/dist/validators/markdown-structure.js +253 -0
  641. package/dist/validators/markdown-structure.js.map +1 -0
  642. package/i18n/cli/en.json +155 -0
  643. package/i18n/cli/ja.json +155 -0
  644. package/i18n/discussion/en.json +191 -0
  645. package/i18n/discussion/ja.json +191 -0
  646. package/package.json +113 -0
  647. package/portal/app/api-tools/api-tools-client.tsx +411 -0
  648. package/portal/app/api-tools/api-tools-document.tsx +240 -0
  649. package/portal/app/api-tools/page.tsx +56 -0
  650. package/portal/app/api-tools/swagger-view.tsx +114 -0
  651. package/portal/app/apps/[appId]/[type]/[module]/[item]/item-tabs-client.tsx +71 -0
  652. package/portal/app/apps/[appId]/[type]/[module]/[item]/page.tsx +1422 -0
  653. package/portal/app/apps/[appId]/[type]/[module]/page.tsx +373 -0
  654. package/portal/app/apps/[appId]/feature-map/feature-map-app-document.tsx +298 -0
  655. package/portal/app/apps/[appId]/feature-map/page.tsx +224 -0
  656. package/portal/app/apps/[appId]/i18n/page.tsx +139 -0
  657. package/portal/app/apps/[appId]/test-cases/page.tsx +840 -0
  658. package/portal/app/apps/[appId]/tools/[tool]/page.tsx +351 -0
  659. package/portal/app/apps/[appId]/tools/api-tools-client.tsx +429 -0
  660. package/portal/app/apps/[appId]/tools/page.tsx +119 -0
  661. package/portal/app/db-schema/[db]/[table]/page.tsx +235 -0
  662. package/portal/app/db-schema/[db]/diagram/page.tsx +81 -0
  663. package/portal/app/db-schema/[db]/page.tsx +148 -0
  664. package/portal/app/db-schema/db-schema-document.tsx +100 -0
  665. package/portal/app/db-schema/diagram/client.tsx +211 -0
  666. package/portal/app/db-schema/diagram/page.tsx +20 -0
  667. package/portal/app/db-schema/page.tsx +145 -0
  668. package/portal/app/db-schema/table-detail-document.tsx +710 -0
  669. package/portal/app/db-schema/table-detail.tsx +747 -0
  670. package/portal/app/db-schema/table-list-document.tsx +224 -0
  671. package/portal/app/db-schema/table-list.tsx +247 -0
  672. package/portal/app/details/[type]/[module]/[item]/item-tabs-client.tsx +71 -0
  673. package/portal/app/details/[type]/[module]/[item]/page.tsx +1286 -0
  674. package/portal/app/details/[type]/[module]/page.tsx +884 -0
  675. package/portal/app/feature-map/feature-map-client.tsx +681 -0
  676. package/portal/app/feature-map/feature-map-document.tsx +313 -0
  677. package/portal/app/feature-map/page.tsx +438 -0
  678. package/portal/app/globals.css +205 -0
  679. package/portal/app/i18n/[...namespace]/page.tsx +190 -0
  680. package/portal/app/i18n/i18n-client.tsx +369 -0
  681. package/portal/app/i18n/page.tsx +339 -0
  682. package/portal/app/layout.tsx +37 -0
  683. package/portal/app/overview/page.tsx +65 -0
  684. package/portal/app/packages/[packageId]/page.tsx +201 -0
  685. package/portal/app/packages/page.tsx +148 -0
  686. package/portal/app/page.tsx +568 -0
  687. package/portal/app/test-cases/[file]/[line]/page.tsx +455 -0
  688. package/portal/app/test-cases/[file]/[line]/test-detail-document.tsx +335 -0
  689. package/portal/app/test-cases/[file]/page.tsx +323 -0
  690. package/portal/app/test-cases/[file]/test-file-document.tsx +335 -0
  691. package/portal/app/test-cases/page.tsx +546 -0
  692. package/portal/app/test-cases/test-cases-document.tsx +384 -0
  693. package/portal/components/code-block.tsx +57 -0
  694. package/portal/components/document/doc-params-table.tsx +71 -0
  695. package/portal/components/document/doc-section.tsx +133 -0
  696. package/portal/components/document/doc-table.tsx +119 -0
  697. package/portal/components/document/index.ts +9 -0
  698. package/portal/components/drawflow-er-diagram.tsx +607 -0
  699. package/portal/components/interactive-er-diagram.tsx +228 -0
  700. package/portal/components/layout/app-sidebar.tsx +490 -0
  701. package/portal/components/layout/er-sidebar.tsx +116 -0
  702. package/portal/components/layout/global-header.tsx +117 -0
  703. package/portal/components/layout/layout-content.tsx +48 -0
  704. package/portal/components/markdown-content.tsx +120 -0
  705. package/portal/components/mermaid-diagram.tsx +83 -0
  706. package/portal/components/reactflow-er-diagram.tsx +475 -0
  707. package/portal/components/search-dialog.tsx +268 -0
  708. package/portal/components/shared/coverage-score-bar.tsx +144 -0
  709. package/portal/components/swagger/endpoint-accordion.tsx +117 -0
  710. package/portal/components/swagger/index.ts +7 -0
  711. package/portal/components/swagger/method-badge.tsx +55 -0
  712. package/portal/components/swagger/params-table.tsx +78 -0
  713. package/portal/components/tabs-with-hash.tsx +43 -0
  714. package/portal/components/test/index.ts +2 -0
  715. package/portal/components/test/test-bdd-card.tsx +192 -0
  716. package/portal/components/test/test-matrix.tsx +242 -0
  717. package/portal/components/ui/accordion.tsx +66 -0
  718. package/portal/components/ui/badge.tsx +46 -0
  719. package/portal/components/ui/breadcrumb.tsx +109 -0
  720. package/portal/components/ui/button.tsx +62 -0
  721. package/portal/components/ui/card.tsx +92 -0
  722. package/portal/components/ui/collapsible.tsx +33 -0
  723. package/portal/components/ui/dialog.tsx +118 -0
  724. package/portal/components/ui/progress.tsx +28 -0
  725. package/portal/components/ui/scroll-area.tsx +58 -0
  726. package/portal/components/ui/sheet.tsx +139 -0
  727. package/portal/components/ui/table.tsx +116 -0
  728. package/portal/components/ui/tabs.tsx +66 -0
  729. package/portal/components.json +21 -0
  730. package/portal/lib/constants/test-categories.ts +186 -0
  731. package/portal/lib/data-loader.ts +1181 -0
  732. package/portal/lib/db-schema-utils.ts +182 -0
  733. package/portal/lib/format.ts +43 -0
  734. package/portal/lib/hooks/use-hash-tab.ts +144 -0
  735. package/portal/lib/path-utils.ts +25 -0
  736. package/portal/lib/search-index-generator.ts +214 -0
  737. package/portal/lib/search.ts +126 -0
  738. package/portal/lib/sidebar-context.tsx +111 -0
  739. package/portal/lib/types.ts +740 -0
  740. package/portal/lib/utils.ts +6 -0
  741. package/portal/next.config.ts +21 -0
  742. package/portal/package.json +45 -0
  743. package/portal/postcss.config.mjs +8 -0
  744. package/portal/tsconfig.json +41 -0
  745. package/portal/types/drawflow.d.ts +80 -0
  746. package/templates/README.md +73 -0
  747. package/templates/coverage.html +367 -0
  748. package/templates/dark-theme.css +443 -0
  749. package/templates/discussion/adr.yml.hbs +65 -0
  750. package/templates/discussion/handovers.yml.hbs +57 -0
  751. package/templates/discussion/knowledge.yml.hbs +60 -0
  752. package/templates/discussion/reports.yml.hbs +68 -0
  753. package/templates/discussion/research.yml.hbs +61 -0
@@ -0,0 +1,747 @@
1
+ import Link from "next/link";
2
+ import {
3
+ Database,
4
+ Key,
5
+ Link2,
6
+ Hash,
7
+ ArrowLeft,
8
+ ArrowRight,
9
+ Table2,
10
+ FileCode,
11
+ Layers,
12
+ Code,
13
+ Monitor,
14
+ Component,
15
+ Bot,
16
+ Wrench,
17
+ AppWindow,
18
+ } from "lucide-react";
19
+ import type { FeatureMapData, ActionItem, ScreenItem, ComponentItem, DbTable, DbColumn, DbSchemaData, ApiToolsData } from "@/lib/types";
20
+ import {
21
+ Card,
22
+ CardContent,
23
+ CardDescription,
24
+ CardHeader,
25
+ CardTitle,
26
+ } from "@/components/ui/card";
27
+ import {
28
+ Table,
29
+ TableBody,
30
+ TableCell,
31
+ TableHead,
32
+ TableHeader,
33
+ TableRow,
34
+ } from "@/components/ui/table";
35
+ import { Badge } from "@/components/ui/badge";
36
+ import { Button } from "@/components/ui/button";
37
+ import {
38
+ normalizeCategory,
39
+ getCategoryConfig,
40
+ } from "@/lib/db-schema-utils";
41
+
42
+ // MCP Tool type
43
+ interface ApiTool {
44
+ name: string;
45
+ description: string;
46
+ category?: string;
47
+ dbTables?: string[];
48
+ }
49
+
50
+ // Feature Map related items type
51
+ interface RelatedFeatureItems {
52
+ actions: { moduleName: string; action: ActionItem }[];
53
+ screens: { moduleName: string; screen: ScreenItem }[];
54
+ components: { moduleName: string; component: ComponentItem }[];
55
+ }
56
+
57
+ // App configuration for styling
58
+ const appConfig: Record<string, { label: string; color: string; bgColor: string; borderColor: string }> = {
59
+ Admin: { label: "Admin", color: "text-blue-600", bgColor: "bg-blue-500/10", borderColor: "border-blue-500/30" },
60
+ Public: { label: "Public", color: "text-green-600", bgColor: "bg-green-500/10", borderColor: "border-green-500/30" },
61
+ Web: { label: "Web", color: "text-purple-600", bgColor: "bg-purple-500/10", borderColor: "border-purple-500/30" },
62
+ API: { label: "API", color: "text-orange-600", bgColor: "bg-orange-500/10", borderColor: "border-orange-500/30" },
63
+ Shared: { label: "Shared", color: "text-gray-600", bgColor: "bg-gray-500/10", borderColor: "border-gray-500/30" },
64
+ };
65
+
66
+ /**
67
+ * Group items by app
68
+ */
69
+ function groupByApp<T extends { app?: string }>(
70
+ items: { moduleName: string; item: T }[]
71
+ ): Map<string, { moduleName: string; item: T }[]> {
72
+ const grouped = new Map<string, { moduleName: string; item: T }[]>();
73
+
74
+ for (const entry of items) {
75
+ const appName = entry.item.app || "Shared";
76
+ if (!grouped.has(appName)) {
77
+ grouped.set(appName, []);
78
+ }
79
+ grouped.get(appName)!.push(entry);
80
+ }
81
+
82
+ return new Map([...grouped.entries()].sort((a, b) => a[0].localeCompare(b[0])));
83
+ }
84
+
85
+ /**
86
+ * Find related API tools for a table
87
+ */
88
+ function findRelatedApiTools(tableName: string, apiTools: ApiToolsData | null): ApiTool[] {
89
+ if (!apiTools?.tools) return [];
90
+ return apiTools.tools.filter((tool) => tool.dbTables?.includes(tableName));
91
+ }
92
+
93
+ /**
94
+ * Find related Feature Map items for a table
95
+ */
96
+ function findRelatedFeatureItems(
97
+ tableName: string,
98
+ featureMap: FeatureMapData
99
+ ): RelatedFeatureItems {
100
+ const result: RelatedFeatureItems = {
101
+ actions: [],
102
+ screens: [],
103
+ components: [],
104
+ };
105
+
106
+ const relatedActionNames = new Set<string>();
107
+
108
+ const allModules: [string, typeof featureMap.features[string]][] = [
109
+ ...Object.entries(featureMap.features),
110
+ ["uncategorized", featureMap.uncategorized],
111
+ ];
112
+
113
+ for (const [moduleName, group] of allModules) {
114
+ if (!group) continue;
115
+
116
+ for (const action of group.actions || []) {
117
+ if (action.dbTables?.includes(tableName)) {
118
+ result.actions.push({ moduleName, action });
119
+ relatedActionNames.add(action.name);
120
+ }
121
+ }
122
+ }
123
+
124
+ for (const [moduleName, group] of allModules) {
125
+ if (!group) continue;
126
+
127
+ for (const screen of group.screens || []) {
128
+ if (screen.actions?.some((a) => relatedActionNames.has(a))) {
129
+ result.screens.push({ moduleName, screen });
130
+ }
131
+ }
132
+ }
133
+
134
+ return result;
135
+ }
136
+
137
+ function ColumnBadges({ column }: { column: DbColumn }) {
138
+ return (
139
+ <div className="flex flex-wrap gap-1">
140
+ {column.primaryKey && (
141
+ <Badge className="bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400 border-0">
142
+ <Key className="mr-1 h-3 w-3" />
143
+ PK
144
+ </Badge>
145
+ )}
146
+ {column.unique && !column.primaryKey && (
147
+ <Badge className="bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400 border-0">
148
+ <Hash className="mr-1 h-3 w-3" />
149
+ Unique
150
+ </Badge>
151
+ )}
152
+ {!column.nullable && !column.primaryKey && (
153
+ <Badge className="bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400 border-0">
154
+ Required
155
+ </Badge>
156
+ )}
157
+ </div>
158
+ );
159
+ }
160
+
161
+ interface TableDetailProps {
162
+ table: DbTable;
163
+ allTables: DbTable[];
164
+ featureMap: FeatureMapData | null;
165
+ apiTools: ApiToolsData | null;
166
+ /** URL prefix for links (e.g., "/db-schema" or "/db-schema/main") */
167
+ urlPrefix: string;
168
+ /** Database name (for multi-DB mode) */
169
+ dbName?: string;
170
+ }
171
+
172
+ /**
173
+ * Table Detail Component (Server Component)
174
+ *
175
+ * Displays detailed information about a database table
176
+ */
177
+ export function TableDetail({
178
+ table,
179
+ allTables,
180
+ featureMap,
181
+ apiTools,
182
+ urlPrefix,
183
+ dbName,
184
+ }: TableDetailProps) {
185
+ const tableName = table.name;
186
+ const category = normalizeCategory(table.category);
187
+ const config = getCategoryConfig(category);
188
+ const columnCount = table.columns?.length ?? table.columnCount ?? 0;
189
+
190
+ // Build FK map
191
+ const foreignKeyMap = new Map<string, string>();
192
+ if (table.foreignKeys) {
193
+ for (const fk of table.foreignKeys) {
194
+ foreignKeyMap.set(fk.column, fk.references.table);
195
+ }
196
+ }
197
+
198
+ // Find tables that reference this table
199
+ const referencedBy: { table: string; column: string }[] = [];
200
+ for (const t of allTables) {
201
+ if (t.foreignKeys) {
202
+ for (const fk of t.foreignKeys) {
203
+ if (fk.references.table === tableName) {
204
+ referencedBy.push({ table: t.name, column: fk.column });
205
+ }
206
+ }
207
+ }
208
+ }
209
+
210
+ // Find same-category tables for navigation
211
+ const sameCategoryTables = allTables
212
+ .filter((t) => normalizeCategory(t.category) === category && t.name !== tableName)
213
+ .slice(0, 5);
214
+
215
+ // Find related Feature Map items
216
+ const relatedFeatureItems = featureMap
217
+ ? findRelatedFeatureItems(tableName, featureMap)
218
+ : null;
219
+ const hasFeatureMapRelations =
220
+ relatedFeatureItems &&
221
+ (relatedFeatureItems.actions.length > 0 ||
222
+ relatedFeatureItems.screens.length > 0 ||
223
+ relatedFeatureItems.components.length > 0);
224
+
225
+ // Find related API tools
226
+ const relatedApiTools = findRelatedApiTools(tableName, apiTools);
227
+
228
+ // Find prev/next table
229
+ const tableIndex = allTables.findIndex((t) => t.name === tableName);
230
+ const prevTable = tableIndex > 0 ? allTables[tableIndex - 1] : null;
231
+ const nextTable = tableIndex < allTables.length - 1 ? allTables[tableIndex + 1] : null;
232
+
233
+ return (
234
+ <div className="space-y-8">
235
+ {/* Header */}
236
+ <header className="space-y-4">
237
+ <div className="flex items-start gap-4">
238
+ <div className={`rounded-lg p-3 ${config.bgColor}`}>
239
+ <Table2 className={`h-8 w-8 ${config.color}`} />
240
+ </div>
241
+ <div className="flex-1">
242
+ <div className="flex items-center gap-3 flex-wrap">
243
+ <h1 className="text-3xl font-bold font-mono tracking-tight">{tableName}</h1>
244
+ <Badge variant="outline" className={config.bgColor}>
245
+ {config.label}
246
+ </Badge>
247
+ {dbName && (
248
+ <Badge variant="secondary" className="font-mono">
249
+ {dbName}
250
+ </Badge>
251
+ )}
252
+ </div>
253
+ <div className="mt-2 flex items-center gap-2 text-sm text-muted-foreground">
254
+ <span>{columnCount} columns</span>
255
+ {table.foreignKeys && table.foreignKeys.length > 0 && (
256
+ <span>- {table.foreignKeys.length} foreign keys</span>
257
+ )}
258
+ {referencedBy.length > 0 && (
259
+ <span>- Referenced by {referencedBy.length} tables</span>
260
+ )}
261
+ </div>
262
+ {table.file && (
263
+ <p className="mt-1 text-sm text-muted-foreground flex items-center gap-1">
264
+ <FileCode className="h-3.5 w-3.5" />
265
+ Defined in <code className="rounded bg-muted px-1">{table.file}</code>
266
+ </p>
267
+ )}
268
+ </div>
269
+ </div>
270
+ {/* Table Description */}
271
+ {table.description && table.description !== "*" && (
272
+ <div className="rounded-lg border bg-muted/30 p-4">
273
+ <p className="text-sm text-muted-foreground whitespace-pre-line leading-relaxed">
274
+ {table.description}
275
+ </p>
276
+ </div>
277
+ )}
278
+ </header>
279
+
280
+ {/* Quick stats */}
281
+ <div className="grid gap-4 md:grid-cols-3 lg:grid-cols-6">
282
+ <Card>
283
+ <CardHeader className="pb-2">
284
+ <CardDescription>Columns</CardDescription>
285
+ <CardTitle className="text-2xl">{columnCount}</CardTitle>
286
+ </CardHeader>
287
+ </Card>
288
+ <Card>
289
+ <CardHeader className="pb-2">
290
+ <CardDescription>Foreign Keys</CardDescription>
291
+ <CardTitle className="text-2xl">{table.foreignKeys?.length ?? 0}</CardTitle>
292
+ </CardHeader>
293
+ </Card>
294
+ <Card>
295
+ <CardHeader className="pb-2">
296
+ <CardDescription>Referenced By</CardDescription>
297
+ <CardTitle className="text-2xl">{referencedBy.length}</CardTitle>
298
+ </CardHeader>
299
+ </Card>
300
+ <Card>
301
+ <CardHeader className="pb-2">
302
+ <CardDescription>Indexes</CardDescription>
303
+ <CardTitle className="text-2xl">{table.indexes?.length ?? 0}</CardTitle>
304
+ </CardHeader>
305
+ </Card>
306
+ <Card>
307
+ <CardHeader className="pb-2">
308
+ <CardDescription>Used By Actions</CardDescription>
309
+ <CardTitle className="text-2xl">{relatedFeatureItems?.actions.length ?? 0}</CardTitle>
310
+ </CardHeader>
311
+ </Card>
312
+ {apiTools && apiTools.tools && apiTools.tools.length > 0 && (
313
+ <Card>
314
+ <CardHeader className="pb-2">
315
+ <CardDescription>API Tools</CardDescription>
316
+ <CardTitle className="text-2xl">{relatedApiTools.length}</CardTitle>
317
+ </CardHeader>
318
+ </Card>
319
+ )}
320
+ </div>
321
+
322
+ {/* Columns */}
323
+ <Card>
324
+ <CardHeader>
325
+ <CardTitle>Columns</CardTitle>
326
+ <CardDescription>All columns in this table</CardDescription>
327
+ </CardHeader>
328
+ <CardContent>
329
+ {table.columns && table.columns.length > 0 ? (
330
+ <div className="rounded-lg border overflow-hidden">
331
+ <Table>
332
+ <TableHeader>
333
+ <TableRow className="hover:bg-transparent">
334
+ <TableHead className="w-[180px]">Name</TableHead>
335
+ <TableHead className="w-[140px]">Type</TableHead>
336
+ <TableHead className="w-[180px]">Constraints</TableHead>
337
+ <TableHead className="min-w-[200px]">Description</TableHead>
338
+ <TableHead className="w-[150px]">Default</TableHead>
339
+ </TableRow>
340
+ </TableHeader>
341
+ <TableBody>
342
+ {table.columns.map((column) => {
343
+ const referencedTable = foreignKeyMap.get(column.name);
344
+ return (
345
+ <TableRow key={column.name}>
346
+ <TableCell className="font-mono font-medium">
347
+ {column.name}
348
+ </TableCell>
349
+ <TableCell>
350
+ <code className="rounded bg-muted px-1.5 py-0.5 text-xs">
351
+ {column.type}
352
+ </code>
353
+ </TableCell>
354
+ <TableCell>
355
+ <div className="flex flex-wrap gap-1">
356
+ <ColumnBadges column={column} />
357
+ {referencedTable && (
358
+ <Link href={`${urlPrefix}/${encodeURIComponent(referencedTable)}`}>
359
+ <Badge className="bg-accent-purple/10 text-accent-purple border-0 cursor-pointer hover:bg-accent-purple/20">
360
+ <Database className="mr-1 h-3 w-3" />
361
+ {"->"} {referencedTable}
362
+ </Badge>
363
+ </Link>
364
+ )}
365
+ </div>
366
+ </TableCell>
367
+ <TableCell className="text-sm text-muted-foreground">
368
+ {column.description || (
369
+ <span className="text-muted-foreground/50">-</span>
370
+ )}
371
+ </TableCell>
372
+ <TableCell className="text-muted-foreground">
373
+ {column.default ? (
374
+ <code className="rounded bg-muted px-1.5 py-0.5 text-xs">
375
+ {column.default}
376
+ </code>
377
+ ) : (
378
+ <span className="text-muted-foreground/50">-</span>
379
+ )}
380
+ </TableCell>
381
+ </TableRow>
382
+ );
383
+ })}
384
+ </TableBody>
385
+ </Table>
386
+ </div>
387
+ ) : (
388
+ <div className="rounded-lg bg-muted/50 p-4 text-center text-sm text-muted-foreground">
389
+ Column details not available. Run <code className="rounded bg-muted px-1">shirokuma-docs schema --full</code> to generate.
390
+ </div>
391
+ )}
392
+ </CardContent>
393
+ </Card>
394
+
395
+ {/* Indexes */}
396
+ {table.indexes && table.indexes.length > 0 && (
397
+ <Card>
398
+ <CardHeader>
399
+ <CardTitle>Indexes</CardTitle>
400
+ <CardDescription>Database indexes for query optimization</CardDescription>
401
+ </CardHeader>
402
+ <CardContent>
403
+ <div className="rounded-lg border overflow-hidden">
404
+ <Table>
405
+ <TableHeader>
406
+ <TableRow className="hover:bg-transparent">
407
+ <TableHead className="w-[200px]">Name</TableHead>
408
+ <TableHead className="w-[180px]">Columns</TableHead>
409
+ <TableHead className="w-[100px]">Type</TableHead>
410
+ <TableHead className="min-w-[200px]">Description</TableHead>
411
+ </TableRow>
412
+ </TableHeader>
413
+ <TableBody>
414
+ {table.indexes.map((index) => (
415
+ <TableRow key={index.name}>
416
+ <TableCell className="font-mono">{index.name}</TableCell>
417
+ <TableCell>
418
+ <div className="flex flex-wrap gap-1">
419
+ {index.columns?.map((col) => (
420
+ <Badge key={col} variant="outline" className="font-mono text-xs">
421
+ {col}
422
+ </Badge>
423
+ )) ?? "-"}
424
+ </div>
425
+ </TableCell>
426
+ <TableCell>
427
+ {index.unique && (
428
+ <Badge className="bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400 border-0">
429
+ Unique
430
+ </Badge>
431
+ )}
432
+ </TableCell>
433
+ <TableCell className="text-sm text-muted-foreground">
434
+ {index.description || (
435
+ <span className="text-muted-foreground/50">-</span>
436
+ )}
437
+ </TableCell>
438
+ </TableRow>
439
+ ))}
440
+ </TableBody>
441
+ </Table>
442
+ </div>
443
+ </CardContent>
444
+ </Card>
445
+ )}
446
+
447
+ {/* Relationships */}
448
+ {((table.foreignKeys?.length ?? 0) > 0 || referencedBy.length > 0) && (
449
+ <Card>
450
+ <CardHeader>
451
+ <CardTitle className="flex items-center gap-2">
452
+ <Link2 className="h-5 w-5 text-accent-purple" />
453
+ Relationships
454
+ </CardTitle>
455
+ <CardDescription>Foreign key relationships with other tables</CardDescription>
456
+ </CardHeader>
457
+ <CardContent className="space-y-4">
458
+ {/* Outgoing FKs */}
459
+ {table.foreignKeys && table.foreignKeys.length > 0 && (
460
+ <div>
461
+ <h4 className="text-sm font-medium text-muted-foreground mb-2 flex items-center gap-2">
462
+ <ArrowRight className="h-4 w-4" />
463
+ References ({table.foreignKeys.length})
464
+ </h4>
465
+ <div className="flex flex-wrap gap-2">
466
+ {table.foreignKeys.map((fk) => (
467
+ <Button
468
+ key={fk.column}
469
+ asChild
470
+ variant="outline"
471
+ size="sm"
472
+ className="gap-2 border-accent-purple/30 hover:border-accent-purple/50"
473
+ >
474
+ <Link href={`${urlPrefix}/${encodeURIComponent(fk.references.table)}`}>
475
+ <Database className="h-3 w-3 text-accent-purple" />
476
+ <span className="font-mono text-muted-foreground">{fk.column}</span>
477
+ <ArrowRight className="h-3 w-3" />
478
+ <span className="font-mono font-medium">{fk.references.table}</span>
479
+ </Link>
480
+ </Button>
481
+ ))}
482
+ </div>
483
+ </div>
484
+ )}
485
+
486
+ {/* Incoming FKs */}
487
+ {referencedBy.length > 0 && (
488
+ <div>
489
+ <h4 className="text-sm font-medium text-muted-foreground mb-2 flex items-center gap-2">
490
+ <ArrowLeft className="h-4 w-4" />
491
+ Referenced By ({referencedBy.length})
492
+ </h4>
493
+ <div className="flex flex-wrap gap-2">
494
+ {referencedBy.map((ref) => (
495
+ <Button
496
+ key={`${ref.table}-${ref.column}`}
497
+ asChild
498
+ variant="outline"
499
+ size="sm"
500
+ className="gap-2 border-accent-purple/30 hover:border-accent-purple/50"
501
+ >
502
+ <Link href={`${urlPrefix}/${encodeURIComponent(ref.table)}`}>
503
+ <Database className="h-3 w-3 text-accent-purple" />
504
+ <span className="font-mono font-medium">{ref.table}</span>
505
+ <span className="text-muted-foreground">({ref.column})</span>
506
+ </Link>
507
+ </Button>
508
+ ))}
509
+ </div>
510
+ </div>
511
+ )}
512
+ </CardContent>
513
+ </Card>
514
+ )}
515
+
516
+ {/* Same category tables */}
517
+ {sameCategoryTables.length > 0 && (
518
+ <Card>
519
+ <CardHeader>
520
+ <CardTitle>Related Tables</CardTitle>
521
+ <CardDescription>Other tables in the {config.label} category</CardDescription>
522
+ </CardHeader>
523
+ <CardContent>
524
+ <div className="flex flex-wrap gap-2">
525
+ {sameCategoryTables.map((t) => (
526
+ <Button
527
+ key={t.name}
528
+ asChild
529
+ variant="outline"
530
+ size="sm"
531
+ className="gap-2"
532
+ >
533
+ <Link href={`${urlPrefix}/${encodeURIComponent(t.name)}`}>
534
+ <Database className="h-3.5 w-3.5" />
535
+ <span className="font-mono">{t.name}</span>
536
+ <span className="text-muted-foreground text-xs">
537
+ ({t.columns?.length ?? t.columnCount ?? 0} cols)
538
+ </span>
539
+ </Link>
540
+ </Button>
541
+ ))}
542
+ </div>
543
+ </CardContent>
544
+ </Card>
545
+ )}
546
+
547
+ {/* Usage - Feature Map + API Tools */}
548
+ {(hasFeatureMapRelations || relatedApiTools.length > 0) && (() => {
549
+ const actionsByApp: Map<string, { moduleName: string; item: ActionItem }[]> = relatedFeatureItems ? groupByApp(
550
+ relatedFeatureItems.actions.map(({ moduleName, action }) => ({ moduleName, item: action }))
551
+ ) : new Map();
552
+ const screensByApp: Map<string, { moduleName: string; item: ScreenItem }[]> = relatedFeatureItems ? groupByApp(
553
+ relatedFeatureItems.screens.map(({ moduleName, screen }) => ({ moduleName, item: screen }))
554
+ ) : new Map();
555
+ const componentsByApp: Map<string, { moduleName: string; item: ComponentItem }[]> = relatedFeatureItems ? groupByApp(
556
+ relatedFeatureItems.components.map(({ moduleName, component }) => ({ moduleName, item: component }))
557
+ ) : new Map();
558
+
559
+ const featureMapApps = new Set([
560
+ ...actionsByApp.keys(),
561
+ ...screensByApp.keys(),
562
+ ...componentsByApp.keys(),
563
+ ]);
564
+
565
+ const hasApiToolsToShow = relatedApiTools.length > 0;
566
+
567
+ return (
568
+ <Card>
569
+ <CardHeader>
570
+ <CardTitle className="flex items-center gap-2">
571
+ <Layers className="h-5 w-5" />
572
+ Usage
573
+ </CardTitle>
574
+ <CardDescription>
575
+ Applications and APIs using this table
576
+ </CardDescription>
577
+ </CardHeader>
578
+ <CardContent className="space-y-6">
579
+ {/* Feature Map Apps */}
580
+ {[...featureMapApps].sort().map((appName) => {
581
+ const appCfg = appConfig[appName] || appConfig.Shared;
582
+ const appActions = actionsByApp.get(appName) || [];
583
+ const appScreens = screensByApp.get(appName) || [];
584
+ const appComponents = componentsByApp.get(appName) || [];
585
+
586
+ return (
587
+ <div key={appName} className={`rounded-lg border p-4 ${appCfg.bgColor} ${appCfg.borderColor}`}>
588
+ <div className="flex items-center gap-2 mb-3">
589
+ <AppWindow className={`h-4 w-4 ${appCfg.color}`} />
590
+ <span className={`font-semibold ${appCfg.color}`}>{appCfg.label}</span>
591
+ <Badge variant="secondary" className="text-xs">
592
+ {appActions.length + appScreens.length + appComponents.length} items
593
+ </Badge>
594
+ </div>
595
+
596
+ <div className="space-y-3">
597
+ {appActions.length > 0 && (
598
+ <div>
599
+ <h5 className="text-xs font-medium text-accent-yellow mb-1.5 flex items-center gap-1">
600
+ <Code className="h-3 w-3" />
601
+ Actions ({appActions.length})
602
+ </h5>
603
+ <div className="flex flex-wrap gap-1.5">
604
+ {appActions.map(({ moduleName, item: action }) => (
605
+ <Button
606
+ key={`${moduleName}-${action.name}`}
607
+ asChild
608
+ variant="outline"
609
+ size="sm"
610
+ className="h-7 gap-1.5 text-xs border-accent-yellow/30 hover:border-accent-yellow/50 bg-background/50"
611
+ >
612
+ <Link href={`/details/actions/${encodeURIComponent(moduleName)}/${encodeURIComponent(action.name)}`}>
613
+ <Code className="h-3 w-3 text-accent-yellow" />
614
+ <span className="font-mono">{action.name}</span>
615
+ </Link>
616
+ </Button>
617
+ ))}
618
+ </div>
619
+ </div>
620
+ )}
621
+
622
+ {appScreens.length > 0 && (
623
+ <div>
624
+ <h5 className="text-xs font-medium text-accent-blue mb-1.5 flex items-center gap-1">
625
+ <Monitor className="h-3 w-3" />
626
+ Screens ({appScreens.length})
627
+ </h5>
628
+ <div className="flex flex-wrap gap-1.5">
629
+ {appScreens.map(({ moduleName, item: screen }) => (
630
+ <Button
631
+ key={`${moduleName}-${screen.name}`}
632
+ asChild
633
+ variant="outline"
634
+ size="sm"
635
+ className="h-7 gap-1.5 text-xs border-accent-blue/30 hover:border-accent-blue/50 bg-background/50"
636
+ >
637
+ <Link href={`/details/screens/${encodeURIComponent(moduleName)}/${encodeURIComponent(screen.name)}`}>
638
+ <Monitor className="h-3 w-3 text-accent-blue" />
639
+ <span className="font-mono">{screen.name}</span>
640
+ </Link>
641
+ </Button>
642
+ ))}
643
+ </div>
644
+ </div>
645
+ )}
646
+
647
+ {appComponents.length > 0 && (
648
+ <div>
649
+ <h5 className="text-xs font-medium text-accent-green mb-1.5 flex items-center gap-1">
650
+ <Component className="h-3 w-3" />
651
+ Components ({appComponents.length})
652
+ </h5>
653
+ <div className="flex flex-wrap gap-1.5">
654
+ {appComponents.map(({ moduleName, item: component }) => (
655
+ <Button
656
+ key={`${moduleName}-${component.name}`}
657
+ asChild
658
+ variant="outline"
659
+ size="sm"
660
+ className="h-7 gap-1.5 text-xs border-accent-green/30 hover:border-accent-green/50 bg-background/50"
661
+ >
662
+ <Link href={`/details/components/${encodeURIComponent(moduleName)}/${encodeURIComponent(component.name)}`}>
663
+ <Component className="h-3 w-3 text-accent-green" />
664
+ <span className="font-mono">{component.name}</span>
665
+ </Link>
666
+ </Button>
667
+ ))}
668
+ </div>
669
+ </div>
670
+ )}
671
+ </div>
672
+ </div>
673
+ );
674
+ })}
675
+
676
+ {/* API Server */}
677
+ {hasApiToolsToShow && (
678
+ <div className="rounded-lg border p-4 bg-purple-500/10 border-purple-500/30">
679
+ <div className="flex items-center gap-2 mb-3">
680
+ <Bot className="h-4 w-4 text-purple-600" />
681
+ <span className="font-semibold text-purple-600">API Server</span>
682
+ <Badge variant="secondary" className="text-xs">
683
+ {relatedApiTools.length} tools
684
+ </Badge>
685
+ </div>
686
+
687
+ <div>
688
+ <h5 className="text-xs font-medium text-purple-500 mb-1.5 flex items-center gap-1">
689
+ <Wrench className="h-3 w-3" />
690
+ API Tools ({relatedApiTools.length})
691
+ </h5>
692
+ <div className="flex flex-wrap gap-1.5">
693
+ {relatedApiTools.map((tool) => (
694
+ <Button
695
+ key={tool.name}
696
+ asChild
697
+ variant="outline"
698
+ size="sm"
699
+ className="h-7 gap-1.5 text-xs border-purple-500/30 hover:border-purple-500/50 bg-background/50"
700
+ >
701
+ <Link href={`/apps/mcp/tools/${tool.name}`}>
702
+ <Wrench className="h-3 w-3 text-purple-500" />
703
+ <span className="font-mono">{tool.name}</span>
704
+ </Link>
705
+ </Button>
706
+ ))}
707
+ </div>
708
+ </div>
709
+ </div>
710
+ )}
711
+ </CardContent>
712
+ </Card>
713
+ );
714
+ })()}
715
+
716
+ {/* Prev/Next navigation */}
717
+ <div className="flex items-center justify-between pt-4 border-t">
718
+ {prevTable ? (
719
+ <Button asChild variant="ghost" className="gap-2">
720
+ <Link href={`${urlPrefix}/${encodeURIComponent(prevTable.name)}`}>
721
+ <ArrowLeft className="h-4 w-4" />
722
+ <span className="font-mono">{prevTable.name}</span>
723
+ </Link>
724
+ </Button>
725
+ ) : (
726
+ <div />
727
+ )}
728
+ <Button asChild variant="outline">
729
+ <Link href={dbName ? `/db-schema/${encodeURIComponent(dbName)}` : "/db-schema"}>
730
+ <Database className="mr-2 h-4 w-4" />
731
+ All Tables
732
+ </Link>
733
+ </Button>
734
+ {nextTable ? (
735
+ <Button asChild variant="ghost" className="gap-2">
736
+ <Link href={`${urlPrefix}/${encodeURIComponent(nextTable.name)}`}>
737
+ <span className="font-mono">{nextTable.name}</span>
738
+ <ArrowRight className="h-4 w-4" />
739
+ </Link>
740
+ </Button>
741
+ ) : (
742
+ <div />
743
+ )}
744
+ </div>
745
+ </div>
746
+ );
747
+ }