@ihyeon/flow-qa 0.1.0-alpha.2 → 0.1.1

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/README.ko.md CHANGED
@@ -4,17 +4,17 @@
4
4
 
5
5
  사용자 플로우를 검토 가능한 테스트 케이스로 바꾸고, 실제 브라우저 실행 결과를 증거가 연결된 QA 리포트로 남기는 로컬 도구입니다. 플로우의 기대 결과가 모호하면 추측해 통과시키지 않고 질문과 차단 상태로 남깁니다.
6
6
 
7
- **공개 알파:** CLI와 `127.0.0.1` 전용 웹 UI를 제공합니다. UI는 영어로 시작하며 상단 언어 전환에서 한국어를 선택할 수 있습니다. 선택은 이 브라우저에 저장됩니다. 테스트 대상의 URL과 화면 계약을 사용하며 앱 소스 또는 데이터베이스 접근은 필수가 아닙니다. 설치 없이 구조를 보려면 [아키텍처](https://github.com/hyeonse-swing/flow-qa/blob/main/docs/architecture.md)와 [UI 안내](https://github.com/hyeonse-swing/flow-qa/blob/main/docs/ui.md)를 참고하세요.
7
+ CLI와 `127.0.0.1` 전용 웹 UI를 제공합니다. UI는 영어로 시작하며 상단 언어 전환에서 한국어를 선택할 수 있습니다. 선택은 이 브라우저에 저장됩니다. 테스트 대상의 URL과 화면 계약을 사용하며 앱 소스 또는 데이터베이스 접근은 필수가 아닙니다. 설치 없이 구조를 보려면 [아키텍처](https://github.com/hyeonse-swing/flow-qa/blob/main/docs/architecture.md)와 [UI 안내](https://github.com/hyeonse-swing/flow-qa/blob/main/docs/ui.md)를 참고하세요.
8
8
 
9
9
  ![로컬 데모 화면](https://raw.githubusercontent.com/hyeonse-swing/flow-qa/main/docs/media/flow-qa-demo.png)
10
10
 
11
11
 
12
12
  ## 로컬 데모 시작
13
13
 
14
- Node.js 24 이상이 필요합니다. 패키지는 `@ihyeon/flow-qa@0.1.0-alpha.2`입니다. 브라우저는 첫 실행 전에 설치합니다.
14
+ Node.js 24 이상이 필요합니다. 브라우저는 첫 실행 전에 설치합니다.
15
15
 
16
16
  ```sh
17
- npm install -g @ihyeon/flow-qa@0.1.0-alpha.2
17
+ npm install -g @ihyeon/flow-qa@0.1.1
18
18
  flow-qa browser install
19
19
  flow-qa ui --demo
20
20
  ```
@@ -64,7 +64,7 @@ flow-qa plan flows/my-flow.md --workspace my-qa
64
64
  - 실행마다 `.flowqa/runs/<run-id>/`에 새 리포트와 엔진 결과를 만듭니다. `qa-report.json`과 `qa-report.md`는 통과, 실패, 재시도 후 통과, 차단, 오류, 미실행을 구분합니다. assertion 실패는 관찰 결과이며 제품 버그 확정은 아닙니다.
65
65
  - 취소한 실행은 중단으로 기록합니다. UI의 생성 취소는 늦게 도착한 응답을 반영하지 않지만 모델 제공자의 처리나 과금 취소를 보장하지 않습니다. 엔진의 토큰·추정 비용만 표시하며 전체 비용 상한은 없습니다.
66
66
 
67
- 리포트와 원본 증거에는 테스트 앱의 데이터가 포함될 수 있습니다. `.flowqa/`는 Git에서 제외되지만 외부 공유 전에는 내용을 확인하세요. 마스킹이 모든 개인정보를 탐지한다고 보장하지 않습니다. 세션 준비, 모바일 기기, 예약 CI 실행, 팀 권한과 공유 서버는 이 알파의 지원 범위 밖입니다.
67
+ 리포트와 원본 증거에는 테스트 앱의 데이터가 포함될 수 있습니다. `.flowqa/`는 Git에서 제외되지만 외부 공유 전에는 내용을 확인하세요. 마스킹이 모든 개인정보를 탐지한다고 보장하지 않습니다. 세션 준비, 모바일 기기, 예약 CI 실행, 팀 권한과 공유 서버는 현재 지원 범위에 포함되지 않습니다.
68
68
 
69
69
  ![실제 세 케이스 실행 결과](https://raw.githubusercontent.com/hyeonse-swing/flow-qa/main/docs/media/flow-qa-report.png)
70
70
 
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  Flow QA turns a user flow into reviewable test cases, runs them in a real browser, and ties the results to evidence in a QA report. When an expected outcome is unclear, it keeps the question visible and blocks that case instead of guessing.
6
6
 
7
- **Public alpha:** a CLI and a web UI bound to `127.0.0.1`. Provide a target URL and describe the screen behavior; access to the application's source code or database is optional. The UI starts in English. Use the language switch in the top bar for Korean; the choice is saved in this browser. See the [architecture](https://github.com/hyeonse-swing/flow-qa/blob/main/docs/architecture.md) and [UI guide](https://github.com/hyeonse-swing/flow-qa/blob/main/docs/ui.md) for the details.
7
+ Flow QA is available as a CLI and a web UI bound to `127.0.0.1`. Provide a target URL and describe the screen behavior; access to the application's source code or database is optional. The UI starts in English. Use the language switch in the top bar for Korean; the choice is saved in this browser. See the [architecture](https://github.com/hyeonse-swing/flow-qa/blob/main/docs/architecture.md) and [UI guide](https://github.com/hyeonse-swing/flow-qa/blob/main/docs/ui.md) for the details.
8
8
 
9
9
  ![Flow QA local demo](https://raw.githubusercontent.com/hyeonse-swing/flow-qa/main/docs/media/flow-qa-demo.png)
10
10
 
@@ -14,7 +14,7 @@ Flow QA turns a user flow into reviewable test cases, runs them in a real browse
14
14
  Requires Node.js 24 or later. Install Chromium before the first run:
15
15
 
16
16
  ```sh
17
- npm install -g @ihyeon/flow-qa@0.1.0-alpha.2
17
+ npm install -g @ihyeon/flow-qa@0.1.1
18
18
  flow-qa browser install
19
19
  flow-qa ui --demo
20
20
  ```
@@ -64,7 +64,7 @@ For authenticated models, add `--key-env FLOW_QA_API_KEY` to the model command a
64
64
  - Each run gets a fresh `.flowqa/runs/<run-id>/` directory with engine output and `qa-report.json`/`qa-report.md`. Reports distinguish passed, failed, passed after retry, blocked, error, and skipped cases. A failed assertion is an observation, not proof of a product defect.
65
65
  - Cancellation records an interrupted run. Canceling generation prevents a late response from changing the draft, but does not guarantee cancellation of a provider's processing or charges. The UI shows token use and estimated cost only when the engine supplies them; there is no overall cost cap.
66
66
 
67
- Reports and raw evidence can contain data from the tested app. `.flowqa/` is Git-ignored, but inspect files before sharing them. Redaction cannot be assumed to catch every personal detail. Session setup, mobile devices, scheduled CI runs, team permissions, and a shared server are outside this alpha's scope.
67
+ Reports and raw evidence can contain data from the tested app. `.flowqa/` is Git-ignored, but inspect files before sharing them. Redaction cannot be assumed to catch every personal detail. Session setup, mobile devices, scheduled CI runs, team permissions, and a shared server are outside the current scope.
68
68
 
69
69
  ![QA report from three real passing cases](https://raw.githubusercontent.com/hyeonse-swing/flow-qa/main/docs/media/flow-qa-report.png)
70
70
 
@@ -166,11 +166,18 @@ export function normalizeReport1(raw, context) {
166
166
  const attempts = array(result.attempts, 'result.attempts').map((attempt) => normalizeAttempt(attempt, context.rawDir));
167
167
  if (status !== 'skipped' && attempts.length === 0)
168
168
  throw new Error(`Test result has no attempts: ${id}`);
169
- if (status === 'passed' && attempts.at(-1)?.status !== 'passed')
169
+ const finalAttemptStatus = attempts.at(-1)?.status;
170
+ if (status === 'passed' && (attempts.length !== 1 || attempts[0]?.index !== 0 || finalAttemptStatus !== 'passed')) {
170
171
  throw new Error(`Passed status and attempts disagree: ${id}`);
171
- if (status === 'flaky' && (attempts.at(-1)?.status !== 'passed' || !attempts.slice(0, -1).some((attempt) => attempt.status !== 'passed'))) {
172
+ }
173
+ if (status === 'flaky' && (attempts.length < 2 || finalAttemptStatus !== 'passed'
174
+ || attempts.some((attempt, index) => attempt.index !== index
175
+ || (index < attempts.length - 1 && attempt.status !== 'failed' && attempt.status !== 'timed-out')))) {
172
176
  throw new Error(`Flaky status and attempts disagree: ${id}`);
173
177
  }
178
+ if ((status === 'failed' || status === 'timed-out') && finalAttemptStatus === 'passed') {
179
+ throw new Error(`Failed or timed-out status and attempts disagree: ${id}`);
180
+ }
174
181
  if (context.blockedReasons.has(id) && status !== 'skipped')
175
182
  throw new Error(`A blocked case was recorded as executed: ${id}`);
176
183
  const skip = result.skip === undefined ? undefined : object(result.skip, 'result.skip');
@@ -753,6 +753,8 @@ export async function startUIServer(options) {
753
753
  closing = true;
754
754
  controller?.abort();
755
755
  closeTask = (async () => {
756
+ const stopped = new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
757
+ server.closeIdleConnections();
756
758
  if (requestTasks.size) {
757
759
  let requestTimeout;
758
760
  try {
@@ -765,8 +767,7 @@ export async function startUIServer(options) {
765
767
  clearTimeout(requestTimeout);
766
768
  }
767
769
  }
768
- const stopped = new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
769
- server.closeIdleConnections();
770
+ server.closeAllConnections();
770
771
  await stopped;
771
772
  const pending = runTask;
772
773
  if (pending) {
@@ -35,4 +35,4 @@ flowchart LR
35
35
  | Results | A fresh report per run, status interpretation, evidence links | Raw runs and evidence from the engine |
36
36
  | UI | Local workflow screens and English/Korean language switch | [Hyeonse Design System](https://github.com/hyeonse-swing/hyeonse-design-system) tokens and preference utilities |
37
37
 
38
- The UI binds only to `127.0.0.1` and serves approved report evidence, not arbitrary raw logs or HTML/SVG. Local reports may still contain data from the tested app and should be reviewed before sharing. This alpha does not manage login sessions, cap model spending, schedule CI runs, or support mobile devices.
38
+ The UI binds only to `127.0.0.1` and serves approved report evidence, not arbitrary raw logs or HTML/SVG. Local reports may still contain data from the tested app and should be reviewed before sharing. This release does not manage login sessions, cap model spending, schedule CI runs, or support mobile devices.
package/docs/releases.md CHANGED
@@ -1,9 +1,56 @@
1
- # Alpha release and verification
1
+ # Releases and verification
2
2
 
3
- ## 0.1.0-alpha.2
3
+ The alpha entries below are historical release records. They document earlier package versions and checks.
4
+
5
+ ## 0.1.1
6
+
7
+ This release uses plain semver and the npm `latest` dist-tag. It includes the runtime fixes documented in the historical entry below, with no additional runtime changes. The existing runtime passed 47 tests and the browser checks recorded there. Version 0.1.1 metadata, package contents, and a fresh consumer installation were also verified: the installed `flow-qa` command worked and all three Chromium demo cases passed without model calls.
8
+
9
+ - Package target: [`@ihyeon/flow-qa@0.1.1`](https://www.npmjs.com/package/@ihyeon/flow-qa/v/0.1.1), npm `latest` dist-tag
10
+ - Source and package: [GitHub release](https://github.com/hyeonse-swing/flow-qa/releases/tag/v0.1.1)
11
+ - Public checks: [GitHub Actions](https://github.com/hyeonse-swing/flow-qa/actions/workflows/ci.yml)
12
+
13
+ Use this version when checking the published package:
14
+
15
+ ```sh
16
+ FLOWQA_PACKAGE_SPEC=@ihyeon/flow-qa@0.1.1 npm run smoke:package
17
+ ```
18
+
19
+ ## Historical: 0.1.0-alpha.3
20
+
21
+ This maintenance release keeps the existing CLI, UI, and case schema. It tightens result validation, bounds UI shutdown, and checks the command that npm installs for consumers.
22
+
23
+ - A result marked `passed` must contain a single first attempt that passed. A passing retry must have a consistent `flaky` history. Contradictory histories are rejected instead of producing a misleading success report.
24
+ - UI shutdown stops accepting connections immediately, allows existing requests up to one second to finish, and then closes remaining HTTP connections. An incomplete JSON request can no longer hold shutdown open. Planner cancellation responses and run cancellation are preserved.
25
+ - Consumer smoke checks verify npm's installed `flow-qa` command and invoke it offline for help, workspace initialization, validation, and runtime diagnostics. The installed UI still runs three real Chromium cases.
26
+
27
+ Both runtime fixes have regression tests that failed before the changes and passed afterward. Verification uses local test data and no model calls; it does not establish external authentication or model quality.
28
+
29
+ Checked on macOS with Node.js 24.14.1 on 2026-10-12: all 47 tests, type checking, UI syntax, and the design-system audit passed. Real Chromium checks preserved normal pass, intentional assertion failure, and unreachable-app classifications. The bilingual UI smoke passed, including report downloads and a 390px viewport. The runtime dependency audit reported zero known vulnerabilities at that time.
30
+
31
+ - Package: [`@ihyeon/flow-qa@0.1.0-alpha.3`](https://www.npmjs.com/package/@ihyeon/flow-qa/v/0.1.0-alpha.3)
32
+ - Source and package: [GitHub alpha release](https://github.com/hyeonse-swing/flow-qa/releases/tag/v0.1.0-alpha.3)
33
+ - Public checks: [GitHub Actions](https://github.com/hyeonse-swing/flow-qa/actions/workflows/ci.yml)
34
+
35
+ To reproduce this release's checks from its source:
36
+
37
+ ```sh
38
+ npm ci
39
+ npm run check
40
+ npm run qa -- browser install
41
+ npm run demo:smoke
42
+ npm run smoke:ui
43
+ npm run check:package
44
+ npm run smoke:package
45
+ FLOWQA_PACKAGE_SPEC=@ihyeon/flow-qa@0.1.0-alpha.3 npm run smoke:package
46
+ ```
47
+
48
+ ## Historical: 0.1.0-alpha.2
4
49
 
5
50
  This update replaces the introductory video link with two UI screenshots. Runtime behavior is unchanged from alpha.1. Media files are not included in the npm tarball.
6
51
 
52
+ The verification record and reproduction commands below describe alpha.2. Use its matching source tag when reproducing that historical release.
53
+
7
54
  This public alpha provides a local CLI and UI, structured case validation, browser-run orchestration, and QA reports linked to evidence. Its bundled to-do app demo runs without a model.
8
55
 
9
56
  - Package: [`@ihyeon/flow-qa@0.1.0-alpha.2`](https://www.npmjs.com/package/@ihyeon/flow-qa/v/0.1.0-alpha.2), with the `alpha` dist-tag
package/docs/ui.md CHANGED
@@ -4,10 +4,10 @@ Use the target app's URL and a user flow to review cases, run them, and inspect
4
4
 
5
5
  ## Start
6
6
 
7
- Node.js 24 or later is required. Install the alpha and start the local demo:
7
+ Node.js 24 or later is required. Install Flow QA and start the local demo:
8
8
 
9
9
  ```sh
10
- npm install -g @ihyeon/flow-qa@0.1.0-alpha.2
10
+ npm install -g @ihyeon/flow-qa@0.1.1
11
11
  flow-qa browser install
12
12
  flow-qa ui --demo
13
13
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ihyeon/flow-qa",
3
- "version": "0.1.0-alpha.2",
3
+ "version": "0.1.1",
4
4
  "license": "MIT",
5
5
  "author": "Hyeonse Im",
6
6
  "repository": {
@@ -21,7 +21,7 @@
21
21
  ],
22
22
  "publishConfig": {
23
23
  "access": "public",
24
- "tag": "alpha",
24
+ "tag": "latest",
25
25
  "registry": "https://registry.npmjs.org/"
26
26
  },
27
27
  "files": [