aiwf 0.3.22 โ†’ 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/.claude-plugin/marketplace.json +146 -0
  2. package/CHANGELOG.md +49 -1
  3. package/README.ko.md +118 -309
  4. package/README.md +68 -254
  5. package/docs/modernization/BROWNFIELD-GREENFIELD.ko.md +105 -0
  6. package/docs/modernization/CLAUDE-PLAN-REVIEW-2026-10-03.ko.md +77 -0
  7. package/docs/modernization/CLI-PRODUCTIVITY-REVIEWED-2026-10-03.ko.md +177 -0
  8. package/docs/modernization/CLI-PRODUCTIVITY.ko.md +193 -0
  9. package/docs/modernization/CORE-PACKAGE-PLAN.md +7 -0
  10. package/docs/modernization/DEEP-REVERSE-ENGINEERING.ko.md +88 -0
  11. package/docs/modernization/DELEGATION-OPTIONAL.ko.md +57 -0
  12. package/docs/modernization/DIRECTION.ko.md +56 -0
  13. package/docs/modernization/FULL-TEST-2026-10-03.md +49 -0
  14. package/docs/modernization/LEGACY-REMOVAL-PLAN.md +9 -0
  15. package/docs/modernization/PILOT-RESULT-2026-10-03.ko.md +85 -0
  16. package/docs/modernization/PILOT-UC-001.ko.md +79 -0
  17. package/docs/modernization/PLAN.md +28 -0
  18. package/docs/modernization/SKILLS.ko.md +105 -0
  19. package/docs/modernization/SPRINTABLE.ko.md +47 -0
  20. package/docs/modernization/SYNC-DOCS-VALIDATION-2026-10-04.ko.md +38 -0
  21. package/docs/modernization/VALIDATION.md +79 -0
  22. package/docs/modernization/evidence/example-review-packet.json +115 -0
  23. package/docs/modernization/evidence/example-spec-pin.json +48 -0
  24. package/docs/modernization/evidence/full-test-20261003/claude-lint.md +22 -0
  25. package/docs/modernization/evidence/full-test-20261003/claude-review-retry.md +56 -0
  26. package/docs/modernization/evidence/full-test-20261003/codex-review-packet.json +159 -0
  27. package/docs/modernization/evidence/full-test-20261003/src/expense.mjs +40 -0
  28. package/docs/modernization/evidence/full-test-20261003/summary.json +106 -0
  29. package/docs/modernization/evidence/full-test-20261003/tests/expense.test.mjs +61 -0
  30. package/docs/modernization/evidence/local-pilot-20261003/README.ko.md +40 -0
  31. package/docs/modernization/evidence/local-pilot-20261003/execution.json +1055 -0
  32. package/docs/modernization/evidence/local-pilot-20261003/maintenance/dependencies.json +24 -0
  33. package/docs/modernization/evidence/local-pilot-20261003/maintenance/dependencies.stderr.txt +0 -0
  34. package/docs/modernization/evidence/local-pilot-20261003/maintenance/dependencies.stdout.txt +5 -0
  35. package/docs/modernization/evidence/local-pilot-20261003/maintenance/docs.json +24 -0
  36. package/docs/modernization/evidence/local-pilot-20261003/maintenance/docs.stderr.txt +0 -0
  37. package/docs/modernization/evidence/local-pilot-20261003/maintenance/docs.stdout.txt +6 -0
  38. package/docs/modernization/evidence/local-pilot-20261003/maintenance/example.json +24 -0
  39. package/docs/modernization/evidence/local-pilot-20261003/maintenance/example.stderr.txt +0 -0
  40. package/docs/modernization/evidence/local-pilot-20261003/maintenance/example.stdout.txt +5 -0
  41. package/docs/modernization/evidence/local-pilot-20261003/maintenance/local-docs.json +24 -0
  42. package/docs/modernization/evidence/local-pilot-20261003/maintenance/local-docs.stderr.txt +0 -0
  43. package/docs/modernization/evidence/local-pilot-20261003/maintenance/local-docs.stdout.txt +6 -0
  44. package/docs/modernization/evidence/local-pilot-20261003/maintenance/node.json +23 -0
  45. package/docs/modernization/evidence/local-pilot-20261003/maintenance/node.stderr.txt +0 -0
  46. package/docs/modernization/evidence/local-pilot-20261003/maintenance/node.stdout.txt +535 -0
  47. package/docs/modernization/evidence/local-pilot-20261003/maintenance/provenance.json +24 -0
  48. package/docs/modernization/evidence/local-pilot-20261003/maintenance/provenance.stderr.txt +0 -0
  49. package/docs/modernization/evidence/local-pilot-20261003/maintenance/provenance.stdout.txt +5 -0
  50. package/docs/modernization/evidence/local-pilot-20261003/maintenance/readme-replay.json +24 -0
  51. package/docs/modernization/evidence/local-pilot-20261003/maintenance/readme-replay.stderr.txt +0 -0
  52. package/docs/modernization/evidence/local-pilot-20261003/maintenance/readme-replay.stdout.txt +273 -0
  53. package/docs/modernization/evidence/local-pilot-20261003/maintenance/upstream.json +24 -0
  54. package/docs/modernization/evidence/local-pilot-20261003/maintenance/upstream.stderr.txt +0 -0
  55. package/docs/modernization/evidence/local-pilot-20261003/maintenance/upstream.stdout.txt +7 -0
  56. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/archive-service.stderr.txt +0 -0
  57. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/archive-service.stdout.txt +148 -0
  58. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/archive-structure.stderr.txt +0 -0
  59. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/archive-structure.stdout.txt +9 -0
  60. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-check.stderr.txt +0 -0
  61. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-check.stdout.txt +67 -0
  62. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-evidence.json +34 -0
  63. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-packet.json +128 -0
  64. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-packet.stderr.txt +0 -0
  65. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-packet.stdout.txt +128 -0
  66. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-pin.json +54 -0
  67. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-pin.stderr.txt +0 -0
  68. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-pin.stdout.txt +60 -0
  69. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-readback.json +15 -0
  70. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-service.stderr.txt +0 -0
  71. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-service.stdout.txt +82 -0
  72. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-structure.stderr.txt +0 -0
  73. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-structure.stdout.txt +9 -0
  74. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-check.stderr.txt +0 -0
  75. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-check.stdout.txt +79 -0
  76. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-packet-refused.stderr.txt +0 -0
  77. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-packet-refused.stdout.txt +7 -0
  78. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-pin-refresh.stderr.txt +0 -0
  79. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-pin-refresh.stdout.txt +66 -0
  80. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-pin.json +60 -0
  81. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-structure.stderr.txt +0 -0
  82. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-structure.stdout.txt +9 -0
  83. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-check.stderr.txt +0 -0
  84. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-check.stdout.txt +73 -0
  85. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-evidence.json +34 -0
  86. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-packet.json +134 -0
  87. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-packet.stderr.txt +0 -0
  88. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-packet.stdout.txt +134 -0
  89. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-readback.json +15 -0
  90. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-service.stderr.txt +0 -0
  91. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-service.stdout.txt +148 -0
  92. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-structure.stderr.txt +0 -0
  93. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-structure.stdout.txt +9 -0
  94. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/node-version.stderr.txt +0 -0
  95. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/node-version.stdout.txt +1 -0
  96. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/python-version.stderr.txt +0 -0
  97. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/python-version.stdout.txt +1 -0
  98. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-evidence.json +34 -0
  99. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-packet.json +134 -0
  100. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-packet.stderr.txt +0 -0
  101. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-packet.stdout.txt +134 -0
  102. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-readback.json +15 -0
  103. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-service.stderr.txt +0 -0
  104. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-service.stdout.txt +266 -0
  105. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-structure.stderr.txt +0 -0
  106. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-structure.stdout.txt +9 -0
  107. package/docs/modernization/evidence/local-pilot-20261003/project/docs/entity_model.md +33 -0
  108. package/docs/modernization/evidence/local-pilot-20261003/project/docs/glossary.md +9 -0
  109. package/docs/modernization/evidence/local-pilot-20261003/project/docs/plans/UC-001.md +20 -0
  110. package/docs/modernization/evidence/local-pilot-20261003/project/docs/requirements.md +10 -0
  111. package/docs/modernization/evidence/local-pilot-20261003/project/docs/test_cases/TC-001-submit-expense.md +37 -0
  112. package/docs/modernization/evidence/local-pilot-20261003/project/docs/test_cases/TC-002-description-limit.md +42 -0
  113. package/docs/modernization/evidence/local-pilot-20261003/project/docs/use_cases/UC-001-submit-expense.md +76 -0
  114. package/docs/modernization/evidence/local-pilot-20261003/project/docs/use_cases.puml +12 -0
  115. package/docs/modernization/evidence/local-pilot-20261003/project/docs/vision.md +21 -0
  116. package/docs/modernization/evidence/local-pilot-20261003/project/src/expense.mjs +48 -0
  117. package/docs/modernization/evidence/local-pilot-20261003/project/tests/expense.test.mjs +116 -0
  118. package/docs/modernization/evidence/local-pilot-20261003/scope.json +31 -0
  119. package/docs/modernization/reviews/2026-10-03-claude-cli/CONTRACTS.ko.md +122 -0
  120. package/docs/modernization/reviews/2026-10-03-claude-cli/DIRECTION.ko.md +84 -0
  121. package/examples/spec-workflow/README.md +54 -0
  122. package/examples/spec-workflow/docs/entity_model.md +33 -0
  123. package/examples/spec-workflow/docs/glossary.md +9 -0
  124. package/examples/spec-workflow/docs/requirements.md +10 -0
  125. package/examples/spec-workflow/docs/test_cases/TC-001-submit-expense.md +37 -0
  126. package/examples/spec-workflow/docs/use_cases/UC-001-submit-expense.md +63 -0
  127. package/examples/spec-workflow/docs/use_cases.puml +12 -0
  128. package/examples/spec-workflow/docs/vision.md +21 -0
  129. package/package.json +37 -104
  130. package/plugins/aiwf-angular-jpa/.claude-plugin/plugin.json +11 -0
  131. package/plugins/aiwf-angular-jpa/LICENSE +201 -0
  132. package/plugins/aiwf-angular-jpa/NOTICE +16 -0
  133. package/plugins/aiwf-angular-jpa/README.md +54 -0
  134. package/plugins/aiwf-angular-jpa/UPSTREAM.json +35 -0
  135. package/plugins/aiwf-angular-jpa/agents/uc-coverage.md +263 -0
  136. package/plugins/aiwf-angular-jpa/rules/mcp-servers.md +64 -0
  137. package/plugins/aiwf-angular-jpa/skills/coverage-check/SKILL.md +190 -0
  138. package/plugins/aiwf-angular-jpa/skills/flyway-migration/SKILL.md +119 -0
  139. package/plugins/aiwf-angular-jpa/skills/implement/SKILL.md +528 -0
  140. package/plugins/aiwf-angular-jpa/skills/implement/references/module-layout.md +95 -0
  141. package/plugins/aiwf-angular-jpa/skills/playwright-test/SKILL.md +360 -0
  142. package/plugins/aiwf-angular-jpa/skills/spring-boot-test/SKILL.md +504 -0
  143. package/plugins/aiwf-angular-jpa/skills/vitest-test/SKILL.md +309 -0
  144. package/plugins/aiwf-blazor-dotnet/.claude-plugin/plugin.json +11 -0
  145. package/plugins/aiwf-blazor-dotnet/LICENSE +201 -0
  146. package/plugins/aiwf-blazor-dotnet/NOTICE +16 -0
  147. package/plugins/aiwf-blazor-dotnet/README.md +53 -0
  148. package/plugins/aiwf-blazor-dotnet/UPSTREAM.json +31 -0
  149. package/plugins/aiwf-blazor-dotnet/rules/mcp-servers.md +25 -0
  150. package/plugins/aiwf-blazor-dotnet/skills/bunit-test/SKILL.md +110 -0
  151. package/plugins/aiwf-blazor-dotnet/skills/dotnet-test/SKILL.md +108 -0
  152. package/plugins/aiwf-blazor-dotnet/skills/ef-migration/SKILL.md +43 -0
  153. package/plugins/aiwf-blazor-dotnet/skills/implement/SKILL.md +149 -0
  154. package/plugins/aiwf-blazor-dotnet/skills/playwright-test/SKILL.md +130 -0
  155. package/plugins/aiwf-core/.claude-plugin/plugin.json +11 -0
  156. package/plugins/aiwf-core/LICENSE +201 -0
  157. package/plugins/aiwf-core/NOTICE +20 -0
  158. package/plugins/aiwf-core/README.md +38 -0
  159. package/plugins/aiwf-core/UPSTREAM.json +50 -0
  160. package/plugins/aiwf-core/skills/entity-model/SKILL.md +160 -0
  161. package/plugins/aiwf-core/skills/entity-model/references/REFERENCE.md +36 -0
  162. package/plugins/aiwf-core/skills/requirements/SKILL.md +157 -0
  163. package/plugins/aiwf-core/skills/requirements/references/REFERENCE.md +70 -0
  164. package/plugins/aiwf-core/skills/requirements/references/glossary.md +7 -0
  165. package/plugins/aiwf-core/skills/reverse-engineer/SKILL.md +509 -0
  166. package/plugins/aiwf-core/skills/reverse-engineer/references/stack-signals.md +210 -0
  167. package/plugins/aiwf-core/skills/spec-review/SKILL.md +197 -0
  168. package/plugins/aiwf-core/skills/spec-review/references/lint-codes.md +63 -0
  169. package/plugins/aiwf-core/skills/spec-review/references/review-checklist.md +189 -0
  170. package/plugins/aiwf-core/skills/spec-review/scripts/spec_lint.py +1216 -0
  171. package/plugins/aiwf-core/skills/test-case/SKILL.md +138 -0
  172. package/plugins/aiwf-core/skills/test-case/references/example-process.bpmn +118 -0
  173. package/plugins/aiwf-core/skills/test-case/references/example.md +38 -0
  174. package/plugins/aiwf-core/skills/test-case/references/test-case.md +35 -0
  175. package/plugins/aiwf-core/skills/test-case/scripts/bpmn_paths.py +542 -0
  176. package/plugins/aiwf-core/skills/use-case-diagram/SKILL.md +99 -0
  177. package/plugins/aiwf-core/skills/use-case-spec/SKILL.md +257 -0
  178. package/plugins/aiwf-core/skills/use-case-spec/references/clarify-checklist.md +70 -0
  179. package/plugins/aiwf-core/skills/use-case-spec/references/example.md +88 -0
  180. package/plugins/aiwf-core/skills/use-case-spec/references/format-spec.md +246 -0
  181. package/plugins/aiwf-core/skills/use-case-spec/references/use-case.md +50 -0
  182. package/plugins/aiwf-core/skills/use-case-spec/scripts/validate_use_case.py +941 -0
  183. package/plugins/aiwf-delegate-claude/.claude-plugin/plugin.json +9 -0
  184. package/{src/lib/resources/templates/npm-library/template โ†’ plugins/aiwf-delegate-claude}/LICENSE +2 -2
  185. package/plugins/aiwf-delegate-claude/NOTICE +4 -0
  186. package/plugins/aiwf-delegate-claude/README.md +10 -0
  187. package/plugins/aiwf-delegate-claude/plugin.json +13 -0
  188. package/plugins/aiwf-delegate-claude/skills/delegate-claude/LICENSE +21 -0
  189. package/plugins/aiwf-delegate-claude/skills/delegate-claude/NOTICE +4 -0
  190. package/plugins/aiwf-delegate-claude/skills/delegate-claude/SKILL.md +49 -0
  191. package/plugins/aiwf-delegate-claude/skills/delegate-claude/agents/openai.yaml +2 -0
  192. package/plugins/aiwf-delegate-codex/.claude-plugin/plugin.json +9 -0
  193. package/plugins/aiwf-delegate-codex/LICENSE +21 -0
  194. package/plugins/aiwf-delegate-codex/NOTICE +4 -0
  195. package/plugins/aiwf-delegate-codex/README.md +10 -0
  196. package/plugins/aiwf-delegate-codex/plugin.json +13 -0
  197. package/plugins/aiwf-delegate-codex/skills/delegate-codex/LICENSE +21 -0
  198. package/plugins/aiwf-delegate-codex/skills/delegate-codex/NOTICE +4 -0
  199. package/plugins/aiwf-delegate-codex/skills/delegate-codex/SKILL.md +47 -0
  200. package/plugins/aiwf-delegate-codex/skills/delegate-codex/agents/openai.yaml +2 -0
  201. package/plugins/aiwf-nestjs-nextjs/.claude-plugin/plugin.json +11 -0
  202. package/plugins/aiwf-nestjs-nextjs/LICENSE +201 -0
  203. package/plugins/aiwf-nestjs-nextjs/NOTICE +16 -0
  204. package/plugins/aiwf-nestjs-nextjs/README.md +53 -0
  205. package/plugins/aiwf-nestjs-nextjs/UPSTREAM.json +32 -0
  206. package/plugins/aiwf-nestjs-nextjs/rules/mcp-servers.md +59 -0
  207. package/plugins/aiwf-nestjs-nextjs/skills/drizzle-migration/SKILL.md +222 -0
  208. package/plugins/aiwf-nestjs-nextjs/skills/implement/SKILL.md +393 -0
  209. package/plugins/aiwf-nestjs-nextjs/skills/implement/references/project-layout.md +158 -0
  210. package/plugins/aiwf-nestjs-nextjs/skills/nest-test/SKILL.md +300 -0
  211. package/plugins/aiwf-nestjs-nextjs/skills/playwright-test/SKILL.md +245 -0
  212. package/plugins/aiwf-nestjs-nextjs/skills/react-test/SKILL.md +217 -0
  213. package/plugins/aiwf-spec/.claude-plugin/plugin.json +9 -0
  214. package/plugins/aiwf-spec/LICENSE +201 -0
  215. package/plugins/aiwf-spec/NOTICE +20 -0
  216. package/plugins/aiwf-spec/README.md +36 -0
  217. package/plugins/aiwf-spec/skills/sync-docs/SKILL.md +47 -0
  218. package/plugins/aiwf-spec/skills/workflow/SKILL.md +42 -0
  219. package/plugins/aiwf-vaadin-jooq/.claude-plugin/plugin.json +11 -0
  220. package/plugins/aiwf-vaadin-jooq/LICENSE +201 -0
  221. package/plugins/aiwf-vaadin-jooq/NOTICE +16 -0
  222. package/plugins/aiwf-vaadin-jooq/README.md +56 -0
  223. package/plugins/aiwf-vaadin-jooq/UPSTREAM.json +43 -0
  224. package/plugins/aiwf-vaadin-jooq/agents/uc-coverage.md +260 -0
  225. package/plugins/aiwf-vaadin-jooq/rules/mcp-servers.md +44 -0
  226. package/plugins/aiwf-vaadin-jooq/skills/browserless-test/SKILL.md +407 -0
  227. package/plugins/aiwf-vaadin-jooq/skills/browserless-test/references/UC001ManagePersonsTest.java +111 -0
  228. package/plugins/aiwf-vaadin-jooq/skills/coverage-check/SKILL.md +190 -0
  229. package/plugins/aiwf-vaadin-jooq/skills/flyway-migration/SKILL.md +70 -0
  230. package/plugins/aiwf-vaadin-jooq/skills/hilla-test/SKILL.md +350 -0
  231. package/plugins/aiwf-vaadin-jooq/skills/hilla-test/references/UC001ManagePersonsServiceTest.java +81 -0
  232. package/plugins/aiwf-vaadin-jooq/skills/hilla-test/references/UC001ManagePersonsViewTest.tsx +87 -0
  233. package/plugins/aiwf-vaadin-jooq/skills/implement/SKILL.md +196 -0
  234. package/plugins/aiwf-vaadin-jooq/skills/implement-hilla/SKILL.md +216 -0
  235. package/plugins/aiwf-vaadin-jooq/skills/karibu-test/SKILL.md +298 -0
  236. package/plugins/aiwf-vaadin-jooq/skills/karibu-test/references/UC001ManagePersonsTest.java +93 -0
  237. package/plugins/aiwf-vaadin-jooq/skills/playwright-test/SKILL.md +237 -0
  238. package/plugins/aiwf-vaadin-jooq/skills/playwright-test/references/ExampleViewIT.java +143 -0
  239. package/plugins/aiwf-vaadin-jooq/skills/playwright-test/references/TC001CustomerOnboardingIT.java +144 -0
  240. package/plugins/aiwf-vaadin-jooq/skills/playwright-test/references/dramafinder-api.md +190 -0
  241. package/scripts/check-dependencies.js +26 -96
  242. package/scripts/install-spec-skills.mjs +126 -0
  243. package/scripts/validate-spec-plugin.mjs +145 -0
  244. package/src/cli/spec-cli.js +292 -0
  245. package/src/lib/spec-workflow.js +982 -0
  246. package/docs/ADR_MANAGEMENT_GUIDE.ko.md +0 -602
  247. package/docs/ADR_MANAGEMENT_GUIDE.md +0 -602
  248. package/docs/AI-WORKFLOW.ko.md +0 -299
  249. package/docs/AI-WORKFLOW.md +0 -401
  250. package/docs/API_REFERENCE_FULL.ko.md +0 -1135
  251. package/docs/API_REFERENCE_FULL.md +0 -1135
  252. package/docs/ARCHITECTURE.ko.md +0 -314
  253. package/docs/ARCHITECTURE.md +0 -314
  254. package/docs/CLI_USAGE_GUIDE.ko.md +0 -634
  255. package/docs/CLI_USAGE_GUIDE.md +0 -640
  256. package/docs/CODE_CLEANUP_GUIDE.ko.md +0 -415
  257. package/docs/CODE_CLEANUP_GUIDE.md +0 -415
  258. package/docs/COMMANDS_GUIDE.ko.md +0 -1037
  259. package/docs/COMMANDS_GUIDE.md +0 -1037
  260. package/docs/CONTRIBUTING.ko.md +0 -408
  261. package/docs/CONTRIBUTING.md +0 -408
  262. package/docs/DEVELOPMENT_GUIDE.ko.md +0 -440
  263. package/docs/DEVELOPMENT_GUIDE.md +0 -727
  264. package/docs/EXAMPLES.ko.md +0 -695
  265. package/docs/EXAMPLES.md +0 -693
  266. package/docs/GETTING_STARTED.ko.md +0 -219
  267. package/docs/GETTING_STARTED.md +0 -476
  268. package/docs/MODULE_MANAGEMENT_GUIDE.ko.md +0 -289
  269. package/docs/MODULE_MANAGEMENT_GUIDE.md +0 -289
  270. package/docs/PERFORMANCE_ARCHITECTURE.md +0 -494
  271. package/docs/PERFORMANCE_GUIDELINES.ko.md +0 -388
  272. package/docs/PERFORMANCE_GUIDELINES.md +0 -553
  273. package/docs/PRD.ko.md +0 -148
  274. package/docs/PRD.md +0 -150
  275. package/docs/ROADMAP_v0.4.0.md +0 -286
  276. package/docs/STATE_MANAGEMENT_GUIDE.ko.md +0 -278
  277. package/docs/STATE_MANAGEMENT_GUIDE.md +0 -278
  278. package/docs/TROUBLESHOOTING.ko.md +0 -366
  279. package/docs/TROUBLESHOOTING.md +0 -722
  280. package/docs/VALIDATOR_API.ko.md +0 -324
  281. package/docs/VALIDATOR_API.md +0 -324
  282. package/docs/YOLO_SYSTEM_GUIDE.ko.md +0 -542
  283. package/docs/YOLO_SYSTEM_GUIDE.md +0 -542
  284. package/docs/designs/AI_PERSONA_SYSTEM_DESIGN.md +0 -516
  285. package/docs/designs/API_DOCUMENTATION.md +0 -932
  286. package/docs/designs/API_REFERENCE.md +0 -979
  287. package/docs/designs/Enhanced_Installation_Flow_Design.md +0 -498
  288. package/docs/designs/aiwf-metadata-system-prd.md +0 -127
  289. package/docs/designs/offline-template-cache.md +0 -323
  290. package/docs/designs/persona-aware-compression.md +0 -168
  291. package/docs/guides/ai-personas-guide-ko.md +0 -239
  292. package/docs/guides/ai-personas-guide.md +0 -239
  293. package/docs/guides/checkpoint-system-guide-ko.md +0 -356
  294. package/docs/guides/checkpoint-system-guide.md +0 -356
  295. package/docs/guides/context-compression-guide-ko.md +0 -313
  296. package/docs/guides/context-compression-guide.md +0 -313
  297. package/docs/guides/independent-sprint-guide-ko.md +0 -321
  298. package/docs/guides/independent-sprint-guide.md +0 -321
  299. package/rules/global/aiwf-code-style-guide.md +0 -30
  300. package/rules/global/aiwf-coding-principles.md +0 -33
  301. package/rules/global/aiwf-development-process.md +0 -41
  302. package/rules/global/aiwf-global-rules.md +0 -84
  303. package/rules/manual/aiwf-generate-plan-docs.md +0 -280
  304. package/scripts/run-integration-tests.js +0 -317
  305. package/scripts/update-file-lists.js +0 -267
  306. package/scripts/validate-commands.js +0 -254
  307. package/src/DEPENDENCY_MAP.md +0 -90
  308. package/src/cli/cache-cli.js +0 -459
  309. package/src/cli/checkpoint-cli.js +0 -417
  310. package/src/cli/index.js +0 -481
  311. package/src/cli/language-cli.js +0 -286
  312. package/src/cli/sprint-cli.js +0 -287
  313. package/src/commands/ai-tool.js +0 -383
  314. package/src/commands/compress.js +0 -60
  315. package/src/commands/create-project.js +0 -160
  316. package/src/commands/evaluate.js +0 -459
  317. package/src/commands/persona.js +0 -309
  318. package/src/commands/sprint-independent.js +0 -393
  319. package/src/commands/sprint-task.js +0 -262
  320. package/src/commands/state.js +0 -1164
  321. package/src/commands/token.js +0 -312
  322. package/src/commands/yolo-config.js +0 -502
  323. package/src/config/file-lists.js +0 -147
  324. package/src/config/yolo-config-template.yaml +0 -168
  325. package/src/lib/ai-persona-manager.js +0 -711
  326. package/src/lib/backup-manager.js +0 -271
  327. package/src/lib/cache-system.js +0 -332
  328. package/src/lib/context-engine.js +0 -568
  329. package/src/lib/file-downloader.js +0 -304
  330. package/src/lib/github-integration.js +0 -402
  331. package/src/lib/installer.js +0 -1066
  332. package/src/lib/memory-profiler.js +0 -471
  333. package/src/lib/metrics-collector.js +0 -885
  334. package/src/lib/offline-detector.js +0 -386
  335. package/src/lib/resource-loader-enhanced.js +0 -399
  336. package/src/lib/resource-loader.js +0 -250
  337. package/src/lib/resources/commands/ai-persona.js +0 -602
  338. package/src/lib/resources/commands/compress-context.js +0 -389
  339. package/src/lib/resources/commands/evaluate.js +0 -246
  340. package/src/lib/resources/commands/persona-context-apply.js +0 -562
  341. package/src/lib/resources/commands/token-tracking.js +0 -443
  342. package/src/lib/resources/config/commit-patterns.js +0 -103
  343. package/src/lib/resources/config/language.json +0 -6
  344. package/src/lib/resources/personas/PERSONA_INDEX.md +0 -57
  345. package/src/lib/resources/personas/analyst.json +0 -44
  346. package/src/lib/resources/personas/architect/best_practices.md +0 -136
  347. package/src/lib/resources/personas/architect/knowledge_base.md +0 -377
  348. package/src/lib/resources/personas/architect.json +0 -44
  349. package/src/lib/resources/personas/backend/best_practices.md +0 -766
  350. package/src/lib/resources/personas/backend/knowledge_base.md +0 -1070
  351. package/src/lib/resources/personas/data_analyst/best_practices.md +0 -594
  352. package/src/lib/resources/personas/data_analyst/knowledge_base.md +0 -1057
  353. package/src/lib/resources/personas/developer.json +0 -44
  354. package/src/lib/resources/personas/developer.md +0 -37
  355. package/src/lib/resources/personas/evaluation_criteria.json +0 -137
  356. package/src/lib/resources/personas/frontend/best_practices.md +0 -445
  357. package/src/lib/resources/personas/frontend/knowledge_base.md +0 -729
  358. package/src/lib/resources/personas/persona-index.json +0 -31
  359. package/src/lib/resources/personas/reviewer.json +0 -44
  360. package/src/lib/resources/personas/security/best_practices.md +0 -307
  361. package/src/lib/resources/personas/security/knowledge_base.md +0 -498
  362. package/src/lib/resources/personas/tester.json +0 -44
  363. package/src/lib/resources/templates/README.md +0 -78
  364. package/src/lib/resources/templates/api-server/config.json +0 -64
  365. package/src/lib/resources/templates/api-server/template/.aiwf/config.json +0 -56
  366. package/src/lib/resources/templates/api-server/template/.aiwf/feature-ledger.json +0 -42
  367. package/src/lib/resources/templates/api-server/template/.aiwf/personas/backend-engineer.json +0 -40
  368. package/src/lib/resources/templates/api-server/template/.aiwf/scripts/cli.js +0 -111
  369. package/src/lib/resources/templates/api-server/template/.env.example +0 -29
  370. package/src/lib/resources/templates/api-server/template/.eslintrc.json +0 -23
  371. package/src/lib/resources/templates/api-server/template/README.md +0 -171
  372. package/src/lib/resources/templates/api-server/template/jest.config.js +0 -26
  373. package/src/lib/resources/templates/api-server/template/nodemon.json +0 -9
  374. package/src/lib/resources/templates/api-server/template/package.json +0 -61
  375. package/src/lib/resources/templates/api-server/template/src/app.ts +0 -60
  376. package/src/lib/resources/templates/api-server/template/src/config/swagger.ts +0 -38
  377. package/src/lib/resources/templates/api-server/template/src/controllers/aiwfController.ts +0 -54
  378. package/src/lib/resources/templates/api-server/template/src/controllers/authController.ts +0 -128
  379. package/src/lib/resources/templates/api-server/template/src/controllers/statusController.ts +0 -28
  380. package/src/lib/resources/templates/api-server/template/src/index.ts +0 -28
  381. package/src/lib/resources/templates/api-server/template/src/middleware/aiwfMiddleware.ts +0 -50
  382. package/src/lib/resources/templates/api-server/template/src/middleware/authMiddleware.ts +0 -41
  383. package/src/lib/resources/templates/api-server/template/src/middleware/errorHandler.ts +0 -42
  384. package/src/lib/resources/templates/api-server/template/src/middleware/notFoundHandler.ts +0 -14
  385. package/src/lib/resources/templates/api-server/template/src/middleware/requestLogger.ts +0 -20
  386. package/src/lib/resources/templates/api-server/template/src/routes/aiwf.ts +0 -31
  387. package/src/lib/resources/templates/api-server/template/src/routes/index.ts +0 -13
  388. package/src/lib/resources/templates/api-server/template/src/routes/v1/index.ts +0 -67
  389. package/src/lib/resources/templates/api-server/template/src/utils/logger.ts +0 -37
  390. package/src/lib/resources/templates/api-server/template/tests/app.test.ts +0 -40
  391. package/src/lib/resources/templates/api-server/template/tsconfig.json +0 -43
  392. package/src/lib/resources/templates/npm-library/config.json +0 -61
  393. package/src/lib/resources/templates/npm-library/template/README.md +0 -201
  394. package/src/lib/resources/templates/npm-library/template/package.json +0 -78
  395. package/src/lib/resources/templates/web-app/config.json +0 -53
  396. package/src/lib/resources/templates/web-app/template/.aiwf/config.json +0 -54
  397. package/src/lib/resources/templates/web-app/template/.aiwf/feature-ledger.json +0 -37
  398. package/src/lib/resources/templates/web-app/template/.aiwf/personas/fullstack-developer.json +0 -40
  399. package/src/lib/resources/templates/web-app/template/.aiwf/scripts/cli.js +0 -110
  400. package/src/lib/resources/templates/web-app/template/.eslintrc.cjs +0 -20
  401. package/src/lib/resources/templates/web-app/template/README.md +0 -151
  402. package/src/lib/resources/templates/web-app/template/index.html +0 -14
  403. package/src/lib/resources/templates/web-app/template/package.json +0 -44
  404. package/src/lib/resources/templates/web-app/template/postcss.config.js +0 -6
  405. package/src/lib/resources/templates/web-app/template/public/vite.svg +0 -1
  406. package/src/lib/resources/templates/web-app/template/src/App.tsx +0 -21
  407. package/src/lib/resources/templates/web-app/template/src/components/Layout.tsx +0 -57
  408. package/src/lib/resources/templates/web-app/template/src/components/aiwf/ContextStatus.tsx +0 -107
  409. package/src/lib/resources/templates/web-app/template/src/components/aiwf/TokenUsage.tsx +0 -71
  410. package/src/lib/resources/templates/web-app/template/src/index.css +0 -60
  411. package/src/lib/resources/templates/web-app/template/src/main.tsx +0 -10
  412. package/src/lib/resources/templates/web-app/template/src/pages/AiwfDashboard.tsx +0 -57
  413. package/src/lib/resources/templates/web-app/template/src/pages/HomePage.tsx +0 -89
  414. package/src/lib/resources/templates/web-app/template/src/pages/NotFound.tsx +0 -25
  415. package/src/lib/resources/templates/web-app/template/src/stores/aiwfStore.ts +0 -126
  416. package/src/lib/resources/templates/web-app/template/src/types/global.d.ts +0 -9
  417. package/src/lib/resources/templates/web-app/template/src/vite-env.d.ts +0 -1
  418. package/src/lib/resources/templates/web-app/template/tailwind.config.js +0 -30
  419. package/src/lib/resources/templates/web-app/template/tsconfig.json +0 -37
  420. package/src/lib/resources/templates/web-app/template/tsconfig.node.json +0 -10
  421. package/src/lib/resources/templates/web-app/template/vite.config.ts +0 -23
  422. package/src/lib/resources/utils/background-monitor.js +0 -223
  423. package/src/lib/resources/utils/compression-metrics.js +0 -1031
  424. package/src/lib/resources/utils/compression-strategies.js +0 -557
  425. package/src/lib/resources/utils/content-normalizer.js +0 -455
  426. package/src/lib/resources/utils/context-compressor.js +0 -583
  427. package/src/lib/resources/utils/context-rule-parser.js +0 -180
  428. package/src/lib/resources/utils/context-token-monitor.js +0 -463
  429. package/src/lib/resources/utils/context-update-manager.js +0 -502
  430. package/src/lib/resources/utils/git-utils.js +0 -220
  431. package/src/lib/resources/utils/importance-classifier.js +0 -645
  432. package/src/lib/resources/utils/information-filter.js +0 -710
  433. package/src/lib/resources/utils/persona-aware-compressor.js +0 -598
  434. package/src/lib/resources/utils/prompt-injector.js +0 -242
  435. package/src/lib/resources/utils/simplified-evaluator.js +0 -119
  436. package/src/lib/resources/utils/text-summarizer.js +0 -492
  437. package/src/lib/resources/utils/token-counter.js +0 -177
  438. package/src/lib/resources/utils/token-monitor.js +0 -484
  439. package/src/lib/resources/utils/token-reporter.js +0 -452
  440. package/src/lib/resources/utils/token-storage.js +0 -433
  441. package/src/lib/resources/utils/token-tracker.js +0 -283
  442. package/src/lib/rollback-manager.js +0 -418
  443. package/src/lib/state/priority-calculator.js +0 -217
  444. package/src/lib/state/state-index.js +0 -155
  445. package/src/lib/state/task-scanner.js +0 -328
  446. package/src/lib/task-analyzer.js +0 -599
  447. package/src/lib/template-cache-system.js +0 -559
  448. package/src/lib/template-downloader.js +0 -467
  449. package/src/lib/template-version-manager.js +0 -491
  450. package/src/lib/token-optimizer.js +0 -517
  451. package/src/lib/validator.js +0 -376
  452. package/src/utils/checkpoint-manager.js +0 -435
  453. package/src/utils/engineering-guard.js +0 -399
  454. package/src/utils/language-utils.js +0 -331
  455. package/src/utils/messages.js +0 -166
  456. package/src/utils/paths.js +0 -112
@@ -1,304 +0,0 @@
1
- import https from 'https';
2
- import { createWriteStream } from 'fs';
3
- import fs from 'fs/promises';
4
- import { pipeline } from 'stream/promises';
5
- import path from 'path';
6
- import {
7
- COMMAND_FILES,
8
- GLOBAL_RULES_FILES,
9
- MANUAL_RULES_FILES,
10
- TEMPLATE_FILES,
11
- PROMPT_FILES
12
- } from '../config/file-lists.js';
13
-
14
- const GITHUB_RAW_URL = 'https://raw.githubusercontent.com/moonklabs/aiwf/main';
15
- const GITHUB_CONTENT_PREFIX = 'claude-code/aiwf';
16
- const GITHUB_API_URL = 'https://api.github.com/repos/moonklabs/aiwf/contents';
17
- const GITHUB_OWNER = 'moonklabs';
18
- const GITHUB_REPO = 'aiwf';
19
- const GITHUB_BRANCH = 'main';
20
-
21
- /**
22
- * Fetch content from URL
23
- * @param {string} url - The URL to fetch from
24
- * @param {Object} headers - Optional headers
25
- * @returns {Promise<string>} The response content
26
- */
27
- async function fetchContent(url, headers = {}) {
28
- return new Promise((resolve, reject) => {
29
- const defaultHeaders = { 'User-Agent': 'aiwf' };
30
- const requestHeaders = { ...defaultHeaders, ...headers };
31
-
32
- https.get(url, { headers: requestHeaders }, (res) => {
33
- let data = '';
34
- res.on('data', chunk => data += chunk);
35
- res.on('end', () => {
36
- if (res.statusCode === 200) {
37
- resolve(data);
38
- } else if (res.statusCode === 403 && res.headers['x-ratelimit-remaining'] === '0') {
39
- reject(new Error('GitHub API rate limit exceeded. Please try again later.'));
40
- } else {
41
- reject(new Error(`Failed to fetch ${url}: ${res.statusCode}`));
42
- }
43
- res.destroy();
44
- });
45
- }).on('error', (err) => {
46
- reject(err);
47
- });
48
- });
49
- }
50
-
51
- /**
52
- * Sleep for specified milliseconds
53
- * @param {number} ms - Milliseconds to sleep
54
- * @returns {Promise<void>}
55
- */
56
- function sleep(ms) {
57
- return new Promise(resolve => setTimeout(resolve, ms));
58
- }
59
-
60
- /**
61
- * Fetch directory contents from GitHub API with retry logic
62
- * @param {string} path - Repository path
63
- * @param {number} retries - Number of retries for rate limit
64
- * @returns {Promise<Array>} Array of file/directory objects
65
- */
66
- async function fetchGitHubDirectory(path, retries = 3) {
67
- const apiUrl = `${GITHUB_API_URL}/${path}?ref=${GITHUB_BRANCH}`;
68
-
69
- for (let attempt = 0; attempt <= retries; attempt++) {
70
- try {
71
- const response = await fetchContent(apiUrl, {
72
- 'Accept': 'application/vnd.github.v3+json'
73
- });
74
- return JSON.parse(response);
75
- } catch (error) {
76
- if (error.message.includes('rate limit exceeded') && attempt < retries) {
77
- console.warn(`GitHub API rate limit hit. Retrying in ${(attempt + 1) * 10} seconds...`);
78
- await sleep((attempt + 1) * 10000); // 10s, 20s, 30s
79
- continue;
80
- }
81
-
82
- // GitHub API๊ฐ€ ์‹คํŒจํ•˜๋ฉด ๋นˆ ๋ฐฐ์—ด ๋ฐ˜ํ™˜
83
- console.warn(`Failed to fetch directory listing for ${path}: ${error.message}`);
84
-
85
- // 404 ์—๋Ÿฌ์˜ ๊ฒฝ์šฐ ์ •์ƒ์ ์œผ๋กœ ๋นˆ ๋ฐฐ์—ด ๋ฐ˜ํ™˜ (๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ)
86
- if (error.message.includes('404')) {
87
- return [];
88
- }
89
-
90
- // Rate limit์ด๋‚˜ ๋‹ค๋ฅธ ์—๋Ÿฌ์˜ ๊ฒฝ์šฐ ์žฌ์‹œ๋„ ํ›„ ์‹คํŒจ
91
- if (attempt === retries) {
92
- throw error;
93
- }
94
- }
95
- }
96
-
97
- return [];
98
- }
99
-
100
- /**
101
- * Recursively download directory contents
102
- * @param {string} githubPath - GitHub repository path
103
- * @param {string} localPath - Local destination path
104
- * @param {Object} spinner - Ora spinner instance
105
- * @param {boolean} debugLog - Debug logging flag
106
- * @returns {Promise<void>}
107
- */
108
- async function downloadDirectoryRecursive(githubPath, localPath, spinner, debugLog = false) {
109
- try {
110
- // GitHub API๋กœ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์šฉ ๊ฐ€์ ธ์˜ค๊ธฐ
111
- const contents = await fetchGitHubDirectory(githubPath);
112
-
113
- if (contents.length === 0) {
114
- if (debugLog) console.log(`No contents found in ${githubPath}`);
115
- return;
116
- }
117
-
118
- // ๋กœ์ปฌ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
119
- await fs.mkdir(localPath, { recursive: true });
120
-
121
- for (const item of contents) {
122
- if (item.type === 'file') {
123
- // ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ
124
- const destPath = path.join(localPath, item.name);
125
- const downloadUrl = item.download_url;
126
-
127
- try {
128
- await downloadFile(downloadUrl, destPath);
129
- if (spinner) {
130
- spinner.text = `Downloaded: ${item.name}`;
131
- }
132
- if (debugLog) console.log(`Downloaded: ${githubPath}/${item.name}`);
133
- } catch (error) {
134
- if (debugLog) console.error(`Failed to download ${item.name}: ${error.message}`);
135
- }
136
- } else if (item.type === 'dir') {
137
- // ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ ์žฌ๊ท€์ ์œผ๋กœ ์ฒ˜๋ฆฌ
138
- const subGithubPath = `${githubPath}/${item.name}`;
139
- const subLocalPath = path.join(localPath, item.name);
140
-
141
- if (spinner) {
142
- spinner.text = `Processing directory: ${item.name}`;
143
- }
144
-
145
- await downloadDirectoryRecursive(subGithubPath, subLocalPath, spinner, debugLog);
146
- }
147
- }
148
- } catch (error) {
149
- if (debugLog) console.error(`Error processing directory ${githubPath}: ${error.message}`);
150
- throw error;
151
- }
152
- }
153
-
154
- /**
155
- * Download a file from URL to destination path with retry logic
156
- * @param {string} url - The URL to download from
157
- * @param {string} destPath - The destination file path
158
- * @param {number} retries - Number of retries
159
- * @returns {Promise<void>}
160
- */
161
- async function downloadFile(url, destPath, retries = 3) {
162
- // Ensure destination directory exists
163
- const destDir = path.dirname(destPath);
164
- await fs.mkdir(destDir, { recursive: true });
165
-
166
- for (let attempt = 0; attempt <= retries; attempt++) {
167
- try {
168
- await new Promise((resolve, reject) => {
169
- https.get(url, { headers: { 'User-Agent': 'aiwf' } }, (response) => {
170
- if (response.statusCode === 403 && response.headers['x-ratelimit-remaining'] === '0') {
171
- response.destroy();
172
- reject(new Error('GitHub API rate limit exceeded'));
173
- return;
174
- }
175
-
176
- if (response.statusCode !== 200) {
177
- response.destroy();
178
- reject(new Error(`Failed to download ${url}: ${response.statusCode}`));
179
- return;
180
- }
181
-
182
- const file = createWriteStream(destPath);
183
- pipeline(response, file)
184
- .then(() => {
185
- resolve();
186
- })
187
- .catch((error) => {
188
- reject(error);
189
- });
190
- }).on('error', (err) => {
191
- reject(err);
192
- });
193
- });
194
-
195
- // ์„ฑ๊ณตํ•˜๋ฉด ๋ฐ˜ํ™˜
196
- return;
197
- } catch (error) {
198
- if (error.message.includes('rate limit exceeded') && attempt < retries) {
199
- console.warn(`Rate limit hit while downloading ${path.basename(destPath)}. Retrying in ${(attempt + 1) * 10} seconds...`);
200
- await sleep((attempt + 1) * 10000);
201
- continue;
202
- }
203
-
204
- // ๋งˆ์ง€๋ง‰ ์‹œ๋„์—์„œ๋„ ์‹คํŒจํ•˜๋ฉด ์—๋Ÿฌ throw
205
- if (attempt === retries) {
206
- throw error;
207
- }
208
- }
209
- }
210
- }
211
-
212
- /**
213
- * Download files from a predefined list
214
- * @param {string} githubPath - GitHub repository path
215
- * @param {string} localPath - Local destination path
216
- * @param {Array<string>} fileList - List of files to download
217
- * @param {Object} spinner - Ora spinner instance
218
- * @param {Object} messages - Localized messages
219
- * @returns {Promise<void>}
220
- */
221
- async function downloadFileList(githubPath, localPath, fileList, spinner, messages) {
222
- for (const fileName of fileList) {
223
- try {
224
- const destPath = path.join(localPath, fileName);
225
- const downloadUrl = `${GITHUB_RAW_URL}/${githubPath}/${fileName}`;
226
-
227
- await downloadFile(downloadUrl, destPath);
228
- if (spinner) {
229
- spinner.text = `${messages.downloading}: ${fileName}`;
230
- }
231
- } catch (error) {
232
- // Skip files that don't exist, but log the error
233
- if (spinner) {
234
- spinner.text = `${messages.skipping || 'Skipping'}: ${fileName}`;
235
- }
236
- }
237
- }
238
- }
239
-
240
- /**
241
- * Download directory contents using predefined file lists or dynamic fetching
242
- * @param {string} githubPath - GitHub repository path
243
- * @param {string} localPath - Local destination path
244
- * @param {Object} spinner - Ora spinner instance
245
- * @param {Object} messages - Localized messages
246
- * @param {string} [selectedLanguage='en'] - Selected language
247
- * @param {boolean} [useDynamicFetch=false] - Use GitHub API for dynamic fetching
248
- * @returns {Promise<void>}
249
- */
250
- async function downloadDirectory(githubPath, localPath, spinner, messages, selectedLanguage = 'en', useDynamicFetch = false) {
251
- try {
252
- // .aiwf ๋””๋ ‰ํ† ๋ฆฌ๋‚˜ ์•Œ ์ˆ˜ ์—†๋Š” ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋™์  ๋‹ค์šด๋กœ๋“œ ์‚ฌ์šฉ
253
- if (useDynamicFetch || githubPath.includes('.aiwf') ||
254
- (!githubPath.includes('.claude/commands/aiwf') &&
255
- !githubPath.includes('rules/global') &&
256
- !githubPath.includes('rules/manual'))) {
257
-
258
- if (spinner) {
259
- spinner.text = `Fetching directory structure: ${githubPath}`;
260
- }
261
-
262
- // GitHub API๋ฅผ ์‚ฌ์šฉํ•œ ๋™์  ๋””๋ ‰ํ† ๋ฆฌ ๋‹ค์šด๋กœ๋“œ
263
- await downloadDirectoryRecursive(githubPath, localPath, spinner, messages && messages.debugLog);
264
- return;
265
- }
266
-
267
- // ๊ธฐ์กด ๋กœ์ง: ์‚ฌ์ „ ์ •์˜๋œ ํŒŒ์ผ ๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉ
268
- let fileList = [];
269
-
270
- if (githubPath.includes('.claude/commands/aiwf')) {
271
- fileList = COMMAND_FILES;
272
- } else if (githubPath.includes('rules/global')) {
273
- fileList = GLOBAL_RULES_FILES;
274
- } else if (githubPath.includes('rules/manual')) {
275
- fileList = MANUAL_RULES_FILES;
276
- }
277
-
278
- if (fileList.length > 0) {
279
- await downloadFileList(githubPath, localPath, fileList, spinner, messages);
280
- }
281
- } catch (error) {
282
- throw new Error(`Failed to download directory ${githubPath}: ${error.message}`);
283
- }
284
- }
285
-
286
- export {
287
- fetchContent,
288
- downloadFile,
289
- downloadFileList,
290
- downloadDirectory,
291
- downloadDirectoryRecursive,
292
- fetchGitHubDirectory,
293
- GITHUB_RAW_URL,
294
- GITHUB_CONTENT_PREFIX,
295
- GITHUB_API_URL,
296
- GITHUB_OWNER,
297
- GITHUB_REPO,
298
- GITHUB_BRANCH,
299
- COMMAND_FILES,
300
- GLOBAL_RULES_FILES,
301
- MANUAL_RULES_FILES,
302
- TEMPLATE_FILES,
303
- PROMPT_FILES
304
- };
@@ -1,402 +0,0 @@
1
- /**
2
- * AIWF GitHub Integration
3
- * GitHub Issues์™€ Pull Requests ํ†ตํ•ฉ ๊ด€๋ฆฌ
4
- */
5
-
6
- import { execSync } from 'child_process';
7
- import fs from 'fs/promises';
8
- import path from 'path';
9
- import chalk from 'chalk';
10
- import ora from 'ora';
11
- import { StateIndexManager } from './state/state-index.js';
12
-
13
- export class GitHubIntegration {
14
- constructor() {
15
- this.projectRoot = null;
16
- this.aiwfPath = null;
17
- this.stateIndexManager = null;
18
- }
19
-
20
- /**
21
- * ์ดˆ๊ธฐํ™”
22
- */
23
- async init() {
24
- this.projectRoot = await this.findProjectRoot();
25
- this.aiwfPath = path.join(this.projectRoot, '.aiwf');
26
- this.stateIndexManager = new StateIndexManager(this.aiwfPath);
27
- }
28
-
29
- async findProjectRoot(startDir = process.cwd()) {
30
- let currentDir = startDir;
31
-
32
- while (currentDir !== path.parse(currentDir).root) {
33
- try {
34
- const aiwfPath = path.join(currentDir, '.aiwf');
35
- await fs.access(aiwfPath);
36
- return currentDir;
37
- } catch {
38
- currentDir = path.dirname(currentDir);
39
- }
40
- }
41
-
42
- throw new Error('.aiwf directory not found. Are you in an AIWF project?');
43
- }
44
-
45
- /**
46
- * GitHub CLI ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ
47
- */
48
- checkGitHubCLI() {
49
- try {
50
- execSync('gh --version', { stdio: 'ignore' });
51
- return true;
52
- } catch {
53
- throw new Error('GitHub CLI (gh) is not installed. Please install it first: https://cli.github.com/');
54
- }
55
- }
56
-
57
- /**
58
- * ํƒœ์Šคํฌ์—์„œ GitHub ์ด์Šˆ ์ƒ์„ฑ
59
- */
60
- async createIssue(taskId) {
61
- const spinner = ora('Creating GitHub issue...').start();
62
-
63
- try {
64
- await this.init();
65
- this.checkGitHubCLI();
66
-
67
- // ์ƒํƒœ ์ธ๋ฑ์Šค์—์„œ ํƒœ์Šคํฌ ์ •๋ณด ๋กœ๋“œ
68
- const stateIndex = await this.stateIndexManager.loadIndex();
69
- if (!stateIndex) {
70
- throw new Error('State index not found. Run "aiwf state update" first.');
71
- }
72
-
73
- const task = stateIndex.tasks[taskId];
74
- if (!task) {
75
- throw new Error(`Task ${taskId} not found in state index.`);
76
- }
77
-
78
- spinner.text = 'Generating issue template...';
79
-
80
- // ์ด์Šˆ ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ
81
- const issueBody = this.generateIssueTemplate(task);
82
- const issueTitle = `${taskId}: ${task.title}`;
83
-
84
- // GitHub CLI๋กœ ์ด์Šˆ ์ƒ์„ฑ
85
- spinner.text = 'Creating issue on GitHub...';
86
- const labels = this.generateLabels(task);
87
-
88
- const createCommand = [
89
- 'gh', 'issue', 'create',
90
- '--title', `"${issueTitle}"`,
91
- '--body', `"${issueBody}"`,
92
- '--label', `"${labels.join(',')}"`,
93
- '--assignee', '@me'
94
- ].join(' ');
95
-
96
- const result = execSync(createCommand, {
97
- encoding: 'utf8',
98
- cwd: this.projectRoot
99
- });
100
-
101
- // ์ด์Šˆ URL ์ถ”์ถœ
102
- const issueUrl = result.trim();
103
- const issueNumber = this.extractIssueNumber(issueUrl);
104
-
105
- // ํƒœ์Šคํฌ ํŒŒ์ผ์— GitHub ์ด์Šˆ ์ •๋ณด ์ถ”๊ฐ€
106
- if (task.file_path) {
107
- await this.updateTaskWithIssue(task.file_path, issueNumber, issueUrl);
108
- }
109
-
110
- spinner.succeed(`GitHub issue created successfully: ${issueUrl}`);
111
-
112
- console.log(chalk.cyan('\n๐Ÿ“‹ Issue Details:'));
113
- console.log(` Title: ${issueTitle}`);
114
- console.log(` URL: ${issueUrl}`);
115
- console.log(` Labels: ${labels.join(', ')}`);
116
-
117
- } catch (error) {
118
- spinner.fail(`Failed to create GitHub issue: ${error.message}`);
119
- throw error;
120
- }
121
- }
122
-
123
- /**
124
- * Pull Request ์ƒ์„ฑ
125
- */
126
- async createPullRequest(taskId) {
127
- const spinner = ora('Creating pull request...').start();
128
-
129
- try {
130
- await this.init();
131
- this.checkGitHubCLI();
132
-
133
- // ํ˜„์žฌ ๋ธŒ๋žœ์น˜ ํ™•์ธ
134
- const currentBranch = execSync('git branch --show-current', {
135
- encoding: 'utf8',
136
- cwd: this.projectRoot
137
- }).trim();
138
-
139
- if (currentBranch === 'main' || currentBranch === 'master') {
140
- throw new Error('Cannot create PR from main/master branch. Please create a feature branch first.');
141
- }
142
-
143
- spinner.text = 'Checking branch status...';
144
-
145
- // ๋ณ€๊ฒฝ์‚ฌํ•ญ ํ™•์ธ
146
- const diffStat = execSync('git diff main...HEAD --stat', {
147
- encoding: 'utf8',
148
- cwd: this.projectRoot
149
- });
150
-
151
- if (!diffStat.trim()) {
152
- throw new Error('No changes found between current branch and main.');
153
- }
154
-
155
- // ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ ํ™•์ธ
156
- const commits = execSync('git log main..HEAD --oneline', {
157
- encoding: 'utf8',
158
- cwd: this.projectRoot
159
- });
160
-
161
- spinner.text = 'Generating PR template...';
162
-
163
- // PR ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ
164
- const prBody = this.generatePRTemplate(taskId, commits, diffStat);
165
- const prTitle = taskId ? `${taskId}: Complete task implementation` : `Complete feature implementation`;
166
-
167
- // GitHub CLI๋กœ PR ์ƒ์„ฑ
168
- spinner.text = 'Creating pull request on GitHub...';
169
-
170
- const createCommand = [
171
- 'gh', 'pr', 'create',
172
- '--title', `"${prTitle}"`,
173
- '--body', `"${prBody}"`,
174
- '--base', 'main',
175
- '--head', currentBranch
176
- ].join(' ');
177
-
178
- const result = execSync(createCommand, {
179
- encoding: 'utf8',
180
- cwd: this.projectRoot
181
- });
182
-
183
- const prUrl = result.trim();
184
-
185
- spinner.succeed(`Pull request created successfully: ${prUrl}`);
186
-
187
- console.log(chalk.cyan('\n๐Ÿ”€ Pull Request Details:'));
188
- console.log(` Title: ${prTitle}`);
189
- console.log(` URL: ${prUrl}`);
190
- console.log(` Base: main โ† ${currentBranch}`);
191
-
192
- } catch (error) {
193
- spinner.fail(`Failed to create pull request: ${error.message}`);
194
- throw error;
195
- }
196
- }
197
-
198
- /**
199
- * GitHub ์ด์Šˆ์™€ AIWF ํƒœ์Šคํฌ ๋™๊ธฐํ™”
200
- */
201
- async syncIssues() {
202
- const spinner = ora('Syncing GitHub issues...').start();
203
-
204
- try {
205
- await this.init();
206
- this.checkGitHubCLI();
207
-
208
- // GitHub์—์„œ ์ด์Šˆ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ
209
- spinner.text = 'Fetching GitHub issues...';
210
- const issuesJson = execSync('gh issue list --json number,title,state,labels,assignees', {
211
- encoding: 'utf8',
212
- cwd: this.projectRoot
213
- });
214
-
215
- const issues = JSON.parse(issuesJson);
216
-
217
- // AIWF ํƒœ์Šคํฌ์™€ ์—ฐ๊ฒฐ๋œ ์ด์Šˆ๋“ค ํ™•์ธ
218
- const stateIndex = await this.stateIndexManager.loadIndex();
219
- if (!stateIndex) {
220
- throw new Error('State index not found. Run "aiwf state update" first.');
221
- }
222
-
223
- spinner.text = 'Analyzing synchronization...';
224
-
225
- let syncCount = 0;
226
- const syncResults = [];
227
-
228
- for (const issue of issues) {
229
- // ์ด์Šˆ ์ œ๋ชฉ์—์„œ ํƒœ์Šคํฌ ID ์ถ”์ถœ
230
- const taskIdMatch = issue.title.match(/^([A-Z]\d+):/);
231
- if (taskIdMatch) {
232
- const taskId = taskIdMatch[1];
233
- const task = stateIndex.tasks[taskId];
234
-
235
- if (task) {
236
- // ์ƒํƒœ ๋™๊ธฐํ™” ํ™•์ธ
237
- const issueState = issue.state.toLowerCase();
238
- const taskState = task.status;
239
-
240
- let needsSync = false;
241
- if (issueState === 'closed' && taskState !== 'completed') {
242
- needsSync = true;
243
- } else if (issueState === 'open' && taskState === 'completed') {
244
- needsSync = true;
245
- }
246
-
247
- if (needsSync) {
248
- syncResults.push({
249
- taskId,
250
- issueNumber: issue.number,
251
- issueState,
252
- taskState,
253
- needsSync
254
- });
255
- syncCount++;
256
- }
257
- }
258
- }
259
- }
260
-
261
- spinner.succeed(`GitHub sync completed. Found ${syncCount} items needing attention.`);
262
-
263
- if (syncResults.length > 0) {
264
- console.log(chalk.cyan('\n๐Ÿ”„ Sync Status:'));
265
- for (const result of syncResults) {
266
- console.log(` ${result.taskId}: Issue #${result.issueNumber} (${result.issueState}) โ†” Task (${result.taskState})`);
267
- }
268
- console.log(chalk.yellow('\nNote: Manual review recommended for state mismatches.'));
269
- } else {
270
- console.log(chalk.green('\nโœ… All GitHub issues are in sync with AIWF tasks.'));
271
- }
272
-
273
- } catch (error) {
274
- spinner.fail(`Failed to sync GitHub issues: ${error.message}`);
275
- throw error;
276
- }
277
- }
278
-
279
- /**
280
- * ์ด์Šˆ ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ
281
- */
282
- generateIssueTemplate(task) {
283
- return `## ๐Ÿ“‹ Task: ${task.title}
284
-
285
- ### Description
286
- ${task.description || 'No description provided.'}
287
-
288
- ### Acceptance Criteria
289
- - [ ] Task implementation completed
290
- - [ ] Tests written and passing
291
- - [ ] Documentation updated
292
- - [ ] Code reviewed
293
-
294
- ### Additional Information
295
- - **Task ID**: ${task.id}
296
- - **Sprint**: ${task.sprint_id || 'N/A'}
297
- - **Priority**: ${task.priority_score?.toFixed(2) || 'N/A'}
298
- - **Estimated Hours**: ${task.estimated_hours || 'N/A'}
299
- - **Complexity**: ${task.complexity || 'N/A'}
300
-
301
- ### Task File
302
- \`${task.file_path || 'N/A'}\`
303
-
304
- ---
305
- *This issue was automatically created by AIWF*`;
306
- }
307
-
308
- /**
309
- * PR ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ
310
- */
311
- generatePRTemplate(taskId, commits, diffStat) {
312
- return `## ๐ŸŽฏ Overview
313
- ${taskId ? `Completed implementation of ${taskId}.` : 'Completed feature implementation.'}
314
-
315
- ## ๐Ÿ“ Changes
316
- \`\`\`
317
- ${commits}
318
- \`\`\`
319
-
320
- ## ๐Ÿ“Š Changed Files
321
- \`\`\`
322
- ${diffStat}
323
- \`\`\`
324
-
325
- ## โœ… Checklist
326
- - [ ] Tests pass
327
- - [ ] Code review completed
328
- - [ ] Documentation updated
329
-
330
- ## ๐Ÿ”— Related Information
331
- ${taskId ? `- Related Task: ${taskId}` : '- No specific task linked'}
332
-
333
- ---
334
- *This pull request was automatically created by AIWF*`;
335
- }
336
-
337
- /**
338
- * ํƒœ์Šคํฌ ํƒ€์ž…๊ณผ ์ƒํƒœ์— ๋”ฐ๋ฅธ ๋ผ๋ฒจ ์ƒ์„ฑ
339
- */
340
- generateLabels(task) {
341
- const labels = ['aiwf-task'];
342
-
343
- if (task.type) {
344
- labels.push(task.type);
345
- }
346
-
347
- if (task.sprint_id && task.sprint_id !== 'general') {
348
- labels.push('sprint-task');
349
- }
350
-
351
- if (task.priority_score && task.priority_score > 0.8) {
352
- labels.push('high-priority');
353
- }
354
-
355
- if (task.complexity === 'high' || task.complexity === 'very-high') {
356
- labels.push('complex');
357
- }
358
-
359
- return labels;
360
- }
361
-
362
- /**
363
- * ์ด์Šˆ URL์—์„œ ์ด์Šˆ ๋ฒˆํ˜ธ ์ถ”์ถœ
364
- */
365
- extractIssueNumber(issueUrl) {
366
- const match = issueUrl.match(/\/issues\/(\d+)$/);
367
- return match ? match[1] : null;
368
- }
369
-
370
- /**
371
- * ํƒœ์Šคํฌ ํŒŒ์ผ์— GitHub ์ด์Šˆ ์ •๋ณด ์ถ”๊ฐ€
372
- */
373
- async updateTaskWithIssue(filePath, issueNumber, issueUrl) {
374
- try {
375
- const content = await fs.readFile(filePath, 'utf8');
376
-
377
- // ์ด๋ฏธ GitHub ์ •๋ณด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ
378
- if (content.includes('github_issue:') || content.includes('GitHub Issue:')) {
379
- return; // ์ด๋ฏธ ์žˆ์œผ๋ฉด ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Œ
380
- }
381
-
382
- // YAML frontmatter๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ
383
- const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
384
-
385
- let updatedContent;
386
- if (frontmatterMatch) {
387
- // YAML frontmatter์— ์ถ”๊ฐ€
388
- const frontmatter = frontmatterMatch[1];
389
- const body = frontmatterMatch[2];
390
- const updatedFrontmatter = `${frontmatter}\ngithub_issue: ${issueNumber}\ngithub_url: ${issueUrl}`;
391
- updatedContent = `---\n${updatedFrontmatter}\n---\n${body}`;
392
- } else {
393
- // ํŒŒ์ผ ์‹œ์ž‘ ๋ถ€๋ถ„์— GitHub ์ •๋ณด ์ถ”๊ฐ€
394
- updatedContent = `<!-- GitHub Issue: #${issueNumber} - ${issueUrl} -->\n\n${content}`;
395
- }
396
-
397
- await fs.writeFile(filePath, updatedContent, 'utf8');
398
- } catch (error) {
399
- console.warn(`Failed to update task file with GitHub issue: ${error.message}`);
400
- }
401
- }
402
- }