@flextudio/scenario 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +85 -208
  2. package/package.json +1 -1
  3. package/skill/SKILL.md +1 -0
package/README.md CHANGED
@@ -1,260 +1,137 @@
1
- # @flextudio/scenario
1
+ # Flextudio-CLI
2
2
 
3
- flextudio meta-contract v1 시나리오를 **MCP 서버 없이** Claude Code Skill + 자체 CLI 만으로 생성하고 검증한다.
3
+ ## 소개
4
4
 
5
- ## 2종 빌드 프로파일 (단일 소스)
5
+ Flextudio Scenario CLI Claude Code 같은 AI 코딩 에이전트로 flextudio meta-contract v1 시나리오를 쉽게 작성할 수 있는 도구
6
6
 
7
- > **배포는 항상 base(otel 없음).** otel 프로파일은 벤치 트레이싱 전용이며 배포 산출물이 아니다.
8
-
9
- | 프로파일 | 패키지명 | otel | 용도 |
10
- |---|---|---|---|
11
- | **base** (기본·배포) | `@flextudio/scenario` | 없음 | 배포 — 사람들이 `npm i -g` 해서 직접 쓰는 일반 버전 |
12
- | **otel** | `@flextudio/scenario-gen-otel` | 포함(@opentelemetry/* + collector) | 벤치 트레이스 span 방출 전용 (**배포 아님**) |
7
+ ## 1. 설치
13
8
 
14
9
  ```bash
15
- # repo 루트에서
16
- npm run pack # 배포용 = base alias (otel 없음) → flextudio-scenario-gen-0.1.0.tgz
17
- npm run pack:base # 위와 동일 (명시)
18
- npm run pack:otel # 벤치 전용, 배포 아님 → flextudio-scenario-gen-otel-0.1.0.tgz
10
+ npm i -g @flextudio/scenario
19
11
  ```
20
12
 
21
- **스킬/커맨드는 "설치한 폴더" 로컬에, schema 데이터는 전역에.** `npm i -g` 를 실행한 폴더(npm `INIT_CWD`)에 한 번이면:
22
- - `<설치폴더>/.claude/skills/scenario-gen/` 에 SKILL.md + 펼친 자산 배치 (그 폴더에서 Claude Code 가 자동 인식)
23
- - `<설치폴더>/.claude/commands/flex-spec.md` 에 `/flex-spec` 슬래시 커맨드 배치
24
- - `~/.flex-scenario/contract-root/` 에 schema/+rules.md/+catalog.json/+examples 진실원본 복사 (**전역 1개 공유** — 없으면 글로벌 패키지 내부 `contract-data/` 폴백)
25
- - (otel 프로파일만) `~/.flex-scenario/otel-collector.yaml` 에 OTel Collector 템플릿 배치
26
- - 전역 PATH 에 `flex-scenario` 실행 파일 등록
13
+ ## 2. 빠른 시작
27
14
 
28
- > **다른 폴더에서 쓰려면** 그 폴더로 이동해 `flex-scenario init` 을 한 번 실행 → 그 폴더의 `.claude/` 에 복제된다.
29
- > 전역 `~/.claude` 는 건드리지 않는다(홈에서 `npm i -g` 한 경우만 예외 — 경고 출력). `uninstall` 삭제 범위
30
- > 메뉴(현재 폴더/모든 설치 폴더/완전 삭제)로 전역 receipt 의 설치 폴더를 정리하고, 완전 삭제는
31
- > `npm uninstall -g` 까지 자동 실행한다.
15
+ ```bash
16
+ # 0) 작업할 폴더에서 환경 세팅
17
+ cd my-project
18
+ fscn init
32
19
 
33
- ## 버전별 사용법 정리 (base / otel)
20
+ # 1) 로그인 (브라우저 OIDC 인증 → 워크스페이스 선택)
21
+ fscn login
34
22
 
35
- > **글로벌엔 하나만.** 패키지는 같은 bin(`flex-scenario`)·같은 전역 경로(`~/.flex-scenario`)
36
- > 폴더 로컬 `.claude/skills/scenario-gen` 규칙을 공유하므로 동시에 글로벌 설치하면 서로 덮어쓴다.
37
- > 역할이 처음부터 분리돼 있다 — **base = 사람 설치 / otel = repo 안 벤치 전용(글로벌 설치 안 함)**.
23
+ # 2) Claude Code 에서 화면 요청 시나리오 JSON 생성 및 시나리오 생성 (아래 "시나리오 만들기" 참고)
24
+ claude
25
+ > 휴가신청 화면 만들어줘
38
26
 
39
- ### A. base (일반 — 사람들이 직접 사용)
27
+ # 3) 시나리오 검증
28
+ fscn validate my-scenario.json
40
29
 
41
- ```bash
42
- # 1) 빌드 (repo 루트)
43
- npm run pack:base # → cli/flextudio-scenario-gen-0.1.0.tgz
44
-
45
- # 2) 설치 — 스킬/커맨드는 "지금 있는 폴더"의 .claude 에 깔린다. 먼저 쓸 프로젝트로 이동:
46
- cd /path/to/your-project
47
- npm i -g <repo>/cli/flextudio-scenario-gen-0.1.0.tgz # base 엔 protobufjs 없음 → postinstall 자동 실행
48
- # ↳ 어떤 의존 postinstall 이 깨지면: --ignore-scripts 붙이고 → 그 폴더에서 flex-scenario init
49
-
50
- # 3) 사용
51
- # (a) claude 터미널에서 자연어: "휴가신청 화면 만들어줘" → scenario-gen 스킬 자동 발동
52
- # (b) CLI 직접:
53
- flex-scenario validate <scenario.json> # 전체 검증
54
- flex-scenario catalog --section controlTypes
55
- flex-scenario examples list / cat <relpath>
56
- flex-scenario gen --input case.md --out out.json # 비대화형 생성 (트레이싱 없음)
57
- flex-scenario doctor # otel 항목은 ○ optional 로 표시
58
-
59
- # 다른 폴더에서도 쓰려면 — 그 폴더로 이동해 한 번 실행 (그 폴더의 .claude 에 복제)
60
- cd /path/to/another-project && flex-scenario init
61
-
62
- # 4) 삭제 — 한 번이면 끝. 삭제 범위 메뉴(현재 폴더/모든 설치 폴더/완전 삭제/취소)
63
- flex-scenario uninstall # "완전 삭제" 선택 시 cleanup + npm uninstall -g 자동
30
+ # 4) 검증 통과한 시나리오를 서버에 생성
31
+ fscn create --file my-scenario.json
64
32
  ```
65
33
 
66
- - 스킬/커맨드는 **설치/`init` 폴더의 `.claude/` 에만** 있다. 폴더(또는 하위)에서 Claude Code 열어야 인식된다. 전역 `~/.claude` 건드리지 않는다.
67
-
68
- ### B. otel (벤치 — repo 안에서만)
34
+ > `init` 폴더에 **환경을 세팅**합니다. `npm i -g` 직후엔 설치 명령을 폴더에 자동 세팅되며, **다른 작업 폴더**에서 쓰려면 그 폴더에서 `fscn init` 실행합니다.
69
35
 
70
- otel 버전은 **글로벌 설치하지 않는다.** 벤치는 워크스페이스 bin 을 직접 호출하고, 워크스페이스엔 `otel-common` 이 이미 링크돼 있어 트레이싱이 자동으로 가능하다.
36
+ ## 3. 시나리오 만들기
71
37
 
72
- ```bash
73
- # 1) 1회 세팅 (project-local — ~/.claude·글로벌 안 건드림)
74
- ./bench/setup-bench.sh
75
-
76
- # 2) 실행 (병렬 OK). 기본은 트레이싱 OFF
77
- ./bench/run-case.sh flex-cli-skill L1-01
38
+ `fscn init` 으로 세팅된 폴더에서 **Claude Code 에게 만들고 싶은 화면을 자연어로 요청**하면, 함께 설치된 `scenario-gen` 스킬이 자동으로 발동해 시나리오 메타를 생성합니다.
78
39
 
79
- # 트레이스를 보고 싶으면: Phoenix 띄우고 telemetry ON
80
- ./bench/scripts/start.sh
81
- BENCH_DISABLE_TELEMETRY=0 ./bench/run-case.sh flex-cli-skill L1-01
40
+ ```
41
+ cd my-project # fscn init 해둔 폴더
42
+ claude # Claude Code 실행
82
43
 
83
- # 3) 정리
84
- ./bench/teardown-bench.sh
85
- ./bench/scripts/stop.sh # Phoenix 내렸을
44
+ > 휴가신청 화면 만들어줘
45
+ > 거래처 리스트-상세 화면 만들어줘
46
+ > (엑셀 화면정의서/캡처 이미지를 첨부하며) 이대로 화면 만들어줘
86
47
  ```
87
48
 
88
- - `npm run pack:otel` 로 만드는 `@flextudio/scenario-gen-otel` tgz 는 **벤치/외부 트레이스 전용** 산출물이다 — **배포 대상이 아니다(배포는 항상 base).** 굳이 글로벌로 쓰려면 `npm i -g ./cli/flextudio-scenario-gen-otel-0.1.0.tgz --ignore-scripts && flex-scenario init` (otel transitive `protobufjs` 때문에 `--ignore-scripts` 필요). 단 위 경고대로 **base 와 동시 글로벌 설치는 불가**.
49
+ ### 스펙 기반 생성
50
+
51
+ 바로 생성하는 대신 **중간 스펙을 먼저 만들어** 마스터-디테일·키·데이터연결을 확정한 뒤 그 스펙대로 생성하면 더 정확한 결과물을 생성할 수 있습니다.
89
52
 
90
- ## cli/skill 구성 authored(관리) vs 자동생성(빌드)
53
+ - **Claude Code**: `/flex-spec` 커맨드에 프롬프트(화면 요청·화면정의서·데이터구조, 엑셀/캡처 이미지 첨부 가능) 주면, 스펙을 생성해 **데이터연결이 확정된 상태로** 시나리오를 만듭니다.
91
54
 
92
- `cli/skill/` 안은 두 종류가 섞여 있다. **authored 만 손으로 고치고, 자동생성은 ①계약코어 원본을 고친 뒤 재빌드**한다.
55
+ ```
56
+ > /flex-spec 거래처 리스트-상세 화면 만들어줘
57
+ > /flex-spec (화면정의서 캡처 이미지를 첨부하며) 이대로 만들어줘
58
+ ```
93
59
 
94
- | 구분 | 항목 | 어디서 관리 |
95
- |---|---|---|
96
- | **authored (직접 수정)** | `SKILL.md`, `references/**` | `cli/skill/` 안에서 직접 편집 (빌드 비대상, git 추적) |
97
- | **자동생성 (빌드 산출 · 직접수정 금지 · gitignore)** | `docs/` `schemas/` `patterns/` `examples/` `skill-guides/` `catalog.json` `rules.md` `README.md` `design-rules.md` `design-system.md` `intent-rules.md` `intent-system.md` | `scripts/build-skill-payload.mjs` 가 루트 ①영역에서 펼침 |
60
+ - **Codex / Antigravity**: 프롬프트에 **스펙을 생성해서 진행해달라**고 요청하면, 스펙을 어느 정도 생성한 뒤 진행해 더 나은 결과물이 나옵니다.
98
61
 
99
- 자동생성 항목의 **진짜 원본**(여기를 고침):
62
+ ```
63
+ > 거래처 리스트-상세 화면, 스펙을 먼저 생성해서 진행해줘
64
+ ```
100
65
 
101
- | skill 산출물 | 원본 (repo 루트) |
102
- |---|---|
103
- | `schemas/` | `schema/v1/**/*.schema.json` |
104
- | `docs/` | `schema/v1/**/*.md` |
105
- | `patterns/` | `core/contract.mjs` (`listPatterns`/`getPattern`) |
106
- | `examples/` | `examples/**` |
107
- | `skill-guides/` | `skill-guides/**` (루트 별도 관리 폴더) |
108
- | `catalog.json` `rules.md` | `spec/catalog.json` `spec/rules.md` |
109
- | `design-rules.md` `design-system.md` | `schema/v1/design-system/{DESIGN,README}.md` |
110
- | `intent-rules.md` `intent-system.md` | `runtime/v1/intent-system/{INTENT,README}.md` |
66
+ 해당 메타로 시나리오 생성 방법은 아래와 같습니다.
111
67
 
112
68
  ```bash
113
- # 원본 수정 재빌드 (= node cli/scripts/build-skill-payload.mjs)
114
- npm run build:skill
69
+ fscn create --file <생성된 파일>.json
115
70
  ```
116
71
 
117
- > 전체 "빌드 산출물 ↔ 원본" 매핑·전파 절차의 단일 진실원본은 [../SOURCE-MAP.md](../SOURCE-MAP.md).
72
+ ## 4. 명령어
118
73
 
119
- ## 설치
74
+ ### 환경 세팅
120
75
 
121
76
  ```bash
122
- # 옵션 1: npm 전역 (base — 일반 사용)
123
- npm i -g @flextudio/scenario --ignore-scripts
124
- flex-scenario init
125
-
126
- # 옵션 2: 로컬 tarball
127
- npm run pack:base # repo 루트에서 → cli/flextudio-scenario-gen-0.1.0.tgz
128
- npm i -g ./cli/flextudio-scenario-gen-0.1.0.tgz --ignore-scripts
129
- flex-scenario init
130
-
131
- # 옵션 3: npx 즉시 실행
132
- npx @flextudio/scenario doctor
77
+ fscn init # 현재 폴더에 스킬/커맨드 배치 (환경 세팅)
78
+ fscn doctor # 세팅 점검 — 에이전트 / SKILL.md / contract-root / core 모듈
133
79
  ```
134
80
 
135
- > **왜 `--ignore-scripts` 인가?**
136
- > OTel transitive 의존성인 `protobufjs@7.6.0` 의 npm registry tarball 에 `scripts/postinstall.js`
137
- > 가 빠져 있어 (registry 패키징 버그) 글로벌 install 시점에 그 패키지의 postinstall
138
- > hook 이 `Cannot find module` 으로 깨진다. 우리 패키지는 그 파일을 실제로 필요로
139
- > 하지 않으므로 `--ignore-scripts` 로 모든 의존성 postinstall 을 차단하고, 그 직후
140
- > `flex-scenario init` 으로 우리만의 postinstall (skill 배치 + contract-root 복사 등)
141
- > 을 수동 실행한다. 동일 효과, 깨지지 않음.
81
+ - `npm i -g @flextudio/scenario` 직후엔 설치 명령을 친 폴더에 자동 세팅됩니다. **다른 작업 폴더**에서 쓰려면 그 폴더에서 `fscn init` 을 실행합니다.
142
82
 
143
- 설치 직후 자동으로 다음이 출력됩니다 (base 프로파일 예 — collector 줄은 otel 프로파일만):
144
-
145
- ```
146
- ✔ /Users/<you>/.claude/skills/scenario-gen
147
- ✔ /Users/<you>/.flex-scenario/contract-root
148
- · otel collector 템플릿 없음 (base 프로파일) — skip
83
+ ### 인증
149
84
 
150
- next step: flex-scenario doctor
85
+ ```bash
86
+ fscn login # 브라우저 OIDC 로그인
87
+ fscn logout # 로그아웃
151
88
  ```
152
89
 
153
- ## 서브커맨드
154
-
155
- | 명령 | 역할 |
156
- |---|---|
157
- | `flex-scenario init` | postinstall 을 수동 재실행 |
158
- | `flex-scenario gen --input <case.md> --out <scenario.json>` | claude -p 를 spawn → stream-json → (otel 프로파일이면 OTel adapter) → 결과 파일. base 프로파일은 트레이싱 없이 동작 |
159
- | `flex-scenario validate <file>` | 전체 시나리오 검증 (ajv + cross-check 21종) |
160
- | `flex-scenario validate --schema <name> <file>` | 단편 검증 |
161
- | `flex-scenario catalog --section <name>` | catalog.json 의 한 섹션 출력 |
162
- | `flex-scenario examples list / cat <relpath>` | examples 디렉토리 트리 / 본문 |
163
- | `flex-scenario trace ui` | Phoenix 기동 안내 (docker run …) |
164
- | `flex-scenario doctor` | claude / OTel endpoint / SKILL.md / contract-core 점검 |
165
- | `flex-scenario uninstall [--scope here\|all\|full]` | 삭제 범위 메뉴 — full 은 cleanup + `npm uninstall -g` 자동 (완전 삭제) |
166
-
167
- ## 환경변수
168
-
169
- | 변수 | 기본 | 용도 |
170
- |---|---|---|
171
- | `FLEX_CONTRACT_ROOT` | (auto) | schema/+rules.md 가 있는 디렉토리. 명시하면 우선. |
172
- | `OTEL_EXPORTER_OTLP_ENDPOINT` | `http://localhost:4318` | Collector/Phoenix URL |
173
- | `OTEL_SERVICE_NAME` | (none) | 트레이스 service.name |
174
- | `CLAUDE_CODE_ENABLE_TELEMETRY` | (off) | Claude Code 내장 telemetry. 끄면 API 요청·토큰 metric 안 나감 |
175
- | `FLEX_METHOD / FLEX_CASE / FLEX_ITER` | `flex-cli-skill / <case basename> / 1` | adapter 가 root span 에 박는 flex.* attribute |
176
- | `TRACE_PARENT` | (auto) | W3C traceparent. 비어 있으면 매 gen 호출마다 자체 생성. |
177
-
178
- ## 동작 모델 (어떻게 MCP 없이 검증까지?)
90
+ ### 시나리오 검증
179
91
 
180
- ```
181
- 사용자 프롬프트
182
-
183
-
184
- claude -p "$(cat case.md)" ← --append-system-prompt 으로 SKILL.md 본문 주입
185
- │ (SKILL.md 안에 schema 요약·catalog·패턴이 인라인되어 있어 모델이 그것만 보고 JSON 작성)
186
-
187
- stream-json (stdout)
188
-
189
-
190
- (otel 프로파일) stream-json-otel-adapter ← @flextudio/otel-common 의 bin. OTLP 로 span 전송
191
- (base 프로파일) adapter 없이 claude.stdout 직결 (트레이싱 없음)
192
-
193
-
194
- flex-scenario.mjs 가 결과 텍스트에서 JSON 한 덩어리 추출 → --out
195
-
196
-
197
- flex-scenario validate <out> ← @flextudio/contract-core 의 buildAjv + runAllCrossChecks 직접 호출
198
- (검증 진입점은 모두 동일 core 호출 — 단일 진실원본).
92
+ ```bash
93
+ fscn validate <scenario.json> # 전체 검증
94
+ fscn validate --schema <name> <file> # 단편(스키마 1개) 검증
95
+ fscn validate <f> --no-write # 검증만, 파일 수정 안 함
96
+ fscn validate <f> --emit-materialized <path> # materialized 본문 별도 저장
199
97
  ```
200
98
 
201
- 핵심: MCP 호출이 없으므로 모델이 외부 시스템과 왕복하지 않는다. 대신 SKILL.md 가 컨텍스트에 그대로 들어가 한 번에 큰 본문을 인지한다. 그래서 토큰 분포가 cache_creation 쪽에 쏠리는 게 정상.
99
+ ### 시나리오 생성
202
100
 
203
- ## 제거 절차
204
-
205
- postinstall 이 npm 책임 영역 **밖** (`<설치폴더>/.claude/`, 전역 `~/.flex-scenario/`) 에 만든 산출물은
206
- `npm uninstall` 만으로는 안 지워진다. 그리고 **npm 7+ 는 uninstall lifecycle(preuninstall)을 실행하지
207
- 않는다** ("While npm v6 had uninstall lifecycle scripts, npm v7 does not" — npm 공식 문서). 자동 훅은
208
- 존재하지 않으므로 **제거의 단일 진입점은 `flex-scenario uninstall`** 이다.
209
-
210
- ### 기본 — flex-scenario uninstall (삭제 범위 메뉴)
211
101
  ```bash
212
- flex-scenario uninstall
213
- ```
214
- ```
215
- 삭제 범위를 선택하세요. (↑/↓ 이동 · Enter 선택)
216
- ❯ 현재 폴더만 — 이 폴더의 스킬/커맨드 삭제
217
- 모든 설치 폴더 — 설치된 모든 폴더의 스킬/커맨드 삭제
218
- 완전 삭제 — 모든 설치 폴더 + ~/.flex-scenario 삭제 후 전역 패키지 제거
219
- 취소
220
- ```
221
- - "현재 폴더만" 은 cwd 가 전역 receipt(`installs[]`)에 기록된 설치 폴더일 때만 나타난다.
222
- - 현재 폴더만 / 모든 설치 폴더 → CLI 와 `~/.flex-scenario`(contract-root)는 유지, receipt 만 갱신.
223
- - 완전 삭제 → cleanup(.bak 복원 포함) 후 `npm uninstall -g @flextudio/scenario` 까지 자동 실행.
224
- 단, repo 워크스페이스(dev)에서 실행하면 전역 npm 패키지는 건드리지 않는다
225
- (`FLEX_SCENARIO_FORCE_UNINSTALL=1` 로 강제 가능).
226
- - 비대화형(CI·파이프)에선 메뉴 대신 `--scope here|all|full` 을 명시해야 한다 — 묻지 못하면 지우지 않는다.
227
-
228
- ### 수동 fallback
229
- `flex-scenario uninstall` 의 npm 단계가 실패했거나 bin 이 이미 깨진 경우:
230
- ```bash
231
- npm uninstall -g @flextudio/scenario
232
- rm -rf ~/.flex-scenario "<설치폴더>/.claude/skills/scenario-gen" "<설치폴더>/.claude/commands/flex-spec.md"
102
+ fscn create --file <scenario.json>
233
103
  ```
234
104
 
235
- ### 벤치 환경 — bench.sh trap
236
- 벤치 드라이버가 Ctrl+C 등으로 비정상 종료해도 `~/.claude` 가 더러운 상태로 남지 않도록
237
- `bench/bench.sh` 가 trap 으로 강제 cleanup 호출. (별도 도큐먼트.)
105
+ ### 레퍼런스 조회
238
106
 
239
- ### 백업 복원
107
+ ```bash
108
+ fscn catalog --section <name> # catalog.json 의 한 섹션
109
+ fscn examples list # examples 디렉토리 트리
110
+ fscn examples cat <relpath> # 특정 example 본문
111
+ fscn contract info # contract 메타 (버전·스키마 수)
112
+ ```
240
113
 
241
- 기존 `<설치폴더>/.claude/skills/scenario-gen/` 가 이미 있으면 postinstall 이 자동으로
242
- `scenario-gen.bak` 으로 백업(커맨드는 `flex-spec.md.bak`). uninstall 시 `.bak` 이 있으면 원위치로 되돌린다.
243
- 같은 규칙이 전역 `~/.flex-scenario`(`otel-collector.yaml`, `contract-root`) 에도 적용된다.
114
+ ### 빌드 세션
244
115
 
245
- ## base vs otel 프로파일 차이
116
+ ```bash
117
+ fscn session start # build_id 발급
118
+ fscn session status --id <build_id> # 현재 stage + 다음 힌트
119
+ fscn session finish --id <build_id> [--artifact <path>]
120
+ ```
246
121
 
247
- | 항목 | base (`@flextudio/scenario`) | otel (`@flextudio/scenario-gen-otel`) |
248
- |---|---|---|
249
- | `@opentelemetry/*` · otel-common | **없음** | 포함(bundle) |
250
- | collector 템플릿 배치 | skip | `~/.flex-scenario/otel-collector.yaml` |
251
- | `gen` 트레이싱 | 없음(claude.stdout 직결) | adapter 로 OTLP span 방출 |
252
- | `validate`/`catalog`/`examples` | 동일 | 동일 |
253
- | 대상 | 사람들이 직접 설치·사용 | 벤치(setup-bench) |
122
+ ### 진단·관리
254
123
 
255
- > 두 프로파일은 **같은 소스**(`cli/`)에서 나온다. `cli/scripts/profile.mjs` + `prepack.mjs` 가
256
- > `FLEX_PROFILE` 따라 otel 동봉 여부와 패키지명만 가른다. 전체 구조: [../ARCHITECTURE.md](../ARCHITECTURE.md).
124
+ ```bash
125
+ fscn doctor # 에이전트 모듈 점검
126
+ fscn version # 버전
127
+ fscn help # 도움말
128
+ ```
257
129
 
258
- ## 라이선스
130
+ ### 제거
259
131
 
260
- UNLICENSED (사내).
132
+ ```bash
133
+ fscn uninstall # 범위 선택 메뉴 (TTY)
134
+ fscn uninstall --scope here # 현재 폴더 스킬/커맨드만
135
+ fscn uninstall --scope all # 설치된 모든 폴더
136
+ fscn uninstall --scope full # 전부 + ~/.flex-scenario + 전역 패키지 제거
137
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flextudio/scenario",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "description": "flextudio meta-contract v1 시나리오 검증·카탈로그·세션 CLI + Claude Code Skill. MCP 서버 없이 SKILL.md 인라인 스키마로 시나리오를 만들고 자체 검증한다. otel 없는 클린 배포본. (벤치용 gen·otel 은 bench/cli_bench 로 분리)",
6
6
  "bin": {
package/skill/SKILL.md CHANGED
@@ -86,6 +86,7 @@ description: flextudio meta-contract v1 시나리오 JSON 빌드 절차. 사용
86
86
  7. (**Step 수 ≥ 3 또는 예상 60KB+ 면 필수, 그 외 권장**) **fragment-first** — Step 한 개씩 작성 후 `flex-scenario validate --schema step <fragment-file>` 로 단편 검증, 다음 Step 진행. 한 번에 전체를 Write 하면 (a) 8번에서 polynomial schema fail 폭주(oneOf 회귀), (b) 단일 거대 생성 turn 으로 시간이 폭증하고 실패 시 30KB+ 전체 재작성을 부른다 — 둘 다 fragment-first 가 차단. fragment 가 ok 인 Step 부터 누적 조립 → 마지막 8번 호출은 전체 합본 검증. **이미 쓴 시나리오의 수정은 `Edit`(부분) 로 하고 전체 `Write` 재작성은 금지** (자가검증 루프 6번과 동일 원칙).
87
87
  8. **Bash:** `flex-scenario validate <scenario-file>` — 전체 검증. 아래 **자가검증 루프**.
88
88
  9. **Bash:** `flex-scenario session finish --id <build_id>` — 세션 종료. 반환된 `artifact` 경로를 최종 답에 명시한다. **산출 JSON 본문을 `cat`/`Read` 로 다시 읽어 응답에 출력하지 않는다** — 경로만.
89
+ 10. **Bash:** `flex-scenario create --file <artifact>` — 9번이 반환한 `artifact` 를 서버에 시나리오로 생성. 별도 요청 없이 9번 직후 이어서 호출한다(메타 생성과 시나리오 생성을 한 흐름으로). 응답의 `HTTP <status>` 와 생성 결과(`fScenarioID`/`fScenarioName`)를 최종 답에 함께 보고한다. 미인증이면 `create` 가 로그인을 유도하므로 그 흐름을 따른다. 4xx/5xx(비정상 종료코드)면 본문 메시지를 그대로 보고하고 성공으로 처리하지 않는다.
89
90
 
90
91
  ## ★ 자가검증 루프 (8번 단계의 본체)
91
92