@flanksource/clicky-ui 0.3.47 → 0.3.48

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 (169) hide show
  1. package/README.md +49 -0
  2. package/dist/comments/CommentSidePanel.cjs +10 -4
  3. package/dist/comments/CommentSidePanel.cjs.map +1 -1
  4. package/dist/comments/CommentSidePanel.d.ts +2 -0
  5. package/dist/comments/CommentSidePanel.d.ts.map +1 -1
  6. package/dist/comments/CommentSidePanel.js +10 -4
  7. package/dist/comments/CommentSidePanel.js.map +1 -1
  8. package/dist/comments/CommentThread.cjs +2 -0
  9. package/dist/comments/CommentThread.cjs.map +1 -1
  10. package/dist/comments/CommentThread.d.ts +2 -1
  11. package/dist/comments/CommentThread.d.ts.map +1 -1
  12. package/dist/comments/CommentThread.js +2 -0
  13. package/dist/comments/CommentThread.js.map +1 -1
  14. package/dist/comments/CommentThreadList.cjs +3 -0
  15. package/dist/comments/CommentThreadList.cjs.map +1 -1
  16. package/dist/comments/CommentThreadList.d.ts +3 -1
  17. package/dist/comments/CommentThreadList.d.ts.map +1 -1
  18. package/dist/comments/CommentThreadList.js +3 -0
  19. package/dist/comments/CommentThreadList.js.map +1 -1
  20. package/dist/data/CodeLine.cjs +4 -2
  21. package/dist/data/CodeLine.cjs.map +1 -1
  22. package/dist/data/CodeLine.d.ts.map +1 -1
  23. package/dist/data/CodeLine.js +4 -2
  24. package/dist/data/CodeLine.js.map +1 -1
  25. package/dist/data/SymbolBadge.cjs +61 -0
  26. package/dist/data/SymbolBadge.cjs.map +1 -0
  27. package/dist/data/SymbolBadge.d.ts +21 -0
  28. package/dist/data/SymbolBadge.d.ts.map +1 -0
  29. package/dist/data/SymbolBadge.js +61 -0
  30. package/dist/data/SymbolBadge.js.map +1 -0
  31. package/dist/data/test-runner/TestDetailPanel.cjs +26 -12
  32. package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
  33. package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
  34. package/dist/data/test-runner/TestDetailPanel.js +27 -13
  35. package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
  36. package/dist/data/test-runner/TestRunner.cjs +6 -0
  37. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  38. package/dist/data/test-runner/TestRunner.d.ts +3 -1
  39. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  40. package/dist/data/test-runner/TestRunner.js +6 -0
  41. package/dist/data/test-runner/TestRunner.js.map +1 -1
  42. package/dist/data/test-runner/TestTreeNode.cjs +2 -1
  43. package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
  44. package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
  45. package/dist/data/test-runner/TestTreeNode.js +2 -1
  46. package/dist/data/test-runner/TestTreeNode.js.map +1 -1
  47. package/dist/data/test-runner/adapter.cjs +4 -0
  48. package/dist/data/test-runner/adapter.cjs.map +1 -1
  49. package/dist/data/test-runner/adapter.d.ts +9 -0
  50. package/dist/data/test-runner/adapter.d.ts.map +1 -1
  51. package/dist/data/test-runner/adapter.js +4 -0
  52. package/dist/data/test-runner/adapter.js.map +1 -1
  53. package/dist/data/test-runner/context.cjs.map +1 -1
  54. package/dist/data/test-runner/context.d.ts +2 -0
  55. package/dist/data/test-runner/context.d.ts.map +1 -1
  56. package/dist/data/test-runner/context.js.map +1 -1
  57. package/dist/data/test-runner/index.d.ts +2 -2
  58. package/dist/data/test-runner/index.d.ts.map +1 -1
  59. package/dist/data/test-runner/marks.cjs +42 -1
  60. package/dist/data/test-runner/marks.cjs.map +1 -1
  61. package/dist/data/test-runner/marks.d.ts +10 -0
  62. package/dist/data/test-runner/marks.d.ts.map +1 -1
  63. package/dist/data/test-runner/marks.js +42 -1
  64. package/dist/data/test-runner/marks.js.map +1 -1
  65. package/dist/data/traces/TerminalCastPlayer.d.ts +21 -0
  66. package/dist/data/traces/TerminalCastPlayer.d.ts.map +1 -0
  67. package/dist/data/traces/TraceHarView.d.ts +13 -0
  68. package/dist/data/traces/TraceHarView.d.ts.map +1 -0
  69. package/dist/data/traces/cast.d.ts +9 -0
  70. package/dist/data/traces/cast.d.ts.map +1 -0
  71. package/dist/data/traces/fixtures.d.ts +8 -0
  72. package/dist/data/traces/fixtures.d.ts.map +1 -0
  73. package/dist/data/traces/har-adapter.d.ts +13 -0
  74. package/dist/data/traces/har-adapter.d.ts.map +1 -0
  75. package/dist/data/traces/terminal-screen.d.ts +45 -0
  76. package/dist/data/traces/terminal-screen.d.ts.map +1 -0
  77. package/dist/data/traces/terminal-timeline.d.ts +26 -0
  78. package/dist/data/traces/terminal-timeline.d.ts.map +1 -0
  79. package/dist/data/traces/types.d.ts +141 -0
  80. package/dist/data/traces/types.d.ts.map +1 -0
  81. package/dist/data/verification/VerificationResults.cjs +4 -0
  82. package/dist/data/verification/VerificationResults.cjs.map +1 -1
  83. package/dist/data/verification/VerificationResults.d.ts +3 -1
  84. package/dist/data/verification/VerificationResults.d.ts.map +1 -1
  85. package/dist/data/verification/VerificationResults.js +4 -0
  86. package/dist/data/verification/VerificationResults.js.map +1 -1
  87. package/dist/data/verification/adapterViews.cjs +12 -3
  88. package/dist/data/verification/adapterViews.cjs.map +1 -1
  89. package/dist/data/verification/adapterViews.d.ts +4 -1
  90. package/dist/data/verification/adapterViews.d.ts.map +1 -1
  91. package/dist/data/verification/adapterViews.js +12 -3
  92. package/dist/data/verification/adapterViews.js.map +1 -1
  93. package/dist/data/verification/adapters.cjs +53 -10
  94. package/dist/data/verification/adapters.cjs.map +1 -1
  95. package/dist/data/verification/adapters.d.ts +7 -1
  96. package/dist/data/verification/adapters.d.ts.map +1 -1
  97. package/dist/data/verification/adapters.js +53 -10
  98. package/dist/data/verification/adapters.js.map +1 -1
  99. package/dist/data/verification/index.d.ts +4 -2
  100. package/dist/data/verification/index.d.ts.map +1 -1
  101. package/dist/data/verification/stepKind.cjs +217 -0
  102. package/dist/data/verification/stepKind.cjs.map +1 -0
  103. package/dist/data/verification/stepKind.d.ts +87 -0
  104. package/dist/data/verification/stepKind.d.ts.map +1 -0
  105. package/dist/data/verification/stepKind.js +217 -0
  106. package/dist/data/verification/stepKind.js.map +1 -0
  107. package/dist/data/verification/stepKindViews.cjs +111 -0
  108. package/dist/data/verification/stepKindViews.cjs.map +1 -0
  109. package/dist/data/verification/stepKindViews.d.ts +18 -0
  110. package/dist/data/verification/stepKindViews.d.ts.map +1 -0
  111. package/dist/data/verification/stepKindViews.js +111 -0
  112. package/dist/data/verification/stepKindViews.js.map +1 -0
  113. package/dist/data/verification/verifyReportTests.cjs +1 -0
  114. package/dist/data/verification/verifyReportTests.cjs.map +1 -1
  115. package/dist/data/verification/verifyReportTests.d.ts +2 -1
  116. package/dist/data/verification/verifyReportTests.d.ts.map +1 -1
  117. package/dist/data/verification/verifyReportTests.js +1 -0
  118. package/dist/data/verification/verifyReportTests.js.map +1 -1
  119. package/dist/data/version-info.cjs +3 -3
  120. package/dist/data/version-info.js +3 -3
  121. package/dist/data.cjs +14 -0
  122. package/dist/data.cjs.map +1 -1
  123. package/dist/data.d.ts +1 -0
  124. package/dist/data.d.ts.map +1 -1
  125. package/dist/data.js +16 -2
  126. package/dist/data.js.map +1 -1
  127. package/dist/index.cjs +16 -0
  128. package/dist/index.cjs.map +1 -1
  129. package/dist/index.js +18 -2
  130. package/dist/index.js.map +1 -1
  131. package/dist/rpc/FilterForm.cjs +9 -0
  132. package/dist/rpc/FilterForm.cjs.map +1 -1
  133. package/dist/rpc/FilterForm.d.ts +5 -1
  134. package/dist/rpc/FilterForm.d.ts.map +1 -1
  135. package/dist/rpc/FilterForm.js +9 -0
  136. package/dist/rpc/FilterForm.js.map +1 -1
  137. package/dist/rpc/OperationArgsForm.cjs +153 -0
  138. package/dist/rpc/OperationArgsForm.cjs.map +1 -0
  139. package/dist/rpc/OperationArgsForm.d.ts +16 -0
  140. package/dist/rpc/OperationArgsForm.d.ts.map +1 -0
  141. package/dist/rpc/OperationArgsForm.js +153 -0
  142. package/dist/rpc/OperationArgsForm.js.map +1 -0
  143. package/dist/rpc/OperationScheduleDialog.cjs +61 -17
  144. package/dist/rpc/OperationScheduleDialog.cjs.map +1 -1
  145. package/dist/rpc/OperationScheduleDialog.d.ts +3 -0
  146. package/dist/rpc/OperationScheduleDialog.d.ts.map +1 -1
  147. package/dist/rpc/OperationScheduleDialog.js +62 -18
  148. package/dist/rpc/OperationScheduleDialog.js.map +1 -1
  149. package/dist/rpc/OperationSchedules.cjs +6 -1
  150. package/dist/rpc/OperationSchedules.cjs.map +1 -1
  151. package/dist/rpc/OperationSchedules.d.ts.map +1 -1
  152. package/dist/rpc/OperationSchedules.js +6 -1
  153. package/dist/rpc/OperationSchedules.js.map +1 -1
  154. package/dist/rpc/operation-schedule-model.cjs +0 -7
  155. package/dist/rpc/operation-schedule-model.cjs.map +1 -1
  156. package/dist/rpc/operation-schedule-model.d.ts +0 -2
  157. package/dist/rpc/operation-schedule-model.d.ts.map +1 -1
  158. package/dist/rpc/operation-schedule-model.js +0 -7
  159. package/dist/rpc/operation-schedule-model.js.map +1 -1
  160. package/dist/rpc/operation-schedule-types.d.ts +6 -1
  161. package/dist/rpc/operation-schedule-types.d.ts.map +1 -1
  162. package/dist/rpc.cjs +2 -0
  163. package/dist/rpc.cjs.map +1 -1
  164. package/dist/rpc.d.ts +1 -0
  165. package/dist/rpc.d.ts.map +1 -1
  166. package/dist/rpc.js +2 -0
  167. package/dist/rpc.js.map +1 -1
  168. package/dist/styles.css +1 -1
  169. package/package.json +1 -1
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const utils = require("../../lib/utils.cjs");
5
+ const Badge = require("../Badge.cjs");
6
+ const JsonView = require("../JsonView.cjs");
7
+ const stepKind = require("./stepKind.cjs");
8
+ function Section({ name, title, aside, children }) {
9
+ return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "min-w-0 space-y-1.5", "data-step-section": name, children: [
10
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
11
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[10px] uppercase tracking-wide text-muted-foreground", children: title }),
12
+ aside
13
+ ] }),
14
+ children
15
+ ] });
16
+ }
17
+ const OUTCOME_BADGE = {
18
+ satisfied: { label: "Satisfied", tone: "success" },
19
+ failed: { label: "Failed", tone: "danger" },
20
+ timeout: { label: "Timed out", tone: "warning" }
21
+ };
22
+ function StepWait({ wait }) {
23
+ const { label, tone } = OUTCOME_BADGE[wait.outcome];
24
+ const { policy } = wait;
25
+ const schedule = stepKind.policySummary(policy);
26
+ return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "min-w-0 text-[11px]", "data-step-section": "wait", children: [
27
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 items-center gap-2", "data-wait-summary": "", children: [
28
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 text-muted-foreground", children: "Wait" }),
29
+ /* @__PURE__ */ jsxRuntime.jsx("code", { className: "min-w-0 shrink truncate font-mono", title: policy.until ?? "Service readiness", children: policy.until ?? "Service readiness" }),
30
+ /* @__PURE__ */ jsxRuntime.jsx(Badge.Badge, { size: "xs", clickToCopy: false, children: stepKind.formatDelay(wait.durationMs) }),
31
+ /* @__PURE__ */ jsxRuntime.jsx(Badge.Badge, { size: "xs", clickToCopy: false, tone, children: label }),
32
+ wait.outputs !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate font-mono text-muted-foreground", "data-wait-output": "", title: "Full value in Outputs", children: stepKind.formatExportValue(wait.outputs) })
33
+ ] }),
34
+ (schedule || policy.failWhen || wait.error || wait.trace) && /* @__PURE__ */ jsxRuntime.jsxs("details", { className: "mt-1 text-muted-foreground", children: [
35
+ /* @__PURE__ */ jsxRuntime.jsx("summary", { className: "cursor-pointer", children: "Wait details" }),
36
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-1 space-y-1 break-words", children: [
37
+ schedule && /* @__PURE__ */ jsxRuntime.jsx("p", { children: schedule }),
38
+ policy.failWhen && /* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
39
+ "failWhen: ",
40
+ /* @__PURE__ */ jsxRuntime.jsx("code", { children: policy.failWhen })
41
+ ] }),
42
+ wait.error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-destructive", children: wait.error }),
43
+ wait.trace && /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "whitespace-pre-wrap", children: wait.trace })
44
+ ] })
45
+ ] })
46
+ ] });
47
+ }
48
+ function ExportsTable({ exports: exports$1 }) {
49
+ return /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "w-full table-fixed border-collapse text-left text-[11px]", children: [
50
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { className: "text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "border-b border-border", children: [
51
+ /* @__PURE__ */ jsxRuntime.jsx("th", { className: "w-[28%] py-1 pr-2 font-medium", children: "Name" }),
52
+ /* @__PURE__ */ jsxRuntime.jsx("th", { className: "py-1 pr-2 font-medium", children: "Value" }),
53
+ /* @__PURE__ */ jsxRuntime.jsx("th", { className: "w-[18%] py-1 font-medium", children: "Step" })
54
+ ] }) }),
55
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { className: "font-mono", children: exports$1.map((entry) => /* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "border-b border-border/60 align-top last:border-0", children: [
56
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "break-words py-1 pr-2", children: entry.name }),
57
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "break-all py-1 pr-2", children: stepKind.formatExportValue(entry.value) }),
58
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "break-words py-1 text-muted-foreground", children: entry.step })
59
+ ] }, entry.name)) })
60
+ ] });
61
+ }
62
+ const ALERT_ROW = "border-red-500/60 bg-red-500/10 text-red-700 dark:text-red-400";
63
+ function isAlarming(event) {
64
+ return event.type === "alert" || event.type === "pageerror" || event.type === "response" && (event.status ?? 0) >= 400;
65
+ }
66
+ function EventRow({ event }) {
67
+ const alarming = isAlarming(event);
68
+ return /* @__PURE__ */ jsxRuntime.jsxs(
69
+ "li",
70
+ {
71
+ className: utils.cn("space-y-0.5 rounded border px-2 py-1 text-[11px]", alarming ? ALERT_ROW : "border-border"),
72
+ "data-event-type": event.type,
73
+ children: [
74
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
75
+ /* @__PURE__ */ jsxRuntime.jsx(Badge.Badge, { size: "xs", clickToCopy: false, tone: alarming ? "danger" : "neutral", children: event.type }),
76
+ event.status !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-mono", children: event.status }),
77
+ event.text && /* @__PURE__ */ jsxRuntime.jsx("span", { className: utils.cn("min-w-0 break-words", event.type === "alert" && "font-medium"), children: event.text })
78
+ ] }),
79
+ event.url && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "break-all font-mono text-[10px] opacity-80", children: event.url }),
80
+ event.detail && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "whitespace-pre-wrap break-words", children: event.detail })
81
+ ]
82
+ }
83
+ );
84
+ }
85
+ function StepKindSections({ step, renderWait }) {
86
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
87
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-[11px] text-muted-foreground", "data-step-ref": "", children: [
88
+ step.step.kind,
89
+ " · ",
90
+ step.step.id,
91
+ step.background && " · background"
92
+ ] }),
93
+ step.wait && (renderWait ? renderWait(step.wait) : /* @__PURE__ */ jsxRuntime.jsx(StepWait, { wait: step.wait })),
94
+ step.events.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(Section, { name: "events", title: "Events", children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-1", children: step.events.map((event, index) => /* @__PURE__ */ jsxRuntime.jsx(EventRow, { event }, index)) }) }),
95
+ step.exports.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(Section, { name: "exports", title: "Exports", children: /* @__PURE__ */ jsxRuntime.jsx(ExportsTable, { exports: step.exports }) })
96
+ ] });
97
+ }
98
+ function StepOutputs({ outputs }) {
99
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 p-density-4", "data-step-section": "outputs", children: /* @__PURE__ */ jsxRuntime.jsx(JsonView.JsonView, { data: outputs }) });
100
+ }
101
+ function MalformedStepDetail({ error }) {
102
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { role: "alert", className: "rounded border border-red-500/60 bg-red-500/10 px-2 py-1 text-xs text-red-700 dark:text-red-400", children: [
103
+ "Malformed step detail: ",
104
+ error
105
+ ] });
106
+ }
107
+ exports.MalformedStepDetail = MalformedStepDetail;
108
+ exports.StepKindSections = StepKindSections;
109
+ exports.StepOutputs = StepOutputs;
110
+ exports.StepWait = StepWait;
111
+ //# sourceMappingURL=stepKindViews.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepKindViews.cjs","sources":["../../../src/data/verification/stepKindViews.tsx"],"sourcesContent":["// Detail sections for a typed fixture step (see stepKind.ts): the wait\n// timeline, retry attempts, exported variables, outputs and a background\n// watcher's events. Rendered inside FixtureDetail; split out so adapterViews.tsx\n// stays focused on the command/CEL body.\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Badge, type BadgeTone } from \"../Badge\";\nimport { JsonView } from \"../JsonView\";\nimport {\n formatDelay,\n formatExportValue,\n policySummary,\n type StepDetail,\n type StepExport,\n type WaitDetail,\n type WaitOutcome,\n type WatcherEvent,\n} from \"./stepKind\";\n\nfunction Section({ name, title, aside, children }: { name: string; title: string; aside?: ReactNode; children: ReactNode }) {\n return (\n <section className=\"min-w-0 space-y-1.5\" data-step-section={name}>\n <div className=\"flex items-center gap-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">{title}</div>\n {aside}\n </div>\n {children}\n </section>\n );\n}\n\n// ── Wait ────────────────────────────────────────────────────────────────────\n\nconst OUTCOME_BADGE: Record<WaitOutcome, { label: string; tone: BadgeTone }> = {\n satisfied: { label: \"Satisfied\", tone: \"success\" },\n failed: { label: \"Failed\", tone: \"danger\" },\n timeout: { label: \"Timed out\", tone: \"warning\" },\n};\n\nexport function StepWait({ wait }: { wait: WaitDetail }) {\n const { label, tone } = OUTCOME_BADGE[wait.outcome];\n const { policy } = wait;\n const schedule = policySummary(policy);\n return (\n <section className=\"min-w-0 text-[11px]\" data-step-section=\"wait\">\n <div className=\"flex min-w-0 items-center gap-2\" data-wait-summary=\"\">\n <span className=\"shrink-0 text-muted-foreground\">Wait</span>\n <code className=\"min-w-0 shrink truncate font-mono\" title={policy.until ?? \"Service readiness\"}>{policy.until ?? \"Service readiness\"}</code>\n <Badge size=\"xs\" clickToCopy={false}>{formatDelay(wait.durationMs)}</Badge>\n <Badge size=\"xs\" clickToCopy={false} tone={tone}>{label}</Badge>\n {wait.outputs !== undefined && <span className=\"min-w-0 flex-1 truncate font-mono text-muted-foreground\" data-wait-output=\"\" title=\"Full value in Outputs\">{formatExportValue(wait.outputs)}</span>}\n </div>\n {(schedule || policy.failWhen || wait.error || wait.trace) && (\n <details className=\"mt-1 text-muted-foreground\">\n <summary className=\"cursor-pointer\">Wait details</summary>\n <div className=\"mt-1 space-y-1 break-words\">\n {schedule && <p>{schedule}</p>}\n {policy.failWhen && <p>failWhen: <code>{policy.failWhen}</code></p>}\n {wait.error && <p className=\"text-destructive\">{wait.error}</p>}\n {wait.trace && <pre className=\"whitespace-pre-wrap\">{wait.trace}</pre>}\n </div>\n </details>\n )}\n </section>\n );\n}\n\n// ── Exports ─────────────────────────────────────────────────────────────────\n\nfunction ExportsTable({ exports }: { exports: StepExport[] }) {\n return (\n <table className=\"w-full table-fixed border-collapse text-left text-[11px]\">\n <thead className=\"text-muted-foreground\">\n <tr className=\"border-b border-border\">\n <th className=\"w-[28%] py-1 pr-2 font-medium\">Name</th>\n <th className=\"py-1 pr-2 font-medium\">Value</th>\n <th className=\"w-[18%] py-1 font-medium\">Step</th>\n </tr>\n </thead>\n <tbody className=\"font-mono\">\n {exports.map((entry) => (\n <tr key={entry.name} className=\"border-b border-border/60 align-top last:border-0\">\n <td className=\"break-words py-1 pr-2\">{entry.name}</td>\n <td className=\"break-all py-1 pr-2\">{formatExportValue(entry.value)}</td>\n <td className=\"break-words py-1 text-muted-foreground\">{entry.step}</td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\n// ── Watcher events ──────────────────────────────────────────────────────────\n\nconst ALERT_ROW = \"border-red-500/60 bg-red-500/10 text-red-700 dark:text-red-400\";\n\nfunction isAlarming(event: WatcherEvent): boolean {\n return event.type === \"alert\" || event.type === \"pageerror\" || (event.type === \"response\" && (event.status ?? 0) >= 400);\n}\n\nfunction EventRow({ event }: { event: WatcherEvent }) {\n const alarming = isAlarming(event);\n return (\n <li\n className={cn(\"space-y-0.5 rounded border px-2 py-1 text-[11px]\", alarming ? ALERT_ROW : \"border-border\")}\n data-event-type={event.type}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <Badge size=\"xs\" clickToCopy={false} tone={alarming ? \"danger\" : \"neutral\"}>{event.type}</Badge>\n {event.status !== undefined && <span className=\"font-mono\">{event.status}</span>}\n {event.text && <span className={cn(\"min-w-0 break-words\", event.type === \"alert\" && \"font-medium\")}>{event.text}</span>}\n </div>\n {event.url && <div className=\"break-all font-mono text-[10px] opacity-80\">{event.url}</div>}\n {event.detail && <p className=\"whitespace-pre-wrap break-words\">{event.detail}</p>}\n </li>\n );\n}\n\n// ── Whole step ──────────────────────────────────────────────────────────────\n\n/** Execution sections for a typed fixture step; final outputs render separately. */\nexport function StepKindSections({ step, renderWait }: { step: StepDetail; renderWait?: (wait: WaitDetail) => ReactNode }) {\n return (\n <>\n <div className=\"text-[11px] text-muted-foreground\" data-step-ref=\"\">\n {step.step.kind} · {step.step.id}\n {step.background && \" · background\"}\n </div>\n {step.wait && (renderWait ? renderWait(step.wait) : <StepWait wait={step.wait} />)}\n {step.events.length > 0 && (\n <Section name=\"events\" title=\"Events\">\n <ul className=\"space-y-1\">\n {step.events.map((event, index) => (\n <EventRow key={index} event={event} />\n ))}\n </ul>\n </Section>\n )}\n {step.exports.length > 0 && (\n <Section name=\"exports\" title=\"Exports\">\n <ExportsTable exports={step.exports} />\n </Section>\n )}\n </>\n );\n}\n\nexport function StepOutputs({ outputs }: { outputs: unknown }) {\n return (\n <div className=\"min-w-0 p-density-4\" data-step-section=\"outputs\">\n <JsonView data={outputs} />\n </div>\n );\n}\n\n/** Shown in place of the sections when `detail.step` is present but breaks the contract. */\nexport function MalformedStepDetail({ error }: { error: string }) {\n return (\n <div role=\"alert\" className=\"rounded border border-red-500/60 bg-red-500/10 px-2 py-1 text-xs text-red-700 dark:text-red-400\">\n Malformed step detail: {error}\n </div>\n );\n}\n"],"names":["jsxs","jsx","policySummary","Badge","formatDelay","formatExportValue","exports","cn","Fragment","JsonView"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { ReactNode } from 'react';
2
+ import { StepDetail, WaitDetail } from './stepKind.js';
3
+ export declare function StepWait({ wait }: {
4
+ wait: WaitDetail;
5
+ }): import("react").JSX.Element;
6
+ /** Execution sections for a typed fixture step; final outputs render separately. */
7
+ export declare function StepKindSections({ step, renderWait }: {
8
+ step: StepDetail;
9
+ renderWait?: (wait: WaitDetail) => ReactNode;
10
+ }): import("react").JSX.Element;
11
+ export declare function StepOutputs({ outputs }: {
12
+ outputs: unknown;
13
+ }): import("react").JSX.Element;
14
+ /** Shown in place of the sections when `detail.step` is present but breaks the contract. */
15
+ export declare function MalformedStepDetail({ error }: {
16
+ error: string;
17
+ }): import("react").JSX.Element;
18
+ //# sourceMappingURL=stepKindViews.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepKindViews.d.ts","sourceRoot":"","sources":["../../../src/data/verification/stepKindViews.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,OAAO,EAIL,KAAK,UAAU,EAEf,KAAK,UAAU,EAGhB,MAAM,YAAY,CAAC;AAsBpB,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,+BA0BtD;AAuDD,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS,CAAA;CAAE,+BAwBxH;AAED,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,+BAM5D;AAED,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,+BAM/D"}
@@ -0,0 +1,111 @@
1
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/utils.js";
3
+ import { Badge } from "../Badge.js";
4
+ import { JsonView } from "../JsonView.js";
5
+ import { policySummary, formatDelay, formatExportValue } from "./stepKind.js";
6
+ function Section({ name, title, aside, children }) {
7
+ return /* @__PURE__ */ jsxs("section", { className: "min-w-0 space-y-1.5", "data-step-section": name, children: [
8
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
9
+ /* @__PURE__ */ jsx("div", { className: "text-[10px] uppercase tracking-wide text-muted-foreground", children: title }),
10
+ aside
11
+ ] }),
12
+ children
13
+ ] });
14
+ }
15
+ const OUTCOME_BADGE = {
16
+ satisfied: { label: "Satisfied", tone: "success" },
17
+ failed: { label: "Failed", tone: "danger" },
18
+ timeout: { label: "Timed out", tone: "warning" }
19
+ };
20
+ function StepWait({ wait }) {
21
+ const { label, tone } = OUTCOME_BADGE[wait.outcome];
22
+ const { policy } = wait;
23
+ const schedule = policySummary(policy);
24
+ return /* @__PURE__ */ jsxs("section", { className: "min-w-0 text-[11px]", "data-step-section": "wait", children: [
25
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-2", "data-wait-summary": "", children: [
26
+ /* @__PURE__ */ jsx("span", { className: "shrink-0 text-muted-foreground", children: "Wait" }),
27
+ /* @__PURE__ */ jsx("code", { className: "min-w-0 shrink truncate font-mono", title: policy.until ?? "Service readiness", children: policy.until ?? "Service readiness" }),
28
+ /* @__PURE__ */ jsx(Badge, { size: "xs", clickToCopy: false, children: formatDelay(wait.durationMs) }),
29
+ /* @__PURE__ */ jsx(Badge, { size: "xs", clickToCopy: false, tone, children: label }),
30
+ wait.outputs !== void 0 && /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate font-mono text-muted-foreground", "data-wait-output": "", title: "Full value in Outputs", children: formatExportValue(wait.outputs) })
31
+ ] }),
32
+ (schedule || policy.failWhen || wait.error || wait.trace) && /* @__PURE__ */ jsxs("details", { className: "mt-1 text-muted-foreground", children: [
33
+ /* @__PURE__ */ jsx("summary", { className: "cursor-pointer", children: "Wait details" }),
34
+ /* @__PURE__ */ jsxs("div", { className: "mt-1 space-y-1 break-words", children: [
35
+ schedule && /* @__PURE__ */ jsx("p", { children: schedule }),
36
+ policy.failWhen && /* @__PURE__ */ jsxs("p", { children: [
37
+ "failWhen: ",
38
+ /* @__PURE__ */ jsx("code", { children: policy.failWhen })
39
+ ] }),
40
+ wait.error && /* @__PURE__ */ jsx("p", { className: "text-destructive", children: wait.error }),
41
+ wait.trace && /* @__PURE__ */ jsx("pre", { className: "whitespace-pre-wrap", children: wait.trace })
42
+ ] })
43
+ ] })
44
+ ] });
45
+ }
46
+ function ExportsTable({ exports: exports$1 }) {
47
+ return /* @__PURE__ */ jsxs("table", { className: "w-full table-fixed border-collapse text-left text-[11px]", children: [
48
+ /* @__PURE__ */ jsx("thead", { className: "text-muted-foreground", children: /* @__PURE__ */ jsxs("tr", { className: "border-b border-border", children: [
49
+ /* @__PURE__ */ jsx("th", { className: "w-[28%] py-1 pr-2 font-medium", children: "Name" }),
50
+ /* @__PURE__ */ jsx("th", { className: "py-1 pr-2 font-medium", children: "Value" }),
51
+ /* @__PURE__ */ jsx("th", { className: "w-[18%] py-1 font-medium", children: "Step" })
52
+ ] }) }),
53
+ /* @__PURE__ */ jsx("tbody", { className: "font-mono", children: exports$1.map((entry) => /* @__PURE__ */ jsxs("tr", { className: "border-b border-border/60 align-top last:border-0", children: [
54
+ /* @__PURE__ */ jsx("td", { className: "break-words py-1 pr-2", children: entry.name }),
55
+ /* @__PURE__ */ jsx("td", { className: "break-all py-1 pr-2", children: formatExportValue(entry.value) }),
56
+ /* @__PURE__ */ jsx("td", { className: "break-words py-1 text-muted-foreground", children: entry.step })
57
+ ] }, entry.name)) })
58
+ ] });
59
+ }
60
+ const ALERT_ROW = "border-red-500/60 bg-red-500/10 text-red-700 dark:text-red-400";
61
+ function isAlarming(event) {
62
+ return event.type === "alert" || event.type === "pageerror" || event.type === "response" && (event.status ?? 0) >= 400;
63
+ }
64
+ function EventRow({ event }) {
65
+ const alarming = isAlarming(event);
66
+ return /* @__PURE__ */ jsxs(
67
+ "li",
68
+ {
69
+ className: cn("space-y-0.5 rounded border px-2 py-1 text-[11px]", alarming ? ALERT_ROW : "border-border"),
70
+ "data-event-type": event.type,
71
+ children: [
72
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
73
+ /* @__PURE__ */ jsx(Badge, { size: "xs", clickToCopy: false, tone: alarming ? "danger" : "neutral", children: event.type }),
74
+ event.status !== void 0 && /* @__PURE__ */ jsx("span", { className: "font-mono", children: event.status }),
75
+ event.text && /* @__PURE__ */ jsx("span", { className: cn("min-w-0 break-words", event.type === "alert" && "font-medium"), children: event.text })
76
+ ] }),
77
+ event.url && /* @__PURE__ */ jsx("div", { className: "break-all font-mono text-[10px] opacity-80", children: event.url }),
78
+ event.detail && /* @__PURE__ */ jsx("p", { className: "whitespace-pre-wrap break-words", children: event.detail })
79
+ ]
80
+ }
81
+ );
82
+ }
83
+ function StepKindSections({ step, renderWait }) {
84
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
85
+ /* @__PURE__ */ jsxs("div", { className: "text-[11px] text-muted-foreground", "data-step-ref": "", children: [
86
+ step.step.kind,
87
+ " · ",
88
+ step.step.id,
89
+ step.background && " · background"
90
+ ] }),
91
+ step.wait && (renderWait ? renderWait(step.wait) : /* @__PURE__ */ jsx(StepWait, { wait: step.wait })),
92
+ step.events.length > 0 && /* @__PURE__ */ jsx(Section, { name: "events", title: "Events", children: /* @__PURE__ */ jsx("ul", { className: "space-y-1", children: step.events.map((event, index) => /* @__PURE__ */ jsx(EventRow, { event }, index)) }) }),
93
+ step.exports.length > 0 && /* @__PURE__ */ jsx(Section, { name: "exports", title: "Exports", children: /* @__PURE__ */ jsx(ExportsTable, { exports: step.exports }) })
94
+ ] });
95
+ }
96
+ function StepOutputs({ outputs }) {
97
+ return /* @__PURE__ */ jsx("div", { className: "min-w-0 p-density-4", "data-step-section": "outputs", children: /* @__PURE__ */ jsx(JsonView, { data: outputs }) });
98
+ }
99
+ function MalformedStepDetail({ error }) {
100
+ return /* @__PURE__ */ jsxs("div", { role: "alert", className: "rounded border border-red-500/60 bg-red-500/10 px-2 py-1 text-xs text-red-700 dark:text-red-400", children: [
101
+ "Malformed step detail: ",
102
+ error
103
+ ] });
104
+ }
105
+ export {
106
+ MalformedStepDetail,
107
+ StepKindSections,
108
+ StepOutputs,
109
+ StepWait
110
+ };
111
+ //# sourceMappingURL=stepKindViews.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepKindViews.js","sources":["../../../src/data/verification/stepKindViews.tsx"],"sourcesContent":["// Detail sections for a typed fixture step (see stepKind.ts): the wait\n// timeline, retry attempts, exported variables, outputs and a background\n// watcher's events. Rendered inside FixtureDetail; split out so adapterViews.tsx\n// stays focused on the command/CEL body.\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Badge, type BadgeTone } from \"../Badge\";\nimport { JsonView } from \"../JsonView\";\nimport {\n formatDelay,\n formatExportValue,\n policySummary,\n type StepDetail,\n type StepExport,\n type WaitDetail,\n type WaitOutcome,\n type WatcherEvent,\n} from \"./stepKind\";\n\nfunction Section({ name, title, aside, children }: { name: string; title: string; aside?: ReactNode; children: ReactNode }) {\n return (\n <section className=\"min-w-0 space-y-1.5\" data-step-section={name}>\n <div className=\"flex items-center gap-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">{title}</div>\n {aside}\n </div>\n {children}\n </section>\n );\n}\n\n// ── Wait ────────────────────────────────────────────────────────────────────\n\nconst OUTCOME_BADGE: Record<WaitOutcome, { label: string; tone: BadgeTone }> = {\n satisfied: { label: \"Satisfied\", tone: \"success\" },\n failed: { label: \"Failed\", tone: \"danger\" },\n timeout: { label: \"Timed out\", tone: \"warning\" },\n};\n\nexport function StepWait({ wait }: { wait: WaitDetail }) {\n const { label, tone } = OUTCOME_BADGE[wait.outcome];\n const { policy } = wait;\n const schedule = policySummary(policy);\n return (\n <section className=\"min-w-0 text-[11px]\" data-step-section=\"wait\">\n <div className=\"flex min-w-0 items-center gap-2\" data-wait-summary=\"\">\n <span className=\"shrink-0 text-muted-foreground\">Wait</span>\n <code className=\"min-w-0 shrink truncate font-mono\" title={policy.until ?? \"Service readiness\"}>{policy.until ?? \"Service readiness\"}</code>\n <Badge size=\"xs\" clickToCopy={false}>{formatDelay(wait.durationMs)}</Badge>\n <Badge size=\"xs\" clickToCopy={false} tone={tone}>{label}</Badge>\n {wait.outputs !== undefined && <span className=\"min-w-0 flex-1 truncate font-mono text-muted-foreground\" data-wait-output=\"\" title=\"Full value in Outputs\">{formatExportValue(wait.outputs)}</span>}\n </div>\n {(schedule || policy.failWhen || wait.error || wait.trace) && (\n <details className=\"mt-1 text-muted-foreground\">\n <summary className=\"cursor-pointer\">Wait details</summary>\n <div className=\"mt-1 space-y-1 break-words\">\n {schedule && <p>{schedule}</p>}\n {policy.failWhen && <p>failWhen: <code>{policy.failWhen}</code></p>}\n {wait.error && <p className=\"text-destructive\">{wait.error}</p>}\n {wait.trace && <pre className=\"whitespace-pre-wrap\">{wait.trace}</pre>}\n </div>\n </details>\n )}\n </section>\n );\n}\n\n// ── Exports ─────────────────────────────────────────────────────────────────\n\nfunction ExportsTable({ exports }: { exports: StepExport[] }) {\n return (\n <table className=\"w-full table-fixed border-collapse text-left text-[11px]\">\n <thead className=\"text-muted-foreground\">\n <tr className=\"border-b border-border\">\n <th className=\"w-[28%] py-1 pr-2 font-medium\">Name</th>\n <th className=\"py-1 pr-2 font-medium\">Value</th>\n <th className=\"w-[18%] py-1 font-medium\">Step</th>\n </tr>\n </thead>\n <tbody className=\"font-mono\">\n {exports.map((entry) => (\n <tr key={entry.name} className=\"border-b border-border/60 align-top last:border-0\">\n <td className=\"break-words py-1 pr-2\">{entry.name}</td>\n <td className=\"break-all py-1 pr-2\">{formatExportValue(entry.value)}</td>\n <td className=\"break-words py-1 text-muted-foreground\">{entry.step}</td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\n// ── Watcher events ──────────────────────────────────────────────────────────\n\nconst ALERT_ROW = \"border-red-500/60 bg-red-500/10 text-red-700 dark:text-red-400\";\n\nfunction isAlarming(event: WatcherEvent): boolean {\n return event.type === \"alert\" || event.type === \"pageerror\" || (event.type === \"response\" && (event.status ?? 0) >= 400);\n}\n\nfunction EventRow({ event }: { event: WatcherEvent }) {\n const alarming = isAlarming(event);\n return (\n <li\n className={cn(\"space-y-0.5 rounded border px-2 py-1 text-[11px]\", alarming ? ALERT_ROW : \"border-border\")}\n data-event-type={event.type}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <Badge size=\"xs\" clickToCopy={false} tone={alarming ? \"danger\" : \"neutral\"}>{event.type}</Badge>\n {event.status !== undefined && <span className=\"font-mono\">{event.status}</span>}\n {event.text && <span className={cn(\"min-w-0 break-words\", event.type === \"alert\" && \"font-medium\")}>{event.text}</span>}\n </div>\n {event.url && <div className=\"break-all font-mono text-[10px] opacity-80\">{event.url}</div>}\n {event.detail && <p className=\"whitespace-pre-wrap break-words\">{event.detail}</p>}\n </li>\n );\n}\n\n// ── Whole step ──────────────────────────────────────────────────────────────\n\n/** Execution sections for a typed fixture step; final outputs render separately. */\nexport function StepKindSections({ step, renderWait }: { step: StepDetail; renderWait?: (wait: WaitDetail) => ReactNode }) {\n return (\n <>\n <div className=\"text-[11px] text-muted-foreground\" data-step-ref=\"\">\n {step.step.kind} · {step.step.id}\n {step.background && \" · background\"}\n </div>\n {step.wait && (renderWait ? renderWait(step.wait) : <StepWait wait={step.wait} />)}\n {step.events.length > 0 && (\n <Section name=\"events\" title=\"Events\">\n <ul className=\"space-y-1\">\n {step.events.map((event, index) => (\n <EventRow key={index} event={event} />\n ))}\n </ul>\n </Section>\n )}\n {step.exports.length > 0 && (\n <Section name=\"exports\" title=\"Exports\">\n <ExportsTable exports={step.exports} />\n </Section>\n )}\n </>\n );\n}\n\nexport function StepOutputs({ outputs }: { outputs: unknown }) {\n return (\n <div className=\"min-w-0 p-density-4\" data-step-section=\"outputs\">\n <JsonView data={outputs} />\n </div>\n );\n}\n\n/** Shown in place of the sections when `detail.step` is present but breaks the contract. */\nexport function MalformedStepDetail({ error }: { error: string }) {\n return (\n <div role=\"alert\" className=\"rounded border border-red-500/60 bg-red-500/10 px-2 py-1 text-xs text-red-700 dark:text-red-400\">\n Malformed step detail: {error}\n </div>\n );\n}\n"],"names":["exports"],"mappings":"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"}
@@ -79,6 +79,7 @@ function verifyReportTests(report) {
79
79
  function verifyReportCounts(report) {
80
80
  return status.aggregateStatusCounts(verifyReportTests(report));
81
81
  }
82
+ exports.verifyNodeTest = verifyNodeTest;
82
83
  exports.verifyReportCounts = verifyReportCounts;
83
84
  exports.verifyReportTests = verifyReportTests;
84
85
  //# sourceMappingURL=verifyReportTests.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"verifyReportTests.cjs","sources":["../../../src/data/verification/verifyReportTests.ts"],"sourcesContent":["// Projects a captain VerifyReport onto the shared test-runner Test model, so\n// VerificationResults can render it with the same TestRunner every other\n// fixture/test surface uses. Ported from gavel's verificationAttempts.ts\n// (executionNodeTest / checklistTest), adapted to VerifyReport's node shape\n// (which already carries boolean status flags, unlike gavel's execution\n// snapshot which carried a single `state` string to translate).\n\nimport { aggregateStatusCounts, type StatusCounts, type Test, type TestSummary } from \"../test-runner\";\nimport type { VerifyChecklistItem, VerifyNode, VerifyReport, VerifySummary } from \"./verify-report\";\n\nconst ACCEPTANCE_CRITERIA_ID = \"acceptance-criteria\";\n\nfunction coerceDuration(duration: unknown): number | undefined {\n return typeof duration === \"number\" && Number.isFinite(duration) ? duration : undefined;\n}\n\n/**\n * Projects a `VerifySummary` onto the test-runner's `TestSummary` shape (see\n * `test-runner/types.ts`), so `sum()`/`aggregateStatusCounts` (test-runner\n * `status.ts`) read a summary-carrying node's counts directly instead of\n * recursing into (possibly elided) children.\n *\n * `Duration` is not carried by `VerifySummary`, so it is reported as 0.\n */\nfunction verifySummaryToTestSummary(summary: VerifySummary): TestSummary {\n return {\n Total: summary.total,\n Passed: summary.passed,\n Failed: summary.failed,\n Warned: summary.warned,\n Skipped: summary.skipped,\n Pending: summary.pending,\n Running: summary.running,\n Timedout: summary.timedout,\n Duration: 0,\n };\n}\n\n// Every field below is optional on both VerifyNode and Test, and the project\n// compiles with exactOptionalPropertyTypes — so an absent field must be an\n// absent key, not a key explicitly set to undefined. Each is assigned only\n// when present rather than copied through in one object literal.\nfunction verifyNodeTest(node: VerifyNode): Test {\n const test: Test = { name: node.name };\n if (node.framework !== undefined) test.framework = node.framework;\n if (node.task_id !== undefined) test.task_id = node.task_id;\n if (node.file !== undefined) test.file = node.file;\n if (node.line !== undefined) test.line = node.line;\n if (node.message !== undefined) test.message = node.message;\n if (node.command !== undefined) test.command = node.command;\n if (node.work_dir !== undefined) test.work_dir = node.work_dir;\n if (node.stdout !== undefined) test.stdout = node.stdout;\n if (node.stderr !== undefined) test.stderr = node.stderr;\n const duration = coerceDuration(node.duration);\n if (duration !== undefined) test.duration = duration;\n if (node.passed !== undefined) test.passed = node.passed;\n if (node.failed !== undefined) test.failed = node.failed;\n if (node.warned !== undefined) test.warned = node.warned;\n if (node.skipped !== undefined) test.skipped = node.skipped;\n if (node.pending !== undefined) test.pending = node.pending;\n if (node.running !== undefined) test.running = node.running;\n if (node.timed_out !== undefined) test.timed_out = node.timed_out;\n if (node.progress !== undefined) test.progress = node.progress;\n if (node.context !== undefined) test.context = node.context;\n if (node.detail !== undefined) test.detail = node.detail;\n // A node carrying its own `summary` (elided children) contributes that\n // summary directly and is never recursed into, even if `children` is also\n // present — parity with Go's `SummarizeNodes` and `summarizeVerifyNodes`.\n if (node.summary !== undefined) {\n test.summary = verifySummaryToTestSummary(node.summary);\n } else if (node.children !== undefined) {\n test.children = node.children.map(verifyNodeTest);\n }\n return test;\n}\n\nfunction checklistItemTest(item: VerifyChecklistItem, index: number): Test {\n const test: Test = {\n name: item.item || `Criterion ${index + 1}`,\n framework: \"checklist\",\n task_id: `${ACCEPTANCE_CRITERIA_ID}:${index}`,\n passed: item.passed === true,\n failed: item.passed === false,\n pending: item.passed !== true && item.passed !== false,\n detail: item,\n };\n if (item.message !== undefined) test.message = item.message;\n return test;\n}\n\n/**\n * Synthesizes the \"Acceptance criteria\" parent node gavel's checklistTest\n * ports. Deliberately carries no status flags of its own — `status.ts`'s\n * `testStatus` checks `pending` before `failed`, so a container explicitly\n * flagged both `failed` and `pending` (one item failed, another is still\n * unjudged) would render as queued instead of failed. Leaving the container\n * status-less lets the shared roll-up (`outcomeFor`/`statusToneFor`: failed\n * → warned → running → pending → passed, via `sum()` over the children) decide\n * instead.\n */\nfunction checklistTest(checklist: VerifyChecklistItem[]): Test | null {\n if (checklist.length === 0) return null;\n const children = checklist.map(checklistItemTest);\n return {\n name: \"Acceptance criteria\",\n framework: \"checklist\",\n task_id: ACCEPTANCE_CRITERIA_ID,\n children,\n };\n}\n\n/** Maps a VerifyReport onto the TestRunner's Test forest, appending a\n * synthesized \"Acceptance criteria\" node for the checklist when present. */\nexport function verifyReportTests(report: VerifyReport): Test[] {\n const tests = (report.tests ?? []).map(verifyNodeTest);\n const checklist = checklistTest(report.checklist ?? []);\n return checklist ? [...tests, checklist] : tests;\n}\n\n/**\n * Status roll-up across the *rendered* forest: `report.tests` plus the\n * synthesized checklist leaves. This is **not** `report.summary` — the\n * producer's tests-only tally (see `summarizeVerifyNodes` in ./verify-report)\n * — since it also counts checklist items, which never appear in `tests`.\n */\nexport function verifyReportCounts(report: VerifyReport): StatusCounts {\n return aggregateStatusCounts(verifyReportTests(report));\n}\n"],"names":["aggregateStatusCounts"],"mappings":"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"}
1
+ {"version":3,"file":"verifyReportTests.cjs","sources":["../../../src/data/verification/verifyReportTests.ts"],"sourcesContent":["// Projects a captain VerifyReport onto the shared test-runner Test model, so\n// VerificationResults can render it with the same TestRunner every other\n// fixture/test surface uses. Ported from gavel's verificationAttempts.ts\n// (executionNodeTest / checklistTest), adapted to VerifyReport's node shape\n// (which already carries boolean status flags, unlike gavel's execution\n// snapshot which carried a single `state` string to translate).\n\nimport { aggregateStatusCounts, type StatusCounts, type Test, type TestSummary } from \"../test-runner\";\nimport type { VerifyChecklistItem, VerifyNode, VerifyReport, VerifySummary } from \"./verify-report\";\n\nconst ACCEPTANCE_CRITERIA_ID = \"acceptance-criteria\";\n\nfunction coerceDuration(duration: unknown): number | undefined {\n return typeof duration === \"number\" && Number.isFinite(duration) ? duration : undefined;\n}\n\n/**\n * Projects a `VerifySummary` onto the test-runner's `TestSummary` shape (see\n * `test-runner/types.ts`), so `sum()`/`aggregateStatusCounts` (test-runner\n * `status.ts`) read a summary-carrying node's counts directly instead of\n * recursing into (possibly elided) children.\n *\n * `Duration` is not carried by `VerifySummary`, so it is reported as 0.\n */\nfunction verifySummaryToTestSummary(summary: VerifySummary): TestSummary {\n return {\n Total: summary.total,\n Passed: summary.passed,\n Failed: summary.failed,\n Warned: summary.warned,\n Skipped: summary.skipped,\n Pending: summary.pending,\n Running: summary.running,\n Timedout: summary.timedout,\n Duration: 0,\n };\n}\n\n// Every field below is optional on both VerifyNode and Test, and the project\n// compiles with exactOptionalPropertyTypes — so an absent field must be an\n// absent key, not a key explicitly set to undefined. Each is assigned only\n// when present rather than copied through in one object literal.\nexport function verifyNodeTest(node: VerifyNode): Test {\n const test: Test = { name: node.name };\n if (node.framework !== undefined) test.framework = node.framework;\n if (node.task_id !== undefined) test.task_id = node.task_id;\n if (node.file !== undefined) test.file = node.file;\n if (node.line !== undefined) test.line = node.line;\n if (node.message !== undefined) test.message = node.message;\n if (node.command !== undefined) test.command = node.command;\n if (node.work_dir !== undefined) test.work_dir = node.work_dir;\n if (node.stdout !== undefined) test.stdout = node.stdout;\n if (node.stderr !== undefined) test.stderr = node.stderr;\n const duration = coerceDuration(node.duration);\n if (duration !== undefined) test.duration = duration;\n if (node.passed !== undefined) test.passed = node.passed;\n if (node.failed !== undefined) test.failed = node.failed;\n if (node.warned !== undefined) test.warned = node.warned;\n if (node.skipped !== undefined) test.skipped = node.skipped;\n if (node.pending !== undefined) test.pending = node.pending;\n if (node.running !== undefined) test.running = node.running;\n if (node.timed_out !== undefined) test.timed_out = node.timed_out;\n if (node.progress !== undefined) test.progress = node.progress;\n if (node.context !== undefined) test.context = node.context;\n if (node.detail !== undefined) test.detail = node.detail;\n // A node carrying its own `summary` (elided children) contributes that\n // summary directly and is never recursed into, even if `children` is also\n // present — parity with Go's `SummarizeNodes` and `summarizeVerifyNodes`.\n if (node.summary !== undefined) {\n test.summary = verifySummaryToTestSummary(node.summary);\n } else if (node.children !== undefined) {\n test.children = node.children.map(verifyNodeTest);\n }\n return test;\n}\n\nfunction checklistItemTest(item: VerifyChecklistItem, index: number): Test {\n const test: Test = {\n name: item.item || `Criterion ${index + 1}`,\n framework: \"checklist\",\n task_id: `${ACCEPTANCE_CRITERIA_ID}:${index}`,\n passed: item.passed === true,\n failed: item.passed === false,\n pending: item.passed !== true && item.passed !== false,\n detail: item,\n };\n if (item.message !== undefined) test.message = item.message;\n return test;\n}\n\n/**\n * Synthesizes the \"Acceptance criteria\" parent node gavel's checklistTest\n * ports. Deliberately carries no status flags of its own — `status.ts`'s\n * `testStatus` checks `pending` before `failed`, so a container explicitly\n * flagged both `failed` and `pending` (one item failed, another is still\n * unjudged) would render as queued instead of failed. Leaving the container\n * status-less lets the shared roll-up (`outcomeFor`/`statusToneFor`: failed\n * → warned → running → pending → passed, via `sum()` over the children) decide\n * instead.\n */\nfunction checklistTest(checklist: VerifyChecklistItem[]): Test | null {\n if (checklist.length === 0) return null;\n const children = checklist.map(checklistItemTest);\n return {\n name: \"Acceptance criteria\",\n framework: \"checklist\",\n task_id: ACCEPTANCE_CRITERIA_ID,\n children,\n };\n}\n\n/** Maps a VerifyReport onto the TestRunner's Test forest, appending a\n * synthesized \"Acceptance criteria\" node for the checklist when present. */\nexport function verifyReportTests(report: VerifyReport): Test[] {\n const tests = (report.tests ?? []).map(verifyNodeTest);\n const checklist = checklistTest(report.checklist ?? []);\n return checklist ? [...tests, checklist] : tests;\n}\n\n/**\n * Status roll-up across the *rendered* forest: `report.tests` plus the\n * synthesized checklist leaves. This is **not** `report.summary` — the\n * producer's tests-only tally (see `summarizeVerifyNodes` in ./verify-report)\n * — since it also counts checklist items, which never appear in `tests`.\n */\nexport function verifyReportCounts(report: VerifyReport): StatusCounts {\n return aggregateStatusCounts(verifyReportTests(report));\n}\n"],"names":["aggregateStatusCounts"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { StatusCounts, Test } from '../test-runner/index.js';
2
- import { VerifyReport } from './verify-report.js';
2
+ import { VerifyNode, VerifyReport } from './verify-report.js';
3
+ export declare function verifyNodeTest(node: VerifyNode): Test;
3
4
  /** Maps a VerifyReport onto the TestRunner's Test forest, appending a
4
5
  * synthesized "Acceptance criteria" node for the checklist when present. */
5
6
  export declare function verifyReportTests(report: VerifyReport): Test[];
@@ -1 +1 @@
1
- {"version":3,"file":"verifyReportTests.d.ts","sourceRoot":"","sources":["../../../src/data/verification/verifyReportTests.ts"],"names":[],"mappings":"AAOA,OAAO,EAAyB,KAAK,YAAY,EAAE,KAAK,IAAI,EAAoB,MAAM,gBAAgB,CAAC;AACvG,OAAO,KAAK,EAAmC,YAAY,EAAiB,MAAM,iBAAiB,CAAC;AAuGpG;6EAC6E;AAC7E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,EAAE,CAI9D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAErE"}
1
+ {"version":3,"file":"verifyReportTests.d.ts","sourceRoot":"","sources":["../../../src/data/verification/verifyReportTests.ts"],"names":[],"mappings":"AAOA,OAAO,EAAyB,KAAK,YAAY,EAAE,KAAK,IAAI,EAAoB,MAAM,gBAAgB,CAAC;AACvG,OAAO,KAAK,EAAuB,UAAU,EAAE,YAAY,EAAiB,MAAM,iBAAiB,CAAC;AAkCpG,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAgCrD;AAqCD;6EAC6E;AAC7E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,EAAE,CAI9D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAErE"}
@@ -78,6 +78,7 @@ function verifyReportCounts(report) {
78
78
  return aggregateStatusCounts(verifyReportTests(report));
79
79
  }
80
80
  export {
81
+ verifyNodeTest,
81
82
  verifyReportCounts,
82
83
  verifyReportTests
83
84
  };
@@ -1 +1 @@
1
- {"version":3,"file":"verifyReportTests.js","sources":["../../../src/data/verification/verifyReportTests.ts"],"sourcesContent":["// Projects a captain VerifyReport onto the shared test-runner Test model, so\n// VerificationResults can render it with the same TestRunner every other\n// fixture/test surface uses. Ported from gavel's verificationAttempts.ts\n// (executionNodeTest / checklistTest), adapted to VerifyReport's node shape\n// (which already carries boolean status flags, unlike gavel's execution\n// snapshot which carried a single `state` string to translate).\n\nimport { aggregateStatusCounts, type StatusCounts, type Test, type TestSummary } from \"../test-runner\";\nimport type { VerifyChecklistItem, VerifyNode, VerifyReport, VerifySummary } from \"./verify-report\";\n\nconst ACCEPTANCE_CRITERIA_ID = \"acceptance-criteria\";\n\nfunction coerceDuration(duration: unknown): number | undefined {\n return typeof duration === \"number\" && Number.isFinite(duration) ? duration : undefined;\n}\n\n/**\n * Projects a `VerifySummary` onto the test-runner's `TestSummary` shape (see\n * `test-runner/types.ts`), so `sum()`/`aggregateStatusCounts` (test-runner\n * `status.ts`) read a summary-carrying node's counts directly instead of\n * recursing into (possibly elided) children.\n *\n * `Duration` is not carried by `VerifySummary`, so it is reported as 0.\n */\nfunction verifySummaryToTestSummary(summary: VerifySummary): TestSummary {\n return {\n Total: summary.total,\n Passed: summary.passed,\n Failed: summary.failed,\n Warned: summary.warned,\n Skipped: summary.skipped,\n Pending: summary.pending,\n Running: summary.running,\n Timedout: summary.timedout,\n Duration: 0,\n };\n}\n\n// Every field below is optional on both VerifyNode and Test, and the project\n// compiles with exactOptionalPropertyTypes — so an absent field must be an\n// absent key, not a key explicitly set to undefined. Each is assigned only\n// when present rather than copied through in one object literal.\nfunction verifyNodeTest(node: VerifyNode): Test {\n const test: Test = { name: node.name };\n if (node.framework !== undefined) test.framework = node.framework;\n if (node.task_id !== undefined) test.task_id = node.task_id;\n if (node.file !== undefined) test.file = node.file;\n if (node.line !== undefined) test.line = node.line;\n if (node.message !== undefined) test.message = node.message;\n if (node.command !== undefined) test.command = node.command;\n if (node.work_dir !== undefined) test.work_dir = node.work_dir;\n if (node.stdout !== undefined) test.stdout = node.stdout;\n if (node.stderr !== undefined) test.stderr = node.stderr;\n const duration = coerceDuration(node.duration);\n if (duration !== undefined) test.duration = duration;\n if (node.passed !== undefined) test.passed = node.passed;\n if (node.failed !== undefined) test.failed = node.failed;\n if (node.warned !== undefined) test.warned = node.warned;\n if (node.skipped !== undefined) test.skipped = node.skipped;\n if (node.pending !== undefined) test.pending = node.pending;\n if (node.running !== undefined) test.running = node.running;\n if (node.timed_out !== undefined) test.timed_out = node.timed_out;\n if (node.progress !== undefined) test.progress = node.progress;\n if (node.context !== undefined) test.context = node.context;\n if (node.detail !== undefined) test.detail = node.detail;\n // A node carrying its own `summary` (elided children) contributes that\n // summary directly and is never recursed into, even if `children` is also\n // present — parity with Go's `SummarizeNodes` and `summarizeVerifyNodes`.\n if (node.summary !== undefined) {\n test.summary = verifySummaryToTestSummary(node.summary);\n } else if (node.children !== undefined) {\n test.children = node.children.map(verifyNodeTest);\n }\n return test;\n}\n\nfunction checklistItemTest(item: VerifyChecklistItem, index: number): Test {\n const test: Test = {\n name: item.item || `Criterion ${index + 1}`,\n framework: \"checklist\",\n task_id: `${ACCEPTANCE_CRITERIA_ID}:${index}`,\n passed: item.passed === true,\n failed: item.passed === false,\n pending: item.passed !== true && item.passed !== false,\n detail: item,\n };\n if (item.message !== undefined) test.message = item.message;\n return test;\n}\n\n/**\n * Synthesizes the \"Acceptance criteria\" parent node gavel's checklistTest\n * ports. Deliberately carries no status flags of its own — `status.ts`'s\n * `testStatus` checks `pending` before `failed`, so a container explicitly\n * flagged both `failed` and `pending` (one item failed, another is still\n * unjudged) would render as queued instead of failed. Leaving the container\n * status-less lets the shared roll-up (`outcomeFor`/`statusToneFor`: failed\n * → warned → running → pending → passed, via `sum()` over the children) decide\n * instead.\n */\nfunction checklistTest(checklist: VerifyChecklistItem[]): Test | null {\n if (checklist.length === 0) return null;\n const children = checklist.map(checklistItemTest);\n return {\n name: \"Acceptance criteria\",\n framework: \"checklist\",\n task_id: ACCEPTANCE_CRITERIA_ID,\n children,\n };\n}\n\n/** Maps a VerifyReport onto the TestRunner's Test forest, appending a\n * synthesized \"Acceptance criteria\" node for the checklist when present. */\nexport function verifyReportTests(report: VerifyReport): Test[] {\n const tests = (report.tests ?? []).map(verifyNodeTest);\n const checklist = checklistTest(report.checklist ?? []);\n return checklist ? [...tests, checklist] : tests;\n}\n\n/**\n * Status roll-up across the *rendered* forest: `report.tests` plus the\n * synthesized checklist leaves. This is **not** `report.summary` — the\n * producer's tests-only tally (see `summarizeVerifyNodes` in ./verify-report)\n * — since it also counts checklist items, which never appear in `tests`.\n */\nexport function verifyReportCounts(report: VerifyReport): StatusCounts {\n return aggregateStatusCounts(verifyReportTests(report));\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verifyReportTests.js","sources":["../../../src/data/verification/verifyReportTests.ts"],"sourcesContent":["// Projects a captain VerifyReport onto the shared test-runner Test model, so\n// VerificationResults can render it with the same TestRunner every other\n// fixture/test surface uses. Ported from gavel's verificationAttempts.ts\n// (executionNodeTest / checklistTest), adapted to VerifyReport's node shape\n// (which already carries boolean status flags, unlike gavel's execution\n// snapshot which carried a single `state` string to translate).\n\nimport { aggregateStatusCounts, type StatusCounts, type Test, type TestSummary } from \"../test-runner\";\nimport type { VerifyChecklistItem, VerifyNode, VerifyReport, VerifySummary } from \"./verify-report\";\n\nconst ACCEPTANCE_CRITERIA_ID = \"acceptance-criteria\";\n\nfunction coerceDuration(duration: unknown): number | undefined {\n return typeof duration === \"number\" && Number.isFinite(duration) ? duration : undefined;\n}\n\n/**\n * Projects a `VerifySummary` onto the test-runner's `TestSummary` shape (see\n * `test-runner/types.ts`), so `sum()`/`aggregateStatusCounts` (test-runner\n * `status.ts`) read a summary-carrying node's counts directly instead of\n * recursing into (possibly elided) children.\n *\n * `Duration` is not carried by `VerifySummary`, so it is reported as 0.\n */\nfunction verifySummaryToTestSummary(summary: VerifySummary): TestSummary {\n return {\n Total: summary.total,\n Passed: summary.passed,\n Failed: summary.failed,\n Warned: summary.warned,\n Skipped: summary.skipped,\n Pending: summary.pending,\n Running: summary.running,\n Timedout: summary.timedout,\n Duration: 0,\n };\n}\n\n// Every field below is optional on both VerifyNode and Test, and the project\n// compiles with exactOptionalPropertyTypes — so an absent field must be an\n// absent key, not a key explicitly set to undefined. Each is assigned only\n// when present rather than copied through in one object literal.\nexport function verifyNodeTest(node: VerifyNode): Test {\n const test: Test = { name: node.name };\n if (node.framework !== undefined) test.framework = node.framework;\n if (node.task_id !== undefined) test.task_id = node.task_id;\n if (node.file !== undefined) test.file = node.file;\n if (node.line !== undefined) test.line = node.line;\n if (node.message !== undefined) test.message = node.message;\n if (node.command !== undefined) test.command = node.command;\n if (node.work_dir !== undefined) test.work_dir = node.work_dir;\n if (node.stdout !== undefined) test.stdout = node.stdout;\n if (node.stderr !== undefined) test.stderr = node.stderr;\n const duration = coerceDuration(node.duration);\n if (duration !== undefined) test.duration = duration;\n if (node.passed !== undefined) test.passed = node.passed;\n if (node.failed !== undefined) test.failed = node.failed;\n if (node.warned !== undefined) test.warned = node.warned;\n if (node.skipped !== undefined) test.skipped = node.skipped;\n if (node.pending !== undefined) test.pending = node.pending;\n if (node.running !== undefined) test.running = node.running;\n if (node.timed_out !== undefined) test.timed_out = node.timed_out;\n if (node.progress !== undefined) test.progress = node.progress;\n if (node.context !== undefined) test.context = node.context;\n if (node.detail !== undefined) test.detail = node.detail;\n // A node carrying its own `summary` (elided children) contributes that\n // summary directly and is never recursed into, even if `children` is also\n // present — parity with Go's `SummarizeNodes` and `summarizeVerifyNodes`.\n if (node.summary !== undefined) {\n test.summary = verifySummaryToTestSummary(node.summary);\n } else if (node.children !== undefined) {\n test.children = node.children.map(verifyNodeTest);\n }\n return test;\n}\n\nfunction checklistItemTest(item: VerifyChecklistItem, index: number): Test {\n const test: Test = {\n name: item.item || `Criterion ${index + 1}`,\n framework: \"checklist\",\n task_id: `${ACCEPTANCE_CRITERIA_ID}:${index}`,\n passed: item.passed === true,\n failed: item.passed === false,\n pending: item.passed !== true && item.passed !== false,\n detail: item,\n };\n if (item.message !== undefined) test.message = item.message;\n return test;\n}\n\n/**\n * Synthesizes the \"Acceptance criteria\" parent node gavel's checklistTest\n * ports. Deliberately carries no status flags of its own — `status.ts`'s\n * `testStatus` checks `pending` before `failed`, so a container explicitly\n * flagged both `failed` and `pending` (one item failed, another is still\n * unjudged) would render as queued instead of failed. Leaving the container\n * status-less lets the shared roll-up (`outcomeFor`/`statusToneFor`: failed\n * → warned → running → pending → passed, via `sum()` over the children) decide\n * instead.\n */\nfunction checklistTest(checklist: VerifyChecklistItem[]): Test | null {\n if (checklist.length === 0) return null;\n const children = checklist.map(checklistItemTest);\n return {\n name: \"Acceptance criteria\",\n framework: \"checklist\",\n task_id: ACCEPTANCE_CRITERIA_ID,\n children,\n };\n}\n\n/** Maps a VerifyReport onto the TestRunner's Test forest, appending a\n * synthesized \"Acceptance criteria\" node for the checklist when present. */\nexport function verifyReportTests(report: VerifyReport): Test[] {\n const tests = (report.tests ?? []).map(verifyNodeTest);\n const checklist = checklistTest(report.checklist ?? []);\n return checklist ? [...tests, checklist] : tests;\n}\n\n/**\n * Status roll-up across the *rendered* forest: `report.tests` plus the\n * synthesized checklist leaves. This is **not** `report.summary` — the\n * producer's tests-only tally (see `summarizeVerifyNodes` in ./verify-report)\n * — since it also counts checklist items, which never appear in `tests`.\n */\nexport function verifyReportCounts(report: VerifyReport): StatusCounts {\n return aggregateStatusCounts(verifyReportTests(report));\n}\n"],"names":[],"mappings":"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"}
@@ -15,9 +15,9 @@ function detectMode() {
15
15
  }
16
16
  function getVersionInfo() {
17
17
  return {
18
- commit: read(() => "9d48b408", ""),
19
- tag: read(() => "clicky-ui@0.3.46", ""),
20
- date: read(() => "2026-10-14T08:16:20.626Z", ""),
18
+ commit: read(() => "f9879aa9", ""),
19
+ tag: read(() => "clicky-ui@0.3.47", ""),
20
+ date: read(() => "2026-10-15T09:20:40.620Z", ""),
21
21
  dirty: read(() => true, false),
22
22
  mode: detectMode()
23
23
  };
@@ -13,9 +13,9 @@ function detectMode() {
13
13
  }
14
14
  function getVersionInfo() {
15
15
  return {
16
- commit: read(() => "9d48b408", ""),
17
- tag: read(() => "clicky-ui@0.3.46", ""),
18
- date: read(() => "2026-10-14T08:15:51.549Z", ""),
16
+ commit: read(() => "f9879aa9", ""),
17
+ tag: read(() => "clicky-ui@0.3.47", ""),
18
+ date: read(() => "2026-10-15T09:19:57.913Z", ""),
19
19
  dirty: read(() => true, false),
20
20
  mode: detectMode()
21
21
  };
package/dist/data.cjs CHANGED
@@ -8,6 +8,7 @@ const Badge = require("./data/Badge.cjs");
8
8
  const CodeBlock = require("./data/CodeBlock.cjs");
9
9
  const CodeDiff = require("./data/CodeDiff.cjs");
10
10
  const CodeLine = require("./data/CodeLine.cjs");
11
+ const SymbolBadge = require("./data/SymbolBadge.cjs");
11
12
  const codeDiff = require("./data/code-diff.cjs");
12
13
  const dataTableUtils = require("./data/data-table-utils.cjs");
13
14
  const dataTableFilterValues = require("./data/data-table-filter-values.cjs");
@@ -135,6 +136,7 @@ const MarkIcons = require("./data/test-runner/MarkIcons.cjs");
135
136
  const QueryBrowser = require("./data/query-browser/QueryBrowser.cjs");
136
137
  const QueryBrowser_types = require("./data/query-browser/QueryBrowser.types.cjs");
137
138
  const status = require("./data/test-runner/status.cjs");
139
+ const stepKindViews = require("./data/verification/stepKindViews.cjs");
138
140
  const TestFailureDetail = require("./data/test-runner/TestFailureDetail.cjs");
139
141
  const TestDetailPanel = require("./data/test-runner/TestDetailPanel.cjs");
140
142
  const TestFilterBar = require("./data/test-runner/TestFilterBar.cjs");
@@ -732,6 +734,7 @@ const copy = require("./data/test-runner/copy.cjs");
732
734
  const api = require("./data/cache-browser/api.cjs");
733
735
  const changeIconAliases = require("./icons/changeIconAliases.cjs");
734
736
  const registry = require("./icons/registry.cjs");
737
+ const stepKind = require("./data/verification/stepKind.cjs");
735
738
  const fixtureBlocks = require("./data/FixtureEditor/fixture-blocks.cjs");
736
739
  const filterState = require("./data/test-runner/filterState.cjs");
737
740
  const verifyReport = require("./data/verification/verify-report.cjs");
@@ -750,6 +753,7 @@ exports.Badge = Badge.Badge;
750
753
  exports.CodeBlock = CodeBlock.CodeBlock;
751
754
  exports.CodeDiff = CodeDiff.CodeDiff;
752
755
  exports.CodeLine = CodeLine.CodeLine;
756
+ exports.SymbolBadge = SymbolBadge.SymbolBadge;
753
757
  exports.computeLineDiff = codeDiff.computeLineDiff;
754
758
  exports.parseUnifiedDiff = codeDiff.parseUnifiedDiff;
755
759
  exports.inferColumns = dataTableUtils.inferColumns;
@@ -1000,6 +1004,7 @@ exports.GitFileList = GitChangeList.GitFileList;
1000
1004
  exports.LINT_SEVERITIES = marks.LINT_SEVERITIES;
1001
1005
  exports.TEST_OUTCOMES = marks.TEST_OUTCOMES;
1002
1006
  exports.TEST_TOOLS = marks.TEST_TOOLS;
1007
+ exports.toolKeyFor = marks.toolKeyFor;
1003
1008
  exports.toolMark = marks.toolMark;
1004
1009
  exports.LintSeverityIcon = MarkIcons.LintSeverityIcon;
1005
1010
  exports.OutcomeIcon = MarkIcons.OutcomeIcon;
@@ -1022,6 +1027,9 @@ exports.sum = status.sum;
1022
1027
  exports.sumNonTaskTests = status.sumNonTaskTests;
1023
1028
  exports.testStatus = status.testStatus;
1024
1029
  exports.totalDuration = status.totalDuration;
1030
+ exports.StepKindSections = stepKindViews.StepKindSections;
1031
+ exports.StepOutputs = stepKindViews.StepOutputs;
1032
+ exports.StepWait = stepKindViews.StepWait;
1025
1033
  exports.TestAttempts = TestFailureDetail.TestAttempts;
1026
1034
  exports.TestFailureDetail = TestFailureDetail.TestFailureDetail;
1027
1035
  exports.TestOutput = TestFailureDetail.TestOutput;
@@ -2126,6 +2134,11 @@ exports.changeIconAliases = changeIconAliases.changeIconAliases;
2126
2134
  exports.getChangeIcon = changeIconAliases.getChangeIcon;
2127
2135
  exports.clickyIconProvider = registry.clickyIconProvider;
2128
2136
  exports.iconsByConsumerName = registry.iconsByConsumerName;
2137
+ exports.clockTime = stepKind.clockTime;
2138
+ exports.formatDelay = stepKind.formatDelay;
2139
+ exports.formatExportValue = stepKind.formatExportValue;
2140
+ exports.policySummary = stepKind.policySummary;
2141
+ exports.readStepDetail = stepKind.readStepDetail;
2129
2142
  exports.createChecklistMarkdown = fixtureBlocks.createChecklistMarkdown;
2130
2143
  exports.createFenceMarkdown = fixtureBlocks.createFenceMarkdown;
2131
2144
  exports.fixtureFenceKind = fixtureBlocks.fixtureFenceKind;
@@ -2150,6 +2163,7 @@ exports.programmingIconCatalog = programmingCatalog.programmingIconCatalog;
2150
2163
  exports.routeEdges = graphEdgeRouting.routeEdges;
2151
2164
  exports.useClickyExport = useClickyExport.useClickyExport;
2152
2165
  exports.verificationAdapters = adapters.verificationAdapters;
2166
+ exports.verifyNodeTest = verifyReportTests.verifyNodeTest;
2153
2167
  exports.verifyReportCounts = verifyReportTests.verifyReportCounts;
2154
2168
  exports.verifyReportTests = verifyReportTests.verifyReportTests;
2155
2169
  //# sourceMappingURL=data.cjs.map
package/dist/data.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"data.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"data.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/data.d.ts CHANGED
@@ -6,6 +6,7 @@ export { Badge, type BadgeProps, type BadgeShape, type BadgeSize, type BadgeStat
6
6
  export { CodeBlock, type CodeBlockProps } from './data/CodeBlock.js';
7
7
  export { CodeDiff, type CodeDiffProps, type CodeDiffView, type DiffLineTarget, type DiffLineWidget, type DiffSide, } from './data/CodeDiff.js';
8
8
  export { CodeLine, type CodeLineProps } from './data/CodeLine.js';
9
+ export { SymbolBadge, type SymbolBadgeProps, type SymbolBadgeStyle } from './data/SymbolBadge.js';
9
10
  export { computeLineDiff, parseUnifiedDiff, type DiffHunk, type DiffLine, type DiffLineType, } from './data/code-diff.js';
10
11
  export { inferColumns } from './data/data-table-utils.js';
11
12
  export { parseBoundsValue, parseDurationBoundsValue, parseMultiFilterValue, serializeBoundsValue, serializeDurationBoundsValue, serializeMultiFilterValue, splitCommaValues, updateFilterSelection, type DataTableFilterSelection, type FilterDefaultOperator, } from './data/data-table-filter-values.js';