@gfdelarue/testkit 0.6.0 → 0.6.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.
Files changed (156) hide show
  1. package/README.md +455 -56
  2. package/bin/testkit-windows-owner-arm64.exe +0 -0
  3. package/bin/testkit-windows-owner-x64.exe +0 -0
  4. package/dist/app/bugs/batch.js +1 -0
  5. package/dist/app/bugs/ci-report.js +2 -2
  6. package/dist/app/bugs/ci-summary.js +3 -3
  7. package/dist/app/bugs/draft.js +2 -2
  8. package/dist/app/bugs/file.js +1 -1
  9. package/dist/app/bugs/guide.js +1 -1
  10. package/dist/app/bugs/record.js +1 -1
  11. package/dist/app/bugs/run-reading.js +1 -1
  12. package/dist/app/bugs/store.js +1 -1
  13. package/dist/app/campaigns/summary.js +1 -1
  14. package/dist/app/cleanup/index.js +1 -1
  15. package/dist/app/db-schema/prepare.js +1 -1
  16. package/dist/app/db-schema/refresh.js +1 -1
  17. package/dist/app/db-schema/verify.js +1 -1
  18. package/dist/app/destroy/index.js +1 -1
  19. package/dist/app/environments/config-driven.js +1 -1
  20. package/dist/app/environments/file-setup.js +1 -1
  21. package/dist/app/environments/routing.js +1 -1
  22. package/dist/app/environments/static-values.js +1 -1
  23. package/dist/app/environments/supplied.js +1 -1
  24. package/dist/app/lint/shared.js +1 -1
  25. package/dist/app/run/live-run.js +1 -1
  26. package/dist/app/run/orchestrator.js +1 -1
  27. package/dist/app/run/planning.js +1 -1
  28. package/dist/app/run/results.js +1 -1
  29. package/dist/app/run/run-finalization.js +1 -1
  30. package/dist/app/run/run-finisher.js +1 -0
  31. package/dist/app/run/setup/runtime-node-setup-protocol.js +1 -1
  32. package/dist/app/run/setup/runtime-node-setup-worker.js +1 -1
  33. package/dist/app/run/setup/runtime-node-setup.js +2 -2
  34. package/dist/app/status/runs.js +1 -1
  35. package/dist/app/stop/index.js +1 -1
  36. package/dist/app/tracker/index.js +1 -1
  37. package/dist/app/tracker/token.js +2 -2
  38. package/dist/app/typecheck/index.js +4 -4
  39. package/dist/cli/command-catalog.js +1 -1
  40. package/dist/cli/command-flags.js +1 -1
  41. package/dist/cli/commands/bug/file.js +3 -2
  42. package/dist/cli/framework/help.js +5 -5
  43. package/dist/cli/framework/parser.js +1 -1
  44. package/dist/cli/json-errors.js +1 -1
  45. package/dist/cli/renderers/bug/text.js +1 -1
  46. package/dist/cli/renderers/run/formatting.js +1 -1
  47. package/dist/config/loader/config-loader.js +1 -1
  48. package/dist/config/loader/discover-tests.js +1 -1
  49. package/dist/config/loader/discovery-result.js +1 -0
  50. package/dist/config/loader/index.js +1 -1
  51. package/dist/config/loader/runtime-isolation.js +1 -1
  52. package/dist/config/loader/skip-config.js +1 -1
  53. package/dist/config/loader/test-selection.js +1 -1
  54. package/dist/database/admin.js +5 -2
  55. package/dist/database/call-caps.js +1 -0
  56. package/dist/database/cleanup.js +1 -1
  57. package/dist/database/configured-steps.js +1 -1
  58. package/dist/database/constants.js +1 -1
  59. package/dist/database/docker-endpoint.js +1 -0
  60. package/dist/database/docker-metadata.js +2 -2
  61. package/dist/database/docker.js +5 -5
  62. package/dist/database/index.js +2 -1
  63. package/dist/database/lifecycle-cleanup.js +1 -1
  64. package/dist/database/local-postgres.js +4 -1
  65. package/dist/database/naming.js +1 -1
  66. package/dist/database/operation-deadline.js +1 -0
  67. package/dist/database/postgres/connection-check.js +1 -1
  68. package/dist/database/postgres/index.js +2 -2
  69. package/dist/database/postgres/owned-exec.js +27 -0
  70. package/dist/database/postgres/protocol.js +2 -2
  71. package/dist/database/provider.js +1 -0
  72. package/dist/database/roles.js +2 -2
  73. package/dist/database/schema-operations.js +5 -1
  74. package/dist/database/schema-source.js +3 -3
  75. package/dist/database/steps.js +1 -1
  76. package/dist/database/template-steps.js +4 -4
  77. package/dist/domain/suite-selection.js +1 -1
  78. package/dist/engines/adapters/evidence-files.js +1 -1
  79. package/dist/engines/adapters/execution.js +1 -1
  80. package/dist/engines/node-vitest/adapter/adapter.js +1 -1
  81. package/dist/engines/node-vitest/adapter/driver.js +2 -2
  82. package/dist/engines/node-vitest/runtime/runtime-input.js +1 -1
  83. package/dist/engines/playwright/adapter/adapter.js +1 -1
  84. package/dist/engines/playwright/adapter/browser-network-evidence.js +4 -0
  85. package/dist/engines/playwright/adapter/config.js +16 -6
  86. package/dist/engines/playwright/adapter/evidence.js +2 -1
  87. package/dist/engines/playwright/adapter/failure-details.js +2 -2
  88. package/dist/engines/playwright/adapter/reporter.js +1 -1
  89. package/dist/engines/playwright/runtime/browser-network.js +1 -0
  90. package/dist/engines/playwright/runtime/browser-traffic.js +1 -0
  91. package/dist/engines/playwright/runtime/chromium-environment.js +1 -0
  92. package/dist/engines/playwright/runtime/emulation.js +1 -0
  93. package/dist/engines/playwright/runtime/index.js +1 -1
  94. package/dist/engines/playwright/runtime/managed-test.js +1 -1
  95. package/dist/engines/playwright/runtime/runtime-input.js +2 -2
  96. package/dist/environment/lifecycle-controller.js +1 -1
  97. package/dist/environment/lifecycle.js +1 -1
  98. package/dist/environment/maintenance.js +1 -1
  99. package/dist/environment/run-environment.js +1 -1
  100. package/dist/environment/run-stopping.js +1 -1
  101. package/dist/environment/runtime-manager.js +1 -1
  102. package/dist/evidence/artifacts.js +5 -2
  103. package/dist/evidence/bundles.js +2 -1
  104. package/dist/evidence/compressed-artifacts.js +1 -0
  105. package/dist/evidence/environment-record.js +1 -1
  106. package/dist/evidence/index.js +1 -1
  107. package/dist/evidence/live-run-summary.js +1 -0
  108. package/dist/evidence/local-paths.js +1 -0
  109. package/dist/evidence/maintenance.js +1 -1
  110. package/dist/evidence/operation-timings.js +1 -1
  111. package/dist/evidence/redaction.js +4 -4
  112. package/dist/evidence/run-evidence.js +1 -0
  113. package/dist/evidence/setup-progress.js +1 -1
  114. package/dist/evidence/storage-inventory.js +1 -1
  115. package/dist/evidence/storage.js +2 -2
  116. package/dist/kernel/redaction-targets.js +1 -1
  117. package/dist/kernel/redaction.js +7 -4
  118. package/dist/process/engine-environment-keys.js +1 -0
  119. package/dist/process/environment-overlay.js +1 -1
  120. package/dist/process/environment.js +1 -1
  121. package/dist/process/execa-bundle.json +3 -3
  122. package/dist/process/files/evidence-writes.js +1 -0
  123. package/dist/process/files/product-dir.js +1 -1
  124. package/dist/process/host-process.js +1 -1
  125. package/dist/process/index.js +1 -1
  126. package/dist/process/lifecycle-fence.js +1 -1
  127. package/dist/process/lock-progress.js +2 -0
  128. package/dist/process/locks.js +4 -4
  129. package/dist/process/process-identity.js +1 -1
  130. package/dist/process/process.js +35 -35
  131. package/dist/process/recovery.js +1 -1
  132. package/dist/process/runs/manifest.js +1 -1
  133. package/dist/process/runs/ownership.js +1 -1
  134. package/dist/process/runs/stop.js +1 -1
  135. package/dist/process/shutdown.js +1 -1
  136. package/dist/process/windows-native.js +1 -1
  137. package/dist/repo/history.js +7 -4
  138. package/dist/repo/managed-git.js +1 -1
  139. package/dist/repo/state.js +4 -4
  140. package/dist/steps/environment.js +1 -1
  141. package/dist/toolchains/node-provisioning.js +2 -2
  142. package/dist/tracker/gitea.js +1 -1
  143. package/dist/tracker/github.js +1 -1
  144. package/dist/tracker/http.js +1 -1
  145. package/dist/tracker/ownership.js +1 -0
  146. package/dist/tracker/redaction.js +1 -1
  147. package/dist/tracker/responses.js +1 -1
  148. package/dist/types/playwright.d.ts +21 -0
  149. package/dist/types/workspace.d.ts +4 -4
  150. package/docs/bug-records.md +16 -10
  151. package/docs/engines.md +52 -4
  152. package/docs/release-notes.md +730 -0
  153. package/package.json +14 -2
  154. package/testkit-config-schema.md +36 -42
  155. package/dist/config/loader/task-policy.js +0 -1
  156. package/dist/environment/lifecycle-artifacts.js +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gfdelarue/testkit",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Test orchestration platform for product acceptance and QA workflows",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",
@@ -136,7 +136,19 @@
136
136
  "yauzl": "3.4.0"
137
137
  },
138
138
  "overrides": {
139
- "postcss": "8.5.24"
139
+ "@verdaccio/config": {
140
+ "js-yaml": "5.4.1"
141
+ },
142
+ "@verdaccio/hooks": {
143
+ "handlebars": "4.7.10"
144
+ },
145
+ "express": {
146
+ "qs": "6.16.0"
147
+ },
148
+ "postcss": "8.5.24",
149
+ "verdaccio": {
150
+ "compression": "1.8.2"
151
+ }
140
152
  },
141
153
  "engines": {
142
154
  "node": ">=22.15.0 <23.0.0 || >=24.14.1 <25.0.0",
@@ -75,7 +75,7 @@ file-local metadata of a typed file may also declare skip and lock intent:
75
75
  import { defineFile } from "@gfdelarue/testkit";
76
76
 
77
77
  export const testkit = defineFile({
78
- engine: "node-vitest",
78
+ engine: "playwright",
79
79
  skip: "Billing is currently unavailable locally",
80
80
  locks: ["payments-sandbox-webhook"],
81
81
  });
@@ -148,8 +148,7 @@ Run documents keep the configured `run.workers` field. Observed
148
148
  `workerCount`, Playwright's own `workers`, `runtime.instances` and
149
149
  `runtime.maxConcurrentTasks` keep their existing meanings.
150
150
 
151
- `fileTimeoutSeconds` is the single per-file wall clock budget for the repo. Runtime
152
- helpers like `waitFor()` consume this budget automatically.
151
+ `fileTimeoutSeconds` is the single per-file wall clock budget for the repo.
153
152
 
154
153
  ### `lint`
155
154
 
@@ -196,7 +195,11 @@ areas: {
196
195
 
197
196
  - The key is the area id: lowercase letters, digits, and single hyphens, at
198
197
  most 40 characters.
199
- - `name`: one line of 1 to 60 characters. It becomes the label's description.
198
+ - `name`: one line of 1 to 60 characters. It becomes the label's description,
199
+ and the issue carries it. Testkit doesn't rewrite it, so it must hold no
200
+ text that Testkit redacts as a secret. `testkit bug file` stops when the
201
+ fault's area has such a name. [Issue body](docs/bug-records.md#issue-body)
202
+ lists what Testkit redacts.
200
203
  - `paths`: at least one glob. Globs are relative to the repository root and
201
204
  written with `/`. A leading `!` or `/` and a `..` segment are rejected.
202
205
 
@@ -592,10 +595,10 @@ Environment names are validated case-insensitively. All engines reserve
592
595
  `XDG_CONFIG_HOME`, and `XDG_DATA_HOME`. Engine-specific reservations and limits
593
596
  are:
594
597
 
595
- | Engine | Additional reservations | Consumer environment limit |
596
- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ |
597
- | `node-vitest` | exact keys `BASE_URL`, `FORCE_COLOR`, `NODE_OPTIONS`, `NO_COLOR`, `UPDATE_SNAPSHOT`, `VITEST_POOL_ID`, `VITEST_WORKER_ID`, and the `TESTKIT_` keys it sets | 512 entries; 4 MiB of UTF-8 key/value data |
598
- | `playwright` | prefixes `TESTKIT_`, `PLAYWRIGHT_`, `PWTEST_`, `PW_TEST_`; exact keys `BASE_URL`, `FORCE_COLOR`, `NODE_OPTIONS`, `NO_COLOR` | 512 entries; 2 MiB of UTF-8 key/value data |
598
+ | Engine | Additional reservations | Consumer environment limit |
599
+ | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------ |
600
+ | `node-vitest` | exact keys `BASE_URL`, `FORCE_COLOR`, `NODE_OPTIONS`, `NO_COLOR`, `UPDATE_SNAPSHOT`, `VITEST_POOL_ID`, `VITEST_WORKER_ID`, and the `TESTKIT_` keys it sets | 512 entries; 4 MiB of UTF-8 key/value data |
601
+ | `playwright` | prefixes `TESTKIT_`, `PLAYWRIGHT_`, `PWTEST_`, `PW_TEST_`; exact keys `BASE_URL`, `DBUS_SESSION_BUS_ADDRESS`, `FC_FONTATIONS`, `FORCE_COLOR`, `NODE_OPTIONS`, `NO_COLOR` | 512 entries; 2 MiB of UTF-8 key/value data |
599
602
 
600
603
  Empty names, names containing `=` or NUL, values containing NUL, and
601
604
  case-variant duplicates are rejected. The limits apply after env files and
@@ -709,13 +712,37 @@ service provisioned in the same runtime instance, as `DATABASE_URL` and in
709
712
 
710
713
  ### `runtime`
711
714
 
712
- Shared runtime topology and preparation behavior.
715
+ Service-local runtime instances and their preparation.
716
+
717
+ ```ts
718
+ runtime: {
719
+ instances: 1,
720
+ maxConcurrentTasks: 4,
721
+ prepare: {
722
+ inputs: ["frontend/src", "frontend/public", "frontend/package.json"],
723
+ steps: [{ kind: "command", run: "npm run build", cwd: "frontend" }],
724
+ },
725
+ }
726
+ ```
713
727
 
714
728
  - `instances`
729
+ - number of reusable local runtime instances for that service graph
715
730
  - `maxConcurrentTasks`
731
+ - maximum number of concurrent file tasks admitted to each runtime instance
732
+ - omit it to leave concurrency bounded only by the outer `taskConcurrency` setting
716
733
  - `toolchain`
734
+ - `prepare`
735
+ - optional runtime-generation preparation hook
736
+ - runs once per runtime instance before local services start
737
+ - fingerprints declared `inputs` plus referenced step files/module inputs
738
+ - use this for build-once/start-many shared runtimes such as `next build` +
739
+ `next start`
717
740
  - `prepare.inputs`
741
+ - extra repo-relative inputs that should invalidate prepared artifacts when
742
+ they change
718
743
  - `prepare.steps`
744
+ - ordered lifecycle steps using the same step DSL as `database.template`
745
+ - each step supports `cwd` and `inputs`
719
746
 
720
747
  `runtime.toolchain` may be either:
721
748
 
@@ -771,39 +798,6 @@ A run that skips a selected file fails, even when every other file passes, and
771
798
  `--allow-empty` doesn't change that. Use `--ignore-skip-rules` on the CLI to run
772
799
  skipped files anyway.
773
800
 
774
- ### `runtime`
775
-
776
- Service-local runtime instance settings.
777
-
778
- ```ts
779
- runtime: {
780
- instances: 1,
781
- maxConcurrentTasks: 4,
782
- prepare: {
783
- inputs: ["frontend/src", "frontend/public", "frontend/package.json"],
784
- steps: [{ kind: "command", run: "npm run build", cwd: "frontend" }],
785
- },
786
- }
787
- ```
788
-
789
- - `instances`
790
- - number of reusable local runtime instances for that service graph
791
- - `maxConcurrentTasks`
792
- - maximum number of concurrent file tasks admitted to each runtime instance
793
- - omit it to leave concurrency bounded only by the outer `taskConcurrency` setting
794
- - `prepare`
795
- - optional runtime-generation preparation hook
796
- - runs once per runtime instance before local services start
797
- - fingerprints declared `inputs` plus referenced step files/module inputs
798
- - use this for build-once/start-many shared runtimes such as `next build` +
799
- `next start`
800
- - `prepare.inputs`
801
- - extra repo-relative inputs that should invalidate prepared artifacts when
802
- they change
803
- - `prepare.steps`
804
- - ordered lifecycle steps using the same step DSL as `database.template`
805
- - each step supports `cwd` and `inputs`
806
-
807
801
  ### `requirements`
808
802
 
809
803
  Task lock rules for a group's files, set as `groups.<name>.requirements`.
@@ -1 +0,0 @@
1
- import{matchesSuiteSelectors as a}from"../../domain/suite-selection.js";import{normalizePath as l}from"./paths.js";import{resolveRuntimeIsolationPolicy as i}from"./runtime-isolation.js";export function resolveTaskPolicy(o,t,r){return{locks:m(o,t,r),runtimeIsolation:i({testkit:o},t,r)}}function m(o,t,r){const n=l(r),s=new Set;for(const e of o.requirements.suites)if(a(t.testType,t.name,[e.selector]))for(const c of e.locks)s.add(c);for(const e of o.requirements.fileLocksByPath.get(n)??[])s.add(e);for(const e of o.fileMetadataByPath.get(n)?.locks??[])s.add(e);return[...s].sort()}
@@ -1 +0,0 @@
1
- import o from"fs";import a from"path";import{finalizeLiveRunArtifact as e}from"../evidence/index.js";import{isUnknownRecord as u}from"../kernel/unknown-values.js";export function reconcileInactiveRunArtifact(n,t){typeof t.runId=="string"&&e(n,{runId:t.runId,reason:"stale run process not active",status:"interrupted"})}export function reconcileOrphanedLiveRunArtifact(n,{activeRunIds:t=new Set}={}){const r=f(n),i=r?.run.id||null;return!i||r?.run.status!=="running"||t.has(i)?!1:e(n,{runId:i,reason:"stale live artifact has no active run manifest",status:"interrupted"})}function f(n){try{const t=JSON.parse(o.readFileSync(a.join(n,".testkit","results","live.json"),"utf8"));return c(t)}catch{return null}}function c(n){if(!u(n)||!u(n.run))return null;const t=n.run.id,r=n.run.status;return!s(t)||!s(r)?null:{run:{id:t,status:r}}}function s(n){return n===void 0||typeof n=="string"}