@ripla/godd-mcp 1.0.4-canary.8 → 1.0.4

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 (348) hide show
  1. package/README.md +89 -94
  2. package/dist/godd.cjs +349 -233
  3. package/dist/godd.js +2193 -838
  4. package/dist/index.js +152 -122
  5. package/{notes-api → notes/api}/.env.example +6 -1
  6. package/{notes-api → notes/api}/README.md +6 -5
  7. package/{notes-api → notes/api}/app/main.py +29 -2
  8. package/{notes-api → notes/api}/app/routers/auth.py +6 -1
  9. package/{notes-api → notes/api}/app/routers/issues.py +157 -1
  10. package/{notes-api → notes/api}/app/routers/pr.py +2 -2
  11. package/{notes-api → notes/api}/app/services/github_app_token.py +32 -1
  12. package/{notes-api → notes/api}/app/services/github_issues.py +101 -11
  13. package/{notes-api → notes/api}/app/services/github_pr.py +6 -1
  14. package/{notes-api → notes/api}/tests/test_github_app_token.py +49 -1
  15. package/{notes-api → notes/api}/tests/test_github_service.py +42 -0
  16. package/notes/api/tests/test_health.py +52 -0
  17. package/{notes-api → notes/api}/tests/test_issues.py +216 -0
  18. package/{notes-api → notes/api}/tests/test_pr.py +24 -0
  19. package/{notes-api → notes/api}/tests/test_pr_chain.py +19 -0
  20. package/{notes-api → notes/api}/uv.lock +178 -2
  21. package/notes/app/DESIGN.md +273 -0
  22. package/{notes-app → notes/app}/README.md +4 -1
  23. package/notes/app/docker/Dockerfile.e2e +19 -0
  24. package/notes/app/docker/Dockerfile.prod +15 -0
  25. package/notes/app/docker/Dockerfile.test +17 -0
  26. package/notes/app/e2e/file-tree.spec.ts +26 -0
  27. package/notes/app/e2e/file-view.spec.ts +25 -0
  28. package/notes/app/e2e/fixtures.ts +28 -0
  29. package/{notes-app → notes/app}/e2e/global-setup.ts +5 -7
  30. package/notes/app/e2e/login.spec.ts +25 -0
  31. package/notes/app/e2e/pages/login-page.ts +29 -0
  32. package/notes/app/e2e/pages/main-page.ts +29 -0
  33. package/notes/app/e2e/panel-resize-handle.spec.ts +213 -0
  34. package/{notes-app → notes/app}/eslint.config.js +9 -0
  35. package/{notes-app → notes/app}/package.json +0 -3
  36. package/{notes-app → notes/app}/pnpm-workspace.yaml +1 -0
  37. package/notes/app/src/components/CommentPanel.test.tsx +194 -0
  38. package/{notes-app → notes/app}/src/components/CommentPanel.tsx +119 -10
  39. package/notes/app/src/components/CommentSelectionPopover.tsx +26 -0
  40. package/notes/app/src/components/EditToolbar.test.tsx +102 -0
  41. package/{notes-app → notes/app}/src/components/EditToolbar.tsx +5 -54
  42. package/notes/app/src/components/FileInfoPanel.branch-tab.test.tsx +250 -0
  43. package/notes/app/src/components/FileInfoPanel.history-tab.test.tsx +146 -0
  44. package/notes/app/src/components/FileInfoPanel.test.tsx +101 -0
  45. package/{notes-app → notes/app}/src/components/FileInfoPanel.tsx +135 -20
  46. package/notes/app/src/components/IssueCommentThread.test.tsx +93 -0
  47. package/notes/app/src/components/IssueCommentThread.tsx +156 -0
  48. package/notes/app/src/components/IssueDetailView.test.tsx +1118 -0
  49. package/notes/app/src/components/IssueDetailView.tsx +476 -0
  50. package/notes/app/src/components/IssueList.test.tsx +545 -0
  51. package/notes/app/src/components/IssueList.tsx +374 -0
  52. package/{notes-app → notes/app}/src/components/LabelSelector.test.tsx +94 -8
  53. package/notes/app/src/components/LabelSelector.tsx +452 -0
  54. package/{notes-app → notes/app}/src/components/MarkdownEditor.tsx +140 -2
  55. package/notes/app/src/components/PanelResizeHandle.test.tsx +481 -0
  56. package/notes/app/src/components/PanelResizeHandle.tsx +96 -0
  57. package/{notes-app → notes/app}/src/hooks/useEditSession.test.ts +171 -23
  58. package/{notes-app → notes/app}/src/hooks/useEditSession.ts +49 -62
  59. package/notes/app/src/hooks/useMdUpLayout.test.ts +10 -0
  60. package/notes/app/src/hooks/useMdUpLayout.ts +27 -0
  61. package/notes/app/src/hooks/usePeriodicSync.test.ts +244 -0
  62. package/notes/app/src/hooks/usePeriodicSync.ts +83 -0
  63. package/notes/app/src/hooks/useResizablePanelWidth.test.ts +251 -0
  64. package/notes/app/src/hooks/useResizablePanelWidth.ts +167 -0
  65. package/{notes-app → notes/app}/src/lib/api.test.ts +81 -1
  66. package/{notes-app → notes/app}/src/lib/api.ts +98 -4
  67. package/notes/app/src/lib/commentAnchor.test.ts +22 -0
  68. package/notes/app/src/lib/commentAnchor.ts +28 -0
  69. package/notes/app/src/lib/commentHighlight.test.ts +110 -0
  70. package/notes/app/src/lib/commentHighlight.ts +44 -0
  71. package/notes/app/src/lib/github-sync.test.ts +126 -0
  72. package/notes/app/src/lib/github-sync.ts +89 -0
  73. package/notes/app/src/lib/issue-list-utils.test.ts +275 -0
  74. package/notes/app/src/lib/issue-list-utils.ts +135 -0
  75. package/notes/app/src/lib/issue-mobile-layout.test.ts +17 -0
  76. package/notes/app/src/lib/issue-mobile-layout.ts +20 -0
  77. package/notes/app/src/lib/issue-url-sync.test.ts +73 -0
  78. package/notes/app/src/lib/issue-url-sync.ts +43 -0
  79. package/notes/app/src/lib/main-page-default-view.test.ts +37 -0
  80. package/notes/app/src/lib/main-page-default-view.ts +15 -0
  81. package/notes/app/src/lib/resizable-panel.test.ts +199 -0
  82. package/notes/app/src/lib/resizable-panel.ts +136 -0
  83. package/notes/app/src/pages/LoginPage.test.tsx +17 -0
  84. package/notes/app/src/pages/MainPage.branch-modal.test.tsx +226 -0
  85. package/notes/app/src/pages/MainPage.issue-sync.test.tsx +145 -0
  86. package/notes/app/src/pages/MainPage.sidebar.test.tsx +361 -0
  87. package/{notes-app → notes/app}/src/pages/MainPage.tsx +406 -61
  88. package/{notes-app → notes/app}/src/pages/SettingsPage.test.tsx +32 -23
  89. package/{notes-app → notes/app}/src/pages/UserManagementPage.test.tsx +8 -18
  90. package/notes/app/src/test/mocks.ts +156 -0
  91. package/notes/app/src/test/render.tsx +27 -0
  92. package/package.json +3 -5
  93. package/notes-api/tests/test_health.py +0 -11
  94. package/notes-app/docker/Dockerfile.e2e +0 -14
  95. package/notes-app/docker/Dockerfile.prod +0 -12
  96. package/notes-app/docker/Dockerfile.test +0 -12
  97. package/notes-app/e2e/file-tree.spec.ts +0 -29
  98. package/notes-app/e2e/file-view.spec.ts +0 -24
  99. package/notes-app/e2e/login.spec.ts +0 -32
  100. package/notes-app/src/components/IssueDetailView.test.tsx +0 -201
  101. package/notes-app/src/components/IssueDetailView.tsx +0 -318
  102. package/notes-app/src/components/IssueList.test.tsx +0 -93
  103. package/notes-app/src/components/IssueList.tsx +0 -169
  104. package/notes-app/src/components/LabelSelector.tsx +0 -276
  105. package/notes-app/src/pages/LoginPage.test.tsx +0 -29
  106. package/stacks/django-vue.yaml +0 -33
  107. package/stacks/fastapi-react.yaml +0 -160
  108. package/stacks/flutter-firebase.yaml +0 -58
  109. package/stacks/nextjs-prisma.yaml +0 -33
  110. package/stacks/schema.json +0 -144
  111. package/templates/agents/architect.hbs +0 -183
  112. package/templates/agents/auto-documenter.hbs +0 -36
  113. package/templates/agents/backend-developer.hbs +0 -175
  114. package/templates/agents/code-reviewer.hbs +0 -29
  115. package/templates/agents/database-developer.hbs +0 -52
  116. package/templates/agents/debug-specialist.hbs +0 -39
  117. package/templates/agents/environment-setup.hbs +0 -41
  118. package/templates/agents/frontend-developer.hbs +0 -45
  119. package/templates/agents/integration-qa.hbs +0 -26
  120. package/templates/agents/performance-qa.hbs +0 -24
  121. package/templates/agents/pr-writer.hbs +0 -53
  122. package/templates/agents/quality-lead.hbs +0 -26
  123. package/templates/agents/requirements-analyst.hbs +0 -26
  124. package/templates/agents/security-analyst.hbs +0 -21
  125. package/templates/agents/security-reviewer.hbs +0 -20
  126. package/templates/agents/ssot-updater.hbs +0 -45
  127. package/templates/agents/technical-writer.hbs +0 -28
  128. package/templates/agents/unit-test-engineer.hbs +0 -19
  129. package/templates/agents/user-clone.hbs +0 -43
  130. package/templates/github-actions/aws/deploy-notes.yml.hbs +0 -117
  131. package/templates/github-actions/azure/deploy-notes.yml.hbs +0 -78
  132. package/templates/github-actions/gcp/deploy-notes.yml.hbs +0 -76
  133. package/templates/github-actions/vercel-railway/deploy-notes.yml.hbs +0 -49
  134. package/templates/mindsets/agent-stdio.hbs +0 -51
  135. package/templates/mindsets/dart.hbs +0 -39
  136. package/templates/mindsets/ddd-clean-architecture.hbs +0 -52
  137. package/templates/mindsets/electron.hbs +0 -41
  138. package/templates/mindsets/fastapi.hbs +0 -40
  139. package/templates/mindsets/flutter.hbs +0 -56
  140. package/templates/mindsets/kotlin.hbs +0 -46
  141. package/templates/mindsets/postgresql.hbs +0 -39
  142. package/templates/mindsets/python.hbs +0 -39
  143. package/templates/mindsets/react.hbs +0 -51
  144. package/templates/mindsets/swift.hbs +0 -46
  145. package/templates/mindsets/terraform.hbs +0 -53
  146. package/templates/mindsets/typescript.hbs +0 -34
  147. package/templates/mindsets/vite.hbs +0 -37
  148. package/templates/notes-compose.yml +0 -82
  149. package/templates/partials/cogito-geo.hbs +0 -84
  150. package/templates/partials/cogito-godd.hbs +0 -22
  151. package/templates/partials/cogito-grammar.hbs +0 -105
  152. package/templates/partials/cogito-particle.hbs +0 -76
  153. package/templates/partials/cogito-root-ai.hbs +0 -79
  154. package/templates/partials/cogito-root-arch.hbs +0 -75
  155. package/templates/partials/cogito-root-core.hbs +0 -75
  156. package/templates/partials/cogito-root-daily.hbs +0 -58
  157. package/templates/partials/cogito-root-dev.hbs +0 -71
  158. package/templates/partials/cogito-root-devops.hbs +0 -71
  159. package/templates/partials/cogito-root-framework.hbs +0 -80
  160. package/templates/partials/cogito-root-lang.hbs +0 -74
  161. package/templates/partials/godd-core.hbs +0 -50
  162. package/templates/partials/project-context.hbs +0 -52
  163. package/templates/partials/ssot-header.hbs +0 -40
  164. package/templates/partials/ssot-rules.hbs +0 -30
  165. package/templates/prompts/adr.hbs +0 -39
  166. package/templates/prompts/agent-dev-workflow.hbs +0 -34
  167. package/templates/prompts/analyze-report.hbs +0 -36
  168. package/templates/prompts/auto-documentation.hbs +0 -37
  169. package/templates/prompts/check.hbs +0 -52
  170. package/templates/prompts/commit.hbs +0 -96
  171. package/templates/prompts/dev.hbs +0 -127
  172. package/templates/prompts/docs-init.hbs +0 -101
  173. package/templates/prompts/docs-update.hbs +0 -51
  174. package/templates/prompts/git-workflow.hbs +0 -125
  175. package/templates/prompts/impact-analysis.hbs +0 -43
  176. package/templates/prompts/install.hbs +0 -40
  177. package/templates/prompts/new-branch.hbs +0 -61
  178. package/templates/prompts/notes-deploy.hbs +0 -138
  179. package/templates/prompts/pr-analyze.hbs +0 -44
  180. package/templates/prompts/pr-create.hbs +0 -125
  181. package/templates/prompts/push-execute.hbs +0 -83
  182. package/templates/prompts/push.hbs +0 -24
  183. package/templates/prompts/release-notes.hbs +0 -38
  184. package/templates/prompts/requirements-to-business-flow.hbs +0 -29
  185. package/templates/prompts/requirements-to-tickets.hbs +0 -26
  186. package/templates/prompts/review.hbs +0 -126
  187. package/templates/prompts/setup.hbs +0 -247
  188. package/templates/prompts/spec.hbs +0 -35
  189. package/templates/prompts/specification-to-tickets.hbs +0 -24
  190. package/templates/prompts/submit.hbs +0 -143
  191. package/templates/prompts/sync.hbs +0 -63
  192. package/templates/prompts/test-plan.hbs +0 -56
  193. package/templates/scripts/aws/terraform-backend-setup.sh.hbs +0 -149
  194. package/templates/terraform/aws/alb.tf.hbs +0 -58
  195. package/templates/terraform/aws/backend.tf.hbs +0 -10
  196. package/templates/terraform/aws/cloudfront.tf.hbs +0 -96
  197. package/templates/terraform/aws/ecr.tf.hbs +0 -30
  198. package/templates/terraform/aws/ecs.tf.hbs +0 -142
  199. package/templates/terraform/aws/iam.tf.hbs +0 -88
  200. package/templates/terraform/aws/local.tf.hbs +0 -34
  201. package/templates/terraform/aws/output.tf.hbs +0 -49
  202. package/templates/terraform/aws/provider.tf.hbs +0 -26
  203. package/templates/terraform/aws/rds.tf.hbs +0 -38
  204. package/templates/terraform/aws/s3.tf.hbs +0 -34
  205. package/templates/terraform/aws/secrets.tf.hbs +0 -53
  206. package/templates/terraform/aws/security_groups.tf.hbs +0 -81
  207. package/templates/terraform/aws/vpc.tf.hbs +0 -63
  208. package/templates/terraform/azure/backend.tf.hbs +0 -8
  209. package/templates/terraform/azure/iam.tf.hbs +0 -36
  210. package/templates/terraform/azure/main.tf.hbs +0 -203
  211. package/templates/terraform/azure/output.tf.hbs +0 -19
  212. package/templates/terraform/azure/provider.tf.hbs +0 -19
  213. package/templates/terraform/gcp/backend.tf.hbs +0 -6
  214. package/templates/terraform/gcp/iam.tf.hbs +0 -47
  215. package/templates/terraform/gcp/main.tf.hbs +0 -175
  216. package/templates/terraform/gcp/output.tf.hbs +0 -15
  217. package/templates/terraform/gcp/provider.tf.hbs +0 -19
  218. package/templates/terraform/vercel-railway/main.tf.hbs +0 -64
  219. package/templates/terraform/vercel-railway/output.tf.hbs +0 -11
  220. /package/{notes-api → notes/api}/.dockerignore +0 -0
  221. /package/{notes-api → notes/api}/alembic/README +0 -0
  222. /package/{notes-api → notes/api}/alembic/env.py +0 -0
  223. /package/{notes-api → notes/api}/alembic/script.py.mako +0 -0
  224. /package/{notes-api → notes/api}/alembic/versions/001_initial_notes_tables.py +0 -0
  225. /package/{notes-api → notes/api}/alembic/versions/002_add_performance_indexes.py +0 -0
  226. /package/{notes-api → notes/api}/alembic/versions/003_add_yjs_documents.py +0 -0
  227. /package/{notes-api → notes/api}/alembic/versions/004_add_comments.py +0 -0
  228. /package/{notes-api → notes/api}/alembic/versions/005_add_github_username.py +0 -0
  229. /package/{notes-api → notes/api}/alembic/versions/006_add_check_constraints.py +0 -0
  230. /package/{notes-api → notes/api}/alembic.ini +0 -0
  231. /package/{notes-api → notes/api}/app/__init__.py +0 -0
  232. /package/{notes-api → notes/api}/app/config.py +0 -0
  233. /package/{notes-api → notes/api}/app/database.py +0 -0
  234. /package/{notes-api → notes/api}/app/http_client.py +0 -0
  235. /package/{notes-api → notes/api}/app/models/__init__.py +0 -0
  236. /package/{notes-api → notes/api}/app/models/audit.py +0 -0
  237. /package/{notes-api → notes/api}/app/models/base.py +0 -0
  238. /package/{notes-api → notes/api}/app/models/collab.py +0 -0
  239. /package/{notes-api → notes/api}/app/models/comment.py +0 -0
  240. /package/{notes-api → notes/api}/app/models/session.py +0 -0
  241. /package/{notes-api → notes/api}/app/models/setting.py +0 -0
  242. /package/{notes-api → notes/api}/app/models/user.py +0 -0
  243. /package/{notes-api → notes/api}/app/path_validation.py +0 -0
  244. /package/{notes-api → notes/api}/app/routers/__init__.py +0 -0
  245. /package/{notes-api → notes/api}/app/routers/collab.py +0 -0
  246. /package/{notes-api → notes/api}/app/routers/comments.py +0 -0
  247. /package/{notes-api → notes/api}/app/routers/files.py +0 -0
  248. /package/{notes-api → notes/api}/app/routers/settings.py +0 -0
  249. /package/{notes-api → notes/api}/app/routers/tree.py +0 -0
  250. /package/{notes-api → notes/api}/app/routers/upload.py +0 -0
  251. /package/{notes-api → notes/api}/app/routers/users.py +0 -0
  252. /package/{notes-api → notes/api}/app/schemas/__init__.py +0 -0
  253. /package/{notes-api → notes/api}/app/schemas/auth.py +0 -0
  254. /package/{notes-api → notes/api}/app/schemas/user.py +0 -0
  255. /package/{notes-api → notes/api}/app/security.py +0 -0
  256. /package/{notes-api → notes/api}/app/services/__init__.py +0 -0
  257. /package/{notes-api → notes/api}/app/services/audit.py +0 -0
  258. /package/{notes-api → notes/api}/app/services/business_date.py +0 -0
  259. /package/{notes-api → notes/api}/app/services/collab.py +0 -0
  260. /package/{notes-api → notes/api}/app/services/github.py +0 -0
  261. /package/{notes-api → notes/api}/app/services/pr_chain.py +0 -0
  262. /package/{notes-api → notes/api}/app/startup.py +0 -0
  263. /package/{notes-api → notes/api}/docker/Dockerfile +0 -0
  264. /package/{notes-api → notes/api}/docker/Dockerfile.test +0 -0
  265. /package/{notes-api → notes/api}/pyproject.toml +0 -0
  266. /package/{notes-api → notes/api}/tests/conftest.py +0 -0
  267. /package/{notes-api → notes/api}/tests/test_audit.py +0 -0
  268. /package/{notes-api → notes/api}/tests/test_auth.py +0 -0
  269. /package/{notes-api → notes/api}/tests/test_business_date.py +0 -0
  270. /package/{notes-api → notes/api}/tests/test_collab.py +0 -0
  271. /package/{notes-api → notes/api}/tests/test_comments.py +0 -0
  272. /package/{notes-api → notes/api}/tests/test_config_ssl.py +0 -0
  273. /package/{notes-api → notes/api}/tests/test_config_warnings.py +0 -0
  274. /package/{notes-api → notes/api}/tests/test_files.py +0 -0
  275. /package/{notes-api → notes/api}/tests/test_path_validation.py +0 -0
  276. /package/{notes-api → notes/api}/tests/test_security.py +0 -0
  277. /package/{notes-api → notes/api}/tests/test_settings.py +0 -0
  278. /package/{notes-api → notes/api}/tests/test_tree.py +0 -0
  279. /package/{notes-api → notes/api}/tests/test_upload.py +0 -0
  280. /package/{notes-api → notes/api}/tests/test_users.py +0 -0
  281. /package/{notes-app → notes/app}/.dockerignore +0 -0
  282. /package/{notes-app → notes/app}/index.html +0 -0
  283. /package/{notes-app → notes/app}/nginx.conf +0 -0
  284. /package/{notes-app → notes/app}/package-lock.json +0 -0
  285. /package/{notes-app → notes/app}/playwright.config.ts +0 -0
  286. /package/{notes-app → notes/app}/pnpm-lock.yaml +0 -0
  287. /package/{notes-app → notes/app}/src/App.tsx +0 -0
  288. /package/{notes-app → notes/app}/src/components/BranchSelectorModal.tsx +0 -0
  289. /package/{notes-app → notes/app}/src/components/CodeBlockView.test.tsx +0 -0
  290. /package/{notes-app → notes/app}/src/components/CodeBlockView.tsx +0 -0
  291. /package/{notes-app → notes/app}/src/components/CollabStatus.tsx +0 -0
  292. /package/{notes-app → notes/app}/src/components/DiffPreview.tsx +0 -0
  293. /package/{notes-app → notes/app}/src/components/DrawioEditor.tsx +0 -0
  294. /package/{notes-app → notes/app}/src/components/DrawioViewer.tsx +0 -0
  295. /package/{notes-app → notes/app}/src/components/ErrorBoundary.test.tsx +0 -0
  296. /package/{notes-app → notes/app}/src/components/ErrorBoundary.tsx +0 -0
  297. /package/{notes-app → notes/app}/src/components/FileContentView.tsx +0 -0
  298. /package/{notes-app → notes/app}/src/components/FileContextMenu.test.tsx +0 -0
  299. /package/{notes-app → notes/app}/src/components/FileContextMenu.tsx +0 -0
  300. /package/{notes-app → notes/app}/src/components/FileDialogs.test.tsx +0 -0
  301. /package/{notes-app → notes/app}/src/components/FileDialogs.tsx +0 -0
  302. /package/{notes-app → notes/app}/src/components/SaveStatusIndicator.test.tsx +0 -0
  303. /package/{notes-app → notes/app}/src/components/SaveStatusIndicator.tsx +0 -0
  304. /package/{notes-app → notes/app}/src/components/Skeleton.tsx +0 -0
  305. /package/{notes-app → notes/app}/src/components/SpreadsheetEditor.test.tsx +0 -0
  306. /package/{notes-app → notes/app}/src/components/SpreadsheetEditor.tsx +0 -0
  307. /package/{notes-app → notes/app}/src/components/TextEditor.tsx +0 -0
  308. /package/{notes-app → notes/app}/src/components/ToastContainer.tsx +0 -0
  309. /package/{notes-app → notes/app}/src/components/TreeNode.tsx +0 -0
  310. /package/{notes-app → notes/app}/src/contexts/AuthContext.test.tsx +0 -0
  311. /package/{notes-app → notes/app}/src/contexts/AuthContext.tsx +0 -0
  312. /package/{notes-app → notes/app}/src/contexts/ToastContext.test.ts +0 -0
  313. /package/{notes-app → notes/app}/src/contexts/ToastContext.tsx +0 -0
  314. /package/{notes-app → notes/app}/src/hooks/useAutoSave.test.ts +0 -0
  315. /package/{notes-app → notes/app}/src/hooks/useAutoSave.ts +0 -0
  316. /package/{notes-app → notes/app}/src/hooks/useCollaboration.ts +0 -0
  317. /package/{notes-app → notes/app}/src/hooks/useComments.ts +0 -0
  318. /package/{notes-app → notes/app}/src/hooks/useYText.ts +0 -0
  319. /package/{notes-app → notes/app}/src/lib/branch-diff.test.ts +0 -0
  320. /package/{notes-app → notes/app}/src/lib/branch-diff.ts +0 -0
  321. /package/{notes-app → notes/app}/src/lib/created-file.test.ts +0 -0
  322. /package/{notes-app → notes/app}/src/lib/created-file.ts +0 -0
  323. /package/{notes-app → notes/app}/src/lib/csv-utils.test.ts +0 -0
  324. /package/{notes-app → notes/app}/src/lib/csv-utils.ts +0 -0
  325. /package/{notes-app → notes/app}/src/lib/deepLinkPathToSearch.test.ts +0 -0
  326. /package/{notes-app → notes/app}/src/lib/deepLinkPathToSearch.ts +0 -0
  327. /package/{notes-app → notes/app}/src/lib/draft-storage.test.ts +0 -0
  328. /package/{notes-app → notes/app}/src/lib/draft-storage.ts +0 -0
  329. /package/{notes-app → notes/app}/src/lib/mermaid-render.ts +0 -0
  330. /package/{notes-app → notes/app}/src/lib/postLoginRedirect.test.ts +0 -0
  331. /package/{notes-app → notes/app}/src/lib/postLoginRedirect.ts +0 -0
  332. /package/{notes-app → notes/app}/src/lib/tree-utils.ts +0 -0
  333. /package/{notes-app → notes/app}/src/lib/user-colors.ts +0 -0
  334. /package/{notes-app → notes/app}/src/lib/xlsx-utils.test.ts +0 -0
  335. /package/{notes-app → notes/app}/src/lib/xlsx-utils.ts +0 -0
  336. /package/{notes-app → notes/app}/src/main.tsx +0 -0
  337. /package/{notes-app → notes/app}/src/pages/LoginPage.tsx +0 -0
  338. /package/{notes-app → notes/app}/src/pages/MainPage.insertChildEntry.test.ts +0 -0
  339. /package/{notes-app → notes/app}/src/pages/SettingsPage.tsx +0 -0
  340. /package/{notes-app → notes/app}/src/pages/UserManagementPage.tsx +0 -0
  341. /package/{notes-app → notes/app}/src/styles/globals.css +0 -0
  342. /package/{notes-app → notes/app}/src/types.ts +0 -0
  343. /package/{notes-app → notes/app}/src/vite-env.d.ts +0 -0
  344. /package/{notes-app → notes/app}/tsconfig.json +0 -0
  345. /package/{notes-app → notes/app}/tsconfig.node.json +0 -0
  346. /package/{notes-app → notes/app}/vite.config.js +0 -0
  347. /package/{notes-app → notes/app}/vite.config.ts +0 -0
  348. /package/{notes-app → notes/app}/vitest.config.ts +0 -0
@@ -1,169 +0,0 @@
1
- import { useState, useEffect, useRef } from "react";
2
- import {
3
- listIssuesApi,
4
- getErrorMessage,
5
- isAbortError,
6
- } from "@/lib/api";
7
- import type { IssueSummary } from "@/lib/api";
8
- import { CircleDot, CircleCheck, MessageSquare, RefreshCw } from "lucide-react";
9
- import { InlineError } from "@/components/Skeleton";
10
-
11
- type IssueListProps = {
12
- onSelect: (number: number) => void;
13
- selectedIssue: number | null;
14
- reloadTrigger?: number;
15
- };
16
-
17
- export default function IssueList({ onSelect, selectedIssue, reloadTrigger }: IssueListProps) {
18
- const [issues, setIssues] = useState<IssueSummary[]>([]);
19
- const [loading, setLoading] = useState(true);
20
- const [error, setError] = useState<string | null>(null);
21
- const [stateFilter, setStateFilter] = useState<"open" | "closed">("open");
22
- const [reloadKey, setReloadKey] = useState(0);
23
- const requestSeq = useRef(0);
24
-
25
- const requestReload = () => {
26
- requestSeq.current += 1;
27
- setLoading(true);
28
- setError(null);
29
- setReloadKey((key) => key + 1);
30
- };
31
-
32
- const changeStateFilter = (nextState: "open" | "closed") => {
33
- if (nextState === stateFilter) return;
34
- requestSeq.current += 1;
35
- setLoading(true);
36
- setError(null);
37
- setStateFilter(nextState);
38
- };
39
-
40
- useEffect(() => {
41
- const ac = new AbortController();
42
- const requestId = requestSeq.current + 1;
43
- requestSeq.current = requestId;
44
- listIssuesApi({ state: stateFilter, per_page: 50, signal: ac.signal })
45
- .then((data) => {
46
- if (ac.signal.aborted || requestSeq.current !== requestId) return;
47
- setIssues([...data.issues].sort((a, b) => b.number - a.number));
48
- })
49
- .catch((e) => {
50
- if (ac.signal.aborted || requestSeq.current !== requestId || isAbortError(e)) return;
51
- setError(getErrorMessage(e));
52
- })
53
- .finally(() => {
54
- if (!ac.signal.aborted && requestSeq.current === requestId) {
55
- setLoading(false);
56
- }
57
- });
58
- return () => ac.abort();
59
- }, [stateFilter, reloadKey, reloadTrigger]);
60
-
61
- return (
62
- <div className="flex flex-col h-full">
63
- {/* Filter bar */}
64
- <div className="px-2 pt-2 flex items-center gap-1">
65
- <div className="flex-1 flex bg-gray-900 rounded border border-gray-600 overflow-hidden text-xs">
66
- <button
67
- type="button"
68
- onClick={() => changeStateFilter("open")}
69
- className={`flex-1 px-2 py-1 transition-colors ${
70
- stateFilter === "open"
71
- ? "bg-green-700/30 text-green-300"
72
- : "text-gray-400 hover:text-gray-200"
73
- }`}
74
- >
75
- <CircleDot className="w-3 h-3 inline mr-1" />
76
- Open
77
- </button>
78
- <button
79
- type="button"
80
- onClick={() => changeStateFilter("closed")}
81
- className={`flex-1 px-2 py-1 transition-colors ${
82
- stateFilter === "closed"
83
- ? "bg-purple-700/30 text-purple-300"
84
- : "text-gray-400 hover:text-gray-200"
85
- }`}
86
- >
87
- <CircleCheck className="w-3 h-3 inline mr-1" />
88
- Closed
89
- </button>
90
- </div>
91
- <button
92
- type="button"
93
- onClick={requestReload}
94
- className="shrink-0 p-1 rounded text-gray-400 hover:text-gray-200 hover:bg-gray-700 transition-colors"
95
- title="更新"
96
- >
97
- <RefreshCw className={`w-4 h-4 ${loading ? "animate-spin" : ""}`} />
98
- </button>
99
- </div>
100
-
101
- {/* Issue list */}
102
- <div className="flex-1 overflow-y-auto p-2">
103
- {loading && issues.length === 0 && (
104
- <div className="flex items-center justify-center py-8 text-gray-500 text-xs">
105
- 読み込み中…
106
- </div>
107
- )}
108
-
109
- {error && <InlineError message={error} onRetry={requestReload} />}
110
-
111
- {!loading && !error && issues.length === 0 && (
112
- <p className="text-xs text-gray-500 text-center py-4">
113
- {stateFilter === "open" ? "オープンな Issue はありません" : "クローズ済み Issue はありません"}
114
- </p>
115
- )}
116
-
117
- {issues.map((issue) => (
118
- <button
119
- key={issue.number}
120
- type="button"
121
- onClick={() => onSelect(issue.number)}
122
- className={`w-full text-left px-2 py-1.5 rounded text-xs mb-0.5 transition-colors ${
123
- selectedIssue === issue.number
124
- ? "bg-blue-600/20 text-blue-300"
125
- : "text-gray-300 hover:bg-gray-700/50"
126
- }`}
127
- >
128
- <div className="flex items-start gap-1.5">
129
- {issue.state === "open" ? (
130
- <CircleDot className="w-3.5 h-3.5 text-green-400 mt-0.5 shrink-0" />
131
- ) : (
132
- <CircleCheck className="w-3.5 h-3.5 text-purple-400 mt-0.5 shrink-0" />
133
- )}
134
- <div className="min-w-0 flex-1">
135
- <p className="truncate font-medium">{issue.title}</p>
136
- <div className="flex items-center gap-2 text-gray-500 mt-0.5">
137
- <span>#{issue.number}</span>
138
- {issue.comments > 0 && (
139
- <span className="flex items-center gap-0.5">
140
- <MessageSquare className="w-3 h-3" />
141
- {issue.comments}
142
- </span>
143
- )}
144
- </div>
145
- {issue.labels.length > 0 && (
146
- <div className="flex flex-wrap gap-1 mt-1">
147
- {issue.labels.map((l) => (
148
- <span
149
- key={l.name}
150
- className="px-1.5 py-0.5 rounded-full text-[10px] leading-none"
151
- style={{
152
- backgroundColor: `#${l.color}22`,
153
- color: `#${l.color}`,
154
- border: `1px solid #${l.color}44`,
155
- }}
156
- >
157
- {l.name}
158
- </span>
159
- ))}
160
- </div>
161
- )}
162
- </div>
163
- </div>
164
- </button>
165
- ))}
166
- </div>
167
- </div>
168
- );
169
- }
@@ -1,276 +0,0 @@
1
- import { useState, useEffect, useRef, useCallback } from "react";
2
- import { Tag, Plus, Check, X, Loader2 } from "lucide-react";
3
- import {
4
- listIssueLabelsApi,
5
- createLabelApi,
6
- getErrorMessage,
7
- } from "@/lib/api";
8
- import type { IssueLabel } from "@/lib/api";
9
- import { useToast } from "@/contexts/ToastContext";
10
-
11
- type LabelSelectorProps = {
12
- selected: string[];
13
- onChange: (names: string[]) => void;
14
- disabled?: boolean;
15
- };
16
-
17
- const PRESET_COLORS = [
18
- "e11d48", "ea580c", "ca8a04", "16a34a",
19
- "0284c7", "7c3aed", "db2777", "64748b",
20
- ];
21
-
22
- export default function LabelSelector({
23
- selected,
24
- onChange,
25
- disabled = false,
26
- }: LabelSelectorProps) {
27
- const { showToast } = useToast();
28
- const [open, setOpen] = useState(false);
29
- const [labels, setLabels] = useState<IssueLabel[]>([]);
30
- const [loadingLabels, setLoadingLabels] = useState(false);
31
- const [creatingMode, setCreatingMode] = useState(false);
32
- const [newName, setNewName] = useState("");
33
- const [newColor, setNewColor] = useState(PRESET_COLORS[0]);
34
- const [creating, setCreating] = useState(false);
35
- const containerRef = useRef<HTMLDivElement>(null);
36
-
37
- const loadLabels = useCallback(async () => {
38
- setLoadingLabels(true);
39
- try {
40
- const { labels: data } = await listIssueLabelsApi();
41
- setLabels(data);
42
- } catch (e) {
43
- showToast(`ラベルの読み込みに失敗しました: ${getErrorMessage(e)}`, "error");
44
- } finally {
45
- setLoadingLabels(false);
46
- }
47
- }, [showToast]);
48
-
49
- useEffect(() => {
50
- if (open && labels.length === 0) {
51
- loadLabels();
52
- }
53
- }, [open, labels.length, loadLabels]);
54
-
55
- useEffect(() => {
56
- function handleClickOutside(e: MouseEvent) {
57
- if (containerRef.current && !containerRef.current.contains(e.target as Node)) {
58
- setOpen(false);
59
- setCreatingMode(false);
60
- }
61
- }
62
- if (open) {
63
- document.addEventListener("mousedown", handleClickOutside);
64
- }
65
- return () => document.removeEventListener("mousedown", handleClickOutside);
66
- }, [open]);
67
-
68
- function toggleLabel(name: string) {
69
- if (selected.includes(name)) {
70
- onChange(selected.filter((n) => n !== name));
71
- } else {
72
- onChange([...selected, name]);
73
- }
74
- }
75
-
76
- async function handleCreateLabel() {
77
- if (!newName.trim()) {
78
- showToast("ラベル名を入力してください", "error");
79
- return;
80
- }
81
- setCreating(true);
82
- try {
83
- const created = await createLabelApi({ name: newName.trim(), color: newColor });
84
- setLabels((prev) => [...prev, created]);
85
- onChange([...selected, created.name]);
86
- setNewName("");
87
- setNewColor(PRESET_COLORS[0]);
88
- setCreatingMode(false);
89
- showToast(`ラベル「${created.name}」を作成しました`, "success");
90
- } catch (e) {
91
- showToast(`ラベルの作成に失敗しました: ${getErrorMessage(e)}`, "error");
92
- } finally {
93
- setCreating(false);
94
- }
95
- }
96
-
97
- return (
98
- <div ref={containerRef} className="relative">
99
- <label className="block text-xs text-gray-400 mb-1">ラベル</label>
100
-
101
- {/* Selected chips */}
102
- <div
103
- role="button"
104
- tabIndex={disabled ? -1 : 0}
105
- aria-expanded={open}
106
- aria-label="ラベルを選択"
107
- onClick={() => !disabled && setOpen((v) => !v)}
108
- onKeyDown={(e) => {
109
- if (!disabled && (e.key === "Enter" || e.key === " ")) {
110
- e.preventDefault();
111
- setOpen((v) => !v);
112
- }
113
- }}
114
- className={`min-h-[38px] w-full px-3 py-1.5 rounded bg-gray-900 border text-sm flex flex-wrap gap-1 items-center cursor-pointer transition-colors ${
115
- disabled
116
- ? "border-gray-700 cursor-not-allowed opacity-50"
117
- : open
118
- ? "border-blue-500"
119
- : "border-gray-600 hover:border-gray-400"
120
- }`}
121
- >
122
- {selected.length === 0 ? (
123
- <span className="text-gray-500 flex items-center gap-1">
124
- <Tag className="w-3 h-3" />
125
- ラベルを選択…
126
- </span>
127
- ) : (
128
- selected.map((name) => {
129
- const label = labels.find((l) => l.name === name);
130
- const color = label?.color ?? "64748b";
131
- return (
132
- <span
133
- key={name}
134
- className="flex items-center gap-1 px-2 py-0.5 rounded-full text-xs"
135
- style={{
136
- backgroundColor: `#${color}22`,
137
- color: `#${color}`,
138
- border: `1px solid #${color}44`,
139
- }}
140
- >
141
- {name}
142
- {!disabled && (
143
- <button
144
- type="button"
145
- aria-label={`${name} を外す`}
146
- onClick={(e) => {
147
- e.stopPropagation();
148
- toggleLabel(name);
149
- }}
150
- className="hover:opacity-70"
151
- >
152
- <X className="w-3 h-3" />
153
- </button>
154
- )}
155
- </span>
156
- );
157
- })
158
- )}
159
- </div>
160
-
161
- {/* Dropdown */}
162
- {open && (
163
- <div className="absolute z-50 mt-1 w-full rounded border border-gray-600 bg-gray-800 shadow-xl">
164
- {loadingLabels ? (
165
- <div className="flex items-center gap-2 px-3 py-3 text-sm text-gray-400">
166
- <Loader2 className="w-4 h-4 animate-spin" />
167
- 読み込み中…
168
- </div>
169
- ) : (
170
- <ul className="max-h-48 overflow-y-auto">
171
- {labels.length === 0 && (
172
- <li className="px-3 py-2 text-sm text-gray-500">
173
- ラベルがありません
174
- </li>
175
- )}
176
- {labels.map((label) => {
177
- const isSelected = selected.includes(label.name);
178
- return (
179
- <li key={label.name}>
180
- <button
181
- type="button"
182
- onClick={() => toggleLabel(label.name)}
183
- className="w-full flex items-center gap-2 px-3 py-2 text-sm hover:bg-gray-700 transition-colors"
184
- >
185
- <span
186
- className="w-3 h-3 rounded-full shrink-0"
187
- style={{ backgroundColor: `#${label.color}` }}
188
- />
189
- <span
190
- className="flex-1 text-left"
191
- style={{ color: `#${label.color}` }}
192
- >
193
- {label.name}
194
- </span>
195
- {isSelected && (
196
- <Check className="w-4 h-4 text-blue-400 shrink-0" />
197
- )}
198
- </button>
199
- </li>
200
- );
201
- })}
202
- </ul>
203
- )}
204
-
205
- <div className="border-t border-gray-600">
206
- {creatingMode ? (
207
- <div className="p-2 space-y-2">
208
- <input
209
- autoFocus
210
- type="text"
211
- value={newName}
212
- onChange={(e) => setNewName(e.target.value)}
213
- placeholder="ラベル名"
214
- maxLength={50}
215
- className="w-full px-2 py-1 rounded bg-gray-900 border border-gray-600 text-gray-200 placeholder-gray-500 text-xs outline-none focus:border-blue-500"
216
- onKeyDown={(e) => {
217
- if (e.key === "Enter") handleCreateLabel();
218
- if (e.key === "Escape") setCreatingMode(false);
219
- }}
220
- />
221
- <div className="flex gap-1 flex-wrap">
222
- {PRESET_COLORS.map((c) => (
223
- <button
224
- key={c}
225
- type="button"
226
- aria-label={`色 #${c}`}
227
- onClick={() => setNewColor(c)}
228
- className={`w-5 h-5 rounded-full transition-transform ${
229
- newColor === c ? "scale-125 ring-2 ring-white" : "hover:scale-110"
230
- }`}
231
- style={{ backgroundColor: `#${c}` }}
232
- />
233
- ))}
234
- </div>
235
- <div className="flex gap-1">
236
- <button
237
- type="button"
238
- onClick={handleCreateLabel}
239
- disabled={creating || !newName.trim()}
240
- className="flex-1 px-2 py-1 rounded text-xs bg-blue-600 hover:bg-blue-700 text-white disabled:opacity-50 flex items-center justify-center gap-1"
241
- >
242
- {creating ? (
243
- <Loader2 className="w-3 h-3 animate-spin" />
244
- ) : (
245
- <Plus className="w-3 h-3" />
246
- )}
247
- 作成
248
- </button>
249
- <button
250
- type="button"
251
- onClick={() => {
252
- setCreatingMode(false);
253
- setNewName("");
254
- }}
255
- className="px-2 py-1 rounded text-xs text-gray-400 hover:text-gray-200 hover:bg-gray-700"
256
- >
257
- キャンセル
258
- </button>
259
- </div>
260
- </div>
261
- ) : (
262
- <button
263
- type="button"
264
- onClick={() => setCreatingMode(true)}
265
- className="w-full flex items-center gap-2 px-3 py-2 text-sm text-gray-400 hover:text-gray-200 hover:bg-gray-700 transition-colors"
266
- >
267
- <Plus className="w-4 h-4" />
268
- 新規ラベルを作成…
269
- </button>
270
- )}
271
- </div>
272
- </div>
273
- )}
274
- </div>
275
- );
276
- }
@@ -1,29 +0,0 @@
1
- import { describe, it, expect, vi } from "vitest";
2
- import { render, screen } from "@testing-library/react";
3
- import { MemoryRouter } from "react-router-dom";
4
- import { ToastProvider } from "@/contexts/ToastContext";
5
- import LoginPage from "./LoginPage";
6
-
7
- vi.mock("@/contexts/AuthContext", () => ({
8
- useAuth: () => ({
9
- login: vi.fn(),
10
- user: null,
11
- loading: false,
12
- isAuthenticated: false,
13
- canEdit: false,
14
- logout: vi.fn(),
15
- }),
16
- }));
17
-
18
- describe("LoginPage", () => {
19
- it("renders title", () => {
20
- render(
21
- <MemoryRouter>
22
- <ToastProvider>
23
- <LoginPage />
24
- </ToastProvider>
25
- </MemoryRouter>
26
- );
27
- expect(screen.getByText("GoDD Notes")).toBeTruthy();
28
- });
29
- });
@@ -1,33 +0,0 @@
1
- name: "Django + Vue"
2
- description: "Django (Python) バックエンド + Vue.js (TypeScript) フロントエンド構成"
3
-
4
- stacks:
5
- - id: frontend
6
- label: "フロント(Vue.js + TypeScript)"
7
- name: "Vue.js + TypeScript"
8
- mindset_template: "react-vite-ts"
9
- - id: backend
10
- label: "バックエンド(Django + Postgres)"
11
- name: "Django + Postgres"
12
- mindset_template: "fastapi-postgres-ddd"
13
-
14
- frontend:
15
- name: "Vue.js + TypeScript"
16
- root_dir: "frontend"
17
- build_command: "pnpm -C frontend build"
18
- package_manager: "pnpm"
19
- mindset_template: "react-vite-ts"
20
-
21
- backend:
22
- name: "Django + Postgres"
23
- root_dir: "backend"
24
- architecture: "Django MVT + Service Layer"
25
- dependency_direction: "Models → Services → Views → URLs"
26
- package_manager: "pip"
27
- mindset_template: "fastapi-postgres-ddd"
28
-
29
- quality_gate:
30
- frontend: "docker compose --profile test run --rm frontend-test"
31
- backend: "docker compose --profile test run --rm backend-test"
32
- preflight_command: "pnpm preflight"
33
- summary: "Docker 完全環境: lint/typecheck/django check/pytest/build (all in containers)"
@@ -1,160 +0,0 @@
1
- name: "FastAPI + React"
2
- description: "FastAPI (Python/DDD) バックエンド + React (Vite/TypeScript) フロントエンド構成"
3
-
4
- stacks:
5
- - id: frontend
6
- label: "フロント(React + TypeScript)"
7
- name: "React + Vite + TypeScript"
8
- mindset_template: "react-vite-ts"
9
- - id: backend
10
- label: "バックエンド(FastAPI + Postgres + DDD)"
11
- name: "FastAPI + Postgres + DDD"
12
- mindset_template: "fastapi-postgres-ddd"
13
-
14
- frontend:
15
- name: "React + Vite + TypeScript"
16
- root_dir: "frontend"
17
- build_command: "pnpm -C frontend build"
18
- package_manager: "pnpm"
19
- mindset_template: "react-vite-ts"
20
-
21
- backend:
22
- name: "FastAPI + Postgres + DDD"
23
- root_dir: "backend"
24
- architecture: "DDD / Clean Architecture"
25
- dependency_direction: "Domain → Usecase → Infrastructure → Presentation"
26
- package_manager: "uv"
27
- mindset_template: "fastapi-postgres-ddd"
28
-
29
- quality_gate:
30
- frontend: "docker compose --profile test run --rm frontend-test"
31
- backend: "docker compose --profile test run --rm backend-test"
32
- preflight_command: "pnpm preflight"
33
- summary: "Docker 完全環境: lint/typecheck/build/ruff/pytest (all in containers)"
34
-
35
- tools:
36
- # --- Frontend ---
37
- - id: "orval"
38
- label: "Orval"
39
- category: "frontend"
40
- description: "OpenAPI クライアントコード自動生成"
41
- url: "https://github.com/orval-labs/orval"
42
- guidance: "バックエンド API スキーマ変更時は `pnpm orval` で型安全なクライアントを再生成する"
43
- - id: "tanstack-query"
44
- label: "TanStack Query"
45
- category: "frontend"
46
- description: "非同期データフェッチング/キャッシュ管理"
47
- url: "https://github.com/TanStack/query"
48
- guidance: "サーバー状態は useState ではなく useQuery/useMutation で管理する。staleTime/gcTime を適切に設定する"
49
- - id: "vite"
50
- label: "Vite"
51
- category: "frontend"
52
- description: "高速フロントエンドビルドツール"
53
- url: "https://vitejs.dev/"
54
- guidance: "HMR を活かすためバレルエクスポートを避ける。環境変数は VITE_ プレフィクス必須"
55
- - id: "storybook"
56
- label: "Storybook"
57
- category: "frontend"
58
- description: "UIコンポーネント開発/カタログツール"
59
- url: "https://storybook.js.org/"
60
- guidance: "新規UIコンポーネント作成時は Story を同時に追加する"
61
- # --- Backend ---
62
- - id: "sqlmodel"
63
- label: "SQLModel"
64
- category: "backend"
65
- description: "SQLAlchemy + Pydantic ベースの Python ORM"
66
- url: "https://sqlmodel.tiangolo.com/"
67
- guidance: "テーブルモデルは table=True、API スキーマは table=False で分離する"
68
- - id: "alembic"
69
- label: "Alembic"
70
- category: "backend"
71
- description: "SQLAlchemy ベースの DB マイグレーションツール"
72
- url: "https://alembic.sqlalchemy.org/"
73
- guidance: "モデル変更後は `alembic revision --autogenerate` → レビュー → `alembic upgrade head`"
74
- - id: "fastapi-users"
75
- label: "FastAPI Users"
76
- category: "backend"
77
- description: "FastAPI 向け認証/ユーザー管理ライブラリ"
78
- url: "https://fastapi-users.github.io/fastapi-users/"
79
- guidance: "認証ロジックはカスタム実装せず fastapi-users の Strategy/Transport を利用する"
80
- # --- DevTools ---
81
- - id: "ruff"
82
- label: "Ruff"
83
- category: "devtool"
84
- description: "超高速 Python Linter / Formatter(Rust製)"
85
- url: "https://docs.astral.sh/ruff/"
86
- guidance: "保存時に `ruff check --fix` と `ruff format` を自動実行する"
87
- - id: "uv"
88
- label: "uv"
89
- category: "devtool"
90
- description: "高速 Python パッケージマネージャ(Rust製)"
91
- url: "https://docs.astral.sh/uv/"
92
- guidance: "依存追加は `uv add`、ロック更新は `uv lock`、実行は `uv run`"
93
- - id: "biome"
94
- label: "Biome"
95
- category: "devtool"
96
- description: "高速 Linter / Formatter(Rust製)"
97
- url: "https://biomejs.dev/"
98
- guidance: "ESLint/Prettier の代替。biome.json で一括設定する"
99
- # --- Testing ---
100
- - id: "pytest"
101
- label: "Pytest"
102
- category: "testing"
103
- description: "Python テストフレームワーク"
104
- url: "https://docs.pytest.org/"
105
- guidance: "conftest.py で fixture を共有。マーカーで slow/integration を分離する"
106
- - id: "httpx"
107
- label: "HTTPX"
108
- category: "testing"
109
- description: "Python 非同期 HTTP クライアント(テスト用)"
110
- url: "https://www.python-httpx.org/"
111
- guidance: "FastAPI テストでは httpx.AsyncClient + app をマウントして使う"
112
- - id: "playwright"
113
- label: "Playwright"
114
- category: "testing"
115
- description: "クロスブラウザ E2E テストフレームワーク"
116
- url: "https://playwright.dev/"
117
- guidance: "Page Object Model パターンで E2E テストを構造化する"
118
- # --- Infrastructure ---
119
- - id: "docker-compose"
120
- label: "Docker Compose"
121
- category: "infra"
122
- description: "マルチコンテナオーケストレーション"
123
- url: "https://docs.docker.com/compose/"
124
- guidance: "開発環境は `docker compose up -d`。サービス間依存は depends_on + healthcheck で制御する"
125
- - id: "caddy"
126
- label: "Caddy"
127
- category: "infra"
128
- description: "自動 HTTPS 対応リバースプロキシ"
129
- url: "https://caddyserver.com/"
130
- guidance: "Caddyfile で reverse_proxy を設定。自動 HTTPS が不要なローカルでは http:// を明示する"
131
- - id: "traefik"
132
- label: "Traefik"
133
- category: "infra"
134
- description: "クラウドネイティブ リバースプロキシ / ロードバランサ"
135
- url: "https://traefik.io/"
136
- guidance: "Docker labels でルーティング設定。entryPoints/routers/services の3層構造を理解する"
137
- # --- Monitoring ---
138
- - id: "sentry"
139
- label: "Sentry"
140
- category: "monitoring"
141
- description: "エラー追跡 / パフォーマンス監視"
142
- url: "https://sentry.io/"
143
- guidance: "フロント/バックエンド両方で init する。環境別DSNを .env で管理し、PII はフィルタリングする"
144
-
145
- vendor:
146
- - name: "browser-use"
147
- description: "Python AI ブラウザエージェント — Webブラウザを自動操作"
148
- runtime: "python"
149
- setup_hint: "uv sync && uv run browser-use install"
150
- enabled: true
151
- - name: "android-use"
152
- description: "Python Android AI エージェント — Android端末をADBで自動操作"
153
- runtime: "python"
154
- setup_hint: "python -m venv .venv && pip install -r requirements.txt"
155
- enabled: true
156
- - name: "react-grab"
157
- description: "Node.js React コンテキストコピーツール — Reactコンポーネントツリーを抽出"
158
- runtime: "node"
159
- setup_hint: "pnpm install && pnpm build"
160
- enabled: true