@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.
- package/dist/index.js +0 -0
- package/package.json +7 -2
- package/templates/base/.claude/commands/check-skill-rules.md +112 -29
- package/templates/base/.claude/commands/linear/implement-issue.md +383 -55
- package/templates/base/.claude/commands/ship.md +77 -13
- package/templates/base/.claude/hooks/package-lock.json +0 -419
- package/templates/base/.claude/hooks/skill-activation-prompt.ts +185 -113
- package/templates/base/.claude/hooks/skill-tool-guard.sh +6 -0
- package/templates/base/.claude/hooks/skill-tool-guard.ts +198 -0
- package/templates/base/.claude/scripts/validate-skill-rules.sh +55 -32
- package/templates/base/.claude/settings.json +18 -11
- package/templates/base/.claude/skills/skill-rules.json +326 -173
- package/templates/base/.env.example +3 -0
- package/templates/base/CLAUDE.md +5 -5
- package/templates/base/README.md +40 -27
- package/templates/base/config/eslint.config.js +1 -0
- package/templates/base/config/wrangler.json +16 -17
- package/templates/base/docs/SETUP-GUIDE.md +566 -0
- package/templates/base/docs/app_spec.txt +13 -10
- package/templates/base/docs/architecture/README.md +162 -5
- package/templates/base/docs/architecture/api-catalog.md +575 -0
- package/templates/base/docs/architecture/c4-component.md +309 -0
- package/templates/base/docs/architecture/c4-container.md +183 -0
- package/templates/base/docs/architecture/c4-context.md +106 -0
- package/templates/base/docs/architecture/data-requirements.md +4 -3
- package/templates/base/docs/architecture/db-bootstrap.md +39 -0
- package/templates/base/docs/architecture/dependencies.md +327 -0
- package/templates/base/docs/architecture/drizzle-migration-plan.md +125 -0
- package/templates/base/docs/architecture/erd.md +1 -1
- package/templates/base/docs/architecture/sql-standards.md +100 -0
- package/templates/base/docs/architecture/tech-debt.md +184 -0
- package/templates/base/docs/testing.md +36 -29
- package/templates/base/package.json +26 -20
- package/templates/base/schema.sql +84 -0
- package/templates/base/scripts/capture-prod-session.ts +2 -2
- package/templates/base/scripts/init.sh +244 -59
- package/templates/base/scripts/sync-template.sh +104 -0
- package/templates/base/src/client/hooks/use-auth.ts +5 -0
- package/templates/base/src/client/routes/_authenticated/dashboard.tsx +1 -1
- package/templates/base/src/client/routes/index.tsx +1 -1
- package/templates/base/src/server/db/client.ts +3 -5
- package/templates/base/src/server/db/records.ts +81 -0
- package/templates/base/src/server/db/seed.ts +3 -2
- package/templates/base/src/server/db/sql.ts +116 -0
- package/templates/base/src/server/index.ts +17 -2
- package/templates/base/src/server/lib/audit.ts +74 -26
- package/templates/base/src/server/lib/audited-db.ts +219 -109
- package/templates/base/src/server/lib/transaction.ts +10 -16
- package/templates/base/src/server/middleware/account.ts +9 -16
- package/templates/base/src/server/middleware/auth.ts +102 -38
- package/templates/base/src/server/middleware/rate-limit.ts +8 -6
- package/templates/base/src/server/routes/accounts/handlers.ts +18 -6
- package/templates/base/src/server/routes/audits/handlers.ts +3 -1
- package/templates/base/src/server/routes/auth/handlers.ts +15 -10
- package/templates/base/src/server/routes/auth/test-login.ts +99 -45
- package/templates/base/src/server/routes/health/handlers.ts +4 -4
- package/templates/base/src/server/routes/index.ts +9 -0
- package/templates/base/src/server/routes/invitations/handlers.ts +9 -6
- package/templates/base/src/server/routes/openapi.ts +1 -1
- package/templates/base/src/server/routes/users/handlers.ts +21 -14
- package/templates/base/src/server/services/accounts.ts +242 -217
- package/templates/base/src/server/services/audits.ts +114 -61
- package/templates/base/src/server/services/auth.ts +310 -180
- package/templates/base/src/server/services/invitations.ts +282 -222
- package/templates/base/src/server/services/users.ts +383 -293
- package/templates/base/src/server/types/index.ts +1 -2
- package/templates/base/src/shared/types/api.ts +66 -198
- package/templates/base/tests/e2e/auth.setup.ts +1 -1
- package/templates/base/{src/server/__tests__/fixtures.ts → tests/fixtures/server.ts} +3 -3
- package/templates/base/{src/client/__tests__/setup-browser.ts → tests/helpers/client-setup-browser.ts} +2 -2
- package/templates/base/{src/client/__tests__/setup.ts → tests/helpers/client-setup.ts} +1 -1
- package/templates/base/{src/client/__tests__/test-utils.tsx → tests/helpers/client-test-utils.tsx} +2 -2
- package/templates/base/{src/server/__tests__/setup.ts → tests/helpers/server.ts} +9 -9
- package/templates/base/tests/integration/accounts/crud.test.ts +2 -11
- package/templates/base/tests/integration/audits/list.test.ts +2 -11
- package/templates/base/tests/integration/auth/auth-service.test.ts +1 -10
- package/templates/base/tests/integration/auth/invitation-token.test.ts +2 -11
- package/templates/base/tests/integration/auth/logout.test.ts +2 -11
- package/templates/base/tests/integration/auth/oauth.test.ts +23 -42
- package/templates/base/tests/integration/auth/refresh-token.test.ts +1 -9
- package/templates/base/tests/integration/auth/session-expiry.test.ts +1 -9
- package/templates/base/tests/integration/auth/session.test.ts +2 -11
- package/templates/base/tests/integration/auth/super-admin.test.ts +1 -9
- package/templates/base/tests/integration/authorization/analytics-role.test.ts +2 -11
- package/templates/base/tests/integration/authorization/billing-role.test.ts +2 -11
- package/templates/base/tests/integration/authorization/guards-roles.test.ts +1 -9
- package/templates/base/tests/integration/authorization/multi-tenancy.test.ts +2 -11
- package/templates/base/tests/integration/authorization/roles.test.ts +2 -11
- package/templates/base/tests/integration/config/production-behavior.test.ts +2 -11
- package/templates/base/tests/integration/health/health.test.ts +25 -44
- package/templates/base/tests/integration/invitations/crud.test.ts +2 -11
- package/templates/base/tests/integration/invitations/email.test.ts +1 -9
- package/templates/base/tests/integration/middleware/auth.test.ts +3 -12
- package/templates/base/tests/integration/middleware/request-logger.test.ts +1 -9
- package/templates/base/tests/integration/performance/response-times.test.ts +1 -9
- package/templates/base/tests/integration/security/cookie-security.test.ts +2 -11
- package/templates/base/tests/integration/security/csrf-protection.test.ts +2 -11
- package/templates/base/tests/integration/security/log-sanitization.test.ts +1 -9
- package/templates/base/tests/integration/security/rate-limiting.test.ts +1 -9
- package/templates/base/tests/integration/security/sql-injection.test.ts +7 -18
- package/templates/base/tests/integration/security/xss-prevention.test.ts +2 -11
- package/templates/base/tests/integration/setup.ts +13 -90
- package/templates/base/tests/integration/smoke.test.ts +3 -2
- package/templates/base/tests/integration/storage/upload.test.ts +2 -11
- package/templates/base/tests/integration/storage/validation.test.ts +2 -11
- package/templates/base/tests/integration/users/crud.test.ts +2 -11
- package/templates/base/tests/integration/users/list.test.ts +2 -11
- package/templates/base/tests/integration/vitest.config.ts +2 -9
- package/templates/base/{src/server/__tests__ → tests}/mocks/db.ts +1 -1
- package/templates/base/{src/server/__tests__ → tests}/mocks/index.ts +1 -1
- package/templates/base/{src/server/__tests__ → tests}/mocks/kv.ts +1 -1
- package/templates/base/{src/server/__tests__ → tests}/mocks/r2.ts +1 -1
- package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/sidebar.test.tsx +1 -1
- package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/avatar.test.tsx +1 -1
- package/templates/base/{src/client/__tests__ → tests/unit/client/components/ui}/button.test.tsx +1 -1
- package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/card.test.tsx +1 -1
- package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/dialog.test.tsx +1 -1
- package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/input.test.tsx +1 -1
- package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/loading-skeleton.test.tsx +1 -1
- package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/skeleton.test.tsx +1 -1
- package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/sonner.test.tsx +1 -1
- package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/tabs.test.tsx +1 -1
- package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/account.test.tsx +1 -1
- package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/integrations.test.tsx +1 -1
- package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/settings.test.tsx +1 -1
- package/templates/base/{src/client/routes/_authenticated/__tests__ → tests/unit/client/routes/_authenticated}/team.test.tsx +1 -1
- package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/authenticated-layout.test.tsx +1 -1
- package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/dashboard.test.tsx +1 -1
- package/templates/base/{src/client/routes/__tests__ → tests/unit/client/routes}/invite.test.tsx +1 -1
- package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/login.test.tsx +1 -1
- package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/navigation.test.tsx +1 -1
- package/templates/base/{src/client/__tests__ → tests/unit/client}/routes/root-layout.test.tsx +1 -1
- package/templates/base/{src/server/auth/__tests__ → tests/unit/server/auth}/guards.test.ts +2 -2
- package/templates/base/{src → tests/unit}/server/auth/permissions.test.ts +1 -1
- package/templates/base/{src → tests/unit}/server/auth/roles.test.ts +1 -1
- package/templates/base/tests/unit/server/db/sql.test.ts +68 -0
- package/templates/base/{src → tests/unit}/server/env.test.ts +1 -1
- package/templates/base/tests/unit/server/lib/audited-db.test.ts +78 -0
- package/templates/base/{src → tests/unit}/server/lib/email.test.ts +1 -1
- package/templates/base/{src → tests/unit}/server/lib/errors.test.ts +1 -1
- package/templates/base/{src → tests/unit}/server/lib/oauth.test.ts +1 -1
- package/templates/base/{src → tests/unit}/server/lib/pagination.test.ts +1 -1
- package/templates/base/{src → tests/unit}/server/lib/password.test.ts +1 -1
- package/templates/base/{src → tests/unit}/server/lib/providers.test.ts +1 -1
- package/templates/base/{src → tests/unit}/server/lib/r2-storage.test.ts +2 -2
- package/templates/base/{src → tests/unit}/server/lib/session.test.ts +2 -2
- package/templates/base/{src → tests/unit}/server/lib/tokens.test.ts +1 -1
- package/templates/base/{src → tests/unit}/server/lib/transaction.test.ts +5 -14
- package/templates/base/{src → tests/unit}/server/middleware/account.test.ts +16 -24
- package/templates/base/tests/unit/server/middleware/auth.test.ts +647 -0
- package/templates/base/{src → tests/unit}/server/middleware/cors.test.ts +1 -1
- package/templates/base/{src → tests/unit}/server/middleware/error-handler.test.ts +2 -2
- package/templates/base/{src → tests/unit}/server/middleware/rate-limit.test.ts +3 -2
- package/templates/base/{src → tests/unit}/server/middleware/request-context.test.ts +1 -1
- package/templates/base/{src → tests/unit}/server/middleware/request-logger.test.ts +1 -1
- package/templates/base/{src/server/__tests__/mocks/__tests__ → tests/unit/server/mocks}/db.test.ts +1 -1
- package/templates/base/{src/server/__tests__/mocks/__tests__ → tests/unit/server/mocks}/kv.test.ts +1 -1
- package/templates/base/{src/server/__tests__/mocks/__tests__ → tests/unit/server/mocks}/r2.test.ts +1 -1
- package/templates/base/{src/server/routes/accounts/__tests__ → tests/unit/server/routes/accounts}/handlers.test.ts +12 -12
- package/templates/base/{src/server/routes/audits/__tests__ → tests/unit/server/routes/audits}/handlers.test.ts +11 -11
- package/templates/base/{src/server/routes/auth/__tests__ → tests/unit/server/routes/auth}/handlers.test.ts +124 -13
- package/templates/base/{src/server/routes/health/__tests__ → tests/unit/server/routes/health}/handlers.test.ts +27 -23
- package/templates/base/{src/server/routes/invitations/__tests__ → tests/unit/server/routes/invitations}/handlers.test.ts +14 -17
- package/templates/base/{src/server/routes/storage/__tests__ → tests/unit/server/routes/storage}/handlers.test.ts +6 -6
- package/templates/base/{src/server/routes/users/__tests__ → tests/unit/server/routes/users}/handlers.test.ts +81 -17
- package/templates/base/tests/unit/server/services/accounts.test.ts +406 -0
- package/templates/base/tests/unit/server/services/audits.test.ts +360 -0
- package/templates/base/tests/unit/server/services/auth.test.ts +656 -0
- package/templates/base/tests/unit/server/services/invitations.test.ts +343 -0
- package/templates/base/tests/unit/server/services/users.test.ts +706 -0
- package/templates/base/{src/shared/schemas/__tests__ → tests/unit/shared}/schemas.test.ts +1 -1
- package/templates/base/tsconfig.json +2 -1
- package/templates/base/vite.config.ts +3 -1
- package/templates/base/vitest.config.browser.ts +3 -2
- package/templates/base/vitest.config.frontend.ts +3 -2
- package/templates/base/vitest.config.ts +7 -14
- package/templates/base/.claude/settings.local.json +0 -11
- package/templates/base/.github/workflows/test.yml +0 -127
- package/templates/base/auth-setup-error.png +0 -0
- package/templates/base/config/drizzle.config.ts +0 -10
- package/templates/base/pnpm-lock.yaml +0 -8175
- package/templates/base/src/server/db/schema/accounts.ts +0 -20
- package/templates/base/src/server/db/schema/audit-logs.ts +0 -26
- package/templates/base/src/server/db/schema/index.ts +0 -7
- package/templates/base/src/server/db/schema/invitations.ts +0 -30
- package/templates/base/src/server/db/schema/refresh-tokens.ts +0 -22
- package/templates/base/src/server/db/schema/user-accounts.ts +0 -25
- package/templates/base/src/server/db/schema/users.ts +0 -33
- package/templates/base/src/server/lib/audited-db.test.ts +0 -107
- package/templates/base/src/server/lib/schema-helpers.ts +0 -16
- package/templates/base/src/server/middleware/auth.test.ts +0 -345
- package/templates/base/src/server/services/__tests__/accounts.test.ts +0 -764
- package/templates/base/src/server/services/__tests__/audits.test.ts +0 -235
- package/templates/base/src/server/services/__tests__/auth.test.ts +0 -765
- package/templates/base/src/server/services/__tests__/invitations.test.ts +0 -704
- package/templates/base/src/server/services/__tests__/users.test.ts +0 -755
- package/templates/base/tests/e2e/_auth/.gitkeep +0 -0
- package/templates/base/tests/integration/lib/schema-helpers.test.ts +0 -129
- package/templates/base/tsconfig.tsbuildinfo +0 -1
- /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
- /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
- /package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/__screenshots__/sidebar.test.tsx/Sidebar-handles-logout-button-click-1.png +0 -0
- /package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/__screenshots__/sidebar.test.tsx/Sidebar-handles-navigation-clicks-1.png +0 -0
- /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
- /package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/__screenshots__/sidebar.test.tsx/Sidebar-highlights-active-route-1.png +0 -0
- /package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/__screenshots__/sidebar.test.tsx/Sidebar-renders-sidebar-navigation-items-1.png +0 -0
- /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
- /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
- /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
- /package/templates/base/{src/client/components/__tests__ → tests/unit/client/components}/error-boundary.test.tsx +0 -0
- /package/templates/base/{src/client/components/ui/__tests__ → tests/unit/client/components/ui}/error-fallback.test.tsx +0 -0
- /package/templates/base/{src/client/hooks/__tests__ → tests/unit/client/hooks}/use-auth.test.tsx +0 -0
- /package/templates/base/{src/client/hooks/__tests__ → tests/unit/client/hooks}/use-theme.test.tsx +0 -0
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
140
|
+
## Phase 6: Verification
|
|
96
141
|
|
|
97
|
-
Before
|
|
142
|
+
Before committing, verify the implementation:
|
|
98
143
|
|
|
99
|
-
###
|
|
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
|
-
###
|
|
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
|
|
330
|
+
## Phase 9: Push and Create PR
|
|
125
331
|
|
|
126
|
-
|
|
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
|
-
###
|
|
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
|
-
##
|
|
434
|
+
## Implementation Summary
|
|
135
435
|
|
|
136
|
-
**Status**:
|
|
436
|
+
**Status**: 🔍 IN REVIEW
|
|
137
437
|
|
|
138
438
|
### Changes Made
|
|
139
|
-
- `path/to/file1.ts`: Brief description
|
|
140
|
-
- `path/to/file2.ts`: Brief description
|
|
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
|
-
- [
|
|
148
|
-
- [
|
|
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
|
-
###
|
|
151
|
-
-
|
|
152
|
-
-
|
|
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
|
|
463
|
+
## Phase 11: Post-Merge (After PR Approved)
|
|
169
464
|
|
|
170
|
-
|
|
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
|
-
###
|
|
182
|
-
|
|
183
|
-
For issues requiring code review:
|
|
478
|
+
### 11.2 Clean Up Local Branch
|
|
184
479
|
|
|
185
480
|
```bash
|
|
186
|
-
|
|
187
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
233
|
-
|
|
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
|
-
- [ ]
|
|
245
|
-
- [ ]
|
|
246
|
-
- [ ]
|
|
247
|
-
|
|
248
|
-
|
|
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).
|