Repository navigation
[RELEASE] NOMOS V 1.0.0 배포 - #44
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
기능명세서 v0.2 기준 S-1~S-9 전 화면을 클라이언트 목업 스토어로 구현. 채팅형 프로젝트 생성, Room 1/2/3 권한 분리, 에이전트→사람 질의(ADR 자동 기록), 정책 게이트 거부, MCP 문서 버전 관리, 활동·비용 대시보드 포함. 남은 과업과 백엔드 API/WS 요구사항은 docs/남은과업_백엔드요구사항.md 참고. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
feat: NOMOS 프론트 목업 A→Z 구현
AGENTS.md에 프로젝트 규칙 추가(nextjs 생성 블록 유지), docs/README·architecture· conventions·design 작성, ADR 0001~0003 추가. Closes #2 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
문서에 "선택"으로 기록된 패키지가 실제로는 하나도 설치돼 있지 않았다. 표에 맞춰 설치하고, 표에 설치·적용 상태 열을 추가했다. - 설치: @tanstack/react-query, @tanstack/react-virtual, zustand, react-markdown, remark-gfm, rehype-sanitize - 설치(dev): openapi-typescript, msw - 제외: 실시간 라이브러리(adr/0004 결정 전 설치 금지), Radix(도입 시점 미도래) - 표에 누락돼 있던 lucide-react 추가 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
docs: 에이전트·기여자용 문서 체계 정비
ADR 0002대로 components/ + lib/types.ts를 해체했다.
- shared/ — ui(도메인 없는 부품 11개 + Markdown), lib/format, model(Role·Level·Decider)
- entities/ — task agent user project room message document event policy 9슬라이스.
lib/types.ts를 도메인별로 쪼개고 각 슬라이스에 index.ts 배럴을 뒀다
- widgets/ — 13슬라이스. RoomView+Cards+Composer를 widgets/room 한 슬라이스로 묶음
- app/ — page.tsx 전부 얇은 셸. "use client" 페이지 5개를
widgets/{auth,connect-agent,project-list,project-new}로 분리
ADR이 지적한 경계 충돌 2건 해소:
- TaskBadge·RoleBadge·StatusDot이 도메인 타입을 참조하던 것을
entities/{task,user,agent}/ui로 이동. shared/ui는 이제 cn만 import한다
- RoomView → Cards·Composer 참조를 슬라이스 내부로 흡수
lib/store.tsx와 lib/mock/seed.ts는 해체 예정이라 옮기지 않고 레이어 밖
예외로 남겼다(architecture.md §8). AppState·Session 타입은 store.tsx로 이동.
검증: tsc --noEmit 통과, eslint 통과, next build 통과(라우트 15개 유지),
레이어 경계 위반 grep 0건.
Closes #4
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
refactor: FSD 4레이어 구조 이행 (app/widgets/entities/shared)
CI가 없어서 PR에 통과/실패 게이트가 하나도 없었다. 포맷터도 없어 diff에 포맷 변경이 섞였고, ADR 0002가 요구한 경계 린트도 미적용 상태였다. - Prettier — printWidth 120 (기존 코드 p90이 105자라 기본값 80이면 전면 재배치) - eslint-config-prettier — 포맷 규칙 충돌 제거 - eslint-plugin-boundaries v7 — app → widgets → entities → shared 단방향, 슬라이스 간 교차 금지, 슬라이스 바깥에서는 index.ts로만 접근. src/lib은 mock-store 타입으로 예외 등록 (해체되면 함께 삭제) - pnpm 전환 — packageManager 고정, onlyBuiltDependencies로 postinstall 승인 - engines node >=20.9 (ADR 0001 결과 항목) - .github/workflows/ci.yml — format:check → lint → typecheck → build CD는 Vercel Git 연동이 담당하므로 워크플로에 넣지 않는다. build를 CI에 넣은 이유는 Vercel이 PR에 상태 체크를 걸지 않아 빌드 실패를 놓치기 때문이다. Closes #6 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
설정 커밋과 분리한 포맷 전용 커밋. 로직 변경 없음. 마크다운은 .prettierignore로 제외했다. 명세서 2개가 판단 기준 문서이고 (AGENTS.md), AGENTS.md에는 next dev가 재생성하는 관리 블록이 있다. 표 패딩 재배치로 diff만 지저분해진다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
깨끗한 체크아웃에서 tsc가 LayoutProps를 찾지 못해 CI가 실패했다. Next 16이 생성하는 전역 타입이라 next dev·next build·next typegen 중 하나를 거쳐야 존재한다. 로컬은 .next/types가 남아 있어 통과했다. CI에만 단계를 넣지 않고 스크립트를 고친 이유는, 새로 클론한 팀원도 같은 실패를 겪기 때문이다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Prettier의 endOfLine 기본값이 "lf"인데 core.autocrlf=true인 Windows에서는 체크아웃 시 CRLF가 되어 format:check가 로컬에서만 실패한다. CI는 LF로 받으므로 통과해서, 로컬과 CI 결과가 어긋난다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
chore: Prettier·경계 린트·CI 도입 및 pnpm 전환
#6에서 내린 결정이 ADR로 남지 않았다. 둘 다 재검토 조건과 예외 항목이 있어 근거가 필요하다. 0004는 실시간 전송 방식용으로 예약돼 있어 0005부터. - adr/0005 — pnpm 전환. 유령 의존성 차단, packageManager 고정, onlyBuiltDependencies를 패키지 추가와 같은 승인 대상으로 취급 - adr/0006 — 규칙을 기계로 고정. printWidth 120·마크다운 제외·build 포함· next typegen·eol=lf의 근거와, 아직 기계로 못 막은 규칙 3가지 - AGENTS.md·conventions.md — pnpm과 검사 명령 반영 ci.yml의 Vercel 주석 제거를 포함한다. Vercel은 실제로 PR에 상태 체크를 걸고 있어 주석 내용이 사실과 달랐다. Closes #8 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
docs: ADR 0005·0006 기록 및 규칙 문서 갱신
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs: 실시간 갱신을 당분간 폴링으로 변경 (ADR 0004)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs: 헤더 토큰·클라이언트 가드로 인증 방식 정정 (ADR 0007), FE 포트 3001 고정
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat: API 호출 기반 구축 (생성 타입·apiFetch·QueryClient)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat: 가입·로그인·/me·부트스트랩 라우팅·조직 만들기
- entities/project: useProjects·useProject, 상태 배지, 접근 에러 화면 - entities/task: ApiTask·칸반 4열·useTasks(4초 폴링)·ApiTaskBadge·TeamRoleBadge - entities/artifact: 제출 이력·검증(실행 순서 재정렬, SKIPPED 별도 배지) - entities/note: since_seq 증분 조회, 정정(supersedes) 표시 - 프로젝트 목록·앱 셸·대시보드 칸반·활동(노트 피드)을 API로 교체 - /p/[projectId]/tasks/[taskId] 태스크 상세 추가 - 남은 목업 영역에 "목업" 배지, 목업 데이터가 없으면 빈 상태 Closes #18 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- entities/org: useOrgMembers, useCreateInvite, OrgRoleBadge·CollaboratorBadge(3상태) - entities/invite(신규): fetchInvitePreview, useInvitePreview, useAcceptInvite - /org: 멤버 목록, 초대 발급(대표만 렌더), 레포 자리 - /join/[token] → /invites/[token]: generateMetadata, 무효 사유별 문구, 로그인 상태별 분기 - 수락 후 /connect?joined=1 — 이미 연결한 에이전트가 있으면 /projects로 - lib/store.tsx에서 joinProject·inviteTokens 제거, 목업 초대 링크 UI 정리 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- /connect/device: CLI가 연 링크에서 코드를 확인하고 승인·거부한다. API는 backend#5에서 구현 예정이라 그 전까지는 404를 받는다 - /connect: 현재 Executor 기준 단계별 사용법을 보여주고, 연결된 에이전트 목록을 5초마다 갱신한다 - 랜딩의 npx nomos connect 문구 교체 (npm의 nomos는 다른 사람 패키지) - ADR 0008, 명세 F-03 로그인 방식 갱신 Refs #22 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- pnpm gen:api로 BE dev 스펙 반영: device flow 스키마(DeviceStart·DevicePoll·DeviceRequest)와 그동안 BE가 문서화한 응답 스키마가 추가됨 (기존 스키마 삭제·변경 없음) - 승인 화면 타입을 Schemas["DeviceRequest"]로 교체하고 직접 쓴 임시 타입 삭제 - /connect 2단계를 브라우저 승인으로 바꾸고, 연결 키 로그인은 "SSH 등" 아래로 접음 (npm run executor -- login <주소> --connect-key — npm이 -- 앞 플래그를 가로채므로) - ADR 0008 확정 Closes #22 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- useCliPublished: npm 레지스트리에 @capstone-nomos/cli가 있는지 확인 (backend#7) - /connect: 배포 후에는 "npx @capstone-nomos/cli connect" 한 줄 + 배정 후 자동 실행 안내, 배포 전에는 지금처럼 백엔드 레포 클론 방식. 연결 키 명령도 같이 바뀐다 - 랜딩 명령 문구도 같은 기준으로 전환 - ADR 0008: 배포 확인 후 클론 분기와 레지스트리 확인을 지운다고 기록 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 명령에 @latest를 붙인다 (CLI_NPX). npx가 캐시한 옛 CLI가 바뀐 서버 API로 실행되는 것을 막는다 - /connect: repos.json 안내 삭제 → 레포는 ~/.nomos/repos/에 자동으로 받는다고 안내 (비공개 레포는 gh auth login 또는 Git Credential Manager 필요) - /connect: 사전 준비에 git·Claude Code 추가, 막혔을 때 doctor 명령 안내 - 연결 키 경로도 connect --connect-key 한 줄로 (로그인 → 배정 대기 → 실행) - /connect/device: npm run executor login → npx …@latest connect - ADR 0008 재검토 조건대로 클론 방식 안내와 useCliPublished(레지스트리 확인)를 지움 Closes #23 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat: CLI npm 배포 반영 — 연결 안내 정정 (@latest·repos.json 제거·사전 준비)
feat: 조직 멤버 · 초대 발급 · 초대 미리보기/수락
- pnpm gen:api로 BE 스펙 반영: /projects/{projectId}/start, 내장 PM 경로(/pm/plans·/pm/status),
PmPlan·PlanDraft 스키마, 레포 연결 요청의 ownerRole 등
- TODO(api) 직접 타입 7곳을 Schemas로 교체 (Task·Note·Artifact·Verification·ProjectDetail·
OrgCreated·InviteCreated·InviteAccepted·SignupResult·ConnectKey). 남은 TODO(api) 0건
- gateMode에 FORBIDDEN 추가(스키마 기준), 검증 detail.reason은 문자열일 때만 표시
- 새 에러 코드 문구: PROJECT_START_INVALID·PROJECT_ALREADY_STARTED·PM_* 등
- DECIDED 노트는 모든 태스크에 전달되므로 강조, 태스크 상세에 다른 태스크의 결정 사항도 표시
Refs #26
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019AwhmzoQJxaKr6s8v9AgpB
feat: OpenAPI 타입 재생성 · 응답 타입 교체 · 결정 사항 노트 강조
- entities/repo: useRepos·useGithubRepos·useConnectRepos·usePaths·useUpdatePath·useCreatePath, glob 검사·조직 상한(priority 900) 판정, 소유 역할 배지 - /org 레포 섹션: 연결 레포 목록 + "소유 역할 미지정" 경고, GitHub 목록(복수 선택) 또는 owner/repo 직접 입력으로 연결 대표는 레포마다 소유 역할(FE·BE·나중에)을 골라 연결과 함께 지정 (#26 §3). 팀원 요청에는 ownerRole을 넣지 않는다 - /org/repos/[repoId] + widgets/repo-paths: ** 행 강조, 900 이상 잠금, 소유 역할·접근 수정과 규칙 추가는 대표만 - Segmented를 shared/ui로 옮기고 disabled 추가 Closes #28 Refs #26 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019AwhmzoQJxaKr6s8v9AgpB
feat: 레포 연결(+ 소유 역할 지정) · 연결 레포 목록 · 경로 소유권 편집
- entities/project: useCreateProject·useAssignMember·useUnassignMember·useStartProject.
PROJECT_STARTED·PROJECT_ALREADY_STARTED가 오면 상세를 다시 부른다 (다른 탭에서 이미 시작한 경우)
- shared/api: errorDetails — 422 details [{ where, message }] 꺼내기
- /projects/new: 채팅형 흐름을 이름 → 레포(소유 역할 지정된 것만) → 레벨 → PM 예산 → 전체 예산·마감일로 교체,
성공하면 설정으로. 대표가 아니면 /projects로
- entities/policy: 레벨 설명을 정책표에서 파생 (levelGates · LevelGates). 손으로 쓴 설명이 L2·L4에서 표와 어긋났다
- /p/[id]/settings: 기본 정보(읽기 전용) · FE/BE 역할 배정(대표, notice 표시) · 프로젝트 시작(확인 창, 422 details 목록)
시작 후에는 배정·해제 비활성
- 대시보드: 시작 전이면 "아직 시작 전입니다" 배너 (대표에게는 시작하러 가기)
- 목업 스토어 createProject·setLevel·setBudget 제거, "새 프로젝트" 목업 배지 제거
Closes #30
Refs #26
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019AwhmzoQJxaKr6s8v9AgpB
globals.css의 ink 스케일에 600·800이 없어 text-ink-600(36곳)·text-ink-800(6곳)이 CSS로 생성되지 않고 부모 색으로 그려지고 있었다. Tailwind gray와 같은 값으로 채우고, design.md에 "없는 단계를 쓰면 빌드·린트 없이 색이 조용히 빠진다"를 남겼다. Refs #30 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019AwhmzoQJxaKr6s8v9AgpB
feat: 프로젝트 생성 · 에이전트 역할 배정 · 프로젝트 시작(G1)
- entities/plan: usePmStatus(꺼져 있거나 작성 중일 때만 폴링)·usePlans(pending이 있을 때만 4초 폴링), 요청·수정 요청·적용·반려 뮤테이션. 응답으로 화면을 바꾸지 않고 목록·상태를 다시 부른다 - shared/api: ResponseData — 인라인 응답 스키마(pm/status) 타입 꺼내기 - /p/[projectId]/rooms/owner + widgets/pm-room: 실제 API로 동작하는 Room 3(대표 + PM, 명세 F-09·S-5). PM 준비 상태(WORKER_OFFLINE이면 pm-worker 실행 안내), 예산 게이지(80% 경고 — F-08) - 승인 카드: 근거와 가정 · 명세(마크다운) · 태스크와 담당(assignments), 담당 없는 태스크 경고, 실패 사유, 승인(확인 창) · 수정 요청(잔여 횟수, 최대 3회 — §0-5) · 반려(사유 선택). 수정본으로 이어진 초안은 접는다 - 앱 셸 Room 목록에 실제 Room 3(대표만), 설정의 시작 실패 "태스크 없음"·대시보드 빈 태스크에서 Room 3로 Closes #32 Closes #26 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019AwhmzoQJxaKr6s8v9AgpB
feat: 내장 PM — Room 3 계획 요청 · 초안 승인 카드
- /settings/account + widgets/account-settings: 프로필 · 연결 키 재발급 · GitHub 연동 - entities/user: RotateConnectKey를 /connect에서 옮겨 두 화면이 같이 쓴다 - entities/user: useGithubDeviceFlow — start → interval마다 poll(200 + status 분기), slow_down이면 응답 interval로 늘리고 expired·denied면 멈춘다. deviceCode는 ref에만, 화면을 떠나면 중단. connected면 me를 다시 부르고, 위젯이 조직 멤버(isCollaborator)도 무효화한다 - GitHub 인증 페이지는 새 탭으로 연다(폴링은 이 탭에서 계속). 502·409 문구 - 헤더 계정 메뉴에 계정 설정 진입점 Closes #34 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019AwhmzoQJxaKr6s8v9AgpB
feat: 계정 설정 화면 · GitHub 연동(Device Flow)
- 연결 승인·거부가 409·410으로 실패해도 요청을 다시 조회해 결과(거부됨·만료됨)를 보여 준다
- Room 403 문구 조사 수정 ("대표은" → "대표는")
- 레포 경로 화면에서 403·404면 "다시 시도" 대신 "조직으로"
Closes #36
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix: 연결 승인 결과 갱신 · Room 403 문구 · 레포 경로 에러 버튼
- OpenAPI 타입 재생성 (backend #18 · #19 · #21) - 프로젝트 생성: 진행 중 프로젝트가 쓰는 레포는 선택 단계에서 막고, 409 REPO_IN_ACTIVE_PROJECT면 겹친 레포를 보여 주고 레포 단계로 돌아간다 - 조직 레포 목록에 사용 중 프로젝트 표시 - 승인 대기열: 대시보드 "승인 · 결정 대기"와 받은 편지함을 API로. 대표만 승인·반려(사유 필수) - 이벤트 로그: 활동 페이지 "활동" 탭, 대시보드 최근 활동을 API로 - 에이전트 온라인 상태: 대시보드 에이전트 목록, 설정 배정 후보 - 에러 문구: PLAN_REVISION_LIMIT · APPROVAL_* Closes #38 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat: BE 후속 작업 연동 — 레포 사용 중 · 승인 대기열 · 이벤트 로그 · 에이전트 온라인
- shared/api/stream.ts: 브라우저 WebSocket 탭당 하나. 첫 메시지 인증, 1초~30초 백오프 재연결, 4401·4403·4400·4408은 재연결 안 함, 레이아웃 전환 사이 연결 유지 - widgets/auth/useRealtimeSync.ts: topic → 쿼리 무효화. 재연결·resync·끊김 때 전체 다시 읽기 - AppShell에서 프로젝트 구독, AuthGate에서 연결(조직 있는 사용자만) - livePoll: 연결 중 30초 대비용, 끊기면 원래 주기 - 신호 없는 곳(pm/status, 팀원 배정 대기 목록)은 폴링 유지 + agents 신호 때 함께 다시 읽기 - ADR 0009(0004 대체), AGENTS.md · architecture.md 갱신 Closes #40 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
shared/api 배럴이 stream.ts(useSyncExternalStore 등 훅)를 다시 내보내면서 invites/[token]/page.tsx(서버 컴포넌트) → inviteApi → @/shared/api 경로로 서버 모듈 그래프에 들어가 pnpm build가 실패했다. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014Jpp5QVC6rPNAk7SRLXYjV
feat: 실시간 신호 웹소켓(/api/stream) 연동 — 신호로 무효화, 폴링은 대비용
- 문서 페이지 명세 탭을 GET /projects/{projectId}/specs로 (featureKey · 버전 · 내용 · 시험지 잠금). 실시간 매핑에 specs 토픽 추가
- 헌법 · 계약 · 결정기록은 탭별로 "API 연결 전" 안내. 목업이 없다고 페이지 전체를 막지 않는다
- 웹소켓: 4401로 거절된 토큰은 기억해 같은 토큰으로 다시 연결하지 않는다 · online 이벤트 때 재연결 대기 중이면 바로 연결
- 400은 다시 보내도 같으므로 재시도하지 않는다
- entities/spec 신설, conventions 슬라이스 목록 갱신(approval · spec)
Closes #42
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…owup feat: 명세 문서 API 연결 · 웹소켓 재연결 보완 · 400 재시도 제외
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🔀 Pull Request Title
NOMOS V 1.0.0 배포