@nwire/cli 0.7.0 → 0.8.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 (84) hide show
  1. package/README.md +58 -30
  2. package/dist/__tests__/bench.test.d.ts +2 -0
  3. package/dist/__tests__/bench.test.d.ts.map +1 -0
  4. package/dist/__tests__/bench.test.js +94 -0
  5. package/dist/__tests__/bench.test.js.map +1 -0
  6. package/dist/__tests__/replay.test.d.ts +2 -0
  7. package/dist/__tests__/replay.test.d.ts.map +1 -0
  8. package/dist/__tests__/replay.test.js +202 -0
  9. package/dist/__tests__/replay.test.js.map +1 -0
  10. package/dist/__tests__/trace.test.d.ts +2 -0
  11. package/dist/__tests__/trace.test.d.ts.map +1 -0
  12. package/dist/__tests__/trace.test.js +136 -0
  13. package/dist/__tests__/trace.test.js.map +1 -0
  14. package/dist/__tests__/watch.test.d.ts +2 -0
  15. package/dist/__tests__/watch.test.d.ts.map +1 -0
  16. package/dist/__tests__/watch.test.js +109 -0
  17. package/dist/__tests__/watch.test.js.map +1 -0
  18. package/dist/cache-runner.js +62 -14
  19. package/dist/cache-runner.js.map +1 -1
  20. package/dist/cli.js +8 -0
  21. package/dist/cli.js.map +1 -1
  22. package/dist/commands/bench.d.ts +103 -0
  23. package/dist/commands/bench.d.ts.map +1 -0
  24. package/dist/commands/bench.js +203 -0
  25. package/dist/commands/bench.js.map +1 -0
  26. package/dist/commands/dev.d.ts.map +1 -1
  27. package/dist/commands/dev.js +31 -20
  28. package/dist/commands/dev.js.map +1 -1
  29. package/dist/commands/doctor.d.ts.map +1 -1
  30. package/dist/commands/doctor.js +29 -5
  31. package/dist/commands/doctor.js.map +1 -1
  32. package/dist/commands/infra.d.ts.map +1 -1
  33. package/dist/commands/infra.js +7 -0
  34. package/dist/commands/infra.js.map +1 -1
  35. package/dist/commands/logs.d.ts.map +1 -1
  36. package/dist/commands/logs.js +64 -11
  37. package/dist/commands/logs.js.map +1 -1
  38. package/dist/commands/replay.d.ts +45 -0
  39. package/dist/commands/replay.d.ts.map +1 -0
  40. package/dist/commands/replay.js +159 -0
  41. package/dist/commands/replay.js.map +1 -0
  42. package/dist/commands/run.d.ts.map +1 -1
  43. package/dist/commands/run.js +14 -4
  44. package/dist/commands/run.js.map +1 -1
  45. package/dist/commands/studio.d.ts.map +1 -1
  46. package/dist/commands/studio.js +7 -1
  47. package/dist/commands/studio.js.map +1 -1
  48. package/dist/commands/test.d.ts.map +1 -1
  49. package/dist/commands/test.js +3 -0
  50. package/dist/commands/test.js.map +1 -1
  51. package/dist/commands/trace.d.ts +40 -0
  52. package/dist/commands/trace.d.ts.map +1 -0
  53. package/dist/commands/trace.js +195 -0
  54. package/dist/commands/trace.js.map +1 -0
  55. package/dist/commands/watch.d.ts +33 -0
  56. package/dist/commands/watch.d.ts.map +1 -0
  57. package/dist/commands/watch.js +152 -0
  58. package/dist/commands/watch.js.map +1 -0
  59. package/dist/lib/dev-entry.d.ts +39 -0
  60. package/dist/lib/dev-entry.d.ts.map +1 -0
  61. package/dist/lib/dev-entry.js +102 -0
  62. package/dist/lib/dev-entry.js.map +1 -0
  63. package/dist/lib/exec.d.ts +7 -0
  64. package/dist/lib/exec.d.ts.map +1 -1
  65. package/dist/lib/exec.js +19 -1
  66. package/dist/lib/exec.js.map +1 -1
  67. package/dist/lib/run-task.d.ts.map +1 -1
  68. package/dist/lib/run-task.js +6 -1
  69. package/dist/lib/run-task.js.map +1 -1
  70. package/dist/lib/sse.d.ts +24 -0
  71. package/dist/lib/sse.d.ts.map +1 -0
  72. package/dist/lib/sse.js +63 -0
  73. package/dist/lib/sse.js.map +1 -0
  74. package/dist/lib/wire-discovery.d.ts +9 -0
  75. package/dist/lib/wire-discovery.d.ts.map +1 -0
  76. package/dist/lib/wire-discovery.js +82 -0
  77. package/dist/lib/wire-discovery.js.map +1 -0
  78. package/dist/load-config.d.ts +3 -3
  79. package/dist/load-config.d.ts.map +1 -1
  80. package/dist/load-config.js +15 -3
  81. package/dist/load-config.js.map +1 -1
  82. package/dist/ls-runner.js +2 -2
  83. package/dist/ls-runner.js.map +1 -1
  84. package/package.json +8 -4
@@ -0,0 +1,159 @@
1
+ /**
2
+ * `nwire replay <recording.json> [--hook <name>]`
3
+ *
4
+ * Replays a previously recorded hook run against the running wire and
5
+ * renders the drift report. The wire-side endpoint contract is:
6
+ *
7
+ * POST /_nwire/hooks/replay body: { recording, hook? }
8
+ * → 200 { matches, drift[], recorded, replayed: { stepCount, outcome } }
9
+ *
10
+ * Wire endpoint gap (as of today): no nwire-http route handler is mounted
11
+ * for `/_nwire/hooks/replay`. When that endpoint is missing we fall back
12
+ * to an *offline* diff — comparing the recording's own `steps[]` against
13
+ * its `ctxIn → ctxOut` snapshot. This is one-sided (it can't show drift,
14
+ * only re-render what was captured) but it keeps the command useful while
15
+ * the wire side catches up.
16
+ */
17
+ import { readFileSync } from "node:fs";
18
+ import { resolve } from "node:path";
19
+ import { defineCommand } from "citty";
20
+ import { palette } from "../lib/colors.js";
21
+ import { findWireUrl } from "../lib/wire-discovery.js";
22
+ // ─── Loader ─────────────────────────────────────────────────────────
23
+ export function loadRecording(path) {
24
+ const abs = resolve(process.cwd(), path);
25
+ const raw = readFileSync(abs, "utf8");
26
+ const parsed = JSON.parse(raw);
27
+ if (!parsed ||
28
+ typeof parsed !== "object" ||
29
+ typeof parsed.hookName !== "string" ||
30
+ !Array.isArray(parsed.steps)) {
31
+ throw new Error(`not a Recording: ${abs} (missing hookName / steps[])`);
32
+ }
33
+ return parsed;
34
+ }
35
+ // ─── Renderers (exported for testing) ───────────────────────────────
36
+ export function renderReplayResult(res) {
37
+ const lines = [];
38
+ const header = res.matches
39
+ ? palette.ok(`✓ replay matches (${res.recorded.steps.length} steps)`)
40
+ : palette.warn(`! replay drift — ${res.drift.length} issue(s)`);
41
+ lines.push(header);
42
+ if (res.drift.length > 0) {
43
+ lines.push("");
44
+ lines.push(palette.bold("Drift:"));
45
+ for (const d of res.drift) {
46
+ lines.push(` ${palette.warn("•")} ${d}`);
47
+ }
48
+ }
49
+ lines.push("");
50
+ lines.push(palette.bold("Steps (recorded → replayed):"));
51
+ const lim = Math.max(res.recorded.steps.length, res.replayed.stepCount);
52
+ for (let i = 0; i < lim; i++) {
53
+ const r = res.recorded.steps[i];
54
+ const present = i < res.replayed.stepCount;
55
+ const rec = r ? `${r.stepKind}/${r.stepName ?? ""}/${r.phase}` : palette.dim("(none)");
56
+ const rep = present ? rec : palette.warn("(missing)");
57
+ lines.push(` ${String(i).padStart(3, " ")} ${rec.padEnd(40, " ")} ${palette.dim("→")} ${rep}`);
58
+ }
59
+ lines.push("");
60
+ lines.push(palette.dim(`recorded outcome=${res.recorded.outcome} replayed outcome=${res.replayed.outcome}`));
61
+ return lines.join("\n");
62
+ }
63
+ /**
64
+ * Render an offline-only step trace from the recording. No drift can be
65
+ * shown — we only have one side of the comparison — but the user still
66
+ * sees what *was* captured plus a one-line hint pointing them at the
67
+ * online surface for the real diff.
68
+ */
69
+ export function renderOfflineDiff(recording) {
70
+ const lines = [];
71
+ lines.push(palette.warn("wire does not expose /_nwire/hooks/replay yet — replay is currently offline-only"));
72
+ lines.push(palette.dim("hint: diff is one-sided. Read recording.ctxIn → recording.ctxOut and replay the steps locally."));
73
+ lines.push("");
74
+ lines.push(palette.bold(`Recorded steps (${recording.steps.length}) — hook=${recording.hookName}:`));
75
+ recording.steps.forEach((s, i) => {
76
+ const dur = s.durationMs !== undefined ? ` ${palette.dim(`${s.durationMs.toFixed(1)}ms`)}` : "";
77
+ lines.push(` ${String(i).padStart(3, " ")} ${s.stepKind}/${s.stepName ?? ""}/${s.phase}${dur}`);
78
+ });
79
+ lines.push("");
80
+ lines.push(palette.dim(`outcome=${recording.outcome} capturedAt=${recording.capturedAt}`));
81
+ return lines.join("\n");
82
+ }
83
+ /**
84
+ * POST the recording at the wire. Resolves to the parsed wire response
85
+ * when the endpoint is mounted, or to `null` when the wire returns 404 /
86
+ * 501 (endpoint missing). Throws on any other transport failure.
87
+ */
88
+ export async function postReplay(opts) {
89
+ const res = await fetch(`${opts.url}/_nwire/hooks/replay`, {
90
+ method: "POST",
91
+ headers: { "content-type": "application/json" },
92
+ body: JSON.stringify({ recording: opts.recording, hook: opts.hook }),
93
+ signal: opts.signal,
94
+ });
95
+ if (res.status === 404 || res.status === 501) {
96
+ // drain body so the socket can be reused
97
+ await res.text().catch(() => "");
98
+ return null;
99
+ }
100
+ if (!res.ok) {
101
+ const body = await res.text().catch(() => "");
102
+ throw new Error(`wire returned ${res.status} ${res.statusText}${body ? `: ${body}` : ""}`);
103
+ }
104
+ return (await res.json());
105
+ }
106
+ // ─── Command ────────────────────────────────────────────────────────
107
+ export const replayCommand = defineCommand({
108
+ meta: {
109
+ name: "replay",
110
+ description: "Replay a recorded hook run against the live wire (or print an offline trace)",
111
+ },
112
+ args: {
113
+ file: {
114
+ type: "positional",
115
+ description: "Path to the recording JSON file",
116
+ required: true,
117
+ },
118
+ hook: {
119
+ type: "string",
120
+ description: "Override hook name (defaults to the recording's hookName)",
121
+ required: false,
122
+ },
123
+ },
124
+ async run({ args }) {
125
+ const file = String(args.file);
126
+ let recording;
127
+ try {
128
+ recording = loadRecording(file);
129
+ }
130
+ catch (err) {
131
+ console.error(palette.err("nwire replay:") +
132
+ ` could not load recording — ${err instanceof Error ? err.message : String(err)}`);
133
+ process.exit(1);
134
+ }
135
+ const hook = typeof args.hook === "string" ? args.hook : undefined;
136
+ const url = await findWireUrl();
137
+ if (!url) {
138
+ console.log(palette.dim("# no running wire found (set NWIRE_INSPECT_URL or run `nwire dev`) — offline trace only"));
139
+ console.log(renderOfflineDiff(recording));
140
+ process.exit(0);
141
+ }
142
+ console.log(palette.dim(`# replaying against ${url}/_nwire/hooks/replay`));
143
+ try {
144
+ const result = await postReplay({ url, recording, hook });
145
+ if (result === null) {
146
+ console.log(renderOfflineDiff(recording));
147
+ process.exit(0);
148
+ }
149
+ console.log(renderReplayResult(result));
150
+ process.exit(result.matches ? 0 : 1);
151
+ }
152
+ catch (err) {
153
+ console.error(palette.err("nwire replay:") +
154
+ ` ${err instanceof Error ? err.message : String(err)}`);
155
+ process.exit(1);
156
+ }
157
+ },
158
+ });
159
+ //# sourceMappingURL=replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/commands/replay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAItC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAcpD,uEAAuE;AAEvE,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;IAC5C,IACE,CAAC,MAAM;QACP,OAAO,MAAM,KAAK,QAAQ;QAC1B,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;QACnC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,+BAA+B,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,uEAAuE;AAEvE,MAAM,UAAU,kBAAkB,CAAC,GAAuB;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO;QACxB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,qBAAqB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;QACrE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,GAAG,CAAC,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC;IAClE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEnB,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACxE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC3C,MAAM,GAAG,GAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3F,MAAM,GAAG,GAAO,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACrG,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CACR,OAAO,CAAC,GAAG,CACT,oBAAoB,GAAG,CAAC,QAAQ,CAAC,OAAO,sBAAsB,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CACrF,CACF,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAoB;IACpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CACR,OAAO,CAAC,IAAI,CACV,kFAAkF,CACnF,CACF,CAAC;IACF,KAAK,CAAC,IAAI,CACR,OAAO,CAAC,GAAG,CACT,gGAAgG,CACjG,CACF,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,SAAS,CAAC,KAAK,CAAC,MAAM,YAAY,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IACrG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAkB,EAAE,CAAS,EAAE,EAAE;QACxD,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChG,KAAK,CAAC,IAAI,CACR,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,GAAG,EAAE,CACtF,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,SAAS,CAAC,OAAO,gBAAgB,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC5F,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAWD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAoB;IACnD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,sBAAsB,EAAE;QACzD,MAAM,EAAG,MAAM;QACf,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAK,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACvE,MAAM,EAAG,IAAI,CAAC,MAAM;KACrB,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC7C,yCAAyC;QACzC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuB,CAAC;AAClD,CAAC;AAED,uEAAuE;AAEvE,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE;QACJ,IAAI,EAAS,QAAQ;QACrB,WAAW,EAAE,8EAA8E;KAC5F;IACD,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,IAAI,EAAS,YAAY;YACzB,WAAW,EAAE,iCAAiC;YAC9C,QAAQ,EAAK,IAAI;SAClB;QACD,IAAI,EAAE;YACJ,IAAI,EAAS,QAAQ;YACrB,WAAW,EAAE,2DAA2D;YACxE,QAAQ,EAAK,KAAK;SACnB;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/B,IAAI,SAAoB,CAAC;QACzB,IAAI,CAAC;YACH,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;gBAC1B,+BAA+B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACpF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QACnE,MAAM,GAAG,GAAI,MAAM,WAAW,EAAE,CAAC;QAEjC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CACT,OAAO,CAAC,GAAG,CACT,yFAAyF,CAC1F,CACF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,sBAAsB,CAAC,CAAC,CAAC;QAE3E,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;gBAC1B,IAAI,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACzD,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,eAAO,MAAM,UAAU;;;;;;EAmGrB,CAAC"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAYH,eAAO,MAAM,UAAU;;;;;;EAyGrB,CAAC"}
@@ -10,10 +10,12 @@
10
10
  * difference is `dev` adds `--watch` and reloads on change.
11
11
  */
12
12
  import { defineCommand } from "citty";
13
- import { resolve } from "node:path";
13
+ import { basename, relative, resolve } from "node:path";
14
14
  import { existsSync } from "node:fs";
15
15
  import { spawn } from "node:child_process";
16
16
  import { palette } from "../lib/colors.js";
17
+ /** Windows toggle — `shell:true` so `.cmd` shims like `pnpm` resolve. */
18
+ const IS_WIN = process.platform === "win32";
17
19
  export const runCommand = defineCommand({
18
20
  meta: {
19
21
  name: "run",
@@ -47,11 +49,11 @@ export const runCommand = defineCommand({
47
49
  // eslint-disable-next-line no-console
48
50
  console.error(palette.err("nwire run:") +
49
51
  ` no entry file in ${appDir} for wire "${args.wire}" (looked for ${candidates
50
- .map((p) => p.split("/").pop())
52
+ .map((p) => basename(p))
51
53
  .join(", ")})`);
52
54
  process.exit(1);
53
55
  }
54
- const entryRel = entry.replace(cwd + "/", "");
56
+ const entryRel = relative(cwd, entry);
55
57
  const passthrough = rawArgs.slice(rawArgs.indexOf(String(args.wire)) + 1);
56
58
  // ── Banner ──────────────────────────────────────────────────────
57
59
  // eslint-disable-next-line no-console
@@ -69,6 +71,7 @@ export const runCommand = defineCommand({
69
71
  const child = spawn("pnpm", ["exec", "vite-node", entry, ...passthrough], {
70
72
  stdio: "inherit",
71
73
  cwd,
74
+ shell: IS_WIN,
72
75
  });
73
76
  let stopping = false;
74
77
  const stop = (signal) => {
@@ -84,7 +87,14 @@ export const runCommand = defineCommand({
84
87
  setTimeout(() => {
85
88
  if (child.exitCode === null && child.signalCode === null) {
86
89
  try {
87
- child.kill("SIGKILL");
90
+ // Windows has no signal mechanism — both SIGTERM and SIGKILL
91
+ // collapse to TerminateProcess. Pass no signal so Node uses
92
+ // the platform default; on POSIX this is still SIGKILL via
93
+ // the explicit branch.
94
+ if (IS_WIN)
95
+ child.kill();
96
+ else
97
+ child.kill("SIGKILL");
88
98
  }
89
99
  catch {
90
100
  // gone
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"studio.d.ts","sourceRoot":"","sources":["../../src/commands/studio.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,eAAO,MAAM,aAAa,qDAkCxB,CAAC"}
1
+ {"version":3,"file":"studio.d.ts","sourceRoot":"","sources":["../../src/commands/studio.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,eAAO,MAAM,aAAa,qDAyCxB,CAAC"}
@@ -28,7 +28,13 @@ export const studioCommand = defineCommand({
28
28
  " @nwire/studio not installed. `pnpm add -D @nwire/studio` first.");
29
29
  process.exit(1);
30
30
  }
31
- const viteBin = resolve(studioDir, "node_modules", ".bin", "vite");
31
+ const posixBin = resolve(studioDir, "node_modules", ".bin", "vite");
32
+ // Windows: pnpm creates both the POSIX shim AND a `vite.cmd` next to
33
+ // it. spawn() with shell:false needs the `.cmd` path; with shell:true
34
+ // (which spawnInteractive sets on Win) either works. Prefer the
35
+ // explicit `.cmd` when present so errors point at the real shim.
36
+ const winBin = `${posixBin}.cmd`;
37
+ const viteBin = process.platform === "win32" && existsSync(winBin) ? winBin : posixBin;
32
38
  if (!existsSync(viteBin)) {
33
39
  // eslint-disable-next-line no-console
34
40
  console.error(palette.err("nwire studio:") +
@@ -1 +1 @@
1
- {"version":3,"file":"studio.js","sourceRoot":"","sources":["../../src/commands/studio.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,mCAAmC;KACjD;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE;QACnB,IAAI,SAAiB,CAAC;QACtB,IAAI,CAAC;YACH,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;YACtC,OAAO,CAAC,KAAK,CACX,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;gBAC1B,kEAAkE,CACrE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACnE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,sCAAsC;YACtC,OAAO,CAAC,KAAK,CACX,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;gBAC1B,2BAA2B,OAAO,8BAA8B,SAAS,EAAE,CAC9E,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE;YAClD,GAAG,EAAE,SAAS;YACd,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE;YACjC,cAAc,EAAE,iBAAiB;SAClC,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAC3B,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"studio.js","sourceRoot":"","sources":["../../src/commands/studio.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,mCAAmC;KACjD;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE;QACnB,IAAI,SAAiB,CAAC;QACtB,IAAI,CAAC;YACH,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;YACtC,OAAO,CAAC,KAAK,CACX,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;gBAC1B,kEAAkE,CACrE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACpE,qEAAqE;QACrE,sEAAsE;QACtE,gEAAgE;QAChE,iEAAiE;QACjE,MAAM,MAAM,GAAG,GAAG,QAAQ,MAAM,CAAC;QACjC,MAAM,OAAO,GACX,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QACzE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,sCAAsC;YACtC,OAAO,CAAC,KAAK,CACX,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;gBAC1B,2BAA2B,OAAO,8BAA8B,SAAS,EAAE,CAC9E,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE;YAClD,GAAG,EAAE,SAAS;YACd,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE;YACjC,cAAc,EAAE,iBAAiB;SAClC,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAC3B,CAAC;CACF,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAmEH,eAAO,MAAM,WAAW;;;;;;;;;;;EAyEtB,CAAC"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAsEH,eAAO,MAAM,WAAW;;;;;;;;;;;EA0EtB,CAAC"}
@@ -16,6 +16,8 @@ import { existsSync, readdirSync, statSync } from "node:fs";
16
16
  import { resolve, join, relative } from "node:path";
17
17
  import { palette } from "../lib/colors.js";
18
18
  import { runTaskList } from "../lib/run-task.js";
19
+ /** Windows toggle — `shell:true` so `pnpm.cmd` resolves on spawn. */
20
+ const IS_WIN = process.platform === "win32";
19
21
  const LAYERS = ["units", "integration", "e2e", "bdd"];
20
22
  /** Walk `cwd` looking for `__tests__/<layer>/` dirs that contain test files. */
21
23
  function findLayerDirs(cwd, layer, prune) {
@@ -132,6 +134,7 @@ export const testCommand = defineCommand({
132
134
  const result = spawnSync(t.command, t.args, {
133
135
  stdio: "inherit",
134
136
  cwd: t.cwd,
137
+ shell: IS_WIN,
135
138
  });
136
139
  process.exit(result.status ?? 0);
137
140
  }
@@ -1 +1 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,WAAW,EAAoB,MAAM,iBAAiB,CAAC;AAEhE,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AAG/D,gFAAgF;AAChF,SAAS,aAAa,CAAC,GAAW,EAAE,KAAY,EAAE,KAA0B;IAC1E,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,SAAS,IAAI,CAAC,GAAW;QACvB,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC;YACT,IAAI,CAAC;gBACH,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBAAE,SAAS;YAClC,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;gBAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACpC,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;oBAC/D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACvB,CAAC;gBACD,SAAS,CAAC,+BAA+B;YAC3C,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+EAA+E;AAC/E,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,IAAI,aAAa,CAAC,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAC;YACvC,CAAC;iBAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5C,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAEhF,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;IACvC,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,kDAAkD;KAChE;IACD,IAAI,EAAE;QACJ,KAAK,EAAE;YACL,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,oEAAoE;SAClF;QACD,KAAK,EAAE;YACL,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,oCAAoC;YACjD,OAAO,EAAE,KAAK;SACf;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAqB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAExF,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAc,CAAC,EAAE,CAAC;YACxD,sCAAsC;YACtC,OAAO,CAAC,KAAK,CACX,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,mBAAmB,IAAI,CAAC,KAAK,cAAc,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5F,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAAkB,EAAE,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACpE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC;YAC9E,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,EAAE,GAAG,KAAK,KAAK,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE;gBACxF,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC;gBACvC,GAAG;aACJ,CAAC,CAAC;QACL,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,sCAAsC;YACtC,OAAO,CAAC,GAAG,CACT,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,KAAK;gBACR,CAAC,CAAC,yCAAyC,IAAI,CAAC,KAAK,IAAI;gBACzD,CAAC,CAAC,0FAA0F,CAC/F,CACF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,qEAAqE;QACrE,+DAA+D;QAC/D,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACpB,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACjD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAgB,EAAE;gBACtD,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,CAAC,CAAC,GAAG;aACX,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QACnC,CAAC;QAED,gEAAgE;QAChE,OAAO,CAAC,GAAG,CAAC,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,WAAW,EAAoB,MAAM,iBAAiB,CAAC;AAEhE,qEAAqE;AACrE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AAE5C,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AAG/D,gFAAgF;AAChF,SAAS,aAAa,CAAC,GAAW,EAAE,KAAY,EAAE,KAA0B;IAC1E,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,SAAS,IAAI,CAAC,GAAW;QACvB,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC;YACT,IAAI,CAAC;gBACH,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBAAE,SAAS;YAClC,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;gBAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACpC,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;oBAC/D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACvB,CAAC;gBACD,SAAS,CAAC,+BAA+B;YAC3C,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+EAA+E;AAC/E,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,IAAI,aAAa,CAAC,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAC;YACvC,CAAC;iBAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5C,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAEhF,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;IACvC,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,kDAAkD;KAChE;IACD,IAAI,EAAE;QACJ,KAAK,EAAE;YACL,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,oEAAoE;SAClF;QACD,KAAK,EAAE;YACL,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,oCAAoC;YACjD,OAAO,EAAE,KAAK;SACf;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAqB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAExF,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAc,CAAC,EAAE,CAAC;YACxD,sCAAsC;YACtC,OAAO,CAAC,KAAK,CACX,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,mBAAmB,IAAI,CAAC,KAAK,cAAc,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5F,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAAkB,EAAE,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACpE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC;YAC9E,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,EAAE,GAAG,KAAK,KAAK,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE;gBACxF,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC;gBACvC,GAAG;aACJ,CAAC,CAAC;QACL,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,sCAAsC;YACtC,OAAO,CAAC,GAAG,CACT,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,KAAK;gBACR,CAAC,CAAC,yCAAyC,IAAI,CAAC,KAAK,IAAI;gBACzD,CAAC,CAAC,0FAA0F,CAC/F,CACF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,qEAAqE;QACrE,+DAA+D;QAC/D,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACpB,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACjD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAgB,EAAE;gBACtD,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QACnC,CAAC;QAED,gEAAgE;QAChE,OAAO,CAAC,GAAG,CAAC,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,40 @@
1
+ interface EventEnvelope {
2
+ readonly messageId?: string;
3
+ readonly causationId?: string;
4
+ readonly correlationId?: string;
5
+ readonly occurredAt?: string | number;
6
+ }
7
+ interface WireEvent {
8
+ readonly name?: string;
9
+ readonly envelope?: EventEnvelope;
10
+ }
11
+ export declare function formatTimestamp(at: string | number | undefined): string;
12
+ export declare function shortId(id: string | undefined): string;
13
+ /**
14
+ * Render a single event line for the summary view.
15
+ *
16
+ * HH:MM:SS.mmm <corr> <event-name> <cause → msg>
17
+ */
18
+ export declare function formatSummaryLine(evt: WireEvent): string;
19
+ /**
20
+ * Build an ASCII causation tree for one correlation.
21
+ *
22
+ * `messageId` is the node identity; `causationId` points at the parent.
23
+ * Events whose parent we never see become additional roots (preserves
24
+ * order so out-of-order arrivals still render).
25
+ */
26
+ export declare function renderTree(events: readonly WireEvent[]): string;
27
+ export declare const traceCommand: import("citty").CommandDef<{
28
+ correlation: {
29
+ type: "string";
30
+ description: string;
31
+ required: false;
32
+ };
33
+ limit: {
34
+ type: "string";
35
+ description: string;
36
+ required: false;
37
+ };
38
+ }>;
39
+ export {};
40
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/commands/trace.ts"],"names":[],"mappings":"AAoBA,UAAU,aAAa;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAM,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAI,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAK,MAAM,GAAG,MAAM,CAAC;CAC1C;AAED,UAAU,SAAS;IACjB,QAAQ,CAAC,IAAI,CAAC,EAAM,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;CACnC;AAOD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAIvE;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAKtD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CAQxD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAuB/D;AAmED,eAAO,MAAM,YAAY;;;;;;;;;;;EA4DvB,CAAC"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * `nwire trace [--correlation <id>] [--limit <N>]`
3
+ *
4
+ * Streams `/_nwire/events/stream` from the running wire and either:
5
+ *
6
+ * • prints a one-line summary per event (default), or
7
+ * • renders a vertical causation tree for a single `--correlation`.
8
+ *
9
+ * The wire may restart while we're streaming — we reconnect with a 1s
10
+ * backoff after each disconnect and print a small dim banner. SIGINT
11
+ * aborts the stream cleanly.
12
+ */
13
+ import { defineCommand } from "citty";
14
+ import { palette } from "../lib/colors.js";
15
+ import { findWireUrl } from "../lib/wire-discovery.js";
16
+ import { SseParser } from "../lib/sse.js";
17
+ // ─── Formatters (exported for testing) ─────────────────────────────
18
+ const PAD2 = (n) => n.toString().padStart(2, "0");
19
+ const PAD3 = (n) => n.toString().padStart(3, "0");
20
+ export function formatTimestamp(at) {
21
+ const d = at === undefined ? new Date() : new Date(at);
22
+ if (Number.isNaN(d.getTime()))
23
+ return "??:??:??.???";
24
+ return `${PAD2(d.getHours())}:${PAD2(d.getMinutes())}:${PAD2(d.getSeconds())}.${PAD3(d.getMilliseconds())}`;
25
+ }
26
+ export function shortId(id) {
27
+ if (!id)
28
+ return "--------";
29
+ // strip leading evt_/cmd_ prefixes if present, then take last 8 chars
30
+ const trimmed = id.replace(/^[a-z]{2,5}_/, "");
31
+ return trimmed.length <= 8 ? trimmed.padEnd(8, " ") : trimmed.slice(-8);
32
+ }
33
+ /**
34
+ * Render a single event line for the summary view.
35
+ *
36
+ * HH:MM:SS.mmm <corr> <event-name> <cause → msg>
37
+ */
38
+ export function formatSummaryLine(evt) {
39
+ const env = evt.envelope ?? {};
40
+ const time = palette.dim(formatTimestamp(env.occurredAt));
41
+ const corr = palette.brand(shortId(env.correlationId));
42
+ const name = (evt.name ?? "(unknown)").padEnd(32, " ");
43
+ const cause = palette.dim(shortId(env.causationId));
44
+ const msg = palette.dim(shortId(env.messageId));
45
+ return `${time} ${corr} ${name} ${cause} ${palette.dim("→")} ${msg}`;
46
+ }
47
+ /**
48
+ * Build an ASCII causation tree for one correlation.
49
+ *
50
+ * `messageId` is the node identity; `causationId` points at the parent.
51
+ * Events whose parent we never see become additional roots (preserves
52
+ * order so out-of-order arrivals still render).
53
+ */
54
+ export function renderTree(events) {
55
+ const byId = new Map();
56
+ const children = new Map();
57
+ const roots = [];
58
+ for (const e of events) {
59
+ const id = e.envelope?.messageId;
60
+ if (id)
61
+ byId.set(id, e);
62
+ }
63
+ for (const e of events) {
64
+ const cause = e.envelope?.causationId;
65
+ if (cause && byId.has(cause) && cause !== e.envelope?.messageId) {
66
+ const list = children.get(cause) ?? [];
67
+ list.push(e);
68
+ children.set(cause, list);
69
+ }
70
+ else {
71
+ roots.push(e);
72
+ }
73
+ }
74
+ const lines = [];
75
+ for (const root of roots) {
76
+ walk(root, "", true, children, lines);
77
+ }
78
+ return lines.join("\n");
79
+ }
80
+ function walk(evt, prefix, isLast, children, out) {
81
+ const branch = isLast ? "└─ " : "├─ ";
82
+ const env = evt.envelope ?? {};
83
+ const time = palette.dim(formatTimestamp(env.occurredAt));
84
+ const name = evt.name ?? "(unknown)";
85
+ const id = palette.dim(shortId(env.messageId));
86
+ out.push(`${prefix}${palette.dim(branch)}${time} ${palette.brand(name)} ${id}`);
87
+ const id2 = env.messageId;
88
+ const kids = id2 ? children.get(id2) ?? [] : [];
89
+ const nextPre = prefix + (isLast ? " " : palette.dim("│ "));
90
+ kids.forEach((k, i) => walk(k, nextPre, i === kids.length - 1, children, out));
91
+ }
92
+ async function streamOnce(opts) {
93
+ const res = await fetch(`${opts.url}/_nwire/events/stream`, {
94
+ headers: { accept: "text/event-stream" },
95
+ signal: opts.signal,
96
+ });
97
+ if (!res.ok || !res.body) {
98
+ throw new Error(`stream returned ${res.status}`);
99
+ }
100
+ const reader = res.body.getReader();
101
+ const decoder = new TextDecoder("utf-8");
102
+ const parser = new SseParser();
103
+ let printed = 0;
104
+ const buffer = [];
105
+ while (!opts.signal.aborted) {
106
+ const { value, done } = await reader.read();
107
+ if (done)
108
+ return;
109
+ const chunk = decoder.decode(value, { stream: true });
110
+ for (const payload of parser.feed(chunk)) {
111
+ const evt = payload;
112
+ if (opts.correlation) {
113
+ if (evt.envelope?.correlationId !== opts.correlation)
114
+ continue;
115
+ buffer.push(evt);
116
+ // Re-render the tree each time. Tiny clear so the previous
117
+ // tree doesn't leave stale lines for the same correlation.
118
+ opts.onBanner("\x1b[2J\x1b[H");
119
+ opts.onLine(renderTree(buffer));
120
+ }
121
+ else {
122
+ opts.onLine(formatSummaryLine(evt));
123
+ printed += 1;
124
+ if (opts.limit && printed >= opts.limit)
125
+ return;
126
+ }
127
+ }
128
+ }
129
+ }
130
+ export const traceCommand = defineCommand({
131
+ meta: {
132
+ name: "trace",
133
+ description: "Tail event stream from a running wire (optionally one correlation)",
134
+ },
135
+ args: {
136
+ correlation: {
137
+ type: "string",
138
+ description: "Show events for this correlationId only — renders as a causation tree",
139
+ required: false,
140
+ },
141
+ limit: {
142
+ type: "string",
143
+ description: "Stop after N events (summary mode only)",
144
+ required: false,
145
+ },
146
+ },
147
+ async run({ args }) {
148
+ const url = await findWireUrl();
149
+ if (!url) {
150
+ console.error(palette.err("nwire trace:") +
151
+ " no running wire found. Start one with `nwire dev`, or set NWIRE_INSPECT_URL.");
152
+ process.exit(1);
153
+ }
154
+ const correlation = typeof args.correlation === "string" ? args.correlation : undefined;
155
+ const limit = typeof args.limit === "string" ? Number(args.limit) : undefined;
156
+ const ctrl = new AbortController();
157
+ const stop = () => ctrl.abort();
158
+ process.on("SIGINT", stop);
159
+ process.on("SIGTERM", stop);
160
+ console.log(palette.dim(`# tracing ${url}/_nwire/events/stream` +
161
+ (correlation ? ` (correlation=${correlation})` : "") +
162
+ ` — Ctrl+C to exit`));
163
+ while (!ctrl.signal.aborted) {
164
+ try {
165
+ await streamOnce({
166
+ url,
167
+ correlation,
168
+ limit,
169
+ signal: ctrl.signal,
170
+ onLine: (l) => console.log(l),
171
+ onBanner: (l) => process.stdout.write(l),
172
+ });
173
+ // Hit the limit or stream EOF — exit cleanly.
174
+ process.exit(0);
175
+ }
176
+ catch (err) {
177
+ if (ctrl.signal.aborted)
178
+ break;
179
+ const msg = err instanceof Error ? err.message : String(err);
180
+ console.log(palette.warn(`# disconnected (${msg}) — reconnecting in 1s…`));
181
+ await sleep(1_000, ctrl.signal);
182
+ }
183
+ }
184
+ process.exit(0);
185
+ },
186
+ });
187
+ function sleep(ms, signal) {
188
+ return new Promise((res) => {
189
+ if (signal.aborted)
190
+ return res();
191
+ const t = setTimeout(() => res(), ms);
192
+ signal.addEventListener("abort", () => { clearTimeout(t); res(); }, { once: true });
193
+ });
194
+ }
195
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/commands/trace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ interface HookStepTelemetry {
2
+ readonly kind: "hook.step";
3
+ readonly hookName: string;
4
+ readonly phase: "start" | "end" | "error";
5
+ readonly stepKind?: string;
6
+ readonly stepName?: string;
7
+ readonly durationMs?: number;
8
+ readonly error?: {
9
+ readonly message?: string;
10
+ } | string;
11
+ readonly occurredAt?: string | number;
12
+ }
13
+ /**
14
+ * Translate a `*`-glob into a `^…$` anchored RegExp. No other glob
15
+ * features (`?`, character classes) are supported — keeping the surface
16
+ * tight matches the rest of the framework's "one obvious way" stance.
17
+ */
18
+ export declare function hookGlobToRegex(glob: string): RegExp;
19
+ export declare function formatHookStepLine(step: HookStepTelemetry): string;
20
+ export declare const watchCommand: import("citty").CommandDef<{
21
+ hook: {
22
+ type: "positional";
23
+ required: true;
24
+ description: string;
25
+ };
26
+ limit: {
27
+ type: "string";
28
+ description: string;
29
+ required: false;
30
+ };
31
+ }>;
32
+ export {};
33
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAwBA,UAAU,iBAAiB;IACzB,QAAQ,CAAC,IAAI,EAAQ,WAAW,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAI,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAO,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAG,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAG,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAM;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC;IAC5D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACvC;AASD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGpD;AAWD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAmBlE;AAuCD,eAAO,MAAM,YAAY;;;;;;;;;;;EA0DvB,CAAC"}