@etus/bhono-app 0.1.5 → 0.1.7

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 (300) hide show
  1. package/dist/index.js +0 -0
  2. package/package.json +7 -2
  3. package/templates/base/.claude/commands/check-skill-rules.md +112 -29
  4. package/templates/base/.claude/commands/linear/implement-issue.md +383 -55
  5. package/templates/base/.claude/commands/ship.md +77 -13
  6. package/templates/base/.claude/hooks/package-lock.json +0 -419
  7. package/templates/base/.claude/hooks/skill-activation-prompt.ts +185 -113
  8. package/templates/base/.claude/hooks/skill-tool-guard.sh +6 -0
  9. package/templates/base/.claude/hooks/skill-tool-guard.ts +198 -0
  10. package/templates/base/.claude/scripts/validate-skill-rules.sh +55 -32
  11. package/templates/base/.claude/settings.json +18 -11
  12. package/templates/base/.claude/skills/skill-rules.json +326 -173
  13. package/templates/base/.env.example +3 -0
  14. package/templates/base/CLAUDE.md +5 -5
  15. package/templates/base/README.md +40 -27
  16. package/templates/base/config/eslint.config.js +1 -0
  17. package/templates/base/config/wrangler.json +16 -17
  18. package/templates/base/docs/SETUP-GUIDE.md +566 -0
  19. package/templates/base/docs/app_spec.txt +13 -10
  20. package/templates/base/docs/architecture/README.md +162 -5
  21. package/templates/base/docs/architecture/api-catalog.md +575 -0
  22. package/templates/base/docs/architecture/c4-component.md +309 -0
  23. package/templates/base/docs/architecture/c4-container.md +183 -0
  24. package/templates/base/docs/architecture/c4-context.md +106 -0
  25. package/templates/base/docs/architecture/data-requirements.md +4 -3
  26. package/templates/base/docs/architecture/db-bootstrap.md +39 -0
  27. package/templates/base/docs/architecture/dependencies.md +327 -0
  28. package/templates/base/docs/architecture/drizzle-migration-plan.md +125 -0
  29. package/templates/base/docs/architecture/erd.md +1 -1
  30. package/templates/base/docs/architecture/sql-standards.md +100 -0
  31. package/templates/base/docs/architecture/tech-debt.md +184 -0
  32. package/templates/base/docs/testing.md +36 -29
  33. package/templates/base/package.json +26 -20
  34. package/templates/base/schema.sql +84 -0
  35. package/templates/base/scripts/capture-prod-session.ts +2 -2
  36. package/templates/base/scripts/init.sh +244 -59
  37. package/templates/base/scripts/sync-template.sh +104 -0
  38. package/templates/base/src/client/hooks/use-auth.ts +5 -0
  39. package/templates/base/src/client/routes/_authenticated/dashboard.tsx +1 -1
  40. package/templates/base/src/client/routes/index.tsx +1 -1
  41. package/templates/base/src/server/db/client.ts +3 -5
  42. package/templates/base/src/server/db/records.ts +81 -0
  43. package/templates/base/src/server/db/seed.ts +3 -2
  44. package/templates/base/src/server/db/sql.ts +116 -0
  45. package/templates/base/src/server/index.ts +17 -2
  46. package/templates/base/src/server/lib/audit.ts +74 -26
  47. package/templates/base/src/server/lib/audited-db.ts +219 -109
  48. package/templates/base/src/server/lib/transaction.ts +10 -16
  49. package/templates/base/src/server/middleware/account.ts +9 -16
  50. package/templates/base/src/server/middleware/auth.ts +102 -38
  51. package/templates/base/src/server/middleware/rate-limit.ts +8 -6
  52. package/templates/base/src/server/routes/accounts/handlers.ts +18 -6
  53. package/templates/base/src/server/routes/audits/handlers.ts +3 -1
  54. package/templates/base/src/server/routes/auth/handlers.ts +15 -10
  55. package/templates/base/src/server/routes/auth/test-login.ts +99 -45
  56. package/templates/base/src/server/routes/health/handlers.ts +4 -4
  57. package/templates/base/src/server/routes/index.ts +9 -0
  58. package/templates/base/src/server/routes/invitations/handlers.ts +9 -6
  59. package/templates/base/src/server/routes/openapi.ts +1 -1
  60. package/templates/base/src/server/routes/users/handlers.ts +21 -14
  61. package/templates/base/src/server/services/accounts.ts +242 -217
  62. package/templates/base/src/server/services/audits.ts +114 -61
  63. package/templates/base/src/server/services/auth.ts +310 -180
  64. package/templates/base/src/server/services/invitations.ts +282 -222
  65. package/templates/base/src/server/services/users.ts +383 -293
  66. package/templates/base/src/server/types/index.ts +1 -2
  67. package/templates/base/src/shared/types/api.ts +66 -198
  68. package/templates/base/tests/e2e/auth.setup.ts +1 -1
  69. package/templates/base/{src/server/__tests__/fixtures.ts → tests/fixtures/server.ts} +3 -3
  70. package/templates/base/{src/client/__tests__/setup-browser.ts → tests/helpers/client-setup-browser.ts} +2 -2
  71. package/templates/base/{src/client/__tests__/setup.ts → tests/helpers/client-setup.ts} +1 -1
  72. package/templates/base/{src/client/__tests__/test-utils.tsx → tests/helpers/client-test-utils.tsx} +2 -2
  73. package/templates/base/{src/server/__tests__/setup.ts → tests/helpers/server.ts} +9 -9
  74. package/templates/base/tests/integration/accounts/crud.test.ts +2 -11
  75. package/templates/base/tests/integration/audits/list.test.ts +2 -11
  76. package/templates/base/tests/integration/auth/auth-service.test.ts +1 -10
  77. package/templates/base/tests/integration/auth/invitation-token.test.ts +2 -11
  78. package/templates/base/tests/integration/auth/logout.test.ts +2 -11
  79. package/templates/base/tests/integration/auth/oauth.test.ts +23 -42
  80. package/templates/base/tests/integration/auth/refresh-token.test.ts +1 -9
  81. package/templates/base/tests/integration/auth/session-expiry.test.ts +1 -9
  82. package/templates/base/tests/integration/auth/session.test.ts +2 -11
  83. package/templates/base/tests/integration/auth/super-admin.test.ts +1 -9
  84. package/templates/base/tests/integration/authorization/analytics-role.test.ts +2 -11
  85. package/templates/base/tests/integration/authorization/billing-role.test.ts +2 -11
  86. package/templates/base/tests/integration/authorization/guards-roles.test.ts +1 -9
  87. package/templates/base/tests/integration/authorization/multi-tenancy.test.ts +2 -11
  88. package/templates/base/tests/integration/authorization/roles.test.ts +2 -11
  89. package/templates/base/tests/integration/config/production-behavior.test.ts +2 -11
  90. package/templates/base/tests/integration/health/health.test.ts +25 -44
  91. package/templates/base/tests/integration/invitations/crud.test.ts +2 -11
  92. package/templates/base/tests/integration/invitations/email.test.ts +1 -9
  93. package/templates/base/tests/integration/middleware/auth.test.ts +3 -12
  94. package/templates/base/tests/integration/middleware/request-logger.test.ts +1 -9
  95. package/templates/base/tests/integration/performance/response-times.test.ts +1 -9
  96. package/templates/base/tests/integration/security/cookie-security.test.ts +2 -11
  97. package/templates/base/tests/integration/security/csrf-protection.test.ts +2 -11
  98. package/templates/base/tests/integration/security/log-sanitization.test.ts +1 -9
  99. package/templates/base/tests/integration/security/rate-limiting.test.ts +1 -9
  100. package/templates/base/tests/integration/security/sql-injection.test.ts +7 -18
  101. package/templates/base/tests/integration/security/xss-prevention.test.ts +2 -11
  102. package/templates/base/tests/integration/setup.ts +13 -90
  103. package/templates/base/tests/integration/smoke.test.ts +3 -2
  104. package/templates/base/tests/integration/storage/upload.test.ts +2 -11
  105. package/templates/base/tests/integration/storage/validation.test.ts +2 -11
  106. package/templates/base/tests/integration/users/crud.test.ts +2 -11
  107. package/templates/base/tests/integration/users/list.test.ts +2 -11
  108. package/templates/base/tests/integration/vitest.config.ts +2 -9
  109. package/templates/base/{src/server/__tests__ → tests}/mocks/db.ts +1 -1
  110. package/templates/base/{src/server/__tests__ → tests}/mocks/index.ts +1 -1
  111. package/templates/base/{src/server/__tests__ → tests}/mocks/kv.ts +1 -1
  112. package/templates/base/{src/server/__tests__ → tests}/mocks/r2.ts +1 -1
  113. package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/sidebar.test.tsx +1 -1
  114. package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/avatar.test.tsx +1 -1
  115. package/templates/base/{src/client/__tests__ → tests/unit/client/components/ui}/button.test.tsx +1 -1
  116. package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/card.test.tsx +1 -1
  117. package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/dialog.test.tsx +1 -1
  118. package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/input.test.tsx +1 -1
  119. package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/loading-skeleton.test.tsx +1 -1
  120. package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/skeleton.test.tsx +1 -1
  121. package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/sonner.test.tsx +1 -1
  122. package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/tabs.test.tsx +1 -1
  123. package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/account.test.tsx +1 -1
  124. package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/integrations.test.tsx +1 -1
  125. package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/settings.test.tsx +1 -1
  126. package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/team.test.tsx +1 -1
  127. package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/authenticated-layout.test.tsx +1 -1
  128. package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/dashboard.test.tsx +1 -1
  129. package/templates/base/{src/client/routes/__tests__ → tests/unit/client/routes}/invite.test.tsx +1 -1
  130. package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/login.test.tsx +1 -1
  131. package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/navigation.test.tsx +1 -1
  132. package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/root-layout.test.tsx +1 -1
  133. package/templates/base/{src/server/auth/__tests__ → tests/unit/server/auth}/guards.test.ts +2 -2
  134. package/templates/base/{src → tests/unit}/server/auth/permissions.test.ts +1 -1
  135. package/templates/base/{src → tests/unit}/server/auth/roles.test.ts +1 -1
  136. package/templates/base/tests/unit/server/db/sql.test.ts +68 -0
  137. package/templates/base/{src → tests/unit}/server/env.test.ts +1 -1
  138. package/templates/base/tests/unit/server/lib/audited-db.test.ts +78 -0
  139. package/templates/base/{src → tests/unit}/server/lib/email.test.ts +1 -1
  140. package/templates/base/{src → tests/unit}/server/lib/errors.test.ts +1 -1
  141. package/templates/base/{src → tests/unit}/server/lib/oauth.test.ts +1 -1
  142. package/templates/base/{src → tests/unit}/server/lib/pagination.test.ts +1 -1
  143. package/templates/base/{src → tests/unit}/server/lib/password.test.ts +1 -1
  144. package/templates/base/{src → tests/unit}/server/lib/providers.test.ts +1 -1
  145. package/templates/base/{src → tests/unit}/server/lib/r2-storage.test.ts +2 -2
  146. package/templates/base/{src → tests/unit}/server/lib/session.test.ts +2 -2
  147. package/templates/base/{src → tests/unit}/server/lib/tokens.test.ts +1 -1
  148. package/templates/base/{src → tests/unit}/server/lib/transaction.test.ts +5 -14
  149. package/templates/base/{src → tests/unit}/server/middleware/account.test.ts +16 -24
  150. package/templates/base/tests/unit/server/middleware/auth.test.ts +647 -0
  151. package/templates/base/{src → tests/unit}/server/middleware/cors.test.ts +1 -1
  152. package/templates/base/{src → tests/unit}/server/middleware/error-handler.test.ts +2 -2
  153. package/templates/base/{src → tests/unit}/server/middleware/rate-limit.test.ts +3 -2
  154. package/templates/base/{src → tests/unit}/server/middleware/request-context.test.ts +1 -1
  155. package/templates/base/{src → tests/unit}/server/middleware/request-logger.test.ts +1 -1
  156. package/templates/base/{src/server/__tests__/mocks/__tests__ → tests/unit/server/mocks}/db.test.ts +1 -1
  157. package/templates/base/{src/server/__tests__/mocks/__tests__ → tests/unit/server/mocks}/kv.test.ts +1 -1
  158. package/templates/base/{src/server/__tests__/mocks/__tests__ → tests/unit/server/mocks}/r2.test.ts +1 -1
  159. package/templates/base/{src/server/routes/accounts/__tests__ → tests/unit/server/routes/accounts}/handlers.test.ts +12 -12
  160. package/templates/base/{src/server/routes/audits/__tests__ → tests/unit/server/routes/audits}/handlers.test.ts +11 -11
  161. package/templates/base/{src/server/routes/auth/__tests__ → tests/unit/server/routes/auth}/handlers.test.ts +124 -13
  162. package/templates/base/{src/server/routes/health/__tests__ → tests/unit/server/routes/health}/handlers.test.ts +27 -23
  163. package/templates/base/{src/server/routes/invitations/__tests__ → tests/unit/server/routes/invitations}/handlers.test.ts +14 -17
  164. package/templates/base/{src/server/routes/storage/__tests__ → tests/unit/server/routes/storage}/handlers.test.ts +6 -6
  165. package/templates/base/{src/server/routes/users/__tests__ → tests/unit/server/routes/users}/handlers.test.ts +81 -17
  166. package/templates/base/tests/unit/server/services/accounts.test.ts +406 -0
  167. package/templates/base/tests/unit/server/services/audits.test.ts +360 -0
  168. package/templates/base/tests/unit/server/services/auth.test.ts +656 -0
  169. package/templates/base/tests/unit/server/services/invitations.test.ts +343 -0
  170. package/templates/base/tests/unit/server/services/users.test.ts +706 -0
  171. package/templates/base/{src/shared/schemas/__tests__ → tests/unit/shared}/schemas.test.ts +1 -1
  172. package/templates/base/tsconfig.json +2 -1
  173. package/templates/base/vite.config.ts +3 -1
  174. package/templates/base/vitest.config.browser.ts +3 -2
  175. package/templates/base/vitest.config.frontend.ts +3 -2
  176. package/templates/base/vitest.config.ts +7 -14
  177. package/templates/base/.claude/settings.local.json +0 -11
  178. package/templates/base/.github/workflows/test.yml +0 -127
  179. package/templates/base/auth-setup-error.png +0 -0
  180. package/templates/base/config/drizzle.config.ts +0 -10
  181. package/templates/base/pnpm-lock.yaml +0 -8175
  182. package/templates/base/src/server/db/schema/accounts.ts +0 -20
  183. package/templates/base/src/server/db/schema/audit-logs.ts +0 -26
  184. package/templates/base/src/server/db/schema/index.ts +0 -7
  185. package/templates/base/src/server/db/schema/invitations.ts +0 -30
  186. package/templates/base/src/server/db/schema/refresh-tokens.ts +0 -22
  187. package/templates/base/src/server/db/schema/user-accounts.ts +0 -25
  188. package/templates/base/src/server/db/schema/users.ts +0 -33
  189. package/templates/base/src/server/lib/audited-db.test.ts +0 -107
  190. package/templates/base/src/server/lib/schema-helpers.ts +0 -16
  191. package/templates/base/src/server/middleware/auth.test.ts +0 -345
  192. package/templates/base/src/server/services/__tests__/accounts.test.ts +0 -764
  193. package/templates/base/src/server/services/__tests__/audits.test.ts +0 -235
  194. package/templates/base/src/server/services/__tests__/auth.test.ts +0 -765
  195. package/templates/base/src/server/services/__tests__/invitations.test.ts +0 -704
  196. package/templates/base/src/server/services/__tests__/users.test.ts +0 -755
  197. package/templates/base/tests/e2e/_auth/.gitkeep +0 -0
  198. package/templates/base/tests/integration/lib/schema-helpers.test.ts +0 -129
  199. package/templates/base/tsconfig.tsbuildinfo +0 -1
  200. /package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/__screenshots__/sidebar.test.tsx/Sidebar-can-be-collapsed-by-default-1.png +0 -0
  201. /package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/__screenshots__/sidebar.test.tsx/Sidebar-expands-when-collapsed-and-expand-button-is-clicked-1.png +0 -0
  202. /package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/__screenshots__/sidebar.test.tsx/Sidebar-handles-logout-button-click-1.png +0 -0
  203. /package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/__screenshots__/sidebar.test.tsx/Sidebar-handles-navigation-clicks-1.png +0 -0
  204. /package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/__screenshots__/sidebar.test.tsx/Sidebar-hides-navigation-labels-when-collapsed-1.png +0 -0
  205. /package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/__screenshots__/sidebar.test.tsx/Sidebar-highlights-active-route-1.png +0 -0
  206. /package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/__screenshots__/sidebar.test.tsx/Sidebar-renders-sidebar-navigation-items-1.png +0 -0
  207. /package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/__screenshots__/sidebar.test.tsx/Sidebar-shows-keyboard-shortcut-hint-when-expanded-1.png +0 -0
  208. /package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/__screenshots__/sidebar.test.tsx/Sidebar-shows-user-info-when-authenticated-1.png +0 -0
  209. /package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/__screenshots__/sidebar.test.tsx/Sidebar-shows-user-initials-in-avatar-fallback-1.png +0 -0
  210. /package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/error-boundary.test.tsx +0 -0
  211. /package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/error-fallback.test.tsx +0 -0
  212. /package/templates/base/{src/client/hooks/__tests__ → tests/unit/client/hooks}/use-auth.test.tsx +0 -0
  213. /package/templates/base/{src/client/hooks/__tests__ → tests/unit/client/hooks}/use-theme.test.tsx +0 -0
  214. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/dashboard.test.tsx/Dashboard-Page-when-authenticated-should-display-dashboard-stats-cards-1.png +0 -0
  215. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/dashboard.test.tsx/Dashboard-Page-when-authenticated-should-display-quick-action-cards-1.png +0 -0
  216. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/dashboard.test.tsx/Dashboard-Page-when-authenticated-should-display-recent-activity-section-1.png +0 -0
  217. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/dashboard.test.tsx/Dashboard-Page-when-authenticated-should-display-user-first-name-in-welcome-message-1.png +0 -0
  218. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/dashboard.test.tsx/Dashboard-Page-when-authenticated-should-display-user-information-in-sidebar-1.png +0 -0
  219. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/dashboard.test.tsx/Dashboard-Page-when-authenticated-should-render-dashboard-when-authenticated-1.png +0 -0
  220. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/dashboard.test.tsx/Dashboard-Page-when-authenticated-should-show-navigation-sidebar-1.png +0 -0
  221. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/dashboard.test.tsx/Dashboard-Page-when-unauthenticated-should-redirect-to-login-when-not-authenticated-1.png +0 -0
  222. /package/templates/base/{src/client/routes/__tests__ → tests/unit/client/routes}/__screenshots__/invite.test.tsx/Invite-Token-Page-pending-invitation-state-should-display-accept-invitation-button-1.png +0 -0
  223. /package/templates/base/{src/client/routes/__tests__ → tests/unit/client/routes}/__screenshots__/invite.test.tsx/Invite-Token-Page-pending-invitation-state-should-display-decline-button-linking-to-homepage-1.png +0 -0
  224. /package/templates/base/{src/client/routes/__tests__ → tests/unit/client/routes}/__screenshots__/invite.test.tsx/Invite-Token-Page-pending-invitation-state-should-display-invitation-details--email--workspace--role--1.png +0 -0
  225. /package/templates/base/{src/client/routes/__tests__ → tests/unit/client/routes}/__screenshots__/invite.test.tsx/Invite-Token-Page-pending-invitation-state-should-have-a-logo-link-to-homepage-1.png +0 -0
  226. /package/templates/base/{src/client/routes/__tests__ → tests/unit/client/routes}/__screenshots__/invite.test.tsx/Invite-Token-Page-pending-invitation-state-should-render-invitation-page-with-inviter-name-and-workspace-1.png +0 -0
  227. /package/templates/base/{src/client/routes/__tests__ → tests/unit/client/routes}/__screenshots__/invite.test.tsx/Invite-Token-Page-pending-invitation-state-should-show-terms-of-service-and-privacy-policy-links-1.png +0 -0
  228. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/login.test.tsx/Login-Page-should-display-Google-OAuth-login-button-1.png +0 -0
  229. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/login.test.tsx/Login-Page-should-have-a-link-back-to-home-page-1.png +0 -0
  230. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/login.test.tsx/Login-Page-should-render-login-content-without-waiting-for-authentication-1.png +0 -0
  231. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/login.test.tsx/Login-Page-should-render-login-page-at--login-route-1.png +0 -0
  232. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/login.test.tsx/Login-Page-should-show-Terms-of-Service-and-Privacy-Policy-links-1.png +0 -0
  233. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/login.test.tsx/Login-Page-should-trigger-OAuth-flow-when-clicking-login-button-1.png +0 -0
  234. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/navigation.test.tsx/Navigation-404-handling-should-display-404-text-on-not-found-page-1.png +0 -0
  235. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/navigation.test.tsx/Navigation-404-handling-should-have-navigation-options-on-404-page-1.png +0 -0
  236. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/navigation.test.tsx/Navigation-404-handling-should-render-404-page-for-unknown-routes-1.png +0 -0
  237. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/navigation.test.tsx/Navigation-authenticated-navigation-should-navigate-from-dashboard-to-account-page-1.png +0 -0
  238. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/navigation.test.tsx/Navigation-authenticated-navigation-should-navigate-from-dashboard-to-integrations-page-1.png +0 -0
  239. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/navigation.test.tsx/Navigation-authenticated-navigation-should-navigate-from-dashboard-to-settings-page-1.png +0 -0
  240. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/navigation.test.tsx/Navigation-authenticated-navigation-should-navigate-from-dashboard-to-team-page-1.png +0 -0
  241. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/navigation.test.tsx/Navigation-home-page-navigation-should-display-navigation-links-on-home-page-1.png +0 -0
  242. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/navigation.test.tsx/Navigation-home-page-navigation-should-have-correct-link-destinations-on-home-page-1.png +0 -0
  243. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/navigation.test.tsx/Navigation-unauthenticated-navigation-should-allow-access-to-home-page-without-authentication-1.png +0 -0
  244. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/navigation.test.tsx/Navigation-unauthenticated-navigation-should-allow-access-to-login-page-without-authentication-1.png +0 -0
  245. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/navigation.test.tsx/Navigation-unauthenticated-navigation-should-redirect-unauthenticated-users-from-dashboard-to-login-1.png +0 -0
  246. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/navigation.test.tsx/Navigation-unauthenticated-navigation-should-redirect-unauthenticated-users-from-settings-to-login-1.png +0 -0
  247. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/__screenshots__/navigation.test.tsx/Navigation-unauthenticated-navigation-should-redirect-unauthenticated-users-from-team-to-login-1.png +0 -0
  248. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/account.test.tsx/Account-Page-should-render-Active-Sessions-section-with-session-cards-1.png +0 -0
  249. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/account.test.tsx/Account-Page-should-render-page-with-correct-title--Account--1.png +0 -0
  250. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/account.test.tsx/Account-Page-should-show-API-Access-section-1.png +0 -0
  251. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/account.test.tsx/Account-Page-should-show-Connected-Accounts-section-with-Google-connected-1.png +0 -0
  252. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/account.test.tsx/Account-Page-should-show-Danger-Zone-section-with-delete-button-1.png +0 -0
  253. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/account.test.tsx/Account-Page-should-show-Security-section-with-Two-Factor-Authentication-1.png +0 -0
  254. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-API-documentation-section-should-display-API-documentation-link-section-1.png +0 -0
  255. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-Create-Webhook-Dialog-should-have-Add-Webhook-trigger-button-1.png +0 -0
  256. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-category-filters-should-display-all-category-buttons-1.png +0 -0
  257. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-integration-cards-should-display-all-integration-cards-with-names-1.png +0 -0
  258. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-integration-cards-should-display-category-badges-on-cards-1.png +0 -0
  259. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-integration-cards-should-show-Configure-button-for-connected-integrations-1.png +0 -0
  260. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-integration-cards-should-show-Connect-button-for-not-connected-integrations-1.png +0 -0
  261. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-integration-cards-should-show-Connected-badge-for-connected-integrations-1.png +0 -0
  262. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-page-rendering-should-display-Available-Integrations-section-1.png +0 -0
  263. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-page-rendering-should-display-Webhooks-section-1.png +0 -0
  264. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-page-rendering-should-display-connected-count-1.png +0 -0
  265. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-page-rendering-should-display-page-description-1.png +0 -0
  266. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-page-rendering-should-display-search-input-1.png +0 -0
  267. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-page-rendering-should-render-with-correct-title--Integrations--1.png +0 -0
  268. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-search-functionality-should-filter-integrations-based-on-search-query-1.png +0 -0
  269. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-search-functionality-should-search-by-description-1.png +0 -0
  270. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-search-functionality-should-show-no-results-message-when-search-has-no-matches-1.png +0 -0
  271. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-webhooks-section-should-display-existing-webhook-1.png +0 -0
  272. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-webhooks-section-should-display-webhook-events-1.png +0 -0
  273. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-webhooks-section-should-display-webhook-last-delivery-info-1.png +0 -0
  274. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-webhooks-section-should-display-webhook-success-status-1.png +0 -0
  275. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/integrations.test.tsx/Integrations-Page-webhooks-section-should-have-Add-Webhook-button-1.png +0 -0
  276. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-Account-tab-should-display-connected-accounts-section-with-Google-provider-1.png +0 -0
  277. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-Account-tab-should-display-sessions-and-danger-zone-sections-1.png +0 -0
  278. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-Notifications-tab-should-display-all-notification-toggle-options-1.png +0 -0
  279. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-Notifications-tab-should-display-email-notifications-section-1.png +0 -0
  280. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-Notifications-tab-should-display-toggle-switches-for-notification-options-1.png +0 -0
  281. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-Notifications-tab-should-have-toggles-checked-by-default-1.png +0 -0
  282. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-Profile-tab-should-display--Save-Changes--button-1.png +0 -0
  283. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-Profile-tab-should-display-personal-information-form-1.png +0 -0
  284. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-Profile-tab-should-display-profile-picture-section-1.png +0 -0
  285. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-Profile-tab-should-display-user-email-in-disabled-email-input-1.png +0 -0
  286. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-Profile-tab-should-display-user-initials-in-avatar-1.png +0 -0
  287. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-Profile-tab-should-display-user-name-in-the-name-input-1.png +0 -0
  288. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-page-rendering-should-display-all-three-tabs-1.png +0 -0
  289. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-page-rendering-should-display-page-description-1.png +0 -0
  290. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-page-rendering-should-render-with-correct-title--Settings--1.png +0 -0
  291. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-tab-navigation-should-show-Profile-tab-as-default-active-tab-1.png +0 -0
  292. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-tab-navigation-should-switch-to-Account-tab-when-clicked-1.png +0 -0
  293. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/settings.test.tsx/Settings-Page-tab-navigation-should-switch-to-Notifications-tab-when-clicked-1.png +0 -0
  294. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/team.test.tsx/Team-Page-should-display-Active-Members-section-with-member-count-1.png +0 -0
  295. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/team.test.tsx/Team-Page-should-display-Pending-Invitations-section-with-invitation-details-1.png +0 -0
  296. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/team.test.tsx/Team-Page-should-have-invite-member-button-that-can-be-clicked-1.png +0 -0
  297. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/team.test.tsx/Team-Page-should-render-page-with-correct-title-and-description-1.png +0 -0
  298. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/team.test.tsx/Team-Page-should-render-search-input-that-filters-team-members-1.png +0 -0
  299. /package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/__screenshots__/team.test.tsx/Team-Page-should-show-current-user-with---you---indicator-and-role-badge-1.png +0 -0
  300. /package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/error-components.test.tsx +0 -0
@@ -1,6 +1,6 @@
1
1
  # Implement Linear Issue
2
2
 
3
- Implement a Linear issue following the complete workflow from the linear skill.
3
+ Implement a Linear issue with full git workflow: branch creation, commits, changesets (when needed), and PR creation.
4
4
 
5
5
  **Usage:** `/linear:implement-issue <issue-identifier>`
6
6
  **Example:** `/linear:implement-issue AA-1395`
@@ -23,12 +23,56 @@ Parse and understand:
23
23
  - **Priority**: How urgent is this?
24
24
  - **Parent**: Is this a subtask of a larger issue?
25
25
  - **Children**: Does this have subtasks?
26
+ - **Labels**: Type of work (feature, bug, chore, etc.)
26
27
 
27
28
  **STOP and analyze the issue before proceeding.**
28
29
 
29
30
  ---
30
31
 
31
- ## Phase 2: Start Work
32
+ ## Phase 2: Branch Creation
33
+
34
+ Create a feature branch linked to the issue:
35
+
36
+ ### 2.1 Branch Naming Convention
37
+
38
+ Format: `<type>/<issue-id>-<short-description>`
39
+
40
+ | Issue Type | Branch Prefix |
41
+ |------------|---------------|
42
+ | Feature/Enhancement | `feat/` |
43
+ | Bug fix | `fix/` |
44
+ | Refactoring | `refactor/` |
45
+ | Documentation | `docs/` |
46
+ | Tests | `test/` |
47
+ | Chore/Maintenance | `chore/` |
48
+
49
+ **Examples:**
50
+ - `feat/AA-123-add-user-auth`
51
+ - `fix/AA-456-login-redirect`
52
+ - `chore/AA-789-update-deps`
53
+
54
+ ### 2.2 Create Branch
55
+
56
+ ```bash
57
+ # Ensure we're on develop (or master for hotfixes)
58
+ git checkout develop
59
+ git pull origin develop
60
+
61
+ # Create feature branch
62
+ BRANCH_NAME="feat/$ARGUMENTS-short-description" # Adjust type and description
63
+ git checkout -b "$BRANCH_NAME"
64
+
65
+ # Verify you're NOT on master/develop
66
+ git branch --show-current # Should show your feature branch
67
+ ```
68
+
69
+ **IMPORTANT**:
70
+ - Replace `short-description` with 2-4 words describing the work (lowercase, hyphenated)
71
+ - **NEVER work directly on `master` or `develop`** - always create a feature branch
72
+
73
+ ---
74
+
75
+ ## Phase 3: Start Work in Linear
32
76
 
33
77
  Update the issue status and assign yourself:
34
78
 
@@ -55,7 +99,7 @@ npx tsx scripts/status/update.ts $ARGUMENTS $IN_PROGRESS --json
55
99
 
56
100
  ---
57
101
 
58
- ## Phase 3: Analysis & Planning
102
+ ## Phase 4: Analysis & Planning
59
103
 
60
104
  Before writing any code:
61
105
 
@@ -73,7 +117,7 @@ Before writing any code:
73
117
 
74
118
  ---
75
119
 
76
- ## Phase 4: Implementation
120
+ ## Phase 5: Implementation
77
121
 
78
122
  Execute the work required by the issue.
79
123
 
@@ -82,6 +126,7 @@ Execute the work required by the issue.
82
126
  - Write tests if appropriate
83
127
  - Keep changes focused on the issue scope
84
128
  - Document complex logic with comments
129
+ - Commit incrementally for logical chunks of work
85
130
 
86
131
  **For parallel work** (complex issues):
87
132
  ```
@@ -92,14 +137,15 @@ Maximum 10 parallel agents.
92
137
 
93
138
  ---
94
139
 
95
- ## Phase 5: Verification
140
+ ## Phase 6: Verification
96
141
 
97
- Before marking the issue as complete:
142
+ Before committing, verify the implementation:
98
143
 
99
- ### 5.1 Check Related Issues
144
+ ### 6.1 Check Related Issues
100
145
 
101
146
  **If this is a subtask:**
102
147
  ```bash
148
+ cd .claude/skills/linear
103
149
  # Get parent issue to check sibling status
104
150
  npx tsx scripts/issues/get.ts <PARENT-ID> --json
105
151
  ```
@@ -112,62 +158,313 @@ npx tsx scripts/issues/get.ts <PARENT-ID> --json
112
158
  # Check if all children are complete before completing parent
113
159
  ```
114
160
 
115
- ### 5.2 Verify Acceptance Criteria
161
+ ### 6.2 Verify Acceptance Criteria
116
162
 
117
163
  - [ ] All requirements from the description are met
118
164
  - [ ] Code works as expected
119
165
  - [ ] No regressions introduced
120
166
  - [ ] Tests pass (if applicable)
121
167
 
168
+ ### 6.3 Run Quality Checks
169
+
170
+ ```bash
171
+ # Lint
172
+ pnpm lint
173
+
174
+ # Type check
175
+ pnpm typecheck
176
+
177
+ # Run tests
178
+ pnpm test:run
179
+ ```
180
+
181
+ Fix any issues before proceeding.
182
+
183
+ ---
184
+
185
+ ## Phase 7: Changeset (Only for Published Packages)
186
+
187
+ **Changesets document changes that affect npm package users.** They are NOT needed for every PR.
188
+
189
+ ### 7.1 Decision Matrix: Do I Need a Changeset?
190
+
191
+ | Changed Files | Changeset Needed? | Reason |
192
+ |---------------|-------------------|--------|
193
+ | `packages/bhono-app/src/*` | **YES** | CLI code published to npm |
194
+ | `packages/bhono-app/templates/*` | **YES** | Templates shipped to users |
195
+ | `packages/create-bhono-app/*` | **YES** | Published to npm |
196
+ | `src/*` (app code) | **NO** | Not published, internal app |
197
+ | `tests/*` | **NO** | Test-only changes |
198
+ | `config/*`, `.github/*` | **NO** | Build/CI infrastructure |
199
+ | `docs/*`, `*.md` | **NO** | Documentation only |
200
+ | `scripts/*` | **NO** | Internal tooling |
201
+
202
+ ### 7.2 Quick Check
203
+
204
+ ```bash
205
+ # Check if publishable package files were changed
206
+ git diff --name-only develop | grep -E "^packages/.*/src/|^packages/.*/templates/" && echo "CHANGESET NEEDED" || echo "NO CHANGESET NEEDED"
207
+ ```
208
+
209
+ **Rule of thumb:** If users who `npm install @etus/bhono-app` won't notice the change, you don't need a changeset.
210
+
211
+ ### 7.3 Determine Changeset Type (if needed)
212
+
213
+ | Change Type | Semver Bump | When to Use |
214
+ |-------------|-------------|-------------|
215
+ | `patch` | 0.0.X | Bug fixes, typos in templates, minor tweaks |
216
+ | `minor` | 0.X.0 | New features, new templates, new CLI options |
217
+ | `major` | X.0.0 | Breaking changes, removed features, API changes |
218
+
219
+ ### 7.4 Create Changeset
220
+
221
+ ```bash
222
+ pnpm changeset
223
+ ```
224
+
225
+ Select the affected package(s), bump type, and write a **user-facing** summary:
226
+
227
+ **Good changeset message:**
228
+ ```
229
+ fix: resolve template TypeScript errors on Windows
230
+
231
+ - Fix path separators in generated config files
232
+ - Add missing type declarations
233
+ ```
234
+
235
+ **Bad changeset message:**
236
+ ```
237
+ fixed stuff
238
+ ```
239
+
240
+ ### 7.5 Empty Changeset (Edge Case)
241
+
242
+ Only use `--empty` if:
243
+ - Package files changed but it's purely internal (refactoring, comments)
244
+ - CI requires a changeset but the change has no user impact
245
+
246
+ ```bash
247
+ pnpm changeset --empty
248
+ ```
249
+
250
+ ### 7.6 No Changeset Needed
251
+
252
+ If your changes don't affect `packages/*/src` or `packages/*/templates`, simply skip this phase and proceed to commit.
253
+
254
+ ---
255
+
256
+ ## Phase 8: Commit Changes
257
+
258
+ ### 8.1 Stage Changes
259
+
260
+ ```bash
261
+ git add -A
262
+ ```
263
+
264
+ ### 8.2 Commit Message Format (Conventional Commits)
265
+
266
+ **Format:** `<type>(<scope>): <description>`
267
+
268
+ **Types:** (must match commitlint config)
269
+ - `feat` - New feature
270
+ - `fix` - Bug fix
271
+ - `docs` - Documentation
272
+ - `style` - Formatting, no code change
273
+ - `refactor` - Code change that neither fixes nor adds
274
+ - `perf` - Performance improvement
275
+ - `test` - Adding/updating tests
276
+ - `build` - Build system, dependencies
277
+ - `ci` - CI configuration
278
+ - `chore` - Other changes
279
+
280
+ **Scope:** Optional, typically:
281
+ - Package name: `(bhono-app)`
282
+ - Feature area: `(auth)`, `(api)`, `(ui)`
283
+ - Multiple: `(auth,api)`
284
+
285
+ **Description:**
286
+ - Present tense, imperative: "add" not "added" or "adds"
287
+ - Max 100 characters
288
+ - Reference issue at end: `closes AA-123` or `refs AA-123`
289
+
290
+ ### 8.3 Create Commit
291
+
292
+ ```bash
293
+ git commit -m "$(cat <<'EOF'
294
+ <type>(<scope>): <short description>
295
+
296
+ <optional body with details>
297
+
298
+ Closes $ARGUMENTS
299
+ EOF
300
+ )"
301
+ ```
302
+
303
+ **Examples:**
304
+ ```bash
305
+ # Feature
306
+ git commit -m "feat(auth): add OAuth 2.0 PKCE flow
307
+
308
+ Implement secure authentication with:
309
+ - PKCE challenge generation
310
+ - Token refresh mechanism
311
+ - Session management
312
+
313
+ Closes AA-123"
314
+
315
+ # Bug fix
316
+ git commit -m "fix(api): prevent null pointer in user lookup
317
+
318
+ Check for undefined user before accessing properties.
319
+
320
+ Closes AA-456"
321
+
322
+ # Chore
323
+ git commit -m "chore(deps): update dependencies
324
+
325
+ Closes AA-789"
326
+ ```
327
+
122
328
  ---
123
329
 
124
- ## Phase 6: Documentation
330
+ ## Phase 9: Push and Create PR
125
331
 
126
- **CRITICAL**: Add a completion comment following documentation standards.
332
+ > **⚠️ NEVER push directly to `master` or `develop`!**
333
+ >
334
+ > All changes MUST go through a Pull Request. This ensures:
335
+ > - Code review before merge
336
+ > - CI checks run on the PR
337
+ > - Changeset validation for package releases
338
+ > - Audit trail of all changes
127
339
 
128
- ### Completion Comment Template
340
+ ### 9.1 Push Feature Branch
341
+
342
+ ```bash
343
+ # Push your feature branch (NOT master/develop)
344
+ git push -u origin HEAD
345
+ ```
346
+
347
+ **Verify you're on a feature branch:**
348
+ ```bash
349
+ git branch --show-current # Should show feat/AA-123-xxx, NOT master/develop
350
+ ```
351
+
352
+ ### 9.2 Determine PR Target Branch
353
+
354
+ | Scenario | Target Branch | Example |
355
+ |----------|---------------|---------|
356
+ | Regular feature/fix | `develop` | New feature, bug fix, refactor |
357
+ | Hotfix for production | `master` | Critical bug in production |
358
+ | Release candidate | `master` | Merging develop → master |
359
+
360
+ ### 9.3 Create Pull Request (REQUIRED)
361
+
362
+ ```bash
363
+ gh pr create --base develop --title "<type>(<scope>): <description>" --body "$(cat <<'EOF'
364
+ ## Summary
365
+
366
+ Brief description of changes.
367
+
368
+ **Linear Issue:** [$ARGUMENTS](https://linear.app/team/issue/$ARGUMENTS)
369
+
370
+ ## Changes Made
371
+
372
+ - Change 1
373
+ - Change 2
374
+ - Change 3
375
+
376
+ ## Testing
377
+
378
+ - [ ] Unit tests added/updated
379
+ - [ ] Manual testing completed
380
+ - [ ] E2E tests pass
381
+
382
+ ## Changeset
383
+
384
+ - [ ] Changeset created (if packages/ changed)
385
+ - [ ] No changeset needed (no package changes)
386
+
387
+ ## Checklist
388
+
389
+ - [ ] Code follows project conventions
390
+ - [ ] Self-reviewed the diff
391
+ - [ ] Tests pass locally
392
+ - [ ] Documentation updated (if needed)
393
+ EOF
394
+ )"
395
+ ```
396
+
397
+ ### 9.4 Link PR to Linear Issue
398
+
399
+ Add a comment to the Linear issue with the PR link:
129
400
 
130
401
  ```bash
131
402
  cd .claude/skills/linear
403
+ PR_URL=$(gh pr view --json url -q '.url')
404
+
405
+ npx tsx scripts/comments/create.ts $ARGUMENTS "$(cat <<EOF
406
+ ## Pull Request Created
407
+
408
+ **PR:** $PR_URL
409
+
410
+ Awaiting code review.
411
+ EOF
412
+ )" --json
413
+ ```
414
+
415
+ ---
416
+
417
+ ## Phase 10: Update Linear Status
418
+
419
+ ### 10.1 Move to "In Review"
132
420
 
421
+ ```bash
422
+ cd .claude/skills/linear
423
+
424
+ STATES=$(npx tsx scripts/status/list.ts --json)
425
+ IN_REVIEW=$(echo $STATES | jq -r '.statuses[] | select(.name == "In Review") | .id')
426
+
427
+ npx tsx scripts/status/update.ts $ARGUMENTS $IN_REVIEW --json
428
+ ```
429
+
430
+ ### 10.2 Add Completion Comment
431
+
432
+ ```bash
133
433
  npx tsx scripts/comments/create.ts $ARGUMENTS "$(cat <<'EOF'
134
- ## Completion Summary
434
+ ## Implementation Summary
135
435
 
136
- **Status**: COMPLETED
436
+ **Status**: 🔍 IN REVIEW
137
437
 
138
438
  ### Changes Made
139
- - `path/to/file1.ts`: Brief description of changes
140
- - `path/to/file2.ts`: Brief description of changes
439
+ - `path/to/file1.ts`: Brief description
440
+ - `path/to/file2.ts`: Brief description
141
441
 
142
442
  ### Features Implemented
143
443
  - Feature 1: What it does
144
444
  - Feature 2: What it does
145
445
 
146
446
  ### Testing
147
- - [ ] Unit tests added/updated
148
- - [ ] Manual testing completed
447
+ - [x] Unit tests added/updated
448
+ - [x] Manual testing completed
449
+ - [x] Lint and typecheck pass
450
+
451
+ ### Changeset
452
+ - [x] Created (patch/minor/major) OR N/A
149
453
 
150
- ### Next Steps (if any)
151
- - Follow-up task description
152
- - Configuration required
454
+ ### PR
455
+ - Link: <PR_URL>
456
+ - Target: develop
153
457
  EOF
154
458
  )" --json
155
459
  ```
156
460
 
157
- ### Documentation Quality Rules
158
-
159
- | Quality | Example |
160
- |---------|---------|
161
- | ✅ Good | Detailed completion with files, features, implementation notes |
162
- | ❌ Poor | "Done." or "Fixed the bug." |
163
-
164
- **NEVER complete an issue with poor documentation.**
165
-
166
461
  ---
167
462
 
168
- ## Phase 7: Complete the Issue
463
+ ## Phase 11: Post-Merge (After PR Approved)
169
464
 
170
- Update the status to "Done":
465
+ After the PR is merged:
466
+
467
+ ### 11.1 Update Linear to "Done"
171
468
 
172
469
  ```bash
173
470
  cd .claude/skills/linear
@@ -178,59 +475,80 @@ DONE=$(echo $STATES | jq -r '.statuses[] | select(.name == "Done") | .id')
178
475
  npx tsx scripts/status/update.ts $ARGUMENTS $DONE --json
179
476
  ```
180
477
 
181
- ### If Moving to Review Instead
182
-
183
- For issues requiring code review:
478
+ ### 11.2 Clean Up Local Branch
184
479
 
185
480
  ```bash
186
- IN_REVIEW=$(echo $STATES | jq -r '.statuses[] | select(.name == "In Review") | .id')
187
- npx tsx scripts/status/update.ts $ARGUMENTS $IN_REVIEW --json
481
+ git checkout develop
482
+ git pull origin develop
483
+ git branch -d <branch-name>
188
484
  ```
189
485
 
190
- ---
191
-
192
- ## Parent Issue Updates
486
+ ### 11.3 Update Parent Issue (if subtask)
193
487
 
194
488
  When completing the LAST subtask of a parent issue:
195
489
 
196
- 1. Add summary comment to parent:
197
490
  ```bash
491
+ cd .claude/skills/linear
492
+
198
493
  npx tsx scripts/comments/create.ts <PARENT-ID> "$(cat <<'EOF'
199
494
  ## All Subtasks Completed
200
495
 
201
496
  **Status**: ✅ COMPLETED
202
497
 
203
498
  ### Completed Subtasks
204
- - $ARGUMENTS: Brief summary of this subtask
205
- - <OTHER-ID>: Brief summary
499
+ - $ARGUMENTS: Brief summary
206
500
  - <OTHER-ID>: Brief summary
207
501
 
208
502
  ### Summary
209
503
  All acceptance criteria met. Feature ready for release.
210
504
  EOF
211
505
  )" --json
212
- ```
213
506
 
214
- 2. Update parent status to "Done":
215
- ```bash
216
- DONE=$(echo $STATES | jq -r '.statuses[] | select(.name == "Done") | .id')
507
+ # Update parent status
217
508
  npx tsx scripts/status/update.ts <PARENT-ID> $DONE --json
218
509
  ```
219
510
 
220
511
  ---
221
512
 
222
- ## Quick Reference: Status Commands
513
+ ## Quick Reference
223
514
 
515
+ ### Branch Commands
516
+ ```bash
517
+ git checkout develop && git pull
518
+ git checkout -b feat/$ARGUMENTS-description
519
+ git push -u origin HEAD
520
+ ```
521
+
522
+ ### Commit Types
523
+ | Type | When |
524
+ |------|------|
525
+ | `feat` | New feature |
526
+ | `fix` | Bug fix |
527
+ | `refactor` | Code restructure |
528
+ | `test` | Tests only |
529
+ | `docs` | Documentation |
530
+ | `chore` | Maintenance |
531
+
532
+ ### Changeset Commands
533
+ ```bash
534
+ pnpm changeset # Interactive
535
+ pnpm changeset --empty # Skip release
536
+ ```
537
+
538
+ ### Linear Status Commands
224
539
  ```bash
225
540
  cd .claude/skills/linear
226
541
  STATES=$(npx tsx scripts/status/list.ts --json)
227
542
 
228
- # Status IDs
229
543
  IN_PROGRESS=$(echo $STATES | jq -r '.statuses[] | select(.name == "In Progress") | .id')
230
544
  IN_REVIEW=$(echo $STATES | jq -r '.statuses[] | select(.name == "In Review") | .id')
231
545
  DONE=$(echo $STATES | jq -r '.statuses[] | select(.name == "Done") | .id')
232
- ICEBOX=$(echo $STATES | jq -r '.statuses[] | select(.name == "Icebox") | .id')
233
- CANCELED=$(echo $STATES | jq -r '.statuses[] | select(.name == "Canceled") | .id')
546
+ ```
547
+
548
+ ### PR Commands
549
+ ```bash
550
+ gh pr create --base develop --title "..." --body "..."
551
+ gh pr view --json url -q '.url'
234
552
  ```
235
553
 
236
554
  ---
@@ -239,10 +557,20 @@ CANCELED=$(echo $STATES | jq -r '.statuses[] | select(.name == "Canceled") | .id
239
557
 
240
558
  Before finishing this command, verify:
241
559
 
560
+ - [ ] Branch created with correct naming convention
242
561
  - [ ] Issue status updated to "In Progress" at start
243
562
  - [ ] All requirements implemented
244
- - [ ] Related issues checked (parent/siblings/children)
245
- - [ ] Completion comment added with documentation standards
246
- - [ ] Issue status updated to "Done" (or "In Review")
247
-
248
- **Remember**: An issue is NOT complete until Linear reflects its completion.
563
+ - [ ] Quality checks pass (lint, typecheck, tests)
564
+ - [ ] Changeset created **only if** `packages/*/src` or `packages/*/templates` changed
565
+ - [ ] Commit message follows Conventional Commits
566
+ - [ ] PR created with proper description
567
+ - [ ] PR linked in Linear issue comment
568
+ - [ ] Issue status updated to "In Review"
569
+ - [ ] (Post-merge) Issue status updated to "Done"
570
+ - [ ] (Post-merge) Local branch cleaned up
571
+
572
+ **Remember**: An issue is NOT complete until:
573
+ 1. PR is merged
574
+ 2. Linear reflects "Done" status
575
+
576
+ **Changeset reminder**: Only needed for changes that affect npm package users (CLI code or templates).