Skip to content

Commit d78dd46

Browse files
docs(tech-specs): address PR #695 review feedback
- Keep @stackflow/compat-await-push: no v2 replacement, independent utility, active usage - Reflect docs accuracy fixes: ActivityLoaderArgs import path, Link animate default, urlPatternOptions removal, ref type - Add resolving-circular-reference deletion, write-plugin lifecycle hook fix, plugin-history-sync v2 update - Consolidate loader-api into preloading, simplify structured-activity examples, fix line highlighting - Add README cleanup for @stackflow/link (remove plugin-preload references) - Add versioned-docs.md tech spec (v1/v2 docs coexistence, separate PR) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 59d9e9c commit d78dd46

6 files changed

Lines changed: 264 additions & 47 deletions

File tree

.tech-specs/future-to-stable-migration.md

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -99,14 +99,19 @@ stackflow({
9999
- `extensions/link/src/stable/` 디렉토리 전체
100100
- `extensions/link/src/future/` 디렉토리 → 내용을 `src/`로 이동
101101

102-
### 1.3 `@stackflow/compat-await-push` (패키지 삭제)
102+
### 1.3 `@stackflow/compat-await-push` (유지)
103103

104-
**현재 상태:** Old API의 `await push()` 패턴을 지원하는 호환 레이어
105-
**변경 계획:** 패키지 전체 삭제 (deprecated)
104+
**현재 상태:** `receive(push(...))` 패턴(다른 Activity에서 데이터를 돌려받는 패턴)을 제공하는 유틸리티 패키지. `resolveMap` 기반 순수 Promise 패턴으로 구현되어 있어 Stackflow 내부 API(stable/future)와 독립적으로 동작
105+
**변경 계획:** **삭제하지 않고 유지**
106106

107-
**삭제 대상:**
108-
- `extensions/compat-await-push/` 디렉토리 전체
109-
- 워크스페이스 설정에서 제거
107+
**유지 사유:**
108+
- Future API(v2)에 `receive(push(...))` 패턴을 대체하는 공식 API가 없음
109+
- Stackflow 내부 API를 import하지 않는 독립 유틸리티 (v1/v2 양쪽과 호환)
110+
- 조직 내 다수의 활성 프로젝트가 의존 중
111+
- 삭제 시 해당 패턴을 사용하는 사용자의 마이그레이션 경로 부재
112+
113+
**후속 작업(별도 트랙):**
114+
- 향후 v2 공식 API로 대체하는 설계 필요 시 별도 RFC/스펙으로 다룬다
110115

111116
### 1.4 `@stackflow/plugin-preload` (패키지 삭제)
112117

@@ -175,7 +180,7 @@ stackflow({
175180
| `@stackflow/link` | `@stackflow/link` (내용 변경) |
176181
| `@stackflow/link/stable` | 삭제 |
177182
| `@stackflow/link/future` | 삭제 (`@stackflow/link`로 통합) |
178-
| `@stackflow/compat-await-push` | 삭제 |
183+
| `@stackflow/compat-await-push` | **유지** (독립 유틸리티) |
179184
| `@stackflow/plugin-preload` | 삭제 (`usePrepare`로 대체) |
180185
| `@stackflow/plugin-map-initial-activity` | 삭제 (`config.initialActivity`로 대체) |
181186

@@ -285,32 +290,31 @@ declare module "@stackflow/config" {
285290

286291
### Phase 3: 패키지 삭제
287292

288-
10. `@stackflow/compat-await-push` - 패키지 삭제, 워크스페이스에서 제거
289-
11. `@stackflow/plugin-preload` - 패키지 삭제, 워크스페이스에서 제거
290-
12. `@stackflow/plugin-map-initial-activity` - 패키지 삭제, 워크스페이스에서 제거
293+
10. `@stackflow/plugin-preload` - 패키지 삭제, 워크스페이스에서 제거
294+
11. `@stackflow/plugin-map-initial-activity` - 패키지 삭제, 워크스페이스에서 제거
291295

292296
### Phase 4: 데모 앱 업데이트
293297

294-
13. `demo/` - import 경로에서 `/future` 제거
295-
14. `demo/` - `compat-await-push`, `plugin-preload`, `plugin-map-initial-activity` 의존성 제거
298+
12. `demo/` - import 경로에서 `/future` 제거
299+
13. `demo/` - `plugin-preload`, `plugin-map-initial-activity` 의존성 제거
296300

297301
### Phase 5: 문서 업데이트
298302

299-
13. Future API 문서를 메인 문서로 통합
300-
14. Get Started / Advanced 문서 재작성
301-
15. 마이그레이션 가이드 작성
302-
16. 네비게이션 구조 업데이트
303+
14. Future API 문서를 메인 문서로 통합
304+
15. Get Started / Advanced 문서 재작성
305+
16. 마이그레이션 가이드 작성
306+
17. 네비게이션 구조 업데이트
303307

304308
### Phase 6: 빌드 설정 정리
305309

306-
17. `esbuild.config.js` - stable/future 분리 빌드 제거
307-
18. `tsconfig.json` - 관련 경로 설정 정리
310+
18. `esbuild.config.js` - stable/future 분리 빌드 제거
311+
19. `tsconfig.json` - 관련 경로 설정 정리
308312

309313
### Phase 7: 버전 및 릴리스
310314

311-
19. Changeset 생성 (major bump)
312-
20. CHANGELOG 업데이트
313-
21. npm deprecate 실행 (`@stackflow/compat-await-push`, `@stackflow/plugin-preload`, `@stackflow/plugin-map-initial-activity`)
315+
20. Changeset 생성 (major bump)
316+
21. CHANGELOG 업데이트
317+
22. npm deprecate 실행 (`@stackflow/plugin-preload`, `@stackflow/plugin-map-initial-activity`)
314318

315319
---
316320

@@ -323,7 +327,6 @@ integrations/react/src/future/ # 코드 이동 후 삭제
323327
integrations/react/src/__internal__/ # 디렉토리 전체 (필요한 코드는 통합 후)
324328
extensions/link/src/stable/ # 디렉토리 전체
325329
extensions/link/src/future/ # 코드 이동 후 삭제
326-
extensions/compat-await-push/ # 패키지 전체
327330
extensions/plugin-preload/ # 패키지 전체
328331
extensions/plugin-map-initial-activity/ # 패키지 전체
329332
docs/pages/api-references/future-api/ # 문서 이동 후 삭제
@@ -357,4 +360,5 @@ docs/pages/docs/migration-v2.ko.mdx # 마이그레이션 가이드 (한국
357360
- **`@stackflow/config` 필수 의존성화** — 기존에는 Future API 사용자만 필요했으나 이제 필수
358361
- **모듈 선언 패턴 강제**`declare module "@stackflow/config"` 패턴이 표준이 됨
359362
- **`__internal__` 코드 제거** — stable/future 양쪽에서 공유하던 내부 유틸리티를 제거하고 필요한 부분만 future 소스에 직접 통합
360-
- **삭제 패키지 3개**`compat-await-push`, `plugin-preload`, `plugin-map-initial-activity` 삭제 후 npm deprecate 실행
363+
- **삭제 패키지 2개**`plugin-preload`, `plugin-map-initial-activity` 삭제 후 npm deprecate 실행
364+
- **`@stackflow/compat-await-push` 유지**`receive(push(...))` 패턴을 제공하며 Stackflow 내부 API와 독립적으로 동작하는 순수 유틸리티. v2에 대체 API가 없고 다수의 프로젝트에서 사용 중이므로 이번 마이그레이션에서는 유지. 향후 공식 대체 API가 설계되면 별도 트랙에서 다룬다

.tech-specs/tasks/01-delete-deprecated-packages.md

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,19 @@
44
55
## 목적
66

7-
Stable API에서만 사용되거나 Future API에 내장된 기능으로 대체된 패키지 3개를 삭제한다.
7+
Future API에 내장된 기능으로 대체된 패키지 2개를 삭제한다.
88

9-
## 삭제 대상
10-
11-
### 1. `@stackflow/compat-await-push`
9+
> **Note:** 초기 계획에서는 `@stackflow/compat-await-push`도 삭제 대상이었으나, 다음 사유로 **유지**한다.
10+
>
11+
> - `receive(push(...))` 패턴을 대체할 공식 API가 v2에 없음
12+
> - Stackflow 내부 API에 의존하지 않는 독립 유틸리티 (`resolveMap` 기반 Promise 패턴) — v1/v2 양쪽과 호환
13+
> - 조직 내 다수 활성 프로젝트가 의존 중
14+
>
15+
> 향후 v2 공식 대체 API가 설계되면 별도 트랙으로 다룬다.
1216
13-
- **경로:** `extensions/compat-await-push/`
14-
- **이유:** Old API의 `await push()` 패턴 호환 레이어. Future API에서는 사용하지 않음
15-
- **작업:**
16-
- `extensions/compat-await-push/` 디렉토리 전체 삭제
17-
- 루트 `package.json` 워크스페이스 설정에서 제거 (해당하는 경우)
18-
- 다른 패키지의 dependency/peerDependency에서 참조 제거
17+
## 삭제 대상
1918

20-
### 2. `@stackflow/plugin-preload`
19+
### 1. `@stackflow/plugin-preload`
2120

2221
- **경로:** `extensions/plugin-preload/`
2322
- **이유:** Future API의 `usePrepare()` 훅으로 대체
@@ -28,7 +27,7 @@ Stable API에서만 사용되거나 Future API에 내장된 기능으로 대체
2827
- 플러그인 문서 삭제: `docs/pages/api-references/plugins/plugin-preload.{en,ko}.mdx`
2928
- `docs/pages/api-references/plugins/_meta.{en,ko}.json`에서 항목 제거
3029

31-
### 3. `@stackflow/plugin-map-initial-activity`
30+
### 2. `@stackflow/plugin-map-initial-activity`
3231

3332
- **경로:** `extensions/plugin-map-initial-activity/`
3433
- **이유:** Future API의 `config.initialActivity`로 대체

.tech-specs/tasks/04-link-promote-future.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,19 @@ export * from "./stable";
6060

6161
- `esbuild.config.js` — stable/future 분리 빌드 엔트리포인트 제거
6262

63+
### 7. `extensions/link/README.md` 업데이트
64+
65+
`README.md`에서 삭제된 `@stackflow/plugin-preload` 관련 내용을 정리한다.
66+
67+
- L7, L9-10, L20 등에서 `plugin-preload`를 peer dependency로 안내하는 부분 제거
68+
- v2 사용법에 맞춰 설치/사용 예시를 `import { Link } from "@stackflow/link"` 기반으로 업데이트
69+
- preload 관련 예시는 `usePrepare()` 기반으로 변경 또는 문서 링크만 유지
70+
6371
## 확인 사항
6472

6573
- [ ] `yarn typecheck` 통과
6674
- [ ] `yarn build` 통과
6775
- [ ] `import { Link } from "@stackflow/link"` 가 future의 Link를 가리킴
6876
- [ ] `@stackflow/link/stable` import 시 에러
6977
- [ ] `@stackflow/link/future` import 시 에러
78+
- [ ] `extensions/link/README.md`에서 `plugin-preload` 언급이 모두 정리됨

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

Lines changed: 89 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,18 @@ Future API 문서를 메인 문서로 통합하고, 기존 문서를 새 API에
1515
- `docs/pages/api-references/future-api/_meta.{en,ko}.json`
1616

1717
**이동:**
18-
- `future-api/loader-api.{en,ko}.mdx``docs/pages/docs/get-started/` 또는 `docs/pages/docs/advanced/`
1918
- `future-api/code-splitting.{en,ko}.mdx``docs/pages/docs/advanced/`
2019
- `future-api/api-pipelining.{en,ko}.mdx``docs/pages/docs/advanced/`
2120
- `future-api/api-pipelining-diagram-1.png` → 함께 이동
2221
- `future-api/config.{en,ko}.mdx``docs/pages/api-references/` 또는 get-started에 통합
2322
- `future-api/changes.{en,ko}.mdx` → 마이그레이션 가이드 작성 시 참고 자료로 활용
2423

24+
**Loader API 문서 통합:**
25+
- `future-api/loader-api.{en,ko}.mdx``docs/pages/docs/advanced/preloading.{en,ko}.mdx` 의 내용이 상당 부분 중복됨
26+
- `loader-api.{en,ko}.mdx` 는 삭제하고, `preloading.{en,ko}.mdx` 에 내용을 통합
27+
- `preloading.{en,ko}.mdx` 제목을 "Loader API"로 변경
28+
- `_meta.{en,ko}.json`에서 `loader-api` 항목 제거, `preloading` 항목 라벨을 "Loader API"로 변경
29+
2530
**최종 삭제:**
2631
- `docs/pages/api-references/future-api/` 디렉토리 전체
2732

@@ -30,13 +35,11 @@ Future API 문서를 메인 문서로 통합하고, 기존 문서를 새 API에
3035
**`docs/pages/api-references/_meta.{en,ko}.json`:**
3136
- `"future-api"` 항목 제거
3237
- 필요시 `"config"` 항목 추가
38+
- **KO 전용:** `@stackflow/config` 엔트리 라벨을 `설정`으로 번역
3339

3440
**`docs/pages/docs/advanced/_meta.{en,ko}.json`:**
3541
- `"code-splitting"`, `"api-pipelining"` 항목 추가
3642

37-
**`docs/pages/docs/get-started/_meta.{en,ko}.json`:**
38-
- `"loader-api"` 항목 추가 (또는 advanced에 배치)
39-
4043
### 3. Get Started 문서 재작성
4144

4245
| 문서 | 변경 내용 |
@@ -52,8 +55,29 @@ Future API 문서를 메인 문서로 통합하고, 기존 문서를 새 API에
5255
| 문서 | 변경 내용 |
5356
|------|----------|
5457
| `history-sync` | Config 기반 라우트 설정으로 변경 (route를 config에 선언) |
55-
| `preloading` | `usePrepare()` 기반으로 전면 재작성, plugin-preload 언급 제거 |
56-
| `write-plugin` | 필요시 업데이트 |
58+
| `preloading` | `usePrepare()` + Loader API 기반으로 전면 재작성, plugin-preload 언급 제거, 제목을 "Loader API"로 변경 |
59+
| `write-plugin` | lifecycle hook 이름 수정 + 오타 교정 (아래 별도 항목) |
60+
61+
**`plugin-history-sync` 문서 v2 업데이트:**
62+
- `docs/pages/api-references/plugins/plugin-history-sync.{en,ko}.mdx` 가 v1 API 패턴을 그대로 사용 중
63+
- `const { Stack, useFlow } = stackflow({ activities: { ... } })` 형태 → config-first 패턴으로
64+
- `routes` 옵션은 이제 `defineConfig()` 의 activity 선언에서 지정
65+
- v2 config-first 패턴으로 전면 업데이트
66+
67+
**`resolving-circular-reference` 문서 삭제:**
68+
- v2에서는 `useFlow``@stackflow/react`에서 직접 import 하므로 순환참조 문제가 발생하지 않음
69+
- 해당 문서가 참조하는 `useActions` API 는 v2에 존재하지 않음
70+
- 삭제 대상:
71+
- `docs/pages/docs/advanced/resolving-circular-reference.en.mdx`
72+
- `docs/pages/docs/advanced/resolving-circular-reference.ko.mdx`
73+
- `docs/pages/docs/advanced/_meta.{en,ko}.json` 에서 해당 항목 제거
74+
75+
**`write-plugin` 문서 수정:**
76+
- 존재하지 않는 lifecycle hook `initialPushedEvent``overrideInitialEvents` 로 교정
77+
- `docs/pages/docs/advanced/write-plugin.en.mdx:261, 272`
78+
- `docs/pages/docs/advanced/write-plugin.ko.mdx:269, 280`
79+
- `write-plugin.ko.mdx:262` 오타 교정
80+
- `G현재 스택의 상태를 가져올 수 있어��``현재 스택의 상태를 가져올 수 있어요`
5781

5882
### 5. 플러그인 문서 정리
5983

@@ -62,8 +86,20 @@ Future API 문서를 메인 문서로 통합하고, 기존 문서를 새 API에
6286
- `docs/pages/api-references/plugins/plugin-map-initial-activity.{en,ko}.mdx`
6387
- `_meta.{en,ko}.json`에서 해당 항목 제거
6488

65-
**수정:**
66-
- `plugins/link.{en,ko}.mdx``createLinkComponent` 제거, 직접 `import { Link }` 패턴으로 변경
89+
**`plugins/link.{en,ko}.mdx` 수정:**
90+
- `createLinkComponent` 제거, 직접 `import { Link } from "@stackflow/link"` 패턴으로 변경
91+
- **`animate` prop 기본값 설명 수정**
92+
- 현재: "If not provided, it defaults to no animation."
93+
- 실제 소스 (`extensions/link/src/Link.tsx:89-99`): `animate`가 undefined/null이면 빈 옵션 `{}`가 push/replace에 전달되어 **기본 애니메이션이 적용**
94+
- 수정 방향: "If not provided, the default animation is applied (same as `animate: true`)."
95+
- **`urlPatternOptions` prop 제거**
96+
- 실제 `LinkProps` (`extensions/link/src/Link.tsx:24-31`)에는 존재하지 않는 prop
97+
- `urlPatternOptions``config.historySync` 에서 내부적으로 사용되는 옵션이며 사용자 prop이 아님
98+
- 문서에서 해당 prop 설명 전체 삭제 (en/ko L47)
99+
- **`ref` 타입 정정**
100+
- 현재: `React.ForwardedRef<HTMLAnchorElement>`
101+
- 실제 소스: `React.RefObject<HTMLAnchorElement>`
102+
- `link.en.mdx:48`, `link.ko.mdx:48` 수정
67103

68104
### 6. 마이그레이션 가이드 작성
69105

@@ -75,10 +111,49 @@ Future API 문서를 메인 문서로 통합하고, 기존 문서를 새 API에
75111
- v1 → v2 마이그레이션 단계별 안내
76112
- API 대응표 (Before/After)
77113
- `changes.{en,ko}.mdx` 내용 통합 및 확장
78-
- 삭제된 패키지 대체 방법
114+
- 삭제된 패키지 대체 방법 (`plugin-preload``usePrepare`, `plugin-map-initial-activity``config.initialActivity`)
79115
- 타입 시스템 변경 (컴포넌트 Props → Config Register)
80116

81-
### 7. 문서 내 "Future API" 언급 일괄 제거
117+
**작성 시 주의점:**
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` |`
122+
123+
### 7. Loader API 관련 문서 import 경로 수정
124+
125+
여러 문서에서 `ActivityLoaderArgs``@stackflow/react`에서 import하도록 안내하고 있으나, 이 타입은 `@stackflow/config`에서만 export된다.
126+
127+
**소스 근거:**
128+
- `config/src/index.ts:4``export * from "./ActivityLoaderArgs"`
129+
- `integrations/react/src/loader/useLoaderData.ts:1``import type { ActivityLoaderArgs } from "@stackflow/config"` (내부 사용만, re-export 없음)
130+
131+
**수정 대상:**
132+
| 파일 | 라인 | 수정 방향 |
133+
|------|------|----------|
134+
| `docs/pages/docs/advanced/loader-api.en.mdx` | L6 | `ActivityLoaderArgs``@stackflow/config`에서 import |
135+
| `docs/pages/docs/advanced/loader-api.ko.mdx` | L6 | 동일 |
136+
| `docs/pages/docs/advanced/preloading.en.mdx` | L12 | 동일 |
137+
| `docs/pages/docs/advanced/preloading.ko.mdx` | L12 | 동일 |
138+
139+
**수정안 (예시):**
140+
```tsx
141+
import type { ActivityLoaderArgs } from "@stackflow/config";
142+
import { useLoaderData } from "@stackflow/react";
143+
```
144+
145+
> 참고: 위 4.의 "Loader API 문서 통합" 작업 시 `loader-api.*.mdx` 는 삭제되므로, 통합 대상인 `preloading.*.mdx` 의 import 경로를 위 기준으로 맞춘다.
146+
147+
### 8. `structured-activity` 문서 개선
148+
149+
- `content` 컴포넌트 예시를 단순화 — `useActivityParams` 대신 매개변수로 `params` 를 직접 받도록 변경
150+
- 페이지 말미의 "API" 섹션은 별도 API 레퍼런스 페이지를 신설할 계획이므로 이번 PR에서 제거
151+
- Line highlighting 정정 (EN/KO 모두)
152+
- Loading State (`Article.tsx`): `{3,7}``{2,6}` (빈 줄/닫는 괄호가 아니라 import와 `loading:` 줄 강조)
153+
- Layout (`Article.tsx`): `{3,4,8,9}``{2,7}` (import와 `layout:` 줄 강조)
154+
- With Loader API (`stackflow.config.ts`): `{8}``{2,9}` (`route`가 아니라 `import articleLoader``loader:` 줄 강조)
155+
156+
### 9. 문서 내 "Future API" 언급 일괄 제거
82157

83158
모든 문서에서:
84159
- "Future API" → 그냥 API (또는 제거)
@@ -92,3 +167,7 @@ Future API 문서를 메인 문서로 통합하고, 기존 문서를 새 API에
92167
- [ ] 깨진 링크 없음
93168
- [ ] EN/KO 양쪽 동기화
94169
- [ ] "future" 또는 "/future" 문자열이 문서에 남아있지 않음
170+
- [ ] `ActivityLoaderArgs` import 경로가 `@stackflow/config` 로 일관되게 수정됨
171+
- [ ] `@stackflow/link` API 레퍼런스가 실제 `LinkProps` 시그니처와 일치
172+
- [ ] `resolving-circular-reference` 문서 및 `_meta` 항목이 모두 제거됨
173+
- [ ] `write-plugin` 의 lifecycle hook 이름이 실제 API와 일치 (`overrideInitialEvents`)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@ Major bump 대상 패키지:
1616
- `@stackflow/core` — 메이저 버전 동기화 (변경 없지만 2.0 생태계 통일)
1717
- `@stackflow/config` — 메이저 버전 동기화
1818

19+
> **Note:** `@stackflow/compat-await-push`는 이번 마이그레이션에서 삭제하지 않으므로 deprecate 대상이 아니다.
20+
1921
### 2. npm deprecate 대상
2022

2123
릴리스 후 실행:
2224
```bash
23-
npm deprecate @stackflow/compat-await-push "Removed in Stackflow 2.0. Use event-based patterns instead."
2425
npm deprecate @stackflow/plugin-preload "Removed in Stackflow 2.0. Use usePrepare() from @stackflow/react instead."
2526
npm deprecate @stackflow/plugin-map-initial-activity "Removed in Stackflow 2.0. Use config.initialActivity instead."
2627
```
@@ -32,7 +33,6 @@ npm deprecate @stackflow/plugin-map-initial-activity "Removed in Stackflow 2.0.
3233
- **BREAKING:** `@stackflow/react``./stable`, `./future` 하위 경로 제거
3334
- **BREAKING:** `@stackflow/link``createLinkComponent` 제거, `Link` 직접 import
3435
- **BREAKING:** `@stackflow/link``./stable`, `./future` 하위 경로 제거
35-
- **REMOVED:** `@stackflow/compat-await-push` 패키지 삭제
3636
- **REMOVED:** `@stackflow/plugin-preload` 패키지 삭제
3737
- **REMOVED:** `@stackflow/plugin-map-initial-activity` 패키지 삭제
3838
- **NEW:** `useLoaderData`, `useConfig`, `usePrepare`, `lazy`, `structuredActivityComponent` 기본 제공

0 commit comments

Comments
 (0)