laxy-verify 1.1.18 → 1.1.21

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.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # laxy-verify
2
2
 
3
- CLI verification for frontend apps.
3
+ A frontend verification CLI that catches build breaks, regressions, and client-visible issues before you ship.
4
4
 
5
- `laxy-verify` runs production build checks, Lighthouse, tiered verify E2E, and plan-gated verification features for Free, Pro, and Pro+ accounts.
6
- It is designed around three user questions:
5
+ `laxy-verify` runs production build checks, Lighthouse, tiered verify E2E, and plan-gated verification for Free, Pro, and Pro+ accounts.
6
+ It is built around three simple questions:
7
7
 
8
- - Free: "Will it break in production?"
9
- - Pro: "Would a client accept this?"
10
- - Pro+: "Can I ship this today?"
8
+ - Free: "Any critical issues right now?"
9
+ - Pro: "Ready to show a client?"
10
+ - Pro+: "Ready for production?"
11
11
 
12
12
  ```bash
13
13
  npx laxy-verify --init --run
@@ -18,34 +18,68 @@ npx laxy-verify whoami
18
18
  npx laxy-verify --help
19
19
  ```
20
20
 
21
+ What you get from one run:
22
+
23
+ - a verification grade: `Gold`, `Silver`, `Bronze`, or `Unverified`
24
+ - a decision-oriented verdict such as `client-ready`, `release-ready`, `hold`, or `investigate`
25
+ - `.laxy-result.json` for automation
26
+ - `laxy-verify-report.md` on paid plans for human review and AI handoff
27
+
21
28
  ## Quick Start
22
29
 
23
- ### 1. Initialize
30
+ ### 1. Run it on a frontend app
24
31
 
25
32
  ```bash
26
33
  cd your-project
34
+ npx laxy-verify .
35
+ ```
36
+
37
+ This runs the default verification flow in the current app directory.
38
+
39
+ ### 2. Generate config and CI workflow
40
+
41
+ ```bash
27
42
  npx laxy-verify --init
28
43
  ```
29
44
 
30
- This generates `.laxy.yml` and a GitHub Actions workflow.
45
+ This creates:
46
+
47
+ - `.laxy.yml`
48
+ - `.github/workflows/laxy-verify.yml`
49
+
50
+ ### 3. Commit the workflow
31
51
 
32
- ### 2. Run locally
52
+ Once committed, each PR gets a verification run, grade output, and optional GitHub reporting.
53
+
54
+ ### 4. Unlock paid plan features
33
55
 
34
56
  ```bash
35
- npx laxy-verify .
57
+ npx laxy-verify login
58
+ npx laxy-verify whoami
59
+ ```
60
+
61
+ For CI, set `LAXY_TOKEN` instead of using interactive login.
62
+
63
+ ```yaml
64
+ env:
65
+ LAXY_TOKEN: ${{ secrets.LAXY_TOKEN }}
36
66
  ```
37
67
 
38
- ### 3. Add to CI
68
+ ## What It Checks
39
69
 
40
- Commit the generated workflow. Each PR gets a verification run, grade output, and optional GitHub reporting.
70
+ - production build success
71
+ - Lighthouse thresholds
72
+ - verify E2E scenarios for real user flows
73
+ - Pro+ viewport and visual regression evidence
74
+ - plan-aware verdicts for local runs and CI
41
75
 
42
76
  ## Verification Tiers
43
77
 
44
78
  | Plan | Question it answers |
45
79
  |------|---------------------|
46
- | Free | Will it break in production? |
47
- | Pro | Would a client accept this? |
48
- | Pro+ | Can I ship this today? |
80
+ | Free | Any critical issues right now? |
81
+ | Pro | Ready to show a client? |
82
+ | Pro+ | Ready for production? |
49
83
 
50
84
  ## Grades
51
85
 
@@ -56,35 +90,39 @@ Commit the generated workflow. Each PR gets a verification run, grade output, an
56
90
  | Bronze | Build passed |
57
91
  | Unverified | Build failed |
58
92
 
59
- ## Paid Features
60
-
61
- Log in with your Laxy account to unlock paid plan features.
62
-
63
- ```bash
64
- npx laxy-verify login
65
- npx laxy-verify whoami
66
- npx laxy-verify logout
67
- ```
93
+ ## Plan Differences
68
94
 
69
95
  | Feature | Free | Pro | Pro+ |
70
96
  |---------|------|-----|------|
71
97
  | Build verification | Yes | Yes | Yes |
72
98
  | Lighthouse | 1 run | 3 runs | 3 runs |
73
- | Verify E2E | Smoke | Deeper client-send checks | Deeper client-send checks |
99
+ | Verify E2E | Smoke checks | Client-facing flow checks | Client-facing flow checks + release evidence |
74
100
  | Detailed report view | No | Yes | Yes |
75
101
  | `laxy-verify-report.md` export | No | Yes | Yes |
76
102
  | Multi-viewport verification | No | No | Yes |
77
103
  | Visual diff | No | No | Yes |
78
104
  | Failure analysis signals | No | No | Yes |
79
105
 
80
- Pro is for delivery verification.
81
- Pro+ is for release-confidence verification with extra evidence before you say "ship it."
106
+ Free tells you whether the app is basically standing.
107
+ Pro tells you whether the app is strong enough to call client-ready.
108
+ Pro+ adds the extra evidence needed for a real release-ready call.
82
109
 
83
- For CI, set `LAXY_TOKEN` instead of using interactive login.
110
+ ## Sample Output
84
111
 
85
- ```yaml
86
- env:
87
- LAXY_TOKEN: ${{ secrets.LAXY_TOKEN }}
112
+ ```text
113
+ Plan: Pro+
114
+ Grade: Gold
115
+ Verdict: release-ready
116
+
117
+ Passed:
118
+ - production build
119
+ - Lighthouse thresholds
120
+ - core E2E flows
121
+ - desktop, tablet, and mobile viewport checks
122
+
123
+ Artifacts:
124
+ - .laxy-result.json
125
+ - laxy-verify-report.md
88
126
  ```
89
127
 
90
128
  ## Configuration
@@ -110,6 +148,12 @@ thresholds:
110
148
  fail_on: "bronze"
111
149
  ```
112
150
 
151
+ Typical cases:
152
+
153
+ - raise `fail_on` to `silver` or `gold` in CI when you want stricter gates
154
+ - set `framework`, `build_command`, or `dev_command` if auto-detection is not enough
155
+ - increase `lighthouse_runs` when you want more stable performance evidence
156
+
113
157
  ## CLI Options
114
158
 
115
159
  ```text
@@ -143,7 +187,7 @@ Each run writes `.laxy-result.json`.
143
187
 
144
188
  Paid plans also write a readable markdown summary to `laxy-verify-report.md`.
145
189
 
146
- - `Pro`: blocker-focused delivery report
190
+ - `Pro`: client-ready delivery report
147
191
  - `Pro+`: release-readiness report with viewport and visual evidence
148
192
 
149
193
  Exit behavior follows the verification verdict, not just the legacy grade.
@@ -190,6 +234,13 @@ It includes:
190
234
  - failed E2E scenarios
191
235
  - a `Copy For AI` section you can paste directly into Codex, Cursor, Claude, or ChatGPT
192
236
 
237
+ ## Environment Notes
238
+
239
+ - Best on current LTS Node releases. `Node 20.18+` is recommended.
240
+ - Monorepos should point `laxy-verify` at the actual app directory.
241
+ - `playwright` is optional. The CLI can run without it.
242
+ - Pro+ viewport and visual checks increase runtime.
243
+
193
244
  ## Regression Fixtures
194
245
 
195
246
  The repo also includes dedicated regression fixtures under `.qa-regression-fixtures/`.
@@ -202,6 +253,11 @@ They intentionally break build, navigation, coverage, performance, viewport beha
202
253
  - Pro+ visual diff and viewport checks increase runtime.
203
254
  - Local verification is most stable on current LTS Node releases.
204
255
 
256
+ ## Links
257
+
258
+ - GitHub: https://github.com/psungmin24/Laxy/tree/main/laxy-verify
259
+ - Issues: https://github.com/psungmin24/Laxy/issues
260
+
205
261
  ## License
206
262
 
207
263
  MIT
@@ -66,6 +66,8 @@ function formatTimestamp(iso) {
66
66
  function sentenceForVerdict(view) {
67
67
  const isReleaseTier = view.tier === "pro_plus";
68
68
  switch (view.verdict) {
69
+ case "client-ready":
70
+ return "Yes. This run collected enough evidence to support a client-ready call.";
69
71
  case "release-ready":
70
72
  return isReleaseTier
71
73
  ? "Yes. This run collected enough evidence to support a release-ready call."
@@ -95,10 +97,14 @@ function defaultNextActions(result) {
95
97
  if (view.nextActions.length > 0)
96
98
  return view.nextActions;
97
99
  switch (view.verdict) {
100
+ case "client-ready":
101
+ return ["Send this version to the client, or rerun verification after meaningful UI or flow changes."];
98
102
  case "release-ready":
99
103
  return ["Ship this version, or archive this report as release evidence."];
100
104
  case "investigate":
101
- return ["Collect the missing verification evidence, then rerun the command before release."];
105
+ return view.tier === "pro_plus"
106
+ ? ["Collect the missing verification evidence, then rerun the command before release."]
107
+ : ["Collect the missing verification evidence, then rerun the command before sending this to a client."];
102
108
  case "build-failed":
103
109
  return ["Fix the production build first, then rerun the verification command."];
104
110
  case "quick-pass":
@@ -266,9 +272,11 @@ function renderCopyForAI(result, flavor) {
266
272
  const evidence = view.failureEvidence.map((item) => `- ${item}`);
267
273
  const closingLine = view.verdict === "release-ready"
268
274
  ? "Use this as release evidence, or rerun after any code change that could affect quality."
269
- : view.verdict === "investigate" && view.blockers.length === 0
270
- ? "Collect the missing verification evidence, then rerun the command and compare the new report."
271
- : "Please fix the blockers first, then rerun the verification command and compare the new report.";
275
+ : view.verdict === "client-ready"
276
+ ? "Use this as client handoff evidence, or rerun after any code change that could affect user-facing flows."
277
+ : view.verdict === "investigate" && view.blockers.length === 0
278
+ ? "Collect the missing verification evidence, then rerun the command and compare the new report."
279
+ : "Please fix the blockers first, then rerun the verification command and compare the new report.";
272
280
  const openingLine = flavor === "release"
273
281
  ? "Use this release report to decide whether the project is truly ready to ship."
274
282
  : flavor === "delivery"
@@ -277,7 +285,7 @@ function renderCopyForAI(result, flavor) {
277
285
  const targetLine = flavor === "release"
278
286
  ? "Goal: reach a release-ready verdict with strong viewport, visual, and user-flow evidence."
279
287
  : flavor === "delivery"
280
- ? "Goal: remove client-visible blockers and reach a confident delivery call."
288
+ ? "Goal: remove client-visible blockers and reach a confident client-ready call."
281
289
  : "Goal: fix the blockers and improve confidence on the next run.";
282
290
  return [
283
291
  `## ${sectionTitle(flavor, "copy")}`,
@@ -333,7 +341,7 @@ function buildMarkdownReport(projectDir, result) {
333
341
  const decisionLead = flavor === "release"
334
342
  ? "This section answers whether the current build is strong enough to call release-ready."
335
343
  : flavor === "delivery"
336
- ? "This section answers whether the current build is strong enough to send to a client."
344
+ ? "This section answers whether the current build is strong enough to call client-ready."
337
345
  : "This section explains the outcome of the current verification run.";
338
346
  const atAGlanceLead = flavor === "release"
339
347
  ? "This report is written for a ship or hold decision."
@@ -351,14 +351,14 @@ function buildVerificationReport(input, options) {
351
351
  summary = `Core checks passed, but release-ready confidence still needs ${missingEvidence.join(" and ")}.`;
352
352
  }
353
353
  else if (tier === "pro" && coreChecksPassed && !hasWarnings) {
354
- verdict = "release-ready";
354
+ verdict = "client-ready";
355
355
  confidence = "medium";
356
- summary = "No blocking issues found. Build, E2E, and Lighthouse checks passed. Safe to send to client.";
356
+ summary = "No blocking issues found. Build, E2E, and Lighthouse checks passed. This run supports a client-ready call.";
357
357
  }
358
358
  else if (tier === "pro" && coreChecksPassed && hasWarnings) {
359
359
  verdict = "investigate";
360
360
  confidence = "medium";
361
- summary = "Core checks passed, but warning-level risks remain. Review warnings before sending this to a client.";
361
+ summary = "Core checks passed, but warning-level risks remain. Review warnings before calling this run client-ready.";
362
362
  }
363
363
  else if (tier === "free") {
364
364
  if (evidence.hasConsoleErrors) {
@@ -43,11 +43,11 @@ function planToVerificationTier(plan) {
43
43
  function getVerificationTierQuestion(tier) {
44
44
  switch (tier) {
45
45
  case "pro":
46
- return "Is this strong enough to send to a client?";
46
+ return "Ready to show a client?";
47
47
  case "pro_plus":
48
- return "Can I call this release-ready with confidence?";
48
+ return "Ready for production?";
49
49
  default:
50
- return "Is this likely to break right now?";
50
+ return "Any critical issues right now?";
51
51
  }
52
52
  }
53
53
  function getTierVerificationView(report) {
@@ -1,6 +1,6 @@
1
1
  export type VerificationGrade = "gold" | "silver" | "bronze" | "unverified";
2
2
  export type VerificationTier = "free" | "pro" | "pro_plus";
3
- export type ReleaseVerdict = "quick-pass" | "investigate" | "hold" | "release-ready" | "build-failed";
3
+ export type ReleaseVerdict = "quick-pass" | "client-ready" | "investigate" | "hold" | "release-ready" | "build-failed";
4
4
  export interface LighthouseThresholds {
5
5
  performance: number;
6
6
  accessibility: number;
package/package.json CHANGED
@@ -1,9 +1,33 @@
1
1
  {
2
2
  "name": "laxy-verify",
3
- "version": "1.1.18",
4
- "description": "Frontend quality gate: build, Lighthouse, tiered E2E, and release-confidence verification",
3
+ "version": "1.1.21",
4
+ "description": "Frontend verification CLI for build checks, Lighthouse, E2E, and release readiness",
5
5
  "license": "MIT",
6
6
  "type": "commonjs",
7
+ "homepage": "https://github.com/psungmin24/Laxy/tree/main/laxy-verify#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/psungmin24/Laxy.git",
11
+ "directory": "laxy-verify"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/psungmin24/Laxy/issues"
15
+ },
16
+ "keywords": [
17
+ "frontend",
18
+ "verification",
19
+ "quality-gate",
20
+ "release-readiness",
21
+ "lighthouse",
22
+ "e2e",
23
+ "qa",
24
+ "cli",
25
+ "nextjs",
26
+ "vite"
27
+ ],
28
+ "engines": {
29
+ "node": ">=20.18.0 <25"
30
+ },
7
31
  "bin": {
8
32
  "laxy-verify": "dist/cli.js"
9
33
  },