@runa-ai/runa-cli 0.5.71 → 0.6.0

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 (508) hide show
  1. package/dist/build-BXUJKYHC.js +1730 -0
  2. package/dist/cache-H63JKFYH.js +112 -0
  3. package/dist/check-6AB5NGWK.js +207 -0
  4. package/dist/chunk-22CS6EMA.js +31 -0
  5. package/dist/chunk-3FDQW524.js +544 -0
  6. package/dist/chunk-5NKWR4FF.js +254 -0
  7. package/dist/chunk-6AALH2ED.js +121 -0
  8. package/dist/chunk-6Y3LAUGL.js +35 -0
  9. package/dist/chunk-7QV7U6NI.js +62 -0
  10. package/dist/chunk-AAIE4F2U.js +140 -0
  11. package/dist/chunk-CCKG5R4Y.js +59 -0
  12. package/dist/chunk-CE3DEYFT.js +480 -0
  13. package/dist/chunk-DRSUEMAK.js +123 -0
  14. package/dist/chunk-GOGRLQNP.js +12 -0
  15. package/dist/chunk-HD74F6W2.js +460 -0
  16. package/dist/chunk-HKUWEGUX.js +36 -0
  17. package/dist/chunk-HPYJPB5Y.js +408 -0
  18. package/dist/chunk-IBVVGH6X.js +33 -0
  19. package/dist/chunk-II7VYQEM.js +179 -0
  20. package/dist/chunk-JMJP4A47.js +204 -0
  21. package/dist/chunk-JQXOVCOP.js +574 -0
  22. package/dist/chunk-JT5SUTWE.js +9 -0
  23. package/dist/chunk-KWX3JHCY.js +85 -0
  24. package/dist/chunk-M47WJJVS.js +71 -0
  25. package/dist/chunk-MNPMZERI.js +194 -0
  26. package/dist/chunk-MXRWBNIY.js +74 -0
  27. package/dist/chunk-NPSRD26F.js +149 -0
  28. package/dist/chunk-P7U52PBY.js +1149 -0
  29. package/dist/chunk-QDF7QXBL.js +67 -0
  30. package/dist/chunk-RRGQCUKT.js +48 -0
  31. package/dist/chunk-RZLYEO4U.js +219 -0
  32. package/dist/chunk-TYIAD6SB.js +74 -0
  33. package/dist/chunk-UU55OH7P.js +42 -0
  34. package/dist/chunk-UWWSAPDR.js +31 -0
  35. package/dist/chunk-VM3IWOT5.js +458 -0
  36. package/dist/chunk-VRXHCR5K.js +42 -0
  37. package/dist/chunk-XJBQINSA.js +351 -0
  38. package/dist/chunk-ZZOXM6Q4.js +8 -0
  39. package/dist/ci-V3PIG2GI.js +8322 -0
  40. package/dist/cli/index.d.ts +7 -1
  41. package/dist/cli/requested-command.d.ts +8 -0
  42. package/dist/cli-GFRZCJQR.js +661 -0
  43. package/dist/commands/build/actors/db-sync.d.ts +2 -0
  44. package/dist/commands/build/actors/static-checks.d.ts +7 -6
  45. package/dist/commands/build/contract.d.ts +30 -30
  46. package/dist/commands/build/machine-dry-run.d.ts +3 -0
  47. package/dist/commands/build/machine-e2e-meta.d.ts +120 -0
  48. package/dist/commands/build/machine.d.ts +22 -22
  49. package/dist/commands/build/types.d.ts +2 -4
  50. package/dist/commands/ci/machine/contract.d.ts +26 -26
  51. package/dist/commands/ci/machine/formatters/sections/final-comment.d.ts +1 -5
  52. package/dist/commands/ci/machine/formatters/sections/format-helpers.d.ts +5 -0
  53. package/dist/commands/ci/machine/formatters/sections/index.d.ts +2 -2
  54. package/dist/commands/ci/machine/machine-execution-helpers.d.ts +40 -0
  55. package/dist/commands/ci/machine/machine-state-helpers.d.ts +14 -0
  56. package/dist/commands/ci/machine/machine.d.ts +12 -12
  57. package/dist/commands/ci/machine/types.d.ts +0 -5
  58. package/dist/commands/ci/utils/ci-summary.d.ts +15 -15
  59. package/dist/commands/ci/utils/execa-helpers.d.ts +1 -0
  60. package/dist/commands/db/apply/actors/idempotent-actors.d.ts +34 -0
  61. package/dist/commands/db/apply/actors/lock-actors.d.ts +16 -0
  62. package/dist/commands/db/apply/actors/pg-schema-diff-actors.d.ts +31 -0
  63. package/dist/commands/db/apply/actors/seed-actors.d.ts +11 -0
  64. package/dist/commands/db/apply/actors/shared.d.ts +9 -0
  65. package/dist/commands/db/apply/actors.d.ts +16 -65
  66. package/dist/commands/db/apply/contract.d.ts +8 -1
  67. package/dist/commands/db/apply/helpers/data-compatibility-checker.d.ts +3 -4
  68. package/dist/commands/db/apply/helpers/data-integrity-verifier.d.ts +37 -0
  69. package/dist/commands/db/apply/helpers/fresh-db-handler.d.ts +34 -0
  70. package/dist/commands/db/apply/helpers/hazard-handler.d.ts +60 -0
  71. package/dist/commands/db/apply/helpers/idempotent-object-registry.d.ts +96 -0
  72. package/dist/commands/db/apply/helpers/idempotent-transaction.d.ts +20 -0
  73. package/dist/commands/db/apply/helpers/index.d.ts +7 -1
  74. package/dist/commands/db/apply/helpers/partition-validator.d.ts +2 -15
  75. package/dist/commands/db/apply/helpers/pg-schema-diff-helpers.d.ts +18 -162
  76. package/dist/commands/db/apply/helpers/pg-schema-diff-patterns.d.ts +55 -0
  77. package/dist/commands/db/apply/helpers/pg-schema-diff-version.d.ts +50 -0
  78. package/dist/commands/db/apply/helpers/plan-validator.d.ts +30 -10
  79. package/dist/commands/db/apply/helpers/rbac-password-manager.d.ts +34 -0
  80. package/dist/commands/db/apply/helpers/retry-logic.d.ts +16 -2
  81. package/dist/commands/db/apply/helpers/shadow-db-manager.d.ts +1 -1
  82. package/dist/commands/db/apply/helpers/sql-utils.d.ts +26 -0
  83. package/dist/commands/db/apply/machine.d.ts +52 -1
  84. package/dist/commands/db/commands/db-apply.d.ts +18 -0
  85. package/dist/commands/db/commands/db-sync/boundary-classifier.d.ts +21 -0
  86. package/dist/commands/db/commands/db-sync/plan-hazard-analyzer.d.ts +13 -0
  87. package/dist/commands/db/commands/db-sync/risk-reporter.d.ts +19 -0
  88. package/dist/commands/db/commands/db-sync/sql-parser.d.ts +25 -0
  89. package/dist/commands/db/commands/db-sync/types.d.ts +47 -0
  90. package/dist/commands/db/commands/db-sync.d.ts +14 -0
  91. package/dist/commands/db/sync/contract.d.ts +6 -2
  92. package/dist/commands/db/sync/machine.d.ts +2 -1
  93. package/dist/commands/db/types.d.ts +2 -0
  94. package/dist/commands/db/utils/boundary-policy/rule-compiler.d.ts +11 -0
  95. package/dist/commands/db/utils/boundary-policy/types.d.ts +105 -0
  96. package/dist/commands/db/utils/boundary-policy/validation.d.ts +20 -0
  97. package/dist/commands/db/utils/boundary-policy-runtime.d.ts +28 -0
  98. package/dist/commands/db/utils/boundary-policy.d.ts +5 -0
  99. package/dist/commands/db/utils/idempotent-risk-context.d.ts +29 -0
  100. package/dist/commands/db/utils/preflight-check.d.ts +14 -0
  101. package/dist/commands/db/utils/preflight-checks/domain-naming-checks.d.ts +106 -0
  102. package/dist/commands/db/utils/preflight-checks/orphan-checks.d.ts +36 -0
  103. package/dist/commands/db/utils/preflight-checks/schema-risk-checks.d.ts +22 -0
  104. package/dist/commands/db/utils/preflight-checks/supabase-checks.d.ts +55 -0
  105. package/dist/commands/db/utils/risk-detector-loader.d.ts +8 -0
  106. package/dist/commands/db/utils/schema-precheck-budget.d.ts +17 -0
  107. package/dist/commands/db/utils/sql-boundary-parser.d.ts +12 -0
  108. package/dist/commands/db/utils/sql-file-collector.d.ts +8 -0
  109. package/dist/commands/db/utils/sql-filename-parser.d.ts +20 -0
  110. package/dist/commands/db/utils/sql-table-extractor-ast.d.ts +19 -0
  111. package/dist/commands/db/utils/sql-table-extractor-regex.d.ts +50 -0
  112. package/dist/commands/db/utils/sql-table-extractor-rls.d.ts +13 -0
  113. package/dist/commands/db/utils/sql-table-extractor.d.ts +79 -1
  114. package/dist/commands/db/utils/table-registry-introspection.d.ts +68 -0
  115. package/dist/commands/db/utils/table-registry.d.ts +3 -38
  116. package/dist/commands/dev/actors/app-lifecycle.d.ts +18 -0
  117. package/dist/commands/dev/actors/index.d.ts +7 -2
  118. package/dist/commands/dev/actors/process-check.d.ts +12 -0
  119. package/dist/commands/dev/actors/shared.d.ts +15 -0
  120. package/dist/commands/dev/contract.d.ts +2 -2
  121. package/dist/commands/dev/machine.d.ts +7 -31
  122. package/dist/commands/env/commands/env-pull/auth.d.ts +13 -0
  123. package/dist/commands/env/commands/env-pull/dotenv-files.d.ts +14 -0
  124. package/dist/commands/env/commands/env-pull/security.d.ts +12 -0
  125. package/dist/commands/env/commands/env-pull/service.d.ts +8 -0
  126. package/dist/commands/env/commands/env-pull/shared.d.ts +79 -0
  127. package/dist/commands/env/commands/setup/types.d.ts +1 -1
  128. package/dist/commands/env/constants/local-supabase.d.ts +2 -0
  129. package/dist/commands/template-check/contract.d.ts +6 -6
  130. package/dist/commands/template-check/machine.d.ts +2 -2
  131. package/dist/commands/template-check/types.d.ts +0 -4
  132. package/dist/commands/template-check/utils/diff-analyzer.d.ts +0 -4
  133. package/dist/config/env.d.ts +4 -4
  134. package/dist/config-loader-GT3HAQ7U.js +7 -0
  135. package/dist/db-HR7CREX2.js +15913 -0
  136. package/dist/dev-A7RW6XQV.js +873 -0
  137. package/dist/env-B47Z4747.js +2624 -0
  138. package/dist/env-HMMRSYCI.js +7 -0
  139. package/dist/env-files-K2C7O7L5.js +8 -0
  140. package/dist/error-handler-4EYSDOSE.js +460 -0
  141. package/dist/hotfix-CULKKMGS.js +1477 -0
  142. package/dist/index.d.ts +5 -1
  143. package/dist/index.js +48 -42912
  144. package/dist/init-ELK5QCWR.js +632 -0
  145. package/dist/inject-test-attrs-Y5UD5P7Q.js +36 -0
  146. package/dist/internal/machines/snapshot-helpers.d.ts +6 -0
  147. package/dist/lib/sql-comment-utils.d.ts +25 -0
  148. package/dist/license-OB7GVJQ2.js +468 -0
  149. package/dist/link-C43JRZWY.js +60 -0
  150. package/dist/manifest-2NOQ2IMK.js +32 -0
  151. package/dist/prepare-32DOVHTE.js +250 -0
  152. package/dist/risk-detector-BXUY2WKS.js +6 -0
  153. package/dist/risk-detector-core-O7I7SPR7.js +166 -0
  154. package/dist/risk-detector-plpgsql-SGMVKYJP.js +1856 -0
  155. package/dist/sdk-XK6HQU7S.js +348 -0
  156. package/dist/services-7VK5KZTO.js +177 -0
  157. package/dist/session-SFW5QSXZ.js +142 -0
  158. package/dist/signal-handler-DO3OANW5.js +6 -0
  159. package/dist/status-IJ4ZWHMX.js +95 -0
  160. package/dist/telemetry-FN7V727Y.js +94 -0
  161. package/dist/template-check-PNG5NQ5H.js +1933 -0
  162. package/dist/test-QYXE5UVW.js +626 -0
  163. package/dist/test-gen-QPWOIEHU.js +89 -0
  164. package/dist/ui-RJAMCWUI.js +331 -0
  165. package/dist/upgrade-3SLWVNAC.js +625 -0
  166. package/dist/utils/config-loader.d.ts +0 -3
  167. package/dist/validate-SM4PXPS7.js +55 -0
  168. package/dist/validators/risk-detector-content-risks.d.ts +13 -0
  169. package/dist/validators/risk-detector-core.d.ts +25 -0
  170. package/dist/validators/risk-detector-patterns.d.ts +15 -0
  171. package/dist/validators/risk-detector-plpgsql-expression-resolver.d.ts +22 -0
  172. package/dist/validators/risk-detector-plpgsql-parser.d.ts +5 -0
  173. package/dist/validators/risk-detector-plpgsql-tokenizer.d.ts +18 -0
  174. package/dist/validators/risk-detector-plpgsql.d.ts +9 -0
  175. package/dist/validators/risk-detector-text-utils.d.ts +6 -0
  176. package/dist/validators/risk-detector-types.d.ts +16 -0
  177. package/dist/validators/risk-detector.d.ts +7 -26
  178. package/dist/vuln-check-TYQNEFS7.js +122 -0
  179. package/dist/vuln-checker-2QXGN5YT.js +2950 -0
  180. package/dist/watch-UCDVOQAH.js +911 -0
  181. package/dist/workflow-ZB5Q2PFY.js +898 -0
  182. package/package.json +4 -1
  183. package/dist/cli/contract-mode.d.ts.map +0 -1
  184. package/dist/cli/contract-output.d.ts.map +0 -1
  185. package/dist/cli/early-flags.d.ts.map +0 -1
  186. package/dist/cli/error-handler.d.ts.map +0 -1
  187. package/dist/cli/exec.d.ts.map +0 -1
  188. package/dist/cli/index.d.ts.map +0 -1
  189. package/dist/cli/json-output.d.ts.map +0 -1
  190. package/dist/cli/non-interactive.d.ts.map +0 -1
  191. package/dist/cli/output-format.d.ts.map +0 -1
  192. package/dist/cli/signal-handler.d.ts.map +0 -1
  193. package/dist/commands/build/actors/build.d.ts.map +0 -1
  194. package/dist/commands/build/actors/clean.d.ts.map +0 -1
  195. package/dist/commands/build/actors/db-sync.d.ts.map +0 -1
  196. package/dist/commands/build/actors/index.d.ts.map +0 -1
  197. package/dist/commands/build/actors/manifest.d.ts.map +0 -1
  198. package/dist/commands/build/actors/setup.d.ts.map +0 -1
  199. package/dist/commands/build/actors/static-checks.d.ts.map +0 -1
  200. package/dist/commands/build/actors/validate.d.ts.map +0 -1
  201. package/dist/commands/build/commands/build.d.ts.map +0 -1
  202. package/dist/commands/build/contract.d.ts.map +0 -1
  203. package/dist/commands/build/guards.d.ts.map +0 -1
  204. package/dist/commands/build/index.d.ts.map +0 -1
  205. package/dist/commands/build/machine.d.ts.map +0 -1
  206. package/dist/commands/build/types.d.ts.map +0 -1
  207. package/dist/commands/cache.d.ts.map +0 -1
  208. package/dist/commands/check/commands/check.d.ts.map +0 -1
  209. package/dist/commands/check/index.d.ts.map +0 -1
  210. package/dist/commands/ci/commands/ci-checks.d.ts.map +0 -1
  211. package/dist/commands/ci/commands/ci-layer-content.d.ts.map +0 -1
  212. package/dist/commands/ci/commands/ci-pr-capabilities.d.ts.map +0 -1
  213. package/dist/commands/ci/commands/ci-prod-apply.d.ts.map +0 -1
  214. package/dist/commands/ci/commands/ci-prod-db-operations.d.ts.map +0 -1
  215. package/dist/commands/ci/commands/ci-prod-github.d.ts.map +0 -1
  216. package/dist/commands/ci/commands/ci-prod-types.d.ts.map +0 -1
  217. package/dist/commands/ci/commands/ci-prod-utils.d.ts.map +0 -1
  218. package/dist/commands/ci/commands/ci-prod-workflow.d.ts.map +0 -1
  219. package/dist/commands/ci/commands/ci-resolvers.d.ts.map +0 -1
  220. package/dist/commands/ci/commands/ci-static.d.ts.map +0 -1
  221. package/dist/commands/ci/commands/ci-supabase-local.d.ts.map +0 -1
  222. package/dist/commands/ci/index.d.ts.map +0 -1
  223. package/dist/commands/ci/machine/actors/build/app-build.d.ts.map +0 -1
  224. package/dist/commands/ci/machine/actors/build/app-start.d.ts.map +0 -1
  225. package/dist/commands/ci/machine/actors/build/build-and-playwright.d.ts.map +0 -1
  226. package/dist/commands/ci/machine/actors/build/index.d.ts.map +0 -1
  227. package/dist/commands/ci/machine/actors/build/playwright-install.d.ts.map +0 -1
  228. package/dist/commands/ci/machine/actors/build/static-checks.d.ts.map +0 -1
  229. package/dist/commands/ci/machine/actors/db/apply-seeds.d.ts.map +0 -1
  230. package/dist/commands/ci/machine/actors/db/collect-schema-stats.d.ts.map +0 -1
  231. package/dist/commands/ci/machine/actors/db/index.d.ts.map +0 -1
  232. package/dist/commands/ci/machine/actors/db/pgtap-install.d.ts.map +0 -1
  233. package/dist/commands/ci/machine/actors/db/production-preview.d.ts.map +0 -1
  234. package/dist/commands/ci/machine/actors/db/pull-production.d.ts.map +0 -1
  235. package/dist/commands/ci/machine/actors/db/reset.d.ts.map +0 -1
  236. package/dist/commands/ci/machine/actors/db/schema-stats.d.ts.map +0 -1
  237. package/dist/commands/ci/machine/actors/db/setup-roles.d.ts.map +0 -1
  238. package/dist/commands/ci/machine/actors/db/sync-schema.d.ts.map +0 -1
  239. package/dist/commands/ci/machine/actors/finalize/github.d.ts.map +0 -1
  240. package/dist/commands/ci/machine/actors/finalize/index.d.ts.map +0 -1
  241. package/dist/commands/ci/machine/actors/finalize/summary.d.ts.map +0 -1
  242. package/dist/commands/ci/machine/actors/index.d.ts.map +0 -1
  243. package/dist/commands/ci/machine/actors/setup/index.d.ts.map +0 -1
  244. package/dist/commands/ci/machine/actors/setup/local.d.ts.map +0 -1
  245. package/dist/commands/ci/machine/actors/setup/pr-common.d.ts.map +0 -1
  246. package/dist/commands/ci/machine/actors/setup/pr-local.d.ts.map +0 -1
  247. package/dist/commands/ci/machine/actors/test/capabilities.d.ts.map +0 -1
  248. package/dist/commands/ci/machine/actors/test/index.d.ts.map +0 -1
  249. package/dist/commands/ci/machine/actors/test/run-layers.d.ts.map +0 -1
  250. package/dist/commands/ci/machine/commands/ci-local.d.ts.map +0 -1
  251. package/dist/commands/ci/machine/commands/ci-pr.d.ts.map +0 -1
  252. package/dist/commands/ci/machine/commands/index.d.ts.map +0 -1
  253. package/dist/commands/ci/machine/commands/machine-runner.d.ts.map +0 -1
  254. package/dist/commands/ci/machine/commands/runtime-env.d.ts.map +0 -1
  255. package/dist/commands/ci/machine/contract.d.ts.map +0 -1
  256. package/dist/commands/ci/machine/formatters/github-comment-types.d.ts.map +0 -1
  257. package/dist/commands/ci/machine/formatters/github-comment.d.ts.map +0 -1
  258. package/dist/commands/ci/machine/formatters/index.d.ts.map +0 -1
  259. package/dist/commands/ci/machine/formatters/sections/final-comment.d.ts.map +0 -1
  260. package/dist/commands/ci/machine/formatters/sections/format-helpers.d.ts.map +0 -1
  261. package/dist/commands/ci/machine/formatters/sections/index.d.ts.map +0 -1
  262. package/dist/commands/ci/machine/formatters/sections/progress-comment.d.ts.map +0 -1
  263. package/dist/commands/ci/machine/formatters/sections/schema-matrix.d.ts.map +0 -1
  264. package/dist/commands/ci/machine/formatters/summary.d.ts.map +0 -1
  265. package/dist/commands/ci/machine/guards.d.ts.map +0 -1
  266. package/dist/commands/ci/machine/helpers.d.ts.map +0 -1
  267. package/dist/commands/ci/machine/index.d.ts.map +0 -1
  268. package/dist/commands/ci/machine/machine.d.ts.map +0 -1
  269. package/dist/commands/ci/machine/types.d.ts.map +0 -1
  270. package/dist/commands/ci/utils/ai-report.d.ts.map +0 -1
  271. package/dist/commands/ci/utils/app-process.d.ts.map +0 -1
  272. package/dist/commands/ci/utils/app-runtime.d.ts.map +0 -1
  273. package/dist/commands/ci/utils/ci-config.d.ts.map +0 -1
  274. package/dist/commands/ci/utils/ci-env-schema.d.ts.map +0 -1
  275. package/dist/commands/ci/utils/ci-logging.d.ts.map +0 -1
  276. package/dist/commands/ci/utils/ci-summary.d.ts.map +0 -1
  277. package/dist/commands/ci/utils/config-readers.d.ts.map +0 -1
  278. package/dist/commands/ci/utils/db-url-utils.d.ts.map +0 -1
  279. package/dist/commands/ci/utils/e2e-auth-setup.d.ts.map +0 -1
  280. package/dist/commands/ci/utils/env-security.d.ts.map +0 -1
  281. package/dist/commands/ci/utils/execa-helpers.d.ts.map +0 -1
  282. package/dist/commands/ci/utils/exit-code-computation.d.ts.map +0 -1
  283. package/dist/commands/ci/utils/github-api.d.ts.map +0 -1
  284. package/dist/commands/ci/utils/github.d.ts.map +0 -1
  285. package/dist/commands/ci/utils/index.d.ts.map +0 -1
  286. package/dist/commands/ci/utils/pgtap-installer.d.ts.map +0 -1
  287. package/dist/commands/ci/utils/rls-verification.d.ts.map +0 -1
  288. package/dist/commands/ci/utils/schema-operations.d.ts.map +0 -1
  289. package/dist/commands/ci/utils/seed-operations.d.ts.map +0 -1
  290. package/dist/commands/ci/utils/test-parallel.d.ts.map +0 -1
  291. package/dist/commands/ci/utils/timestamp-invariants.d.ts.map +0 -1
  292. package/dist/commands/ci/utils/workflow-idempotency.d.ts.map +0 -1
  293. package/dist/commands/db/apply/actors.d.ts.map +0 -1
  294. package/dist/commands/db/apply/contract.d.ts.map +0 -1
  295. package/dist/commands/db/apply/helpers/advisory-lock.d.ts.map +0 -1
  296. package/dist/commands/db/apply/helpers/data-compatibility-checker.d.ts.map +0 -1
  297. package/dist/commands/db/apply/helpers/index.d.ts.map +0 -1
  298. package/dist/commands/db/apply/helpers/partition-acl-cleaner.d.ts.map +0 -1
  299. package/dist/commands/db/apply/helpers/partition-prefilter.d.ts.map +0 -1
  300. package/dist/commands/db/apply/helpers/partition-validator.d.ts.map +0 -1
  301. package/dist/commands/db/apply/helpers/pg-schema-diff-helpers.d.ts.map +0 -1
  302. package/dist/commands/db/apply/helpers/plan-validator.d.ts.map +0 -1
  303. package/dist/commands/db/apply/helpers/retry-logic.d.ts.map +0 -1
  304. package/dist/commands/db/apply/helpers/shadow-db-manager.d.ts.map +0 -1
  305. package/dist/commands/db/apply/index.d.ts.map +0 -1
  306. package/dist/commands/db/apply/machine.d.ts.map +0 -1
  307. package/dist/commands/db/commands/db-apply.d.ts.map +0 -1
  308. package/dist/commands/db/commands/db-audit.d.ts.map +0 -1
  309. package/dist/commands/db/commands/db-backup.d.ts.map +0 -1
  310. package/dist/commands/db/commands/db-cleanup.d.ts.map +0 -1
  311. package/dist/commands/db/commands/db-derive-role-passwords.d.ts.map +0 -1
  312. package/dist/commands/db/commands/db-derive-urls.d.ts.map +0 -1
  313. package/dist/commands/db/commands/db-diagram.d.ts.map +0 -1
  314. package/dist/commands/db/commands/db-drizzle.d.ts.map +0 -1
  315. package/dist/commands/db/commands/db-extension.d.ts.map +0 -1
  316. package/dist/commands/db/commands/db-generate-password.d.ts.map +0 -1
  317. package/dist/commands/db/commands/db-lifecycle.d.ts.map +0 -1
  318. package/dist/commands/db/commands/db-rollback.d.ts.map +0 -1
  319. package/dist/commands/db/commands/db-schema.d.ts.map +0 -1
  320. package/dist/commands/db/commands/db-seed-metadata.d.ts.map +0 -1
  321. package/dist/commands/db/commands/db-seed-verify.d.ts.map +0 -1
  322. package/dist/commands/db/commands/db-seed.d.ts.map +0 -1
  323. package/dist/commands/db/commands/db-snapshot.d.ts.map +0 -1
  324. package/dist/commands/db/commands/db-stack.d.ts.map +0 -1
  325. package/dist/commands/db/commands/db-stats.d.ts.map +0 -1
  326. package/dist/commands/db/commands/db-sync.d.ts.map +0 -1
  327. package/dist/commands/db/commands/db-test.d.ts.map +0 -1
  328. package/dist/commands/db/constants.d.ts.map +0 -1
  329. package/dist/commands/db/extension-registry.d.ts.map +0 -1
  330. package/dist/commands/db/index.d.ts.map +0 -1
  331. package/dist/commands/db/preflight/actors.d.ts.map +0 -1
  332. package/dist/commands/db/preflight/contract.d.ts.map +0 -1
  333. package/dist/commands/db/preflight/index.d.ts.map +0 -1
  334. package/dist/commands/db/sync/actors.d.ts.map +0 -1
  335. package/dist/commands/db/sync/contract.d.ts.map +0 -1
  336. package/dist/commands/db/sync/index.d.ts.map +0 -1
  337. package/dist/commands/db/sync/machine.d.ts.map +0 -1
  338. package/dist/commands/db/types.d.ts.map +0 -1
  339. package/dist/commands/db/utils/db-target.d.ts.map +0 -1
  340. package/dist/commands/db/utils/db-url-builder.d.ts.map +0 -1
  341. package/dist/commands/db/utils/error-handlers.d.ts.map +0 -1
  342. package/dist/commands/db/utils/import-impact-analyzer.d.ts.map +0 -1
  343. package/dist/commands/db/utils/preflight-check.d.ts.map +0 -1
  344. package/dist/commands/db/utils/psql.d.ts.map +0 -1
  345. package/dist/commands/db/utils/schema-detector.d.ts.map +0 -1
  346. package/dist/commands/db/utils/schema-sync.d.ts.map +0 -1
  347. package/dist/commands/db/utils/script-runner.d.ts.map +0 -1
  348. package/dist/commands/db/utils/seed-manager.d.ts.map +0 -1
  349. package/dist/commands/db/utils/semantic-mapper.d.ts.map +0 -1
  350. package/dist/commands/db/utils/sql-table-extractor.d.ts.map +0 -1
  351. package/dist/commands/db/utils/stack-detector.d.ts.map +0 -1
  352. package/dist/commands/db/utils/table-registry.d.ts.map +0 -1
  353. package/dist/commands/db/utils/table-source-classifier.d.ts.map +0 -1
  354. package/dist/commands/dev/actors/index.d.ts.map +0 -1
  355. package/dist/commands/dev/commands/dev.d.ts.map +0 -1
  356. package/dist/commands/dev/contract.d.ts.map +0 -1
  357. package/dist/commands/dev/guards.d.ts.map +0 -1
  358. package/dist/commands/dev/helpers/stale-process-detector.d.ts.map +0 -1
  359. package/dist/commands/dev/machine.d.ts.map +0 -1
  360. package/dist/commands/dev/types.d.ts.map +0 -1
  361. package/dist/commands/env/commands/env-check.d.ts.map +0 -1
  362. package/dist/commands/env/commands/env-encrypt.d.ts.map +0 -1
  363. package/dist/commands/env/commands/env-pull.d.ts.map +0 -1
  364. package/dist/commands/env/commands/env-setup.d.ts.map +0 -1
  365. package/dist/commands/env/commands/env-sync.d.ts.map +0 -1
  366. package/dist/commands/env/commands/setup/action.d.ts.map +0 -1
  367. package/dist/commands/env/commands/setup/auth.d.ts.map +0 -1
  368. package/dist/commands/env/commands/setup/file-export.d.ts.map +0 -1
  369. package/dist/commands/env/commands/setup/github-api.d.ts.map +0 -1
  370. package/dist/commands/env/commands/setup/helpers.d.ts.map +0 -1
  371. package/dist/commands/env/commands/setup/index.d.ts.map +0 -1
  372. package/dist/commands/env/commands/setup/parsers.d.ts.map +0 -1
  373. package/dist/commands/env/commands/setup/prompts.d.ts.map +0 -1
  374. package/dist/commands/env/commands/setup/supabase-api.d.ts.map +0 -1
  375. package/dist/commands/env/commands/setup/types.d.ts.map +0 -1
  376. package/dist/commands/env/commands/setup/vercel-api.d.ts.map +0 -1
  377. package/dist/commands/env/constants/local-supabase.d.ts.map +0 -1
  378. package/dist/commands/env/index.d.ts.map +0 -1
  379. package/dist/commands/hotfix/actors.d.ts.map +0 -1
  380. package/dist/commands/hotfix/commands/hotfix-complete.d.ts.map +0 -1
  381. package/dist/commands/hotfix/commands/hotfix-create.d.ts.map +0 -1
  382. package/dist/commands/hotfix/commands/hotfix-deploy.d.ts.map +0 -1
  383. package/dist/commands/hotfix/commands/hotfix-status.d.ts.map +0 -1
  384. package/dist/commands/hotfix/contract.d.ts.map +0 -1
  385. package/dist/commands/hotfix/index.d.ts.map +0 -1
  386. package/dist/commands/hotfix/machine.d.ts.map +0 -1
  387. package/dist/commands/hotfix/metadata.d.ts.map +0 -1
  388. package/dist/commands/hotfix/utils/hotfix-machine-helper.d.ts.map +0 -1
  389. package/dist/commands/init.d.ts.map +0 -1
  390. package/dist/commands/inject-test-attrs/action.d.ts.map +0 -1
  391. package/dist/commands/inject-test-attrs/commands/inject-test-attrs.d.ts.map +0 -1
  392. package/dist/commands/inject-test-attrs/contract.d.ts.map +0 -1
  393. package/dist/commands/inject-test-attrs/detection-diagnostics.d.ts.map +0 -1
  394. package/dist/commands/inject-test-attrs/formatter.d.ts.map +0 -1
  395. package/dist/commands/inject-test-attrs/index.d.ts.map +0 -1
  396. package/dist/commands/inject-test-attrs/manifest-generator.d.ts.map +0 -1
  397. package/dist/commands/inject-test-attrs/processor-utils.d.ts.map +0 -1
  398. package/dist/commands/inject-test-attrs/processor.d.ts.map +0 -1
  399. package/dist/commands/inject-test-attrs/types.d.ts.map +0 -1
  400. package/dist/commands/link.d.ts.map +0 -1
  401. package/dist/commands/manifest/index.d.ts.map +0 -1
  402. package/dist/commands/prepare/commands/prepare.d.ts.map +0 -1
  403. package/dist/commands/prepare/index.d.ts.map +0 -1
  404. package/dist/commands/sdk/commands/publish.d.ts.map +0 -1
  405. package/dist/commands/sdk/index.d.ts.map +0 -1
  406. package/dist/commands/services/index.d.ts.map +0 -1
  407. package/dist/commands/session/index.d.ts.map +0 -1
  408. package/dist/commands/status.d.ts.map +0 -1
  409. package/dist/commands/telemetry.d.ts.map +0 -1
  410. package/dist/commands/template-check/actors/compare.d.ts.map +0 -1
  411. package/dist/commands/template-check/actors/discover.d.ts.map +0 -1
  412. package/dist/commands/template-check/actors/index.d.ts.map +0 -1
  413. package/dist/commands/template-check/actors/report.d.ts.map +0 -1
  414. package/dist/commands/template-check/commands/template-check.d.ts.map +0 -1
  415. package/dist/commands/template-check/config.d.ts.map +0 -1
  416. package/dist/commands/template-check/contract.d.ts.map +0 -1
  417. package/dist/commands/template-check/index.d.ts.map +0 -1
  418. package/dist/commands/template-check/machine.d.ts.map +0 -1
  419. package/dist/commands/template-check/types.d.ts.map +0 -1
  420. package/dist/commands/template-check/utils/diff-analyzer.d.ts.map +0 -1
  421. package/dist/commands/template-check/utils/normalizer.d.ts.map +0 -1
  422. package/dist/commands/template-check/utils/path-mapping.d.ts.map +0 -1
  423. package/dist/commands/test/commands/test-db.d.ts.map +0 -1
  424. package/dist/commands/test/commands/test-e2e.d.ts.map +0 -1
  425. package/dist/commands/test/commands/test-fast.d.ts.map +0 -1
  426. package/dist/commands/test/commands/test-integration.d.ts.map +0 -1
  427. package/dist/commands/test/commands/test-layer.d.ts.map +0 -1
  428. package/dist/commands/test/commands/test-owasp-generate.d.ts.map +0 -1
  429. package/dist/commands/test/commands/test-service.d.ts.map +0 -1
  430. package/dist/commands/test/commands/test-static.d.ts.map +0 -1
  431. package/dist/commands/test/commands/test.d.ts.map +0 -1
  432. package/dist/commands/test/index.d.ts.map +0 -1
  433. package/dist/commands/test-gen.d.ts.map +0 -1
  434. package/dist/commands/ui.d.ts.map +0 -1
  435. package/dist/commands/upgrade.d.ts.map +0 -1
  436. package/dist/commands/validate.d.ts.map +0 -1
  437. package/dist/commands/vuln-check.d.ts.map +0 -1
  438. package/dist/commands/watch.d.ts.map +0 -1
  439. package/dist/commands/workflow/commands/deploy-production.d.ts.map +0 -1
  440. package/dist/commands/workflow/commands/final-status.d.ts.map +0 -1
  441. package/dist/commands/workflow/commands/log.d.ts.map +0 -1
  442. package/dist/commands/workflow/commands/notify.d.ts.map +0 -1
  443. package/dist/commands/workflow/commands/paths.d.ts.map +0 -1
  444. package/dist/commands/workflow/commands/sync.d.ts.map +0 -1
  445. package/dist/commands/workflow/commands/validate.d.ts.map +0 -1
  446. package/dist/commands/workflow/commands/verify-credentials.d.ts.map +0 -1
  447. package/dist/commands/workflow/index.d.ts.map +0 -1
  448. package/dist/commands/workflow/types.d.ts.map +0 -1
  449. package/dist/config/env-files.d.ts.map +0 -1
  450. package/dist/config/env.d.ts.map +0 -1
  451. package/dist/constants/versions.d.ts.map +0 -1
  452. package/dist/contracts/envelope.d.ts.map +0 -1
  453. package/dist/errors/catalog.d.ts.map +0 -1
  454. package/dist/errors/exit-codes.d.ts.map +0 -1
  455. package/dist/errors/index.d.ts.map +0 -1
  456. package/dist/incremental/affected-tests.d.ts.map +0 -1
  457. package/dist/index.d.ts.map +0 -1
  458. package/dist/internal/machines/index.d.ts.map +0 -1
  459. package/dist/internal/machines/machine-runner.d.ts.map +0 -1
  460. package/dist/internal/machines/snapshot-helpers.d.ts.map +0 -1
  461. package/dist/internal/machines/types.d.ts.map +0 -1
  462. package/dist/internal/vuln-checker/analyzers/dependency-analyzer.d.ts.map +0 -1
  463. package/dist/internal/vuln-checker/analyzers/rls-analyzer.d.ts.map +0 -1
  464. package/dist/internal/vuln-checker/analyzers/secret-analyzer.d.ts.map +0 -1
  465. package/dist/internal/vuln-checker/analyzers/typescript-analyzer.d.ts.map +0 -1
  466. package/dist/internal/vuln-checker/config/loader.d.ts.map +0 -1
  467. package/dist/internal/vuln-checker/constants.d.ts.map +0 -1
  468. package/dist/internal/vuln-checker/ignore/matcher.d.ts.map +0 -1
  469. package/dist/internal/vuln-checker/index.d.ts.map +0 -1
  470. package/dist/internal/vuln-checker/reporters/console-reporter.d.ts.map +0 -1
  471. package/dist/internal/vuln-checker/reporters/json-reporter.d.ts.map +0 -1
  472. package/dist/internal/vuln-checker/reporters/markdown-reporter.d.ts.map +0 -1
  473. package/dist/internal/vuln-checker/reporters/sarif-reporter.d.ts.map +0 -1
  474. package/dist/internal/vuln-checker/security/path-validation.d.ts.map +0 -1
  475. package/dist/internal/vuln-checker/types.d.ts.map +0 -1
  476. package/dist/notifiers/desktop-notifier.d.ts.map +0 -1
  477. package/dist/ui/components/db-panel.d.ts.map +0 -1
  478. package/dist/ui/components/status-bar.d.ts.map +0 -1
  479. package/dist/ui/components/test-panel.d.ts.map +0 -1
  480. package/dist/ui/dashboard.d.ts.map +0 -1
  481. package/dist/ui/index.d.ts.map +0 -1
  482. package/dist/utils/config-loader.d.ts.map +0 -1
  483. package/dist/utils/config-updater.d.ts.map +0 -1
  484. package/dist/utils/diagnostics.d.ts.map +0 -1
  485. package/dist/utils/dotenvx.d.ts.map +0 -1
  486. package/dist/utils/env-local-bridge.d.ts.map +0 -1
  487. package/dist/utils/execution-plan.d.ts.map +0 -1
  488. package/dist/utils/github-output-security.d.ts.map +0 -1
  489. package/dist/utils/help-system.d.ts.map +0 -1
  490. package/dist/utils/license/admin-auth.d.ts.map +0 -1
  491. package/dist/utils/license/allowlist-checker.d.ts.map +0 -1
  492. package/dist/utils/license/ci-detector.d.ts.map +0 -1
  493. package/dist/utils/license/index.d.ts.map +0 -1
  494. package/dist/utils/license/owner-resolver.d.ts.map +0 -1
  495. package/dist/utils/license/types.d.ts.map +0 -1
  496. package/dist/utils/license/validate-owner.d.ts.map +0 -1
  497. package/dist/utils/path-security.d.ts.map +0 -1
  498. package/dist/utils/port-allocator.d.ts.map +0 -1
  499. package/dist/utils/secure-exec.d.ts.map +0 -1
  500. package/dist/utils/template-fetcher.d.ts.map +0 -1
  501. package/dist/utils/type-guards.d.ts.map +0 -1
  502. package/dist/utils/vercel-project.d.ts.map +0 -1
  503. package/dist/utils/workspace-detector.d.ts.map +0 -1
  504. package/dist/validators/risk-detector.d.ts.map +0 -1
  505. package/dist/validators/schema-validator.d.ts.map +0 -1
  506. package/dist/version.d.ts.map +0 -1
  507. package/dist/watchers/schema-watcher.d.ts.map +0 -1
  508. package/dist/watchers/test-watcher.d.ts.map +0 -1
@@ -0,0 +1,1149 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'module';
3
+ import { isPathContained } from './chunk-DRSUEMAK.js';
4
+ import { emitJsonSuccess } from './chunk-UU55OH7P.js';
5
+ import { init_esm_shims, __dirname as __dirname$1 } from './chunk-VRXHCR5K.js';
6
+ import * as fs2 from 'fs';
7
+ import * as path3 from 'path';
8
+ import { clearInjectionRegistry, clearUnifiedRegistry, postProcessRegistries, isPageFile, isLayoutFile, isApiRouteFile, isMiddlewareFile, collectPageInfo, collectLayoutInfo, collectApiRouteInfo, collectAuthBoundaries, hasMachineDefinition, collectMachineDefinition, collectComponentInfo, createReadAndParseFile, createResolveImportPath, transformSync, getInjectionRegistry, buildManifest, getAllMachineDefinitions, generateSelectorTypeScript, getUnifiedRegistry, buildMachineLinks, registerInjection } from '@runa-ai/runa-xstate-test-plugin/standalone';
9
+ import { glob } from 'glob';
10
+ import { execa } from 'execa';
11
+ import { HonoRouteAnalyzer } from '@runa-ai/runa/test-generators';
12
+ import { createCLILogger, CLIError, findProjectRoot } from '@runa-ai/runa';
13
+ import { z } from 'zod';
14
+
15
+ createRequire(import.meta.url);
16
+
17
+ // src/commands/inject-test-attrs/processor.ts
18
+ init_esm_shims();
19
+
20
+ // src/commands/inject-test-attrs/detection-diagnostics.ts
21
+ init_esm_shims();
22
+ var MAX_EXAMPLES = 20;
23
+ function normalizeMachineId(id) {
24
+ return id.replace(/-([a-z])/g, (_, char) => char.toUpperCase()).replace(/Machine$/i, "").toLowerCase();
25
+ }
26
+ function buildDetectionDiagnostics(params) {
27
+ const bySource = {
28
+ explicit: 0,
29
+ import: 0,
30
+ inline: 0,
31
+ fallback: 0
32
+ };
33
+ const fallbackExamples = [];
34
+ for (const detail of params.resolutionDetails) {
35
+ bySource[detail.source] += 1;
36
+ if (detail.source === "fallback" && fallbackExamples.length < MAX_EXAMPLES) {
37
+ fallbackExamples.push(detail);
38
+ }
39
+ }
40
+ const linkedMachineIds = new Set(
41
+ params.machineLinks.filter((link) => link.usedIn.length > 0).map((link) => normalizeMachineId(link.machineName))
42
+ );
43
+ const linkedManifestMachineIds = [];
44
+ const unlinkedManifestMachineIds = [];
45
+ for (const machineId of params.manifestMachineIds) {
46
+ if (linkedMachineIds.has(normalizeMachineId(machineId))) {
47
+ linkedManifestMachineIds.push(machineId);
48
+ continue;
49
+ }
50
+ unlinkedManifestMachineIds.push(machineId);
51
+ }
52
+ const totalMachineUsages = params.resolutionDetails.length;
53
+ const fallbackRate = totalMachineUsages > 0 ? bySource.fallback / totalMachineUsages : 0;
54
+ const totalManifestMachines = params.manifestMachineIds.length;
55
+ const linkedManifestMachines = linkedManifestMachineIds.length;
56
+ const machineLinkCoverage = totalManifestMachines > 0 ? linkedManifestMachines / totalManifestMachines : 1;
57
+ return {
58
+ schemaVersion: 1,
59
+ scan: params.scanSummary,
60
+ resolution: {
61
+ totalMachineUsages,
62
+ bySource,
63
+ fallbackRate,
64
+ fallbackExamples
65
+ },
66
+ coverage: {
67
+ totalManifestMachines,
68
+ linkedManifestMachines,
69
+ unlinkedManifestMachines: totalManifestMachines - linkedManifestMachines,
70
+ machineLinkCoverage,
71
+ unlinkedManifestMachineIds: unlinkedManifestMachineIds.slice(0, MAX_EXAMPLES)
72
+ },
73
+ warnings: params.warnings
74
+ };
75
+ }
76
+ function evaluateStrictDetect(diagnostics) {
77
+ const reasons = [];
78
+ const fallbackCount = diagnostics.resolution.bySource.fallback;
79
+ if (fallbackCount > 0) {
80
+ reasons.push(`fallback machine resolution detected (${fallbackCount})`);
81
+ }
82
+ if (diagnostics.scan.filesWithMachineHooks > 0 && diagnostics.resolution.totalMachineUsages === 0) {
83
+ reasons.push(
84
+ `machine hooks were detected in ${diagnostics.scan.filesWithMachineHooks} files, but no machine usages were resolved`
85
+ );
86
+ }
87
+ if (diagnostics.resolution.totalMachineUsages > 0 && diagnostics.coverage.totalManifestMachines > 0 && diagnostics.coverage.linkedManifestMachines === 0) {
88
+ reasons.push("machine usages were detected, but no machines were linked to routes/pages");
89
+ }
90
+ return {
91
+ enabled: true,
92
+ passed: reasons.length === 0,
93
+ reasons
94
+ };
95
+ }
96
+
97
+ // src/commands/inject-test-attrs/formatter.ts
98
+ init_esm_shims();
99
+ async function formatFilesWithBiome(files, cwd) {
100
+ if (files.length === 0) return;
101
+ const relativePaths = files.map((f) => path3.relative(cwd, f));
102
+ try {
103
+ await execa("pnpm", ["exec", "biome", "format", "--write", ...relativePaths], {
104
+ cwd,
105
+ stdio: "pipe"
106
+ });
107
+ } catch {
108
+ }
109
+ }
110
+
111
+ // src/commands/inject-test-attrs/manifest-generator.ts
112
+ init_esm_shims();
113
+
114
+ // src/commands/inject-test-attrs/processor-utils.ts
115
+ init_esm_shims();
116
+ var CLI_INJECTION_MARKER = "@xstate-test-attrs-injected";
117
+ var EXCLUDED_SCOPES = [
118
+ "packages/runa-templates/",
119
+ // runa-repo: Template files
120
+ "packages/sdk/",
121
+ // runa-repo: SDK internal machines
122
+ "packages/runa-xstate-test-plugin/",
123
+ // runa-repo: Plugin internals
124
+ "node_modules/",
125
+ // All: Dependencies
126
+ ".next/",
127
+ // Next.js: Build artifacts
128
+ "dist/"
129
+ // All: Build output
130
+ ];
131
+ function isExcludedScope(filePath) {
132
+ return EXCLUDED_SCOPES.some((scope) => filePath.includes(scope));
133
+ }
134
+ var ATTRIBUTE_PATTERNS = {
135
+ /** Pattern to match data-action attribute */
136
+ action: /data-action="([^"]+)"/g,
137
+ /** Pattern to match data-field attribute */
138
+ field: /data-field="([^"]+)"/g,
139
+ /** Pattern to match data-testid attribute */
140
+ testId: /data-testid="([^"]+)"/g};
141
+ function mightContainMachineHooks(code) {
142
+ return code.includes("useMachine") || code.includes("useActor") || code.includes("useMachineWithUI");
143
+ }
144
+ function mightContainJsx(code) {
145
+ return /<[A-Za-z]/.test(code);
146
+ }
147
+ function stripInjectedAttributes(code) {
148
+ return code.replace(/\/\*\s*@xstate-test-attrs-injected\s*\*\/\n?/g, "").replace(/\s*data-machine-id="[^"]*"/g, "").replace(/\s*data-state=\{[^}]+\}/g, "").replace(/\s*data-state="[^"]*"/g, "").replace(/\s*data-testid="[^"]*-container"/g, "").replace(/\s*data-testid="[^"]*-button"/g, "").replace(/\s*data-action="[^"]*"/g, "").replace(/\s*data-field="[^"]*"/g, "");
149
+ }
150
+ function extractAttributeValues(code, pattern) {
151
+ const freshPattern = new RegExp(pattern.source, pattern.flags);
152
+ const values = [];
153
+ for (const match of code.matchAll(freshPattern)) {
154
+ if (match[1]) values.push(match[1]);
155
+ }
156
+ return [...new Set(values)];
157
+ }
158
+ function extractInjectedAttributes(code) {
159
+ return {
160
+ actions: extractAttributeValues(code, ATTRIBUTE_PATTERNS.action),
161
+ fields: extractAttributeValues(code, ATTRIBUTE_PATTERNS.field),
162
+ testIds: extractAttributeValues(code, ATTRIBUTE_PATTERNS.testId)
163
+ };
164
+ }
165
+ function collectRouteInfo(relativePath, code, _verbose) {
166
+ if (isExcludedScope(relativePath)) {
167
+ return;
168
+ }
169
+ const isPage = isPageFile(relativePath);
170
+ const isLayout = isLayoutFile(relativePath);
171
+ const isApiRoute = isApiRouteFile(relativePath);
172
+ const isMiddleware = isMiddlewareFile(relativePath);
173
+ if (isPage) {
174
+ collectPageInfo(relativePath, code);
175
+ }
176
+ if (isLayout) {
177
+ collectLayoutInfo(relativePath, code);
178
+ }
179
+ if (isApiRoute) {
180
+ collectApiRouteInfo(relativePath, code);
181
+ }
182
+ if (isMiddleware) {
183
+ collectAuthBoundaries(relativePath, code);
184
+ }
185
+ if (hasMachineDefinition(code)) {
186
+ collectMachineDefinition(relativePath, code);
187
+ }
188
+ if (!isPage && !isLayout && !isApiRoute && !isMiddleware) {
189
+ collectComponentInfo(relativePath, code);
190
+ }
191
+ }
192
+ function emptyResult(filePath) {
193
+ return {
194
+ filePath,
195
+ injectedCount: 0,
196
+ machineIds: [],
197
+ changed: false,
198
+ actions: [],
199
+ fields: [],
200
+ testIds: [],
201
+ resolutionDetails: []
202
+ };
203
+ }
204
+ function ensureDirectoryExists(dirPath) {
205
+ if (!fs2.existsSync(dirPath)) {
206
+ fs2.mkdirSync(dirPath, { recursive: true });
207
+ }
208
+ }
209
+ function getGeneratorVersion() {
210
+ try {
211
+ const pkgPath = path3.resolve(__dirname$1, "../../../package.json");
212
+ if (fs2.existsSync(pkgPath)) {
213
+ const pkg = JSON.parse(fs2.readFileSync(pkgPath, "utf-8"));
214
+ return pkg.version ?? "unknown";
215
+ }
216
+ } catch {
217
+ }
218
+ return "unknown";
219
+ }
220
+
221
+ // src/commands/inject-test-attrs/manifest-generator.ts
222
+ function detectPlatform(repoRoot) {
223
+ const nextConfigPatterns = ["next.config.ts", "next.config.js", "next.config.mjs"];
224
+ for (const pattern of nextConfigPatterns) {
225
+ const paths = [
226
+ path3.join(repoRoot, pattern),
227
+ path3.join(repoRoot, "apps", "web", pattern),
228
+ path3.join(repoRoot, "apps", "dashboard", pattern)
229
+ ];
230
+ if (paths.some((p) => fs2.existsSync(p))) {
231
+ return "nextjs";
232
+ }
233
+ }
234
+ const appJsonPath = path3.join(repoRoot, "app.json");
235
+ if (fs2.existsSync(appJsonPath)) {
236
+ try {
237
+ const appJson = JSON.parse(fs2.readFileSync(appJsonPath, "utf-8"));
238
+ if (appJson.expo) {
239
+ return "expo";
240
+ }
241
+ } catch {
242
+ }
243
+ }
244
+ if (fs2.existsSync(path3.join(repoRoot, "expo.json"))) {
245
+ return "expo";
246
+ }
247
+ const electronPatterns = [
248
+ "electron-builder.json",
249
+ "electron-builder.yml",
250
+ "electron.vite.config.ts",
251
+ "electron.vite.config.js"
252
+ ];
253
+ if (electronPatterns.some((p) => fs2.existsSync(path3.join(repoRoot, p)))) {
254
+ return "electron";
255
+ }
256
+ return "unknown";
257
+ }
258
+ function hasHonoRouteFiles(dir) {
259
+ try {
260
+ const files = fs2.readdirSync(dir);
261
+ return files.some(
262
+ (file) => file.endsWith(".ts") && !file.endsWith(".test.ts") && !file.endsWith(".spec.ts")
263
+ );
264
+ } catch {
265
+ return false;
266
+ }
267
+ }
268
+ function collectRouteDirsInScope(repoRoot, scope) {
269
+ const scopeDir = path3.join(repoRoot, scope);
270
+ if (!fs2.existsSync(scopeDir)) {
271
+ return [];
272
+ }
273
+ try {
274
+ const entries = fs2.readdirSync(scopeDir, { withFileTypes: true });
275
+ return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name).filter((entryName) => hasHonoRouteFiles(path3.join(scopeDir, entryName, "routes"))).map((entryName) => `${scope}/${entryName}/routes`);
276
+ } catch {
277
+ return [];
278
+ }
279
+ }
280
+ function findPossibleHonoDirs(repoRoot) {
281
+ return [
282
+ ...collectRouteDirsInScope(repoRoot, "apps"),
283
+ ...collectRouteDirsInScope(repoRoot, "packages")
284
+ ];
285
+ }
286
+ function collectManifestWarnings(repoRoot, platform, apiContracts, machinesWithoutE2EMeta, totalMachines) {
287
+ const warnings = [];
288
+ if (apiContracts.length === 0) {
289
+ const possibleDirs = findPossibleHonoDirs(repoRoot);
290
+ if (possibleDirs.length > 0) {
291
+ warnings.push({
292
+ severity: "warning",
293
+ message: "Potential Hono routes detected but not analyzed",
294
+ details: possibleDirs.map((d) => ` - ${d}`),
295
+ fix: "Add to runa.config.ts: testing.layer3.routesPath"
296
+ });
297
+ }
298
+ }
299
+ if (platform === "unknown") {
300
+ warnings.push({
301
+ severity: "info",
302
+ message: "Platform could not be detected (next.config.*, app.json, electron-builder.*)",
303
+ fix: "This is usually fine for non-frontend projects"
304
+ });
305
+ }
306
+ if (totalMachines > 0 && machinesWithoutE2EMeta.length > 0) {
307
+ const percentage = Math.round(machinesWithoutE2EMeta.length / totalMachines * 100);
308
+ if (percentage >= 50) {
309
+ warnings.push({
310
+ severity: "warning",
311
+ message: `${machinesWithoutE2EMeta.length}/${totalMachines} machines (${percentage}%) missing meta.e2e`,
312
+ details: machinesWithoutE2EMeta.slice(0, 5).map((m) => ` - ${m.id} (${m.sourceFile})`),
313
+ fix: "Add meta.e2e to machine states for E2E test generation"
314
+ });
315
+ } else if (machinesWithoutE2EMeta.length > 0) {
316
+ warnings.push({
317
+ severity: "hint",
318
+ message: `${machinesWithoutE2EMeta.length} machines missing meta.e2e (E2E tests may be incomplete)`
319
+ });
320
+ }
321
+ }
322
+ return warnings;
323
+ }
324
+ function printManifestWarnings(warnings, verbose) {
325
+ const warningsToShow = verbose ? warnings : warnings.filter((w) => w.severity === "warning" || w.severity === "info");
326
+ if (warningsToShow.length === 0) return;
327
+ console.log("");
328
+ for (const warning of warningsToShow) {
329
+ const icon = warning.severity === "warning" ? "\u26A0\uFE0F" : warning.severity === "info" ? "\u2139\uFE0F" : "\u{1F4A1}";
330
+ console.log(`${icon} ${warning.message}`);
331
+ if (warning.details) {
332
+ for (const detail of warning.details) {
333
+ console.log(detail);
334
+ }
335
+ }
336
+ if (warning.fix) {
337
+ console.log(` \u2192 ${warning.fix}`);
338
+ }
339
+ }
340
+ }
341
+ function toDetectionWarnings(warnings) {
342
+ return warnings.map((warning) => ({
343
+ severity: warning.severity,
344
+ message: warning.message
345
+ }));
346
+ }
347
+ function normalizeToCanonicalId(id) {
348
+ return id.replace(/-([a-z])/g, (_, c) => c.toUpperCase()).replace(/Machine$/i, "");
349
+ }
350
+ function buildDefinitionMap(definitions) {
351
+ const map = /* @__PURE__ */ new Map();
352
+ for (const def of definitions) {
353
+ if (def.id) {
354
+ map.set(def.id, def);
355
+ const normalizedName = normalizeToCanonicalId(def.id).toLowerCase();
356
+ map.set(normalizedName, def);
357
+ }
358
+ }
359
+ return map;
360
+ }
361
+ function buildEnhancedMachines(e2eManifest, definitionMap, machineDefinitions) {
362
+ const enhanced = {};
363
+ const normalizedIdToCanonical = /* @__PURE__ */ new Map();
364
+ const isMachineFile = (path5) => path5.includes("machine.ts") || path5.includes("machines/") || path5.includes(".machine.ts") || path5.includes("/machine/");
365
+ const addMachine = (id, sourceFile, entryBuilder) => {
366
+ const normalizedId = normalizeToCanonicalId(id).toLowerCase();
367
+ const existingCanonical = normalizedIdToCanonical.get(normalizedId);
368
+ if (existingCanonical) {
369
+ const existingEntry = enhanced[existingCanonical];
370
+ const existingSourceFile = existingEntry?.sourceFile ?? "";
371
+ const newIsMachineFile = isMachineFile(sourceFile);
372
+ const existingIsMachineFile = isMachineFile(existingSourceFile);
373
+ if (newIsMachineFile && !existingIsMachineFile) {
374
+ delete enhanced[existingCanonical];
375
+ normalizedIdToCanonical.set(normalizedId, id);
376
+ enhanced[id] = entryBuilder();
377
+ }
378
+ return;
379
+ }
380
+ normalizedIdToCanonical.set(normalizedId, id);
381
+ enhanced[id] = entryBuilder();
382
+ };
383
+ for (const [machineId, entry] of Object.entries(e2eManifest.machines)) {
384
+ const entryWithSource = entry;
385
+ const sourceFile = entryWithSource.sourceFile ?? "";
386
+ if (isExcludedScope(sourceFile)) {
387
+ continue;
388
+ }
389
+ const normalizedKey = normalizeToCanonicalId(machineId).toLowerCase();
390
+ const definition = definitionMap.get(machineId) ?? definitionMap.get(normalizedKey);
391
+ addMachine(machineId, sourceFile, () => ({
392
+ ...entry,
393
+ states: definition?.states ?? [],
394
+ events: definition?.events ?? [],
395
+ actors: definition?.actors ?? [],
396
+ guards: definition?.guards ?? [],
397
+ hasE2EMeta: definition?.hasE2EMeta ?? false,
398
+ brIds: definition?.brIds ?? []
399
+ }));
400
+ }
401
+ for (const def of machineDefinitions) {
402
+ if (!def.id) continue;
403
+ addMachine(def.id, def.sourceFile, () => ({
404
+ id: def.id,
405
+ sourceFile: def.sourceFile,
406
+ container: `[data-machine-id="${def.id}"]`,
407
+ stateSelector: `[data-machine-id="${def.id}"][data-state="\${state}"]`,
408
+ actions: [],
409
+ fields: [],
410
+ testIds: [],
411
+ isPage: false,
412
+ derivedRoute: null,
413
+ dynamicParams: [],
414
+ states: def.states,
415
+ events: def.events,
416
+ actors: def.actors,
417
+ guards: def.guards,
418
+ hasE2EMeta: def.hasE2EMeta,
419
+ brIds: def.brIds
420
+ }));
421
+ }
422
+ return enhanced;
423
+ }
424
+ async function analyzeHonoRoutes(repoRoot, verbose, resolveSchemas = false) {
425
+ try {
426
+ const routesPath = await HonoRouteAnalyzer.discoverRoutesPath(repoRoot);
427
+ if (!routesPath) {
428
+ if (verbose) {
429
+ console.log(" No Hono routes directory found, skipping API contract analysis");
430
+ }
431
+ return { apiContracts: [], schemasResolved: false };
432
+ }
433
+ if (verbose) {
434
+ console.log(` Analyzing Hono routes in: ${path3.relative(repoRoot, routesPath)}`);
435
+ if (resolveSchemas) {
436
+ console.log(" Schema resolution enabled (--resolve-schemas)");
437
+ }
438
+ }
439
+ const analyzer = new HonoRouteAnalyzer(routesPath);
440
+ const result = resolveSchemas ? await analyzer.analyzeWithSchemas(repoRoot) : await analyzer.analyze();
441
+ const apiContracts = result.routes.map((route) => {
442
+ const contract = {
443
+ path: route.path,
444
+ method: route.method,
445
+ inputSchemaName: route.inputSchemaName,
446
+ statusCodes: route.statusCodes,
447
+ sourceFile: route.fileName,
448
+ resourceName: route.resourceName,
449
+ hasParams: route.hasParams,
450
+ params: route.params,
451
+ // v8+: Include export info for correct import generation
452
+ exportType: route.exportType,
453
+ exportName: route.exportName
454
+ };
455
+ if (resolveSchemas && "inputSchema" in route && route.inputSchema) {
456
+ contract.inputSchema = route.inputSchema;
457
+ }
458
+ return contract;
459
+ });
460
+ const schemasResolved = resolveSchemas && apiContracts.some(
461
+ (c) => "inputSchema" in c && c.inputSchema
462
+ );
463
+ if (verbose) {
464
+ console.log(` Found ${apiContracts.length} API contracts`);
465
+ if (resolveSchemas) {
466
+ const resolvedCount = apiContracts.filter(
467
+ (c) => "inputSchema" in c && c.inputSchema
468
+ ).length;
469
+ console.log(` Resolved schemas: ${resolvedCount}/${apiContracts.length}`);
470
+ }
471
+ }
472
+ return { apiContracts, schemasResolved };
473
+ } catch (error) {
474
+ if (verbose) {
475
+ console.error(" Error analyzing Hono routes:", error);
476
+ }
477
+ return { apiContracts: [], schemasResolved: false };
478
+ }
479
+ }
480
+ async function generateManifestFiles(manifestDir, repoRoot, verbose, resolveSchemas = false, diagnosticsInput) {
481
+ const registry = getInjectionRegistry();
482
+ const generatorVersion = getGeneratorVersion();
483
+ const e2eManifest = buildManifest(registry, generatorVersion);
484
+ const allMachineDefinitions = getAllMachineDefinitions();
485
+ const machineDefinitions = allMachineDefinitions.filter(
486
+ (def) => !isExcludedScope(def.sourceFile)
487
+ );
488
+ if (verbose && allMachineDefinitions.length !== machineDefinitions.length) {
489
+ const excludedCount = allMachineDefinitions.length - machineDefinitions.length;
490
+ console.log(` Excluded ${excludedCount} machines from templates/SDK`);
491
+ }
492
+ const definitionMap = buildDefinitionMap(machineDefinitions);
493
+ const enhancedMachines = buildEnhancedMachines(e2eManifest, definitionMap, machineDefinitions);
494
+ const absoluteManifestDir = path3.isAbsolute(manifestDir) ? manifestDir : path3.join(repoRoot, manifestDir);
495
+ if (!isPathContained(repoRoot, absoluteManifestDir)) {
496
+ throw new Error(
497
+ `Security error: Manifest directory '${manifestDir}' would escape the project root. The --manifest-dir must be a relative path within the project directory.`
498
+ );
499
+ }
500
+ ensureDirectoryExists(absoluteManifestDir);
501
+ const generatedDir = path3.join(absoluteManifestDir, "generated");
502
+ ensureDirectoryExists(generatedDir);
503
+ const manifestsDir = path3.join(absoluteManifestDir, "manifests");
504
+ ensureDirectoryExists(manifestsDir);
505
+ const tsPath = path3.join(generatedDir, "selectors.ts");
506
+ await fs2.promises.writeFile(tsPath, generateSelectorTypeScript(e2eManifest), "utf-8");
507
+ const unifiedRegistry = getUnifiedRegistry();
508
+ const machineLinks = buildMachineLinks();
509
+ const { apiContracts, schemasResolved } = await analyzeHonoRoutes(
510
+ repoRoot,
511
+ verbose,
512
+ resolveSchemas
513
+ );
514
+ const manifestVersion = schemasResolved ? 7 : 4;
515
+ const platform = detectPlatform(repoRoot);
516
+ const now = /* @__PURE__ */ new Date();
517
+ const jstOffset = 9 * 60 * 60 * 1e3;
518
+ const jst = new Date(now.getTime() + jstOffset);
519
+ const generatedAtJST = `${jst.getUTCFullYear()}-${String(jst.getUTCMonth() + 1).padStart(2, "0")}-${String(jst.getUTCDate()).padStart(2, "0")}T${String(jst.getUTCHours()).padStart(2, "0")}:${String(jst.getUTCMinutes()).padStart(2, "0")}:${String(jst.getUTCSeconds()).padStart(2, "0")}+09:00`;
520
+ const machinesWithoutE2EMeta = machineDefinitions.filter(
521
+ (def) => !def.hasE2EMeta && typeof def.id === "string"
522
+ ).map((def) => ({ id: def.id, sourceFile: def.sourceFile }));
523
+ const warnings = collectManifestWarnings(
524
+ repoRoot,
525
+ platform,
526
+ apiContracts,
527
+ machinesWithoutE2EMeta,
528
+ machineDefinitions.length
529
+ );
530
+ printManifestWarnings(warnings, verbose);
531
+ const detectionDiagnostics = buildDetectionDiagnostics({
532
+ scanSummary: diagnosticsInput?.scanSummary ?? {
533
+ totalFiles: 0,
534
+ filesWithMachineDefinitions: 0,
535
+ filesWithMachineHooks: 0,
536
+ filesWithJsxOnly: 0
537
+ },
538
+ resolutionDetails: diagnosticsInput?.resolutionDetails ?? [],
539
+ manifestMachineIds: Object.keys(enhancedMachines),
540
+ machineLinks,
541
+ warnings: toDetectionWarnings(warnings)
542
+ });
543
+ const unifiedManifest = {
544
+ version: manifestVersion,
545
+ generatedAt: generatedAtJST,
546
+ generatorVersion,
547
+ platform,
548
+ machines: enhancedMachines,
549
+ routes: unifiedRegistry.pages,
550
+ layouts: unifiedRegistry.layouts,
551
+ apiRoutes: unifiedRegistry.apiRoutes,
552
+ authBoundaries: unifiedRegistry.authBoundaries,
553
+ machineDefinitions: unifiedRegistry.machineDefinitions,
554
+ machineLinks,
555
+ apiContracts,
556
+ detectionDiagnostics
557
+ };
558
+ const manifestPath = path3.join(manifestsDir, "manifest.json");
559
+ await fs2.promises.writeFile(manifestPath, JSON.stringify(unifiedManifest, null, 2), "utf-8");
560
+ if (verbose) {
561
+ console.log(`Generated selectors: ${path3.relative(repoRoot, tsPath)}`);
562
+ console.log(
563
+ `Generated manifest: ${path3.relative(repoRoot, manifestPath)} (v${manifestVersion})`
564
+ );
565
+ console.log(` Platform: ${platform}`);
566
+ console.log(` Machine definitions: ${machineDefinitions.length}`);
567
+ console.log(
568
+ ` Routes: ${unifiedRegistry.pages.length} pages, ${unifiedRegistry.layouts.length} layouts`
569
+ );
570
+ console.log(
571
+ ` API: ${unifiedRegistry.apiRoutes.length} routes, ${unifiedRegistry.authBoundaries.length} auth`
572
+ );
573
+ console.log(
574
+ ` API contracts: ${apiContracts.length}${schemasResolved ? " (with schemas)" : ""}`
575
+ );
576
+ console.log(` Machine links: ${machineLinks.length}`);
577
+ console.log(
578
+ ` Detection: fallback=${detectionDiagnostics.resolution.bySource.fallback}, linkCoverage=${(detectionDiagnostics.coverage.machineLinkCoverage * 100).toFixed(1)}%`
579
+ );
580
+ }
581
+ return {
582
+ manifestPath: path3.relative(repoRoot, tsPath),
583
+ machineCount: Object.keys(enhancedMachines).length,
584
+ machinesWithoutE2EMeta,
585
+ detectionDiagnostics
586
+ };
587
+ }
588
+
589
+ // src/commands/inject-test-attrs/processor.ts
590
+ async function discoverFiles(repoRoot, include, exclude) {
591
+ const allFiles = [];
592
+ for (const pattern of include) {
593
+ const files = await glob(pattern, {
594
+ cwd: repoRoot,
595
+ absolute: true,
596
+ ignore: exclude
597
+ });
598
+ allFiles.push(...files);
599
+ }
600
+ return [...new Set(allFiles)];
601
+ }
602
+ function registerExistingInjections(machineIds, attrs, sourceFile) {
603
+ for (const machineId of machineIds) {
604
+ for (const action of attrs.actions) {
605
+ registerInjection({ machineId, sourceFile, type: "action", value: action });
606
+ }
607
+ for (const field of attrs.fields) {
608
+ registerInjection({ machineId, sourceFile, type: "field", value: field });
609
+ }
610
+ for (const testId of attrs.testIds) {
611
+ registerInjection({ machineId, sourceFile, type: "testid", value: testId });
612
+ }
613
+ }
614
+ }
615
+ async function preprocessFile(filePath, repoRoot, options) {
616
+ let code = await fs2.promises.readFile(filePath, "utf-8");
617
+ const relativePath = path3.relative(repoRoot, filePath);
618
+ collectRouteInfo(relativePath, code, options.verbose);
619
+ const hasMarker = code.includes(CLI_INJECTION_MARKER);
620
+ if (hasMarker && options.force) {
621
+ code = stripInjectedAttributes(code);
622
+ if (options.verbose) {
623
+ console.log(` [force] Stripping existing attributes from ${relativePath}`);
624
+ }
625
+ return { code, hasMarker: true, skipped: false };
626
+ }
627
+ if (hasMarker) {
628
+ const attrs = extractInjectedAttributes(code);
629
+ const machineIdMatches = code.matchAll(/data-machine-id="([^"]+)"/g);
630
+ const machineIds = [...new Set([...machineIdMatches].map((m) => m[1]).filter(Boolean))];
631
+ const resolutionDetails = machineIds.map((machineId) => ({
632
+ filePath: relativePath,
633
+ machineRef: machineId,
634
+ resolvedId: machineId,
635
+ source: "explicit"
636
+ }));
637
+ if (machineIds.length === 0 && mightContainMachineHooks(code)) {
638
+ if (options.verbose) {
639
+ console.log(` [recovery] Marker found but no attributes in ${relativePath}, re-injecting`);
640
+ }
641
+ code = stripInjectedAttributes(code);
642
+ return { code, hasMarker: true, skipped: false };
643
+ }
644
+ registerExistingInjections(machineIds, attrs, relativePath);
645
+ return {
646
+ code,
647
+ hasMarker: true,
648
+ skipped: true,
649
+ skipResult: {
650
+ filePath,
651
+ injectedCount: 0,
652
+ machineIds,
653
+ changed: false,
654
+ ...attrs,
655
+ resolutionDetails
656
+ }
657
+ };
658
+ }
659
+ return { code, hasMarker: false, skipped: false };
660
+ }
661
+ function transformAndRegister(filePath, code, repoRoot, options) {
662
+ const relativePath = path3.relative(repoRoot, filePath);
663
+ const readAndParseFile = createReadAndParseFile(options.verbose);
664
+ const resolveImportPath = createResolveImportPath();
665
+ try {
666
+ const result = transformSync(code, {
667
+ filePath,
668
+ debug: options.verbose,
669
+ readAndParseFile,
670
+ resolveImportPath
671
+ });
672
+ if (!result || result.injectedCount === 0) return emptyResult(filePath);
673
+ const markerComment = `/* ${CLI_INJECTION_MARKER} */
674
+ `;
675
+ const transformedCode = markerComment + result.code;
676
+ const { actions, fields, testIds } = extractInjectedAttributes(transformedCode);
677
+ const machineIds = [...result.resolvedIds.values()];
678
+ const resultWithResolution = result;
679
+ const rawResolutionDetails = Array.isArray(resultWithResolution.resolutionDetails) ? resultWithResolution.resolutionDetails : [];
680
+ const resolutionDetails = rawResolutionDetails.map((detail) => ({
681
+ filePath: relativePath,
682
+ machineRef: detail.machineRef,
683
+ resolvedId: detail.resolvedId,
684
+ source: detail.source
685
+ }));
686
+ registerExistingInjections(machineIds, { actions, fields, testIds }, relativePath);
687
+ return {
688
+ filePath,
689
+ injectedCount: result.injectedCount,
690
+ machineIds,
691
+ changed: true,
692
+ transformedCode,
693
+ actions,
694
+ fields,
695
+ testIds,
696
+ resolutionDetails
697
+ };
698
+ } catch (error) {
699
+ if (options.verbose) {
700
+ console.error(`Error processing ${filePath}:`, error);
701
+ }
702
+ return emptyResult(filePath);
703
+ }
704
+ }
705
+ async function processFile(filePath, repoRoot, options) {
706
+ const prep = await preprocessFile(filePath, repoRoot, options);
707
+ if (prep.skipped && prep.skipResult) return prep.skipResult;
708
+ const { code } = prep;
709
+ if (!mightContainMachineHooks(code)) return emptyResult(filePath);
710
+ return transformAndRegister(filePath, code, repoRoot, options);
711
+ }
712
+ async function processFileForChildInjection(filePath, repoRoot, options) {
713
+ const prep = await preprocessFile(filePath, repoRoot, options);
714
+ if (prep.skipped && prep.skipResult) return prep.skipResult;
715
+ const result = transformAndRegister(filePath, prep.code, repoRoot, options);
716
+ if (options.verbose && result.changed && result.injectedCount > 0) {
717
+ const relativePath = path3.relative(repoRoot, filePath);
718
+ console.log(
719
+ ` [child] Injected ${result.injectedCount} attrs in ${relativePath} (actions: ${result.actions.join(", ")})`
720
+ );
721
+ }
722
+ return result;
723
+ }
724
+ async function handleChangedFile(result, check, repoRoot, verbose, state) {
725
+ if (!result.changed || !result.transformedCode) return;
726
+ state.changes.push({
727
+ filePath: result.filePath,
728
+ injectedCount: result.injectedCount,
729
+ machineIds: result.machineIds,
730
+ changed: true
731
+ });
732
+ state.totalInjections += result.injectedCount;
733
+ if (check) return;
734
+ await fs2.promises.writeFile(result.filePath, result.transformedCode, "utf-8");
735
+ state.filesToFormat.push(result.filePath);
736
+ if (verbose) {
737
+ const relativePath = path3.relative(repoRoot, result.filePath);
738
+ console.log(` Injected ${result.injectedCount} attrs in ${relativePath}`);
739
+ }
740
+ }
741
+ async function formatChangedFiles(filesToFormat, repoRoot, verbose) {
742
+ if (filesToFormat.length === 0) return;
743
+ if (verbose) {
744
+ console.log(`Formatting ${filesToFormat.length} files...`);
745
+ }
746
+ await formatFilesWithBiome(filesToFormat, repoRoot);
747
+ }
748
+ function createScanSummary(params) {
749
+ return {
750
+ totalFiles: params.files.length,
751
+ filesWithMachineDefinitions: params.withMachineDefinitions.length,
752
+ filesWithMachineHooks: params.withMachineHooks.length,
753
+ filesWithJsxOnly: params.withJsxOnly.length
754
+ };
755
+ }
756
+ async function resolveManifestArtifacts(params) {
757
+ let manifestPath;
758
+ let manifestMachineCount;
759
+ let machinesWithoutE2EMeta;
760
+ let detectionDiagnostics;
761
+ if (params.manifest && !params.check) {
762
+ const diagnosticsInput = {
763
+ scanSummary: params.scanSummary,
764
+ resolutionDetails: params.resolutionDetails
765
+ };
766
+ const manifestResult = await generateManifestFiles(
767
+ params.manifestDir,
768
+ params.repoRoot,
769
+ params.verbose,
770
+ params.resolveSchemas,
771
+ diagnosticsInput
772
+ );
773
+ manifestPath = manifestResult.manifestPath;
774
+ manifestMachineCount = manifestResult.machineCount;
775
+ machinesWithoutE2EMeta = manifestResult.machinesWithoutE2EMeta;
776
+ detectionDiagnostics = manifestResult.detectionDiagnostics;
777
+ } else if (params.manifest && params.check) {
778
+ const warnings = [];
779
+ detectionDiagnostics = buildDetectionDiagnostics({
780
+ scanSummary: params.scanSummary,
781
+ resolutionDetails: params.resolutionDetails,
782
+ manifestMachineIds: [],
783
+ machineLinks: [],
784
+ warnings
785
+ });
786
+ }
787
+ const strictDetectStatus = params.strictDetect ? detectionDiagnostics ? evaluateStrictDetect(detectionDiagnostics) : {
788
+ enabled: true,
789
+ passed: false,
790
+ reasons: [
791
+ "strict detect requires manifest diagnostics, but diagnostics were unavailable"
792
+ ]
793
+ } : void 0;
794
+ return {
795
+ manifestPath,
796
+ manifestMachineCount,
797
+ machinesWithoutE2EMeta,
798
+ detectionDiagnostics,
799
+ strictDetectStatus
800
+ };
801
+ }
802
+ function mightContainMachineDefinition(code) {
803
+ return code.includes("createMachine");
804
+ }
805
+ async function categorizeFiles(files) {
806
+ const withMachineDefinitions = [];
807
+ const withMachineHooks = [];
808
+ const withJsxOnly = [];
809
+ for (const filePath of files) {
810
+ try {
811
+ const code = await fs2.promises.readFile(filePath, "utf-8");
812
+ if (mightContainMachineHooks(code)) {
813
+ withMachineHooks.push(filePath);
814
+ } else if (mightContainJsx(code)) {
815
+ withJsxOnly.push(filePath);
816
+ } else if (mightContainMachineDefinition(code)) {
817
+ withMachineDefinitions.push(filePath);
818
+ }
819
+ } catch {
820
+ }
821
+ }
822
+ return { withMachineDefinitions, withMachineHooks, withJsxOnly };
823
+ }
824
+ async function processFiles(options) {
825
+ const {
826
+ repoRoot,
827
+ check,
828
+ verbose,
829
+ include,
830
+ exclude,
831
+ manifest,
832
+ manifestDir,
833
+ resolveSchemas,
834
+ strictDetect
835
+ } = options;
836
+ clearInjectionRegistry();
837
+ clearUnifiedRegistry();
838
+ const files = await discoverFiles(repoRoot, include, exclude);
839
+ if (verbose) console.log(`Found ${files.length} files to process`);
840
+ const state = {
841
+ changes: [],
842
+ filesToFormat: [],
843
+ totalInjections: 0,
844
+ resolutionDetails: []
845
+ };
846
+ const { withMachineDefinitions, withMachineHooks, withJsxOnly } = await categorizeFiles(files);
847
+ const scanSummary = createScanSummary({
848
+ files,
849
+ withMachineDefinitions,
850
+ withMachineHooks,
851
+ withJsxOnly
852
+ });
853
+ if (verbose) {
854
+ console.log(` Files with machine definitions: ${withMachineDefinitions.length}`);
855
+ console.log(` Files with machine hooks: ${withMachineHooks.length}`);
856
+ console.log(` Files with JSX only: ${withJsxOnly.length}`);
857
+ }
858
+ const processOpts = { verbose, force: options.force ?? false };
859
+ for (const filePath of withMachineDefinitions) {
860
+ try {
861
+ const code = await fs2.promises.readFile(filePath, "utf-8");
862
+ const relativePath = path3.relative(repoRoot, filePath);
863
+ collectRouteInfo(relativePath, code, verbose);
864
+ } catch {
865
+ }
866
+ }
867
+ for (const filePath of withMachineHooks) {
868
+ const result = await processFile(filePath, repoRoot, processOpts);
869
+ state.resolutionDetails.push(...result.resolutionDetails);
870
+ await handleChangedFile(result, check, repoRoot, verbose, state);
871
+ }
872
+ for (const filePath of withJsxOnly) {
873
+ const result = await processFileForChildInjection(filePath, repoRoot, processOpts);
874
+ state.resolutionDetails.push(...result.resolutionDetails);
875
+ await handleChangedFile(result, check, repoRoot, verbose, state);
876
+ }
877
+ if (!check) {
878
+ await formatChangedFiles(state.filesToFormat, repoRoot, verbose);
879
+ }
880
+ postProcessRegistries();
881
+ const manifestArtifacts = await resolveManifestArtifacts({
882
+ manifest,
883
+ check,
884
+ manifestDir,
885
+ repoRoot,
886
+ verbose,
887
+ resolveSchemas: resolveSchemas ?? false,
888
+ strictDetect: strictDetect ?? false,
889
+ scanSummary,
890
+ resolutionDetails: state.resolutionDetails
891
+ });
892
+ const hasCheckFailure = check && state.changes.length > 0;
893
+ const hasStrictDetectFailure = manifestArtifacts.strictDetectStatus?.passed === false;
894
+ const exitCode = hasCheckFailure || hasStrictDetectFailure ? 1 : 0;
895
+ return {
896
+ totalFiles: files.length,
897
+ changedFiles: state.changes.length,
898
+ totalInjections: state.totalInjections,
899
+ changes: state.changes,
900
+ exitCode,
901
+ manifestPath: manifestArtifacts.manifestPath,
902
+ manifestMachineCount: manifestArtifacts.manifestMachineCount,
903
+ machinesWithoutE2EMeta: manifestArtifacts.machinesWithoutE2EMeta,
904
+ detectionDiagnostics: manifestArtifacts.detectionDiagnostics,
905
+ strictDetect: manifestArtifacts.strictDetectStatus
906
+ };
907
+ }
908
+
909
+ // src/commands/inject-test-attrs/action.ts
910
+ init_esm_shims();
911
+
912
+ // src/commands/inject-test-attrs/contract.ts
913
+ init_esm_shims();
914
+ var InjectTestAttrsInputSchema = z.object({
915
+ /** Dry-run mode: check without writing */
916
+ check: z.boolean().default(false),
917
+ /** Force overwrite even if marker exists */
918
+ force: z.boolean().default(false),
919
+ /** Verbose output */
920
+ verbose: z.boolean().default(false),
921
+ /** Include patterns (glob) - includes both .tsx and .ts for machine definition detection */
922
+ include: z.array(z.string()).default(["apps/**/*.tsx", "apps/**/*.ts", "packages/**/*.tsx", "packages/**/*.ts"]),
923
+ /** Exclude patterns (glob) */
924
+ exclude: z.array(z.string()).default([
925
+ "**/node_modules/**",
926
+ "**/.next/**",
927
+ "**/dist/**",
928
+ "**/*.test.*",
929
+ "**/*.spec.*",
930
+ "**/*.stories.*"
931
+ ]),
932
+ /** Generate E2E selector manifest */
933
+ manifest: z.boolean().default(true),
934
+ /** Manifest output directory */
935
+ manifestDir: z.string().default(".runa"),
936
+ /** Resolve Zod schemas to JSON Schema (v7+) for API contracts */
937
+ resolveSchemas: z.boolean().default(false),
938
+ /** Fail when heuristic fallback detection is used */
939
+ strictDetect: z.boolean().default(false)
940
+ }).strict();
941
+ var FileChangeSchema = z.object({
942
+ filePath: z.string(),
943
+ injectedCount: z.number(),
944
+ machineIds: z.array(z.string()),
945
+ changed: z.boolean()
946
+ });
947
+ var MachineWithoutE2EMetaSchema = z.object({
948
+ id: z.string(),
949
+ sourceFile: z.string()
950
+ });
951
+ var DetectionScanSummarySchema = z.object({
952
+ totalFiles: z.number().int().nonnegative(),
953
+ filesWithMachineDefinitions: z.number().int().nonnegative(),
954
+ filesWithMachineHooks: z.number().int().nonnegative(),
955
+ filesWithJsxOnly: z.number().int().nonnegative()
956
+ }).strict();
957
+ var MachineResolutionDetailSchema = z.object({
958
+ filePath: z.string(),
959
+ machineRef: z.string(),
960
+ resolvedId: z.string(),
961
+ source: z.enum(["explicit", "import", "inline", "fallback"])
962
+ }).strict();
963
+ var DetectionDiagnosticsSchema = z.object({
964
+ schemaVersion: z.literal(1),
965
+ scan: DetectionScanSummarySchema,
966
+ resolution: z.object({
967
+ totalMachineUsages: z.number().int().nonnegative(),
968
+ bySource: z.object({
969
+ explicit: z.number().int().nonnegative(),
970
+ import: z.number().int().nonnegative(),
971
+ inline: z.number().int().nonnegative(),
972
+ fallback: z.number().int().nonnegative()
973
+ }).strict(),
974
+ fallbackRate: z.number().min(0).max(1),
975
+ fallbackExamples: z.array(MachineResolutionDetailSchema)
976
+ }).strict(),
977
+ coverage: z.object({
978
+ totalManifestMachines: z.number().int().nonnegative(),
979
+ linkedManifestMachines: z.number().int().nonnegative(),
980
+ unlinkedManifestMachines: z.number().int().nonnegative(),
981
+ machineLinkCoverage: z.number().min(0).max(1),
982
+ unlinkedManifestMachineIds: z.array(z.string())
983
+ }).strict(),
984
+ warnings: z.array(
985
+ z.object({
986
+ severity: z.enum(["warning", "info", "hint"]),
987
+ message: z.string()
988
+ }).strict()
989
+ )
990
+ }).strict();
991
+ var StrictDetectStatusSchema = z.object({
992
+ enabled: z.literal(true),
993
+ passed: z.boolean(),
994
+ reasons: z.array(z.string())
995
+ }).strict();
996
+ var InjectTestAttrsOutputSchema = z.object({
997
+ totalFiles: z.number(),
998
+ changedFiles: z.number(),
999
+ totalInjections: z.number(),
1000
+ changes: z.array(FileChangeSchema),
1001
+ exitCode: z.union([z.literal(0), z.literal(1)]),
1002
+ /** Generated manifest file path (if manifest=true) */
1003
+ manifestPath: z.string().optional(),
1004
+ /** Number of machines in manifest */
1005
+ manifestMachineCount: z.number().optional(),
1006
+ /** Machines without meta.e2e annotation (opt-in warning) */
1007
+ machinesWithoutE2EMeta: z.array(MachineWithoutE2EMetaSchema).optional(),
1008
+ /** Structured diagnostics for detection quality */
1009
+ detectionDiagnostics: DetectionDiagnosticsSchema.optional(),
1010
+ /** Strict detection mode result */
1011
+ strictDetect: StrictDetectStatusSchema.optional()
1012
+ }).strict();
1013
+
1014
+ // src/commands/inject-test-attrs/action.ts
1015
+ function logResultSummary(result, options, logger) {
1016
+ if (result.changedFiles === 0) {
1017
+ logger.success("All files are up to date");
1018
+ return;
1019
+ }
1020
+ if (options.check) {
1021
+ logger.warn(`${result.changedFiles} files need injection`);
1022
+ for (const change of result.changes) {
1023
+ logger.info(` - ${change.filePath} (${change.injectedCount} attrs)`);
1024
+ }
1025
+ logger.info("");
1026
+ logger.info("Run without --check to apply changes:");
1027
+ logger.info(" runa inject-test-attrs");
1028
+ return;
1029
+ }
1030
+ logger.success(`Injected ${result.totalInjections} attributes in ${result.changedFiles} files`);
1031
+ if (options.verbose) {
1032
+ for (const change of result.changes) {
1033
+ logger.info(` - ${change.filePath}: ${change.machineIds.join(", ")}`);
1034
+ }
1035
+ }
1036
+ }
1037
+ function logManifestInfo(result, logger) {
1038
+ if (!result.manifestPath || result.manifestMachineCount === void 0) {
1039
+ return;
1040
+ }
1041
+ logger.info("");
1042
+ logger.success(
1043
+ `Generated E2E manifest: ${result.manifestPath} (${result.manifestMachineCount} machines)`
1044
+ );
1045
+ logger.info(" Usage in tests:");
1046
+ logger.info(" import { E2E_SELECTORS } from '.runa/e2e-selectors';");
1047
+ logger.info(" await page.locator(E2E_SELECTORS.auth.container).click();");
1048
+ }
1049
+ function logMachinesWithoutE2EMeta(result, logger) {
1050
+ if (!result.machinesWithoutE2EMeta || result.machinesWithoutE2EMeta.length === 0) {
1051
+ return;
1052
+ }
1053
+ logger.info("");
1054
+ logger.warn(`${result.machinesWithoutE2EMeta.length} machine(s) missing meta.e2e annotation:`);
1055
+ for (const machine of result.machinesWithoutE2EMeta.slice(0, 5)) {
1056
+ logger.info(` - ${machine.id} (${machine.sourceFile})`);
1057
+ }
1058
+ if (result.machinesWithoutE2EMeta.length > 5) {
1059
+ logger.info(` ... and ${result.machinesWithoutE2EMeta.length - 5} more`);
1060
+ }
1061
+ logger.info("");
1062
+ logger.info(" Add meta.e2e to states for E2E test generation:");
1063
+ logger.info(" states: {");
1064
+ logger.info(" idle: {");
1065
+ logger.info(' meta: { e2e: { observable: "ui", assertions: [...] } }');
1066
+ logger.info(" }");
1067
+ logger.info(" }");
1068
+ logger.info(" See: .claude/rules/xstate-design.md#meta.e2e");
1069
+ }
1070
+ function logDetectionDiagnostics(result, logger) {
1071
+ if (!result.detectionDiagnostics) return;
1072
+ const diagnostics = result.detectionDiagnostics;
1073
+ const fallbackCount = diagnostics.resolution.bySource.fallback;
1074
+ const fallbackRate = (diagnostics.resolution.fallbackRate * 100).toFixed(1);
1075
+ const coverage = (diagnostics.coverage.machineLinkCoverage * 100).toFixed(1);
1076
+ logger.info("");
1077
+ logger.info(
1078
+ `Detection diagnostics: usages=${diagnostics.resolution.totalMachineUsages}, fallback=${fallbackCount} (${fallbackRate}%), linkCoverage=${coverage}%`
1079
+ );
1080
+ if (fallbackCount > 0) {
1081
+ for (const item of diagnostics.resolution.fallbackExamples.slice(0, 5)) {
1082
+ logger.warn(
1083
+ ` fallback: ${item.filePath} :: ${item.machineRef} -> ${item.resolvedId} (${item.source})`
1084
+ );
1085
+ }
1086
+ }
1087
+ }
1088
+ function logStrictDetect(result, logger) {
1089
+ if (!result.strictDetect) return;
1090
+ if (result.strictDetect.passed) {
1091
+ logger.success("Strict detect passed (no fallback resolution)");
1092
+ return;
1093
+ }
1094
+ logger.error("Strict detect failed");
1095
+ for (const reason of result.strictDetect.reasons) {
1096
+ logger.error(` - ${reason}`);
1097
+ }
1098
+ }
1099
+ async function injectTestAttrsAction(rawOptions, command) {
1100
+ const logger = createCLILogger("manifest");
1101
+ const parseResult = InjectTestAttrsInputSchema.safeParse(rawOptions);
1102
+ if (!parseResult.success) {
1103
+ throw new CLIError("Invalid options", "INVALID_OPTIONS", [
1104
+ parseResult.error.message,
1105
+ "Run with --help for usage"
1106
+ ]);
1107
+ }
1108
+ const options = parseResult.data;
1109
+ if (options.strictDetect && options.check) {
1110
+ throw new CLIError(
1111
+ "--strict-detect cannot be used with --check",
1112
+ "STRICT_DETECT_CHECK_UNSUPPORTED",
1113
+ ["Run without --check to evaluate strict detection against manifest diagnostics"]
1114
+ );
1115
+ }
1116
+ if (options.strictDetect && !options.manifest) {
1117
+ throw new CLIError(
1118
+ "--strict-detect requires manifest generation",
1119
+ "STRICT_DETECT_MANIFEST_REQUIRED",
1120
+ ["Remove --no-manifest, or disable --strict-detect"]
1121
+ );
1122
+ }
1123
+ const repoRoot = findProjectRoot() ?? process.cwd();
1124
+ if (!options.check) {
1125
+ logger.section("Generating manifest (manifest.json)");
1126
+ } else {
1127
+ logger.section("Checking E2E manifest");
1128
+ }
1129
+ if (options.verbose) {
1130
+ logger.info(`Repository root: ${repoRoot}`);
1131
+ logger.info(`Include patterns: ${options.include.join(", ")}`);
1132
+ logger.info(`Exclude patterns: ${options.exclude.join(", ")}`);
1133
+ }
1134
+ const result = await processFiles({
1135
+ ...options,
1136
+ repoRoot
1137
+ });
1138
+ logResultSummary(result, options, logger);
1139
+ logManifestInfo(result, logger);
1140
+ logMachinesWithoutE2EMeta(result, logger);
1141
+ logDetectionDiagnostics(result, logger);
1142
+ logStrictDetect(result, logger);
1143
+ emitJsonSuccess(command, InjectTestAttrsOutputSchema, result);
1144
+ if (result.exitCode !== 0) {
1145
+ process.exit(result.exitCode);
1146
+ }
1147
+ }
1148
+
1149
+ export { injectTestAttrsAction, processFiles };