@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,969 @@
1
+ /**
2
+ * projects command - GitHub Projects V2 management
3
+ *
4
+ * Subcommands:
5
+ * - list: List project items (excludes Done/Released by default)
6
+ * - get: Get item details by ID or issue number
7
+ * - fields: Show available field options
8
+ * - create: Create a new draft issue in the project
9
+ * - update: Update item fields
10
+ * - delete: Delete item from project
11
+ * - add-issue: Add existing issue to project
12
+ *
13
+ * Project naming convention: Project name = Repository name
14
+ */
15
+ import { createLogger } from "../utils/logger.js";
16
+ import { runGhCommand, runGraphQL, getOwner, getRepoName, validateTitle, validateBody, isIssueNumber, parseIssueNumber, } from "../utils/github.js";
17
+ import { loadGhConfig, getMetricsConfig } from "../utils/gh-config.js";
18
+ import { formatOutput, GH_PROJECTS_LIST_COLUMNS, } from "../utils/formatters.js";
19
+ import { getProjectFields, setItemFields, } from "../utils/project-fields.js";
20
+ /** Default statuses to exclude when listing (typically completed items) */
21
+ const DEFAULT_EXCLUDE_STATUSES = ["Done", "Released"];
22
+ /** #250 推奨ワークフロー: 有効にすべき自動化 */
23
+ export const RECOMMENDED_WORKFLOWS = ["Item closed", "Pull request merged"];
24
+ // =============================================================================
25
+ // GraphQL Queries
26
+ // =============================================================================
27
+ /** プロジェクトのワークフロー一覧を取得 */
28
+ const GRAPHQL_QUERY_WORKFLOWS = `
29
+ query($projectId: ID!) {
30
+ node(id: $projectId) {
31
+ ... on ProjectV2 {
32
+ title
33
+ workflows(first: 20) {
34
+ nodes {
35
+ id
36
+ name
37
+ number
38
+ enabled
39
+ }
40
+ }
41
+ }
42
+ }
43
+ }
44
+ `;
45
+ const GRAPHQL_QUERY_LIST = `
46
+ query($projectId: ID!, $cursor: String) {
47
+ node(id: $projectId) {
48
+ ... on ProjectV2 {
49
+ title
50
+ items(first: 100, after: $cursor) {
51
+ pageInfo { hasNextPage endCursor }
52
+ nodes {
53
+ id
54
+ status: fieldValueByName(name: "Status") {
55
+ ... on ProjectV2ItemFieldSingleSelectValue { name }
56
+ }
57
+ priority: fieldValueByName(name: "Priority") {
58
+ ... on ProjectV2ItemFieldSingleSelectValue { name }
59
+ }
60
+ type: fieldValueByName(name: "Type") {
61
+ ... on ProjectV2ItemFieldSingleSelectValue { name }
62
+ }
63
+ size: fieldValueByName(name: "Size") {
64
+ ... on ProjectV2ItemFieldSingleSelectValue { name }
65
+ }
66
+ content {
67
+ ... on DraftIssue { title }
68
+ ... on Issue { title number }
69
+ }
70
+ }
71
+ }
72
+ }
73
+ }
74
+ }
75
+ `;
76
+ const GRAPHQL_QUERY_ITEM = `
77
+ query($itemId: ID!) {
78
+ node(id: $itemId) {
79
+ ... on ProjectV2Item {
80
+ id
81
+ status: fieldValueByName(name: "Status") {
82
+ ... on ProjectV2ItemFieldSingleSelectValue { name optionId }
83
+ }
84
+ priority: fieldValueByName(name: "Priority") {
85
+ ... on ProjectV2ItemFieldSingleSelectValue { name optionId }
86
+ }
87
+ type: fieldValueByName(name: "Type") {
88
+ ... on ProjectV2ItemFieldSingleSelectValue { name optionId }
89
+ }
90
+ size: fieldValueByName(name: "Size") {
91
+ ... on ProjectV2ItemFieldSingleSelectValue { name optionId }
92
+ }
93
+ content {
94
+ ... on DraftIssue { id title body }
95
+ ... on Issue { id title number body url }
96
+ }
97
+ project { id title }
98
+ }
99
+ }
100
+ }
101
+ `;
102
+ const GRAPHQL_MUTATION_CREATE = `
103
+ mutation($projectId: ID!, $title: String!, $body: String) {
104
+ addProjectV2DraftIssue(input: {projectId: $projectId, title: $title, body: $body}) {
105
+ projectItem { id }
106
+ }
107
+ }
108
+ `;
109
+ const GRAPHQL_MUTATION_UPDATE_BODY = `
110
+ mutation($draftIssueId: ID!, $body: String!) {
111
+ updateProjectV2DraftIssue(input: {draftIssueId: $draftIssueId, body: $body}) {
112
+ draftIssue { id body }
113
+ }
114
+ }
115
+ `;
116
+ const GRAPHQL_MUTATION_UPDATE_ISSUE = `
117
+ mutation($id: ID!, $body: String!) {
118
+ updateIssue(input: {id: $id, body: $body}) {
119
+ issue { id number title body }
120
+ }
121
+ }
122
+ `;
123
+ const GRAPHQL_MUTATION_DELETE_ITEM = `
124
+ mutation($projectId: ID!, $itemId: ID!) {
125
+ deleteProjectV2Item(input: {projectId: $projectId, itemId: $itemId}) {
126
+ deletedItemId
127
+ }
128
+ }
129
+ `;
130
+ const GRAPHQL_MUTATION_ADD_ISSUE_TO_PROJECT = `
131
+ mutation($projectId: ID!, $contentId: ID!) {
132
+ addProjectV2ItemById(input: {projectId: $projectId, contentId: $contentId}) {
133
+ item { id }
134
+ }
135
+ }
136
+ `;
137
+ const GRAPHQL_QUERY_ISSUE_BY_NUMBER = `
138
+ query($owner: String!, $name: String!, $number: Int!) {
139
+ repository(owner: $owner, name: $name) {
140
+ issue(number: $number) {
141
+ id
142
+ number
143
+ title
144
+ body
145
+ url
146
+ }
147
+ }
148
+ }
149
+ `;
150
+ // =============================================================================
151
+ // Helper Functions
152
+ // =============================================================================
153
+ /**
154
+ * Get project ID by name (defaults to repository name)
155
+ */
156
+ export function getProjectId(owner, projectName) {
157
+ const targetName = projectName || getRepoName();
158
+ if (!targetName)
159
+ return null;
160
+ const result = runGhCommand(["project", "list", "--owner", owner, "--format", "json"], { silent: true });
161
+ if (!result.success || !result.data?.projects)
162
+ return null;
163
+ // Find project by name (repository name convention)
164
+ for (const project of result.data.projects) {
165
+ if (project.title === targetName) {
166
+ return project.id;
167
+ }
168
+ }
169
+ // Fallback to first project if no match (#382: warn about fallback)
170
+ const fallbackId = result.data.projects[0]?.id ?? null;
171
+ if (fallbackId) {
172
+ console.error(`warn: No project named '${targetName}'. Using first project as fallback.`);
173
+ }
174
+ return fallbackId;
175
+ }
176
+ /**
177
+ * Fetch all project items with pagination
178
+ */
179
+ function fetchAllItems(projectId) {
180
+ const allItems = [];
181
+ let cursor = null;
182
+ let projectTitle = "";
183
+ while (true) {
184
+ const result = runGraphQL(GRAPHQL_QUERY_LIST, {
185
+ projectId,
186
+ cursor: cursor ?? "null",
187
+ });
188
+ if (!result.success || !result.data?.data?.node)
189
+ break;
190
+ const node = result.data.data.node;
191
+ projectTitle = node.title ?? "";
192
+ const itemsData = node.items ?? { nodes: [], pageInfo: {} };
193
+ const nodes = itemsData.nodes ?? [];
194
+ for (const item of nodes) {
195
+ if (!item?.id)
196
+ continue;
197
+ allItems.push({
198
+ id: item.id,
199
+ title: item.content?.title ?? null,
200
+ status: item.status?.name ?? null,
201
+ priority: item.priority?.name ?? null,
202
+ type: item.type?.name ?? null,
203
+ size: item.size?.name ?? null,
204
+ issueNumber: item.content?.number ?? null,
205
+ });
206
+ }
207
+ const pageInfo = itemsData.pageInfo ?? {};
208
+ if (!pageInfo.hasNextPage)
209
+ break;
210
+ cursor = pageInfo.endCursor ?? null;
211
+ }
212
+ return { title: projectTitle, items: allItems };
213
+ }
214
+ /**
215
+ * Fetch a single project item by ID with full details
216
+ */
217
+ function fetchItem(itemId) {
218
+ const result = runGraphQL(GRAPHQL_QUERY_ITEM, { itemId });
219
+ if (!result.success || !result.data?.data?.node)
220
+ return null;
221
+ const node = result.data.data.node;
222
+ const content = node.content ?? {};
223
+ const project = node.project ?? {};
224
+ return {
225
+ id: node.id ?? itemId,
226
+ title: content.title ?? null,
227
+ body: content.body ?? null,
228
+ status: node.status?.name ?? null,
229
+ statusOptionId: node.status?.optionId ?? null,
230
+ priority: node.priority?.name ?? null,
231
+ priorityOptionId: node.priority?.optionId ?? null,
232
+ type: node.type?.name ?? null,
233
+ typeOptionId: node.type?.optionId ?? null,
234
+ size: node.size?.name ?? null,
235
+ sizeOptionId: node.size?.optionId ?? null,
236
+ issueNumber: content.number ?? null,
237
+ issueUrl: content.url ?? null,
238
+ draftIssueId: content.number ? null : content.id ?? null,
239
+ project: project.id ? { id: project.id, title: project.title ?? "" } : undefined,
240
+ };
241
+ }
242
+ /**
243
+ * Find project item by issue number
244
+ */
245
+ function findItemByIssueNumber(projectId, issueNumber) {
246
+ const { items } = fetchAllItems(projectId);
247
+ for (const item of items) {
248
+ if (item.issueNumber === issueNumber) {
249
+ return { id: item.id };
250
+ }
251
+ }
252
+ return null;
253
+ }
254
+ /**
255
+ * Get issue by number
256
+ */
257
+ function getIssueByNumber(owner, repo, number) {
258
+ const result = runGraphQL(GRAPHQL_QUERY_ISSUE_BY_NUMBER, {
259
+ owner,
260
+ name: repo,
261
+ number,
262
+ });
263
+ if (!result.success)
264
+ return null;
265
+ const issue = result.data?.data?.repository?.issue;
266
+ if (!issue?.id)
267
+ return null;
268
+ return {
269
+ id: issue.id,
270
+ number: issue.number ?? number,
271
+ title: issue.title ?? "",
272
+ body: issue.body ?? "",
273
+ url: issue.url ?? "",
274
+ };
275
+ }
276
+ // =============================================================================
277
+ // Subcommand Handlers
278
+ // =============================================================================
279
+ /**
280
+ * list subcommand
281
+ */
282
+ async function cmdList(options, logger) {
283
+ // Load config for defaults
284
+ const config = loadGhConfig();
285
+ const owner = options.owner || getOwner();
286
+ if (!owner) {
287
+ logger.error("Could not determine repository owner");
288
+ return 1;
289
+ }
290
+ const projectId = getProjectId(owner);
291
+ if (!projectId) {
292
+ logger.error(`No project found for owner '${owner}'`);
293
+ return 1;
294
+ }
295
+ const { title: projectTitle, items } = fetchAllItems(projectId);
296
+ // Apply status filter
297
+ // Default: exclude Done/Released unless --all or --status specified
298
+ let filteredItems = items;
299
+ if (options.status && options.status.length > 0) {
300
+ filteredItems = items.filter((i) => options.status.includes(i.status ?? ""));
301
+ }
302
+ else if (!options.all) {
303
+ filteredItems = items.filter((i) => !DEFAULT_EXCLUDE_STATUSES.includes(i.status ?? ""));
304
+ }
305
+ const output = {
306
+ project: { id: projectId, title: projectTitle, owner },
307
+ items: filteredItems.map((i) => ({
308
+ id: i.id,
309
+ title: i.title,
310
+ status: i.status,
311
+ priority: i.priority,
312
+ type: i.type,
313
+ size: i.size,
314
+ issue_number: i.issueNumber,
315
+ })),
316
+ total_count: filteredItems.length,
317
+ };
318
+ const outputFormat = options.format ?? "json";
319
+ const formatted = formatOutput(output, outputFormat, {
320
+ arrayKey: "items",
321
+ columns: GH_PROJECTS_LIST_COLUMNS,
322
+ });
323
+ console.log(formatted);
324
+ return 0;
325
+ }
326
+ /**
327
+ * get subcommand
328
+ */
329
+ async function cmdGet(itemIdOrNumber, options, logger) {
330
+ let itemId = itemIdOrNumber;
331
+ // Support #number notation
332
+ if (isIssueNumber(itemIdOrNumber)) {
333
+ const issueNumber = parseIssueNumber(itemIdOrNumber);
334
+ const owner = options.owner || getOwner();
335
+ const repo = getRepoName();
336
+ if (!owner || !repo) {
337
+ logger.error("Could not determine repository");
338
+ return 1;
339
+ }
340
+ const projectId = getProjectId(owner);
341
+ if (!projectId) {
342
+ logger.error(`No project found for owner '${owner}'`);
343
+ return 1;
344
+ }
345
+ const found = findItemByIssueNumber(projectId, issueNumber);
346
+ if (!found) {
347
+ logger.error(`No project item found for Issue #${issueNumber}`);
348
+ return 1;
349
+ }
350
+ itemId = found.id;
351
+ }
352
+ const item = fetchItem(itemId);
353
+ if (!item) {
354
+ logger.error(`Item '${itemIdOrNumber}' not found`);
355
+ return 1;
356
+ }
357
+ // Convert to snake_case for JSON output (consistency with Python version)
358
+ const output = {
359
+ id: item.id,
360
+ title: item.title,
361
+ body: item.body,
362
+ status: item.status,
363
+ status_option_id: item.statusOptionId,
364
+ priority: item.priority,
365
+ priority_option_id: item.priorityOptionId,
366
+ type: item.type,
367
+ type_option_id: item.typeOptionId,
368
+ size: item.size,
369
+ size_option_id: item.sizeOptionId,
370
+ issue_number: item.issueNumber,
371
+ issue_url: item.issueUrl,
372
+ draft_issue_id: item.draftIssueId,
373
+ project: item.project,
374
+ };
375
+ console.log(JSON.stringify(output, null, 2));
376
+ return 0;
377
+ }
378
+ /**
379
+ * fields subcommand
380
+ */
381
+ async function cmdFields(options, logger) {
382
+ const owner = options.owner || getOwner();
383
+ if (!owner) {
384
+ logger.error("Could not determine repository owner");
385
+ return 1;
386
+ }
387
+ const projectId = getProjectId(owner);
388
+ if (!projectId) {
389
+ logger.error(`No project found for owner '${owner}'`);
390
+ return 1;
391
+ }
392
+ const fields = getProjectFields(projectId);
393
+ console.log(JSON.stringify(fields, null, 2));
394
+ return 0;
395
+ }
396
+ /**
397
+ * create subcommand
398
+ */
399
+ async function cmdCreate(options, logger) {
400
+ // Validation
401
+ if (!options.title) {
402
+ logger.error("--title is required");
403
+ return 1;
404
+ }
405
+ const titleError = validateTitle(options.title);
406
+ if (titleError) {
407
+ logger.error(titleError);
408
+ return 1;
409
+ }
410
+ const bodyError = validateBody(options.body);
411
+ if (bodyError) {
412
+ logger.error(bodyError);
413
+ return 1;
414
+ }
415
+ const owner = options.owner || getOwner();
416
+ if (!owner) {
417
+ logger.error("Could not determine repository owner");
418
+ return 1;
419
+ }
420
+ const projectId = getProjectId(owner);
421
+ if (!projectId) {
422
+ logger.error(`No project found for owner '${owner}'`);
423
+ return 1;
424
+ }
425
+ const result = runGraphQL(GRAPHQL_MUTATION_CREATE, {
426
+ projectId,
427
+ title: options.title,
428
+ body: options.body ?? "",
429
+ });
430
+ if (!result.success) {
431
+ logger.error("Failed to create item");
432
+ return 1;
433
+ }
434
+ const itemId = result.data?.data?.addProjectV2DraftIssue?.projectItem?.id;
435
+ if (!itemId) {
436
+ logger.error("Failed to create item");
437
+ return 1;
438
+ }
439
+ // Set fields if provided
440
+ const fields = {};
441
+ if (options.fieldStatus)
442
+ fields["Status"] = options.fieldStatus;
443
+ if (options.priority)
444
+ fields["Priority"] = options.priority;
445
+ if (options.type)
446
+ fields["Type"] = options.type;
447
+ if (options.size)
448
+ fields["Size"] = options.size;
449
+ if (Object.keys(fields).length > 0) {
450
+ setItemFields(projectId, itemId, fields, logger);
451
+ }
452
+ const item = fetchItem(itemId);
453
+ if (item) {
454
+ const output = {
455
+ id: item.id,
456
+ title: item.title,
457
+ body: item.body,
458
+ status: item.status,
459
+ priority: item.priority,
460
+ type: item.type,
461
+ size: item.size,
462
+ issue_number: item.issueNumber,
463
+ draft_issue_id: item.draftIssueId,
464
+ project: item.project,
465
+ };
466
+ console.log(JSON.stringify(output, null, 2));
467
+ }
468
+ return 0;
469
+ }
470
+ /**
471
+ * update subcommand
472
+ */
473
+ async function cmdUpdate(itemIdOrNumber, options, logger) {
474
+ // Validation
475
+ const bodyError = validateBody(options.body);
476
+ if (bodyError) {
477
+ logger.error(bodyError);
478
+ return 1;
479
+ }
480
+ let itemId = itemIdOrNumber;
481
+ const owner = options.owner || getOwner();
482
+ const repo = getRepoName();
483
+ // Support #number notation
484
+ if (isIssueNumber(itemIdOrNumber)) {
485
+ const issueNumber = parseIssueNumber(itemIdOrNumber);
486
+ if (!owner || !repo) {
487
+ logger.error("Could not determine repository");
488
+ return 1;
489
+ }
490
+ const projectId = getProjectId(owner);
491
+ if (!projectId) {
492
+ logger.error(`No project found for owner '${owner}'`);
493
+ return 1;
494
+ }
495
+ const found = findItemByIssueNumber(projectId, issueNumber);
496
+ if (!found) {
497
+ logger.error(`No project item found for Issue #${issueNumber}`);
498
+ return 1;
499
+ }
500
+ itemId = found.id;
501
+ }
502
+ let item = fetchItem(itemId);
503
+ if (!item) {
504
+ logger.error(`Item '${itemIdOrNumber}' not found`);
505
+ return 1;
506
+ }
507
+ const projectId = item.project?.id;
508
+ if (!projectId) {
509
+ logger.error("Could not determine project ID");
510
+ return 1;
511
+ }
512
+ // Build fields dict from options
513
+ const fields = {};
514
+ if (options.fieldStatus)
515
+ fields["Status"] = options.fieldStatus;
516
+ if (options.priority)
517
+ fields["Priority"] = options.priority;
518
+ if (options.type)
519
+ fields["Type"] = options.type;
520
+ if (options.size)
521
+ fields["Size"] = options.size;
522
+ let updated = setItemFields(projectId, itemId, fields, logger) > 0;
523
+ // Update body if provided
524
+ if (options.body !== undefined) {
525
+ if (item.draftIssueId) {
526
+ // DraftIssue body update
527
+ const result = runGraphQL(GRAPHQL_MUTATION_UPDATE_BODY, {
528
+ draftIssueId: item.draftIssueId,
529
+ body: options.body,
530
+ });
531
+ if (result.success)
532
+ updated = true;
533
+ }
534
+ else if (item.issueNumber && owner && repo) {
535
+ // Issue body update
536
+ const issueData = getIssueByNumber(owner, repo, item.issueNumber);
537
+ if (issueData?.id) {
538
+ const result = runGraphQL(GRAPHQL_MUTATION_UPDATE_ISSUE, {
539
+ id: issueData.id,
540
+ body: options.body,
541
+ });
542
+ if (result.success)
543
+ updated = true;
544
+ }
545
+ else {
546
+ logger.warn("Cannot update Issue body (Issue not found)");
547
+ }
548
+ }
549
+ else {
550
+ logger.warn("Cannot update body (unknown content type)");
551
+ }
552
+ }
553
+ if (updated) {
554
+ item = fetchItem(itemId);
555
+ }
556
+ if (item) {
557
+ const output = {
558
+ id: item.id,
559
+ title: item.title,
560
+ body: item.body,
561
+ status: item.status,
562
+ status_option_id: item.statusOptionId,
563
+ priority: item.priority,
564
+ type: item.type,
565
+ size: item.size,
566
+ issue_number: item.issueNumber,
567
+ issue_url: item.issueUrl,
568
+ draft_issue_id: item.draftIssueId,
569
+ project: item.project,
570
+ };
571
+ console.log(JSON.stringify(output, null, 2));
572
+ }
573
+ return 0;
574
+ }
575
+ /**
576
+ * delete subcommand
577
+ */
578
+ async function cmdDelete(itemIdOrNumber, options, logger) {
579
+ let itemId = itemIdOrNumber;
580
+ const owner = options.owner || getOwner();
581
+ const repo = getRepoName();
582
+ // Support #number notation
583
+ if (isIssueNumber(itemIdOrNumber)) {
584
+ const issueNumber = parseIssueNumber(itemIdOrNumber);
585
+ if (!owner || !repo) {
586
+ logger.error("Could not determine repository");
587
+ return 1;
588
+ }
589
+ const projectId = getProjectId(owner);
590
+ if (!projectId) {
591
+ logger.error(`No project found for owner '${owner}'`);
592
+ return 1;
593
+ }
594
+ const found = findItemByIssueNumber(projectId, issueNumber);
595
+ if (!found) {
596
+ logger.error(`No project item found for Issue #${issueNumber}`);
597
+ return 1;
598
+ }
599
+ itemId = found.id;
600
+ }
601
+ const item = fetchItem(itemId);
602
+ if (!item) {
603
+ logger.error(`Item '${itemIdOrNumber}' not found`);
604
+ return 1;
605
+ }
606
+ const projectId = item.project?.id;
607
+ if (!projectId) {
608
+ logger.error("Could not determine project ID");
609
+ return 1;
610
+ }
611
+ const title = item.title ?? "Unknown";
612
+ const issueNum = item.issueNumber;
613
+ // Confirmation prompt (unless --force)
614
+ if (!options.force) {
615
+ const displayName = issueNum ? `#${issueNum} ${title}` : title;
616
+ console.error(`About to remove from project: ${displayName}`);
617
+ if (issueNum) {
618
+ console.error(" Note: The Issue will NOT be deleted, only removed from project.");
619
+ }
620
+ // In Node.js we can't easily do interactive prompts in a portable way
621
+ // For now, require --force flag
622
+ logger.error("Use --force to confirm deletion");
623
+ return 1;
624
+ }
625
+ // Delete from project
626
+ const result = runGraphQL(GRAPHQL_MUTATION_DELETE_ITEM, { projectId, itemId });
627
+ if (result.success) {
628
+ const output = {
629
+ deleted: true,
630
+ item_id: itemId,
631
+ title,
632
+ };
633
+ if (issueNum) {
634
+ output.issue_number = issueNum;
635
+ output.note = "Item removed from project. Issue still exists.";
636
+ }
637
+ console.log(JSON.stringify(output, null, 2));
638
+ return 0;
639
+ }
640
+ else {
641
+ logger.error("Failed to delete item");
642
+ return 1;
643
+ }
644
+ }
645
+ /**
646
+ * add-issue subcommand
647
+ */
648
+ async function cmdAddIssue(issueNumberStr, options, logger) {
649
+ const owner = options.owner || getOwner();
650
+ const repo = getRepoName();
651
+ if (!owner || !repo) {
652
+ logger.error("Could not determine repository");
653
+ return 1;
654
+ }
655
+ const projectId = getProjectId(owner);
656
+ if (!projectId) {
657
+ logger.error(`No project found for owner '${owner}'`);
658
+ return 1;
659
+ }
660
+ const issueNumber = parseIssueNumber(issueNumberStr);
661
+ // Get Issue details
662
+ const issue = getIssueByNumber(owner, repo, issueNumber);
663
+ if (!issue) {
664
+ logger.error(`Issue #${issueNumber} not found`);
665
+ return 1;
666
+ }
667
+ // Check if already in project
668
+ const existing = findItemByIssueNumber(projectId, issueNumber);
669
+ if (existing) {
670
+ logger.info(`Issue #${issueNumber} is already in the project`);
671
+ const item = fetchItem(existing.id);
672
+ if (item) {
673
+ const output = {
674
+ id: item.id,
675
+ title: item.title,
676
+ status: item.status,
677
+ priority: item.priority,
678
+ type: item.type,
679
+ size: item.size,
680
+ issue_number: item.issueNumber,
681
+ issue_url: item.issueUrl,
682
+ };
683
+ console.log(JSON.stringify(output, null, 2));
684
+ }
685
+ return 0;
686
+ }
687
+ const result = runGraphQL(GRAPHQL_MUTATION_ADD_ISSUE_TO_PROJECT, {
688
+ projectId,
689
+ contentId: issue.id,
690
+ });
691
+ if (!result.success) {
692
+ logger.error(`Failed to add Issue #${issueNumber} to project`);
693
+ return 1;
694
+ }
695
+ const itemId = result.data?.data?.addProjectV2ItemById?.item?.id;
696
+ if (!itemId) {
697
+ logger.error(`Failed to add Issue #${issueNumber} to project`);
698
+ return 1;
699
+ }
700
+ // Set project fields
701
+ const fields = {};
702
+ if (options.fieldStatus)
703
+ fields["Status"] = options.fieldStatus;
704
+ if (options.priority)
705
+ fields["Priority"] = options.priority;
706
+ if (options.type)
707
+ fields["Type"] = options.type;
708
+ if (options.size)
709
+ fields["Size"] = options.size;
710
+ if (Object.keys(fields).length > 0) {
711
+ setItemFields(projectId, itemId, fields, logger);
712
+ }
713
+ const item = fetchItem(itemId);
714
+ if (item) {
715
+ const output = {
716
+ id: item.id,
717
+ title: item.title,
718
+ status: item.status,
719
+ priority: item.priority,
720
+ type: item.type,
721
+ size: item.size,
722
+ issue_number: item.issueNumber,
723
+ issue_url: item.issueUrl,
724
+ };
725
+ console.log(JSON.stringify(output, null, 2));
726
+ }
727
+ return 0;
728
+ }
729
+ // =============================================================================
730
+ // Workflow helpers (#250)
731
+ // =============================================================================
732
+ /**
733
+ * プロジェクトのワークフロー一覧を取得する。
734
+ * GitHub Projects V2 のビルトイン自動化を確認するために使用。
735
+ *
736
+ * @returns ワークフロー配列。取得失敗時は空配列
737
+ */
738
+ export function fetchWorkflows(projectId) {
739
+ const result = runGraphQL(GRAPHQL_QUERY_WORKFLOWS, { projectId });
740
+ if (!result.success)
741
+ return [];
742
+ const nodes = result.data?.data?.node?.workflows?.nodes ?? [];
743
+ return nodes
744
+ .filter((n) => !!n?.id && !!n?.name && n.number !== undefined)
745
+ .map((n) => ({
746
+ id: n.id,
747
+ name: n.name,
748
+ number: n.number,
749
+ enabled: n.enabled ?? false,
750
+ }));
751
+ }
752
+ /**
753
+ * workflows subcommand - ビルトイン自動化の状態を表示
754
+ */
755
+ async function cmdWorkflows(options, logger) {
756
+ const owner = options.owner || getOwner();
757
+ if (!owner) {
758
+ logger.error("Could not determine repository owner");
759
+ return 1;
760
+ }
761
+ const projectId = getProjectId(owner);
762
+ if (!projectId) {
763
+ logger.error(`No project found for owner '${owner}'`);
764
+ return 1;
765
+ }
766
+ const workflows = fetchWorkflows(projectId);
767
+ if (workflows.length === 0) {
768
+ logger.warn("No workflows found or failed to fetch");
769
+ return 1;
770
+ }
771
+ // 推奨ワークフローの有効/無効をチェック
772
+ const disabledRecommended = workflows.filter((w) => RECOMMENDED_WORKFLOWS.includes(w.name) && !w.enabled);
773
+ const output = {
774
+ project_id: projectId,
775
+ workflows: workflows.map((w) => ({
776
+ name: w.name,
777
+ number: w.number,
778
+ enabled: w.enabled,
779
+ recommended: RECOMMENDED_WORKFLOWS.includes(w.name),
780
+ })),
781
+ recommendations: disabledRecommended.length > 0
782
+ ? {
783
+ message: "以下の推奨ワークフローが無効です。GitHub UI から有効化してください。",
784
+ disabled: disabledRecommended.map((w) => w.name),
785
+ settings_url: `https://github.com/orgs/${owner}/projects (Settings > Workflows)`,
786
+ }
787
+ : null,
788
+ };
789
+ console.log(JSON.stringify(output, null, 2));
790
+ if (disabledRecommended.length > 0) {
791
+ logger.warn(`${disabledRecommended.length} recommended workflow(s) disabled: ${disabledRecommended.map((w) => w.name).join(", ")}`);
792
+ logger.info("Enable via: GitHub Project Settings > Workflows (API not supported)");
793
+ }
794
+ return 0;
795
+ }
796
+ // =============================================================================
797
+ // setup-metrics (#342)
798
+ // =============================================================================
799
+ /** Create a custom field in a project */
800
+ const GRAPHQL_MUTATION_CREATE_FIELD = `
801
+ mutation($projectId: ID!, $name: String!, $dataType: ProjectV2CustomFieldType!) {
802
+ createProjectV2Field(input: {projectId: $projectId, name: $name, dataType: $dataType}) {
803
+ projectV2Field {
804
+ ... on ProjectV2Field { id name dataType }
805
+ }
806
+ }
807
+ }
808
+ `;
809
+ /**
810
+ * Create Text fields for metrics tracking (idempotent).
811
+ * Reads field names from metrics config, creates missing ones.
812
+ */
813
+ async function cmdSetupMetrics(options, logger) {
814
+ const config = loadGhConfig();
815
+ const metricsConfig = getMetricsConfig(config);
816
+ const owner = options.owner || getOwner();
817
+ if (!owner) {
818
+ logger.error("Could not determine repository owner");
819
+ return 1;
820
+ }
821
+ const projectId = getProjectId(owner);
822
+ if (!projectId) {
823
+ logger.error(`No project found for owner '${owner}'`);
824
+ return 1;
825
+ }
826
+ // Get existing fields
827
+ const existingFields = getProjectFields(projectId);
828
+ // Determine which text fields to create
829
+ const dateFields = metricsConfig.dateFields ?? {};
830
+ const fieldNames = Object.values(dateFields).filter(Boolean);
831
+ const created = [];
832
+ const existing = [];
833
+ const failed = [];
834
+ for (const fieldName of fieldNames) {
835
+ if (existingFields[fieldName]) {
836
+ const field = existingFields[fieldName];
837
+ if (field.type === "TEXT") {
838
+ existing.push(fieldName);
839
+ logger.debug(`Field already exists: ${fieldName}`);
840
+ }
841
+ else {
842
+ logger.warn(`Field '${fieldName}' exists but is type ${field.type}, expected TEXT`);
843
+ failed.push(fieldName);
844
+ }
845
+ continue;
846
+ }
847
+ // Create text field
848
+ const result = runGraphQL(GRAPHQL_MUTATION_CREATE_FIELD, {
849
+ projectId,
850
+ name: fieldName,
851
+ dataType: "TEXT",
852
+ });
853
+ if (result.success) {
854
+ created.push(fieldName);
855
+ logger.success(`Created Text field: ${fieldName}`);
856
+ }
857
+ else {
858
+ failed.push(fieldName);
859
+ logger.error(`Failed to create Text field: ${fieldName}`);
860
+ }
861
+ }
862
+ // Output
863
+ const output = {
864
+ project_id: projectId,
865
+ fields: { created, existing, failed },
866
+ metrics_config: {
867
+ enabled: metricsConfig.enabled,
868
+ dateFields: metricsConfig.dateFields,
869
+ statusToDateMapping: metricsConfig.statusToDateMapping,
870
+ },
871
+ next_steps: [
872
+ ...(metricsConfig.enabled
873
+ ? []
874
+ : ["Set metrics.enabled: true in shirokuma-docs.config.yaml"]),
875
+ "Timestamps are automatically set when status changes via 'issues update --field-status'",
876
+ "Run 'session check --fix' to backfill timestamps for existing Done issues",
877
+ ],
878
+ };
879
+ console.log(JSON.stringify(output, null, 2));
880
+ return failed.length > 0 ? 1 : 0;
881
+ }
882
+ // =============================================================================
883
+ // Main Command Handler
884
+ // =============================================================================
885
+ /**
886
+ * projects command handler
887
+ */
888
+ export async function projectsCommand(action, target, options) {
889
+ const logger = createLogger(options.verbose);
890
+ // Deprecation warning (workflows/setup-metrics subcommands are NOT deprecated)
891
+ if (action !== "workflows" && action !== "setup-metrics") {
892
+ console.error("[DEPRECATED] projects item commands are deprecated. Use issues instead:\n" +
893
+ " issues fields (was: projects fields)\n" +
894
+ " issues remove (was: projects delete)\n" +
895
+ " issues update (was: projects update)\n" +
896
+ " issues create (was: projects create)\n" +
897
+ " session start (was: projects list)\n" +
898
+ " projects workflows (project-level: NOT deprecated)\n");
899
+ }
900
+ logger.debug(`Action: ${action}`);
901
+ logger.debug(`Target: ${target ?? "(none)"}`);
902
+ logger.debug(`Owner: ${options.owner ?? "(auto)"}`);
903
+ let exitCode = 0;
904
+ switch (action) {
905
+ case "list":
906
+ exitCode = await cmdList(options, logger);
907
+ break;
908
+ case "get":
909
+ if (!target) {
910
+ logger.error("Item ID or issue number required");
911
+ logger.info("Usage: shirokuma-docs projects get <item-id-or-number>");
912
+ exitCode = 1;
913
+ }
914
+ else {
915
+ exitCode = await cmdGet(target, options, logger);
916
+ }
917
+ break;
918
+ case "fields":
919
+ exitCode = await cmdFields(options, logger);
920
+ break;
921
+ case "create":
922
+ exitCode = await cmdCreate(options, logger);
923
+ break;
924
+ case "update":
925
+ if (!target) {
926
+ logger.error("Item ID or issue number required");
927
+ logger.info("Usage: shirokuma-docs projects update <item-id-or-number> --field-status ...");
928
+ exitCode = 1;
929
+ }
930
+ else {
931
+ exitCode = await cmdUpdate(target, options, logger);
932
+ }
933
+ break;
934
+ case "delete":
935
+ if (!target) {
936
+ logger.error("Item ID or issue number required");
937
+ logger.info("Usage: shirokuma-docs projects delete <item-id-or-number> --force");
938
+ exitCode = 1;
939
+ }
940
+ else {
941
+ exitCode = await cmdDelete(target, options, logger);
942
+ }
943
+ break;
944
+ case "add-issue":
945
+ if (!target) {
946
+ logger.error("Issue number required");
947
+ logger.info("Usage: shirokuma-docs projects add-issue <issue-number>");
948
+ exitCode = 1;
949
+ }
950
+ else {
951
+ exitCode = await cmdAddIssue(target, options, logger);
952
+ }
953
+ break;
954
+ case "workflows":
955
+ exitCode = await cmdWorkflows(options, logger);
956
+ break;
957
+ case "setup-metrics":
958
+ exitCode = await cmdSetupMetrics(options, logger);
959
+ break;
960
+ default:
961
+ logger.error(`Unknown action: ${action}`);
962
+ logger.info("Available actions: list, get, fields, create, update, delete, add-issue, workflows, setup-metrics");
963
+ exitCode = 1;
964
+ }
965
+ if (exitCode !== 0) {
966
+ process.exit(exitCode);
967
+ }
968
+ }
969
+ //# sourceMappingURL=projects.js.map