Skip to content

Commit 5bb66e1

Browse files
docs(tech-specs): address additional PR #695 review feedback
- task 06: add stackflow() destructuring errors (useFlow is not in StackflowOutput) across 8 files, navigating-activities v1 generic pattern, strengthen resolving-circular-reference deletion rationale - task 07: rewrite for Changeset feedback — split per-package changesets, update plugin peer deps to ^2.0.0, add 9 missing breaking changes (react hooks/actions/types, link props/ref) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent d78dd46 commit 5bb66e1

2 files changed

Lines changed: 175 additions & 27 deletions

File tree

.tech-specs/tasks/06-update-docs.md

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,52 @@ Future API 문서를 메인 문서로 통합하고, 기존 문서를 새 API에
4646
|------|----------|
4747
| `installation` | `@stackflow/config` 필수 의존성 추가, `defineConfig()` 소개 |
4848
| `activity` | `defineConfig()` + `stackflow({ config, components })` 패턴으로 변경 |
49-
| `navigating-activities` | `import { useFlow } from "@stackflow/react"` 직접 import 패턴 |
49+
| `navigating-activities` | `import { useFlow } from "@stackflow/react"` 직접 import 패턴. 아래 "타입 패턴 v2 전환" 항목 참조 |
5050
| `navigating-step` | `useStepFlow()` + `pushStep/replaceStep/popStep` 명명 |
5151
| `getting-state` | `useConfig()`, `useLoaderData()` 등 새 훅 추가 |
5252

53+
**`stackflow()` 반환값 destructuring 오류 일괄 수정:**
54+
55+
v2 의 `StackflowOutput` (`integrations/react/src/stackflow.tsx:46-50`) 은 `{ Stack, actions, stepActions }` 만 포함한다. `useFlow` 는 반환값에 **없으며** `@stackflow/react` 에서 독립 훅으로 export 된다. demo 도 `const { Stack, actions } = stackflow(...)` 패턴을 따르고 있다.
56+
57+
여러 문서가 아직 v1 패턴(`const { Stack, useFlow } = stackflow(...)`) 또는 잘못된 destructuring(`const { useFlow } = stackflow(...)`) 을 그대로 쓰고 있다. 아래 대상을 일괄 수정한다.
58+
59+
| 파일 | 라인 |
60+
|------|------|
61+
| `docs/pages/docs/get-started/installation.en.mdx` | L40, L70 |
62+
| `docs/pages/docs/get-started/installation.ko.mdx` | L40, L71 |
63+
| `docs/pages/docs/get-started/activity.en.mdx` | L81 |
64+
| `docs/pages/docs/get-started/activity.ko.mdx` | L84 |
65+
| `docs/pages/docs/advanced/history-sync.en.mdx` | L43 |
66+
| `docs/pages/docs/advanced/history-sync.ko.mdx` | L43 |
67+
| `docs/pages/docs/migration-v2.en.mdx` | L52 ("After" 섹션) |
68+
| `docs/pages/docs/migration-v2.ko.mdx` | L52 ("변경 후" 섹션) |
69+
70+
**수정 방향:**
71+
- `const { Stack } = stackflow({ config, components })` 형태로 축소
72+
- `useFlow` 는 별도 줄에서 `import { useFlow } from "@stackflow/react"` 로 안내
73+
- 필요 시 `actions`, `stepActions` 는 그대로 destructuring 가능 (정적 유틸)
74+
75+
**`navigating-activities` 타입 패턴 v2 전환:**
76+
77+
`navigating-activities.en.mdx:L141-145`, `navigating-activities.ko.mdx:L143-147` 이 아래와 같은 v1 패턴(params 객체 타입 직접 전달) 을 그대로 쓰고 있다.
78+
79+
```tsx
80+
type ArticleParams = { title: string; };
81+
const Article: ActivityComponentType<ArticleParams> = ({ params }) => {
82+
```
83+
84+
v2 의 `ActivityComponentType` 은 **activity 이름의 string literal** 만 수용한다. module augmentation 으로 Register 확장 후 `ActivityComponentType<"Article">` 로 변경한다.
85+
86+
```tsx
87+
declare module "@stackflow/config" {
88+
interface Register {
89+
Article: { title: string };
90+
}
91+
}
92+
const Article: ActivityComponentType<"Article"> = ({ params }) => {
93+
```
94+
5395
### 4. Advanced 문서 업데이트
5496
5597
| 문서 | 변경 내용 |
@@ -66,7 +108,7 @@ Future API 문서를 메인 문서로 통합하고, 기존 문서를 새 API에
66108
67109
**`resolving-circular-reference` 문서 삭제:**
68110
- v2에서는 `useFlow``@stackflow/react`에서 직접 import 하므로 순환참조 문제가 발생하지 않음
69-
- 해당 문서가 참조하는 `useActions` API 는 v2에 존재하지 않음
111+
- 문서가 참조하는 `useActions` `@stackflow/react` exports 에 존재하지 않는 API (`resolving-circular-reference.{en,ko}.mdx:L22-27``import { useActions } from "@stackflow/react"` 예시가 import 에러를 유발)
70112
- 삭제 대상:
71113
- `docs/pages/docs/advanced/resolving-circular-reference.en.mdx`
72114
- `docs/pages/docs/advanced/resolving-circular-reference.ko.mdx`
@@ -115,10 +157,10 @@ Future API 문서를 메인 문서로 통합하고, 기존 문서를 새 API에
115157
- 타입 시스템 변경 (컴포넌트 PropsConfig Register)
116158

117159
**작성 시 주의점:**
118-
- "Before" 예시가 묵시적 파일 경로(`./stackflow`) 에 의존하지 않도록, `stackflow()` 팩토리에서 `useFlow`를 destructuring하여 export하는 전체 맥락을 보여줄 것
119-
- API 대응표에서도 `./stackflow` 표기 대신 `stackflow()` 팩토리 반환값임을 명시
120-
- Before: `| `useFlow()` from `./stackflow` | `useFlow()` from `@stackflow/react` |`
121-
- After: `| `useFlow()` (returned from `stackflow()` factory) | `useFlow()` from `@stackflow/react` |`
160+
- v1`useFlow``stackflow()` 반환값이 아니라 **사용자 프로젝트의 `stackflow.ts` 파일** 에서 직접 export 하는 패턴이 관용적이었다 (예: `const { useFlow } = stackflow(...); export { useFlow }`). "Before" 예시가 `./stackflow` 라는 묵시적 파일 경로에 의존하지 않도록, 해당 파일에서 `useFlow` 를 재-export 하는 전체 맥락(파일명, 선언 위치) 을 함께 보여줄 것
161+
- v2`stackflow()` 반환값(`StackflowOutput`) 은 `{ Stack, actions, stepActions }` 만 포함하며, `useFlow`**별도 훅**으로 `@stackflow/react` 에서 import"After" 예시가 이 구분을 명확히 드러내야 함
162+
- API 대응표도 `./stackflow` (사용자 파일) → `@stackflow/react` (라이브러리) 임을 명시
163+
- Before: `| `useFlow()` (사용자 `./stackflow` 파일에서 재-export) | `useFlow()` from `@stackflow/react` |`
122164

123165
### 7. Loader API 관련 문서 import 경로 수정
124166

@@ -171,3 +213,5 @@ import { useLoaderData } from "@stackflow/react";
171213
- [ ] `@stackflow/link` API 레퍼런스가 실제 `LinkProps` 시그니처와 일치
172214
- [ ] `resolving-circular-reference` 문서 및 `_meta` 항목이 모두 제거됨
173215
- [ ] `write-plugin`lifecycle hook 이름이 실제 API와 일치 (`overrideInitialEvents`)
216+
- [ ] 모든 문서에서 `const { Stack, useFlow } = stackflow(...)` / `const { useFlow } = stackflow(...)` 같은 잘못된 destructuring 이 제거됨 (실제 `StackflowOutput``{ Stack, actions, stepActions }` 만 포함)
217+
- [ ] `navigating-activities``ActivityComponentType<ObjectType>` v1 패턴이 `ActivityComponentType<"ActivityName">` + Register augmentation 으로 전환됨

.tech-specs/tasks/07-changesets-release.md

Lines changed: 125 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,41 +4,145 @@
44
55
## 목적
66

7-
모든 파괴적 변경에 대한 Changeset을 생성하고, v2.0.0 릴리스를 준비한다.
7+
모든 파괴적 변경에 대한 Changeset을 **패키지별로 분리해 생성**하고, 영향받는 하위 플러그인 패키지의 peer dependency 를 v2 범위로 업데이트하며, v2.0.0 릴리스를 준비한다.
88

99
## 작업
1010

11-
### 1. Changeset 생성
11+
### 1. Changeset 파일 분리
1212

13-
Major bump 대상 패키지:
14-
- `@stackflow/react` — API 전면 변경
15-
- `@stackflow/link` — API 전면 변경
16-
- `@stackflow/core` — 메이저 버전 동기화 (변경 없지만 2.0 생태계 통일)
17-
- `@stackflow/config` — 메이저 버전 동기화
13+
#### 배경
1814

19-
> **Note:** `@stackflow/compat-await-push`는 이번 마이그레이션에서 삭제하지 않으므로 deprecate 대상이 아니다.
15+
현재 PR 에는 `.changeset/nine-rabbits-jam.md` 한 파일에 `@stackflow/react`, `@stackflow/link`, `@stackflow/config`, `@stackflow/core` 4개 패키지가 **같은 frontmatter 에 묶여** 있다.
2016

21-
### 2. npm deprecate 대상
17+
Changesets 툴은 frontmatter 에 나열된 모든 패키지에 **동일한 본문 전체**를 CHANGELOG 로 주입한다. 이대로 릴리스하면:
18+
19+
- `@stackflow/core` CHANGELOG 에 `@stackflow/react` breaking changes 전체가 주입됨 (core 는 사실상 변경 없음)
20+
- `@stackflow/link` CHANGELOG 에도 `@stackflow/react` 내용이 그대로 복사됨
21+
- 사용자가 각 패키지 CHANGELOG 만 보고 어떤 변경이 본인 패키지에 해당하는지 판단하기 어려움
22+
23+
#### 분리 방침
24+
25+
패키지별로 changeset 을 분리한다. 최소 3개 파일로 쪼개는 것을 권장:
26+
27+
| Changeset 파일 | 대상 패키지 | 본문 |
28+
|---|---|---|
29+
| `.changeset/react-v2.md` | `@stackflow/react: major` | react 관련 BC 전체 (아래 § 4 참조) |
30+
| `.changeset/link-v2.md` | `@stackflow/link: major` | link 관련 BC 전체 |
31+
| `.changeset/core-config-v2.md` | `@stackflow/core: major`, `@stackflow/config: major` | "Major version bump for 2.0 ecosystem alignment. No API changes in this package." |
32+
33+
> 필요 시 `@stackflow/config` 도 별도 파일로 분리해도 되며, core/config 가 함께 동일 내용을 공유하는 경우에만 묶는다.
34+
35+
#### 기존 파일 처리
36+
37+
- `.changeset/nine-rabbits-jam.md` 는 삭제
38+
- 본문에서 `@stackflow/compat-await-push` 관련 "Removed packages" 문구는 전부 제거 (유지 결정 반영)
39+
40+
### 2. 하위 플러그인 패키지 Changeset 및 peer dependency 업데이트
41+
42+
#### 누락된 changeset
43+
44+
아래 패키지들은 이 마이그레이션 과정에서 `@stackflow/react` 의 import 를 실제로 변경(`useActions``useFlow`, `@stackflow/react/future``@stackflow/react` 등) 했음에도 changeset 에 포함되어 있지 않다.
45+
46+
- `@stackflow/plugin-basic-ui`
47+
- `@stackflow/plugin-blocker`
48+
- `@stackflow/plugin-history-sync`
49+
- `@stackflow/plugin-lifecycle`
50+
- (추가 대상: `@stackflow/plugin-renderer-basic`, `@stackflow/plugin-renderer-web`, `@stackflow/plugin-devtools`, `@stackflow/plugin-sentry`, `@stackflow/plugin-stack-depth-change`, `@stackflow/plugin-google-analytics-4`, `@stackflow/react-ui-core` 등 — 실제 diff 확인 후 결정)
51+
52+
각 패키지에 **최소 patch bump** changeset 을 추가하고, 본문에 "Updated for `@stackflow/react` v2 compatibility (import paths, hook migrations)." 같은 한 줄 요약을 남긴다.
53+
54+
> Bump 규모 판단 기준: 외부 API 가 바뀌면 minor/major, 내부 구현만 바뀌면 patch. 대부분의 플러그인은 patch 로 충분하나, `plugin-history-sync` 처럼 사용자 API 가 config-first 로 바뀌었다면 major 또는 minor 를 고려한다.
55+
56+
#### peer dependency 범위 업데이트
57+
58+
위 플러그인 패키지들의 `peerDependencies` 가 대부분 `"@stackflow/react": "^1.x"` 로 선언되어 있다. `@stackflow/react` v2 가 릴리스되면 peer dep 이 불충족되어 사용자 프로젝트에서 설치 경고/에러가 발생한다.
59+
60+
각 플러그인 `package.json``peerDependencies` 를 v2 범위로 업데이트:
61+
62+
```jsonc
63+
// Before
64+
"peerDependencies": {
65+
"@stackflow/react": "^1.0.0"
66+
}
67+
68+
// After — 하나의 major 만 지원하는 경우
69+
"peerDependencies": {
70+
"@stackflow/react": "^2.0.0"
71+
}
72+
```
73+
74+
> `@stackflow/core`, `@stackflow/config` 에 대한 peer dep 도 동일하게 확인해 v2 범위로 올린다.
75+
76+
### 3. `@stackflow/compat-await-push` 관련 Changeset 본문 정리
77+
78+
- changeset 본문 "Removed packages" 섹션에서 `@stackflow/compat-await-push` 항목 제거
79+
- `@stackflow/compat-await-push` 에 대한 changeset 도 **생성하지 않음** (deprecate 대상이 아니고 버전 bump 도 이번에는 하지 않음 — 추후 독립 트랙에서 처리)
80+
81+
### 4. CHANGELOG 주요 항목 (패키지별)
82+
83+
#### `@stackflow/react` — Major
84+
85+
**Signature / Entry point**
86+
- **BREAKING:** `stackflow()` 입력 시그니처 변경 — `StackflowOptions<T extends BaseActivities>``StackflowInput<T, R>` (`{ activities, transitionDuration }``{ config, components }`)
87+
- **BREAKING:** `stackflow()` 출력 시그니처 변경 — `StackflowOutput<T>``StackflowOutput` (제네릭 파라미터 제거)
88+
- 제거된 반환 필드: `activities`, `useFlow`, `useStepFlow`, `addActivity`, `addPlugin`
89+
- 추가된 반환 필드: `stepActions`
90+
- 최종 구조: `{ Stack, actions, stepActions }`
91+
- **BREAKING:** `./stable`, `./future` 하위 경로 export 제거 — 기본 경로로 통합
92+
93+
**Hooks / Actions**
94+
- **BREAKING:** `useActions`, `useStepActions` 제거 → `useFlow`, `useStepFlow` 사용 (훅 import 경로는 `@stackflow/react`)
95+
- **BREAKING:** `useActiveEffect`, `useEnterDoneEffect`, `useStep` 훅 제거
96+
- **BREAKING:** `stackflow().actions` 에서 `getStack()`, `dispatchEvent()` 제거 — 새 `Actions` 타입은 `push`, `replace`, `pop` 만 노출
97+
- **BREAKING:** step actions 를 `stepActions` 객체로 분리 — 접근 경로가 `stackflow().actions.stepPush``stackflow().stepActions.pushStep` 등으로 변경 (이름 변경 + 구조 변경)
98+
99+
**Type generics**
100+
- **BREAKING:** `useActivityParams` 제네릭 인터페이스 변경 — 기존 `useActivityParams<{ key: string | undefined }>()` (params 객체 타입 직접 전달) → 신규 `useActivityParams<"ActivityName">()` (activity 이름 문자열 리터럴 전달, `@stackflow/config` Register 에서 타입 추론)
101+
- **BREAKING:** `ActivityComponentType` 제네릭 인터페이스 변경 — 기존 `ActivityComponentType<{ title: string }>` → 신규 `ActivityComponentType<"ArticleActivity">`. 기존 params 객체 타입 기반 API 는 `ActivityComponentTypeByParams` 로 rename
102+
103+
**New**
104+
- **NEW:** `useLoaderData`, `useConfig`, `usePrepare`, `lazy`, `structuredActivityComponent` 기본 제공
105+
106+
#### `@stackflow/link` — Major
107+
108+
- **BREAKING:** `createLinkComponent` factory 제거 — `Link` 컴포넌트를 직접 import (`import { Link } from "@stackflow/link"`)
109+
- **BREAKING:** `./stable`, `./future` 하위 경로 export 제거 — 기본 경로로 통합
110+
- **BREAKING:** `LinkProps.urlPatternOptions` prop 제거 — 기존 stable Link 에서 제공하던 prop 이 새 Link 에서 사라짐 (해당 옵션은 `config.historySync` 에서만 설정)
111+
- **BREAKING:** `Link``forwardRef` 를 사용하지 않음 — ref 타입이 `React.ForwardedRef<HTMLAnchorElement>``React.RefObject<HTMLAnchorElement>` 로 변경
112+
113+
#### `@stackflow/core`, `@stackflow/config` — Major
114+
115+
- "Major version bump for 2.0 ecosystem alignment. No API changes in this package."
116+
117+
#### 기타 플러그인 패키지 (patch/minor, 영향 범위별)
118+
119+
- "Updated for `@stackflow/react` v2 compatibility (import paths, hook migrations)."
120+
- `plugin-history-sync` 는 사용자 API (`routes` → config-first) 변경이 있을 경우 minor/major 로 상향 고려
121+
122+
#### Removed packages
123+
124+
- **REMOVED:** `@stackflow/plugin-preload``usePrepare()` hook 으로 대체
125+
- **REMOVED:** `@stackflow/plugin-map-initial-activity``config.initialActivity` 로 대체
126+
127+
> **Note:** `@stackflow/compat-await-push` 는 이번 마이그레이션에서 삭제하지 않으므로 changeset / CHANGELOG / deprecate 대상이 아니다.
128+
129+
### 5. npm deprecate 대상
22130

23131
릴리스 후 실행:
24132
```bash
25133
npm deprecate @stackflow/plugin-preload "Removed in Stackflow 2.0. Use usePrepare() from @stackflow/react instead."
26134
npm deprecate @stackflow/plugin-map-initial-activity "Removed in Stackflow 2.0. Use config.initialActivity instead."
27135
```
28136

29-
### 3. CHANGELOG 주요 항목
30-
31-
- **BREAKING:** `@stackflow/react``stackflow()` 시그니처 변경 (`{ activities }``{ config, components }`)
32-
- **BREAKING:** `@stackflow/react``useActions`, `useStepActions` 제거 → `useFlow`, `useStepFlow` 사용
33-
- **BREAKING:** `@stackflow/react``./stable`, `./future` 하위 경로 제거
34-
- **BREAKING:** `@stackflow/link``createLinkComponent` 제거, `Link` 직접 import
35-
- **BREAKING:** `@stackflow/link``./stable`, `./future` 하위 경로 제거
36-
- **REMOVED:** `@stackflow/plugin-preload` 패키지 삭제
37-
- **REMOVED:** `@stackflow/plugin-map-initial-activity` 패키지 삭제
38-
- **NEW:** `useLoaderData`, `useConfig`, `usePrepare`, `lazy`, `structuredActivityComponent` 기본 제공
39-
40137
## 확인 사항
41138

42139
- [ ] `yarn changeset` 정상 실행
43-
- [ ] 모든 breaking change가 changeset에 기록됨
140+
- [ ] Changeset 파일이 패키지별로 분리되어 있음 (한 파일에 여러 패키지의 서로 다른 본문이 섞이지 않음)
141+
- [ ] `@stackflow/compat-await-push` 관련 Removed 문구가 어떤 changeset 에도 없음
142+
- [ ] 하위 플러그인 패키지(`plugin-basic-ui`, `plugin-blocker`, `plugin-history-sync`, `plugin-lifecycle` 등) 의 changeset 과 peer dep 범위(`@stackflow/react ^2.0.0`) 가 모두 업데이트됨
143+
- [ ] CHANGELOG 주요 항목에 아래 9건의 추가 BC 가 모두 기록됨
144+
- react: (1) `useActiveEffect`/`useEnterDoneEffect`/`useStep` 제거, (2) `stackflow().activities` 제거, (3) `actions.getStack/dispatchEvent` 제거, (4) `stepActions` 분리
145+
- link: (5) `urlPatternOptions` 제거, (6) `forwardRef` 미사용 (ref 타입 변경)
146+
- react types: (7) `useActivityParams` 제네릭 변경, (8) `ActivityComponentType` 제네릭 변경, (9) `stackflow()` 입출력 타입 변경
147+
- [ ] 모든 breaking change 가 올바른 패키지의 changeset 에만 기록됨 (교차 오염 없음)
44148
- [ ] `yarn release` dry-run 정상

0 commit comments

Comments
 (0)