@lorepack/cli 0.0.0-stage → 0.1.0-alpha.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 (229) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/commands/activate.d.ts +20 -0
  3. package/dist/commands/activate.d.ts.map +1 -0
  4. package/dist/commands/activate.js +171 -0
  5. package/dist/commands/activate.js.map +1 -0
  6. package/dist/commands/build.d.ts +3 -0
  7. package/dist/commands/build.d.ts.map +1 -0
  8. package/dist/commands/build.js +53 -0
  9. package/dist/commands/build.js.map +1 -0
  10. package/dist/commands/config.d.ts +14 -0
  11. package/dist/commands/config.d.ts.map +1 -0
  12. package/dist/commands/config.js +109 -0
  13. package/dist/commands/config.js.map +1 -0
  14. package/dist/commands/connect.d.ts +5 -0
  15. package/dist/commands/connect.d.ts.map +1 -0
  16. package/dist/commands/connect.js +196 -0
  17. package/dist/commands/connect.js.map +1 -0
  18. package/dist/commands/deploy.d.ts +14 -0
  19. package/dist/commands/deploy.d.ts.map +1 -0
  20. package/dist/commands/deploy.js +248 -0
  21. package/dist/commands/deploy.js.map +1 -0
  22. package/dist/commands/dev.d.ts +25 -0
  23. package/dist/commands/dev.d.ts.map +1 -0
  24. package/dist/commands/dev.js +227 -0
  25. package/dist/commands/dev.js.map +1 -0
  26. package/dist/commands/diff.d.ts +3 -0
  27. package/dist/commands/diff.d.ts.map +1 -0
  28. package/dist/commands/diff.js +75 -0
  29. package/dist/commands/diff.js.map +1 -0
  30. package/dist/commands/doctor.d.ts +14 -0
  31. package/dist/commands/doctor.d.ts.map +1 -0
  32. package/dist/commands/doctor.js +96 -0
  33. package/dist/commands/doctor.js.map +1 -0
  34. package/dist/commands/export.d.ts +3 -0
  35. package/dist/commands/export.d.ts.map +1 -0
  36. package/dist/commands/export.js +126 -0
  37. package/dist/commands/export.js.map +1 -0
  38. package/dist/commands/index.d.ts +8 -0
  39. package/dist/commands/index.d.ts.map +1 -0
  40. package/dist/commands/index.js +51 -0
  41. package/dist/commands/index.js.map +1 -0
  42. package/dist/commands/init.d.ts +3 -0
  43. package/dist/commands/init.d.ts.map +1 -0
  44. package/dist/commands/init.js +95 -0
  45. package/dist/commands/init.js.map +1 -0
  46. package/dist/commands/inspect.d.ts +15 -0
  47. package/dist/commands/inspect.d.ts.map +1 -0
  48. package/dist/commands/inspect.js +527 -0
  49. package/dist/commands/inspect.js.map +1 -0
  50. package/dist/commands/mcp.d.ts +12 -0
  51. package/dist/commands/mcp.d.ts.map +1 -0
  52. package/dist/commands/mcp.js +219 -0
  53. package/dist/commands/mcp.js.map +1 -0
  54. package/dist/commands/pack.d.ts +9 -0
  55. package/dist/commands/pack.d.ts.map +1 -0
  56. package/dist/commands/pack.js +57 -0
  57. package/dist/commands/pack.js.map +1 -0
  58. package/dist/commands/plan.d.ts +3 -0
  59. package/dist/commands/plan.d.ts.map +1 -0
  60. package/dist/commands/plan.js +44 -0
  61. package/dist/commands/plan.js.map +1 -0
  62. package/dist/commands/prune.d.ts +7 -0
  63. package/dist/commands/prune.d.ts.map +1 -0
  64. package/dist/commands/prune.js +341 -0
  65. package/dist/commands/prune.js.map +1 -0
  66. package/dist/commands/search.d.ts +3 -0
  67. package/dist/commands/search.d.ts.map +1 -0
  68. package/dist/commands/search.js +84 -0
  69. package/dist/commands/search.js.map +1 -0
  70. package/dist/commands/serve.d.ts +20 -0
  71. package/dist/commands/serve.d.ts.map +1 -0
  72. package/dist/commands/serve.js +66 -0
  73. package/dist/commands/serve.js.map +1 -0
  74. package/dist/commands/status.d.ts +3 -0
  75. package/dist/commands/status.d.ts.map +1 -0
  76. package/dist/commands/status.js +27 -0
  77. package/dist/commands/status.js.map +1 -0
  78. package/dist/commands/target.d.ts +71 -0
  79. package/dist/commands/target.d.ts.map +1 -0
  80. package/dist/commands/target.js +945 -0
  81. package/dist/commands/target.js.map +1 -0
  82. package/dist/entry.d.ts +3 -0
  83. package/dist/entry.d.ts.map +1 -0
  84. package/dist/entry.js +19 -0
  85. package/dist/entry.js.map +1 -0
  86. package/dist/framework/context.d.ts +49 -0
  87. package/dist/framework/context.d.ts.map +1 -0
  88. package/dist/framework/context.js +47 -0
  89. package/dist/framework/context.js.map +1 -0
  90. package/dist/framework/exit.d.ts +36 -0
  91. package/dist/framework/exit.d.ts.map +1 -0
  92. package/dist/framework/exit.js +57 -0
  93. package/dist/framework/exit.js.map +1 -0
  94. package/dist/framework/metadata.d.ts +38 -0
  95. package/dist/framework/metadata.d.ts.map +1 -0
  96. package/dist/framework/metadata.js +47 -0
  97. package/dist/framework/metadata.js.map +1 -0
  98. package/dist/framework/program.d.ts +47 -0
  99. package/dist/framework/program.d.ts.map +1 -0
  100. package/dist/framework/program.js +189 -0
  101. package/dist/framework/program.js.map +1 -0
  102. package/dist/index.d.ts +7 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +7 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/migrations/README.md +7 -0
  107. package/dist/migrations/build/0001_catalog.sql +85 -0
  108. package/dist/migrations/build/0002_tables.sql +43 -0
  109. package/dist/migrations/build/0003_table-cell-range.sql +13 -0
  110. package/dist/migrations/build/0004_chunk-page.sql +11 -0
  111. package/dist/migrations/state/0001_state.sql +40 -0
  112. package/dist/public-entry.js +38563 -0
  113. package/dist/public-entry.js.map +7 -0
  114. package/dist/public-index.js +36428 -0
  115. package/dist/public-index.js.map +7 -0
  116. package/dist/services/build.d.ts +48 -0
  117. package/dist/services/build.d.ts.map +1 -0
  118. package/dist/services/build.js +499 -0
  119. package/dist/services/build.js.map +1 -0
  120. package/dist/services/builds.d.ts +40 -0
  121. package/dist/services/builds.d.ts.map +1 -0
  122. package/dist/services/builds.js +184 -0
  123. package/dist/services/builds.js.map +1 -0
  124. package/dist/services/cancellation.d.ts +27 -0
  125. package/dist/services/cancellation.d.ts.map +1 -0
  126. package/dist/services/cancellation.js +41 -0
  127. package/dist/services/cancellation.js.map +1 -0
  128. package/dist/services/cloudflare-target.d.ts +38 -0
  129. package/dist/services/cloudflare-target.d.ts.map +1 -0
  130. package/dist/services/cloudflare-target.js +471 -0
  131. package/dist/services/cloudflare-target.js.map +1 -0
  132. package/dist/services/comparer.d.ts +15 -0
  133. package/dist/services/comparer.d.ts.map +1 -0
  134. package/dist/services/comparer.js +43 -0
  135. package/dist/services/comparer.js.map +1 -0
  136. package/dist/services/config-resolve.d.ts +60 -0
  137. package/dist/services/config-resolve.d.ts.map +1 -0
  138. package/dist/services/config-resolve.js +178 -0
  139. package/dist/services/config-resolve.js.map +1 -0
  140. package/dist/services/deploy.d.ts +70 -0
  141. package/dist/services/deploy.d.ts.map +1 -0
  142. package/dist/services/deploy.js +260 -0
  143. package/dist/services/deploy.js.map +1 -0
  144. package/dist/services/dev-session.d.ts +52 -0
  145. package/dist/services/dev-session.d.ts.map +1 -0
  146. package/dist/services/dev-session.js +102 -0
  147. package/dist/services/dev-session.js.map +1 -0
  148. package/dist/services/doctor.d.ts +35 -0
  149. package/dist/services/doctor.d.ts.map +1 -0
  150. package/dist/services/doctor.js +389 -0
  151. package/dist/services/doctor.js.map +1 -0
  152. package/dist/services/export.d.ts +20 -0
  153. package/dist/services/export.d.ts.map +1 -0
  154. package/dist/services/export.js +129 -0
  155. package/dist/services/export.js.map +1 -0
  156. package/dist/services/init.d.ts +46 -0
  157. package/dist/services/init.d.ts.map +1 -0
  158. package/dist/services/init.js +231 -0
  159. package/dist/services/init.js.map +1 -0
  160. package/dist/services/packing.d.ts +25 -0
  161. package/dist/services/packing.d.ts.map +1 -0
  162. package/dist/services/packing.js +69 -0
  163. package/dist/services/packing.js.map +1 -0
  164. package/dist/services/parse-cache.d.ts +47 -0
  165. package/dist/services/parse-cache.d.ts.map +1 -0
  166. package/dist/services/parse-cache.js +65 -0
  167. package/dist/services/parse-cache.js.map +1 -0
  168. package/dist/services/project.d.ts +49 -0
  169. package/dist/services/project.d.ts.map +1 -0
  170. package/dist/services/project.js +119 -0
  171. package/dist/services/project.js.map +1 -0
  172. package/dist/services/remote-prune.d.ts +7 -0
  173. package/dist/services/remote-prune.d.ts.map +1 -0
  174. package/dist/services/remote-prune.js +34 -0
  175. package/dist/services/remote-prune.js.map +1 -0
  176. package/dist/services/retention.d.ts +20 -0
  177. package/dist/services/retention.d.ts.map +1 -0
  178. package/dist/services/retention.js +106 -0
  179. package/dist/services/retention.js.map +1 -0
  180. package/dist/services/revalidate.d.ts +36 -0
  181. package/dist/services/revalidate.d.ts.map +1 -0
  182. package/dist/services/revalidate.js +73 -0
  183. package/dist/services/revalidate.js.map +1 -0
  184. package/dist/services/search.d.ts +25 -0
  185. package/dist/services/search.d.ts.map +1 -0
  186. package/dist/services/search.js +88 -0
  187. package/dist/services/search.js.map +1 -0
  188. package/dist/services/serving.d.ts +70 -0
  189. package/dist/services/serving.d.ts.map +1 -0
  190. package/dist/services/serving.js +240 -0
  191. package/dist/services/serving.js.map +1 -0
  192. package/dist/services/status.d.ts +54 -0
  193. package/dist/services/status.d.ts.map +1 -0
  194. package/dist/services/status.js +203 -0
  195. package/dist/services/status.js.map +1 -0
  196. package/dist/services/studio-assets.d.ts +13 -0
  197. package/dist/services/studio-assets.d.ts.map +1 -0
  198. package/dist/services/studio-assets.js +94 -0
  199. package/dist/services/studio-assets.js.map +1 -0
  200. package/dist/services/studio-diagnostics.d.ts +28 -0
  201. package/dist/services/studio-diagnostics.d.ts.map +1 -0
  202. package/dist/services/studio-diagnostics.js +88 -0
  203. package/dist/services/studio-diagnostics.js.map +1 -0
  204. package/dist/services/studio-endpoints.d.ts +61 -0
  205. package/dist/services/studio-endpoints.d.ts.map +1 -0
  206. package/dist/services/studio-endpoints.js +88 -0
  207. package/dist/services/studio-endpoints.js.map +1 -0
  208. package/dist/services/studio-mutations.d.ts +32 -0
  209. package/dist/services/studio-mutations.d.ts.map +1 -0
  210. package/dist/services/studio-mutations.js +149 -0
  211. package/dist/services/studio-mutations.js.map +1 -0
  212. package/dist/services/versions.d.ts +38 -0
  213. package/dist/services/versions.d.ts.map +1 -0
  214. package/dist/services/versions.js +46 -0
  215. package/dist/services/versions.js.map +1 -0
  216. package/dist/services/watch.d.ts +103 -0
  217. package/dist/services/watch.d.ts.map +1 -0
  218. package/dist/services/watch.js +420 -0
  219. package/dist/services/watch.js.map +1 -0
  220. package/package.json +73 -4
  221. package/studio-dist/assets/ibm-plex-mono-latin-400-normal-Dm_PoFIZ.woff2 +0 -0
  222. package/studio-dist/assets/ibm-plex-mono-latin-500-normal-C_OblDzq.woff2 +0 -0
  223. package/studio-dist/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  224. package/studio-dist/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  225. package/studio-dist/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  226. package/studio-dist/assets/index-BuAYbQVX.js +66 -0
  227. package/studio-dist/assets/index-C_3XEUt4.css +1 -0
  228. package/studio-dist/index.html +30 -0
  229. package/README.md +0 -3
@@ -0,0 +1,420 @@
1
+ import { realpathSync, statSync } from 'node:fs';
2
+ import { join, relative, sep } from 'node:path';
3
+ import { createSourceMatcher, discover } from '@lorepack/compiler';
4
+ import { LORE_DIRECTORY } from '@lorepack/core';
5
+ import { watch as chokidarWatch } from 'chokidar';
6
+ import { openStateStore } from './builds.js';
7
+ import { readFreshness } from './status.js';
8
+ export const WATCH_DEFAULTS = {
9
+ debounceMs: 150,
10
+ stabilityMs: 120,
11
+ pollMs: 40,
12
+ reconcileIntervalMs: 2000,
13
+ };
14
+ export function startWatching(options) {
15
+ const debounceMs = options.debounceMs ?? WATCH_DEFAULTS.debounceMs;
16
+ const stabilityMs = options.stabilityMs ?? WATCH_DEFAULTS.stabilityMs;
17
+ const pollMs = options.pollMs ?? WATCH_DEFAULTS.pollMs;
18
+ const reconcileIntervalMs = options.reconcileIntervalMs ?? WATCH_DEFAULTS.reconcileIntervalMs;
19
+ // The same rules discovery uses, so an event and a build cannot disagree about
20
+ // whether a file is a source of this project.
21
+ const matcher = createSourceMatcher(options.config);
22
+ /**
23
+ * The path the operating system will name in its own events.
24
+ *
25
+ * On Windows this is not a formality. A directory reached through an 8.3 short path, which
26
+ * is what `%TEMP%` under a long user name gives you (`C:\Users\RUNNER~1\...`), makes
27
+ * libuv abort:
28
+ *
29
+ * Assertion failed: !_wcsnicmp(filename, dir, dirlen), file src\win\fs-event.c, line 72
30
+ *
31
+ * It compares the long name the OS reports against the short name it was asked to watch,
32
+ * they do not match, and the watcher dies. Resolving first means both sides are speaking
33
+ * about the same string. Symlinked roots have the same shape of problem on every platform.
34
+ */
35
+ const watchRoot = resolveRealPath(options.config.projectRoot);
36
+ const loreDirectory = join(options.config.projectRoot, LORE_DIRECTORY);
37
+ let state = 'clean';
38
+ /**
39
+ * The build `state` is a claim about.
40
+ *
41
+ * Freshness is never "the sources are clean", it is "the sources match *this build*", and
42
+ * the pointer can move without a single file changing. Activation and rollback do exactly
43
+ * that, and neither produces a filesystem event, so before #200 the cached answer went on
44
+ * describing the build that was active before: Studio's own write surface could make the
45
+ * header say "the sources match this build" about a build the sources had moved past.
46
+ */
47
+ let describedBuild = activeBuildId();
48
+ let rebuilds = 0;
49
+ let noOps = 0;
50
+ let closed = false;
51
+ let lastEventAt = null;
52
+ let lastRebuild = null;
53
+ /** Paths seen since the last settle, so the stability wait knows what to watch. */
54
+ let touched = new Set();
55
+ let timer = null;
56
+ let running = null;
57
+ /** A change arrived while a rebuild was in flight, so run again when it finishes. */
58
+ let again = false;
59
+ let chain = Promise.resolve();
60
+ const watcher = chokidarWatch(watchRoot, {
61
+ // Chokidar v4 removed glob support and v5 has not brought it back, so it is given a
62
+ // directory and our own matcher decides. Handing it patterns would be two matchers
63
+ // disagreeing about which files are sources.
64
+ ignored: (path) => excluded(path, watchRoot, matcher),
65
+ // The initial scan already happened: it was the build. Replaying it as events would
66
+ // rebuild an identical build on every startup.
67
+ ignoreInitial: true,
68
+ // Complementary to, not a replacement for, the stability wait below. Chokidar's version
69
+ // decides when to *emit*; ours decides when the bytes are worth hashing, and it is the
70
+ // one that runs against the paths a rebuild is about to read.
71
+ awaitWriteFinish: { stabilityThreshold: stabilityMs, pollInterval: pollMs },
72
+ });
73
+ const ready = new Promise((resolve) => {
74
+ watcher.on('ready', () => {
75
+ // Step 3. The scan/watch race: anything written between the build and this moment was
76
+ // seen by neither, so the only safe assumption is that something was.
77
+ chain = chain.then(async () => {
78
+ await settle('startup reconciliation');
79
+ resolve();
80
+ });
81
+ });
82
+ });
83
+ for (const event of ['add', 'change', 'unlink', 'addDir', 'unlinkDir']) {
84
+ watcher.on(event, (path) => {
85
+ if (closed)
86
+ return;
87
+ touched.add(path);
88
+ lastEventAt = new Date().toISOString();
89
+ schedule();
90
+ });
91
+ }
92
+ watcher.on('error', (error) => {
93
+ // A watcher that fell over must not leave the runtime confidently serving stale context.
94
+ // Reconciling is the recovery: it re-establishes truth from content rather than from a
95
+ // stream that has already proved unreliable.
96
+ options.warn(`Watcher error: ${error instanceof Error ? error.message : String(error)}. Reconciling from disk.\n`);
97
+ chain = chain.then(() => settle('watcher recovery'));
98
+ });
99
+ /**
100
+ * The floor under the event stream.
101
+ *
102
+ * Prescreens on paths, sizes and modification times, which is cheap, and only settles when
103
+ * that signature moved. A platform that delivers no event still converges within one
104
+ * interval, and a platform that delivers them promptly pays a directory scan every couple
105
+ * of seconds and finds nothing.
106
+ */
107
+ let signature = '';
108
+ const sweep = setInterval(() => {
109
+ if (closed)
110
+ return;
111
+ const current = metadataSignature(options.config);
112
+ if (current === signature)
113
+ return;
114
+ const first = signature === '';
115
+ signature = current;
116
+ // The first sweep only establishes a baseline: the build that just happened is what it
117
+ // would otherwise mistake for a change.
118
+ if (first)
119
+ return;
120
+ chain = chain.then(() => settle('sources changed'));
121
+ }, reconcileIntervalMs);
122
+ // Never hold the process open on its own account: the supervisor decides when to exit.
123
+ sweep.unref?.();
124
+ /**
125
+ * The active build, read from the pointer.
126
+ *
127
+ * One small transaction against the state database, which is what `/v1/build` already does
128
+ * once per request to name the build it is describing. `null` on any failure, which then
129
+ * compares unequal to a real id and drives a recompute: erring towards re-establishing is
130
+ * the safe direction, and a genuinely broken state database surfaces through the routes
131
+ * that read it properly rather than through a freshness annotation.
132
+ */
133
+ function activeBuildId() {
134
+ try {
135
+ const store = openStateStore(loreDirectory);
136
+ try {
137
+ return store.current()?.buildId ?? null;
138
+ }
139
+ finally {
140
+ store.close();
141
+ }
142
+ }
143
+ catch {
144
+ return null;
145
+ }
146
+ }
147
+ /** Freshness and the build it describes, written together so they cannot drift apart. */
148
+ function record(next) {
149
+ state = next;
150
+ describedBuild = activeBuildId();
151
+ }
152
+ function schedule() {
153
+ if (timer !== null)
154
+ clearTimeout(timer);
155
+ // Step 4. One save is many events, and a rename is a delete plus an add. Coalescing is
156
+ // what turns an editor's write pattern into one rebuild.
157
+ timer = setTimeout(() => {
158
+ timer = null;
159
+ chain = chain.then(() => settle('sources changed'));
160
+ }, debounceMs);
161
+ }
162
+ /** Steps 5 to 9, once per settled burst of events. */
163
+ async function settle(reason) {
164
+ if (closed)
165
+ return;
166
+ const paths = [...touched];
167
+ touched = new Set();
168
+ await waitForStability(paths, stabilityMs, pollMs);
169
+ if (closed)
170
+ return;
171
+ // Whatever the sweep sees next is measured from here, so the rebuild this settle is
172
+ // about to perform is not mistaken for a further change.
173
+ signature = metadataSignature(options.config);
174
+ // Step 6 and 7. The deciding evidence. A touch, an atomic rename of identical bytes, or
175
+ // a save that changed nothing all land here and stop.
176
+ const freshness = await readFreshness({ config: options.config });
177
+ if (freshness.sourceState === 'clean') {
178
+ record('clean');
179
+ if (reason !== 'startup reconciliation') {
180
+ noOps += 1;
181
+ options.warn('No changes: the sources still match the active build.\n');
182
+ }
183
+ return;
184
+ }
185
+ record('dirty');
186
+ await run(reason);
187
+ }
188
+ /**
189
+ * Re-establish freshness without rebuilding.
190
+ *
191
+ * The distinction from `settle` is the whole point. `settle` treats "dirty" as a reason to
192
+ * build, which is right for an edit and catastrophic for an activation: rolling back to an
193
+ * older build makes the sources dirty by definition, and a rebuild here would immediately
194
+ * activate a new build and undo the rollback the reader just asked for.
195
+ */
196
+ async function reestablish() {
197
+ if (closed)
198
+ return;
199
+ try {
200
+ const freshness = await readFreshness({ config: options.config });
201
+ record(freshness.sourceState);
202
+ }
203
+ catch {
204
+ // Leave it unknown. A failure to establish freshness is not evidence of freshness,
205
+ // and invariant 6 makes `unknown` the only honest answer available here.
206
+ }
207
+ }
208
+ /** Steps 8 and 9, serialized, and cancelled by anything newer. */
209
+ async function run(reason) {
210
+ if (running !== null) {
211
+ // Supersede: the candidate in flight is already answering an out-of-date question.
212
+ again = true;
213
+ running.abort();
214
+ return;
215
+ }
216
+ const controller = new AbortController();
217
+ running = controller;
218
+ const startedAt = Date.now();
219
+ try {
220
+ options.warn(`${reason}: rebuilding.\n`);
221
+ const result = await options.rebuild(controller.signal);
222
+ if (result.created)
223
+ rebuilds += 1;
224
+ // After the pointer moved, so `clean` is recorded against the build that is now active.
225
+ record('clean');
226
+ lastRebuild = {
227
+ at: new Date().toISOString(),
228
+ durationMs: Date.now() - startedAt,
229
+ created: result.created,
230
+ failed: false,
231
+ };
232
+ }
233
+ catch (error) {
234
+ // Recorded whether it succeeded or not. A rebuild that keeps failing is the exact
235
+ // case someone opens Diagnostics to understand, and a status that only ever showed
236
+ // successes would show nothing at all.
237
+ lastRebuild = {
238
+ at: new Date().toISOString(),
239
+ durationMs: Date.now() - startedAt,
240
+ created: false,
241
+ failed: !controller.signal.aborted,
242
+ };
243
+ if (controller.signal.aborted) {
244
+ // Cancelled by a newer change. `runBuild` removes its own incomplete candidate and
245
+ // leaves activation alone, so there is nothing to clean up and nothing to report.
246
+ record('dirty');
247
+ }
248
+ else {
249
+ // Architecture 6.9: a failed rebuild keeps the previous build active and says why.
250
+ // Serving stale context is recoverable; exiting the supervisor is not.
251
+ record('dirty');
252
+ options.warn(`Rebuild failed, so the previous build is still active: ${error instanceof Error ? error.message : String(error)}\n`);
253
+ }
254
+ }
255
+ finally {
256
+ running = null;
257
+ }
258
+ if (again && !closed) {
259
+ again = false;
260
+ await settle('superseded by a newer change');
261
+ }
262
+ }
263
+ return {
264
+ ready,
265
+ get rebuilds() {
266
+ return rebuilds;
267
+ },
268
+ get noOps() {
269
+ return noOps;
270
+ },
271
+ async freshness() {
272
+ const active = activeBuildId();
273
+ if (active === describedBuild)
274
+ return state;
275
+ // The pointer moved without a source file changing, which is what an activation or a
276
+ // rollback is, from Studio or from a terminal running alongside this session. The
277
+ // cached answer belongs to the build that was active before it.
278
+ //
279
+ // Reported `unknown` rather than recomputed here: establishing freshness walks and
280
+ // hashes the corpus, and `/v1/build` is on the request path of every Studio poll and
281
+ // every MCP call. The recompute is queued instead, so the next read is accurate and
282
+ // this one is honest. Invariant 6: `unknown` means unknown, never clean.
283
+ state = 'unknown';
284
+ describedBuild = active;
285
+ chain = chain.then(reestablish);
286
+ return state;
287
+ },
288
+ status() {
289
+ return {
290
+ state,
291
+ watchedPaths: countWatched(watcher.getWatched()),
292
+ lastEventAt,
293
+ lastRebuild,
294
+ rebuilds,
295
+ noOps,
296
+ };
297
+ },
298
+ async close() {
299
+ closed = true;
300
+ clearInterval(sweep);
301
+ if (timer !== null)
302
+ clearTimeout(timer);
303
+ running?.abort();
304
+ await watcher.close();
305
+ // Let an in-flight settle unwind rather than tearing out from under it.
306
+ await chain.catch(() => undefined);
307
+ },
308
+ };
309
+ }
310
+ /**
311
+ * Step 5. Holds until size and modification time stop moving on every touched path.
312
+ *
313
+ * An editor that writes in chunks, and a large copy, both produce a file that exists and is
314
+ * incomplete. Hashing it produces a real hash of the wrong bytes, a build gets created and
315
+ * activated, and the next save produces another. Waiting is cheaper than being wrong.
316
+ */
317
+ async function waitForStability(paths, stabilityMs, pollMs) {
318
+ if (paths.length === 0)
319
+ return;
320
+ let previous = signature(paths);
321
+ let stableFor = 0;
322
+ const deadline = Date.now() + 5000;
323
+ while (stableFor < stabilityMs && Date.now() < deadline) {
324
+ await new Promise((resolve) => setTimeout(resolve, pollMs));
325
+ const current = signature(paths);
326
+ stableFor = current === previous ? stableFor + pollMs : 0;
327
+ previous = current;
328
+ }
329
+ }
330
+ /**
331
+ * A cheap signature of the source tree: path, size and modification time.
332
+ *
333
+ * Evidence of nothing on its own, which is the point. A file can change without its mtime
334
+ * moving, so this only decides whether to go and compute the hashes that do decide.
335
+ */
336
+ function metadataSignature(config) {
337
+ try {
338
+ const discovered = discover({ config, allowLargeProject: true });
339
+ return discovered.artifacts
340
+ .map((artifact) => {
341
+ const path = join(config.projectRoot, artifact.relativePath);
342
+ try {
343
+ const stats = statSync(path);
344
+ return `${artifact.relativePath}:${stats.size}:${stats.mtimeMs}`;
345
+ }
346
+ catch {
347
+ return `${artifact.relativePath}:gone`;
348
+ }
349
+ })
350
+ .join('\n');
351
+ }
352
+ catch {
353
+ // A source tree that cannot be walked is not a reason to fail: returning a stable
354
+ // marker means the sweep simply finds nothing until it can be read again.
355
+ return 'unscannable';
356
+ }
357
+ }
358
+ function signature(paths) {
359
+ return paths
360
+ .map((path) => {
361
+ try {
362
+ const stats = statSync(path);
363
+ return `${path}:${stats.size}:${stats.mtimeMs}`;
364
+ }
365
+ catch {
366
+ // Gone is a stable state: a delete is a change like any other.
367
+ return `${path}:gone`;
368
+ }
369
+ })
370
+ .join('\n');
371
+ }
372
+ /**
373
+ * Whether a path is outside what this project indexes.
374
+ *
375
+ * Canonicalized to POSIX separators before matching, because the rules are written that way
376
+ * and the paths arrive native. Architecture 12.11 states the rule generally: internal ids
377
+ * use POSIX separators while filesystem calls use native paths.
378
+ */
379
+ function excluded(path, watchRoot, matcher) {
380
+ const relativePath = relative(watchRoot, path);
381
+ if (relativePath === '')
382
+ return false;
383
+ // Outside the project entirely, which chokidar can ask about for a symlinked parent.
384
+ if (relativePath.startsWith('..'))
385
+ return true;
386
+ const canonical = relativePath.split(sep).join('/');
387
+ // Never watch our own output: a build writes into `.lore`, which would trigger a rebuild,
388
+ // which would write into `.lore`.
389
+ if (canonical === '.lore' || canonical.startsWith('.lore/'))
390
+ return true;
391
+ return matcher.excludes(canonical);
392
+ }
393
+ /**
394
+ * The canonical path, or the original when it cannot be resolved.
395
+ *
396
+ * Falling back rather than throwing: a project that cannot be `realpath`ed is a project the
397
+ * build has already read successfully, so refusing to watch it would be a worse answer than
398
+ * watching it by the name we were given.
399
+ */
400
+ /**
401
+ * Files under watch, from chokidar's directory-to-entries map.
402
+ *
403
+ * Directories are counted too, because they are what a watcher actually holds a handle on,
404
+ * and a number that excluded them would not match what an operating system limit is about.
405
+ */
406
+ function countWatched(watched) {
407
+ let total = 0;
408
+ for (const entries of Object.values(watched))
409
+ total += entries.length;
410
+ return total;
411
+ }
412
+ export function resolveRealPath(path) {
413
+ try {
414
+ return realpathSync.native(path);
415
+ }
416
+ catch {
417
+ return path;
418
+ }
419
+ }
420
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/services/watch.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,75 @@
1
1
  {
2
2
  "name": "@lorepack/cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0-alpha.0",
4
+ "description": "The Lorepack command line interface.",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "engines": {
8
+ "node": ">=24.15 <25"
9
+ },
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/public-index.js"
14
+ }
15
+ },
16
+ "main": "./dist/public-index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "files": [
19
+ "dist",
20
+ "studio-dist"
21
+ ],
22
+ "scripts": {
23
+ "build": "tsc -b && node ../../scripts/bundle-cli.mjs",
24
+ "clean": "rm -rf dist *.tsbuildinfo"
25
+ },
26
+ "dependencies": {
27
+ "@hono/node-server": "2.0.12",
28
+ "@modelcontextprotocol/client": "2.2.0",
29
+ "@modelcontextprotocol/hono": "2.0.0",
30
+ "@modelcontextprotocol/node": "2.0.0",
31
+ "@modelcontextprotocol/server": "2.0.0",
32
+ "chokidar": "5.0.0",
33
+ "commander": "15.0.0",
34
+ "csv-parse": "7.0.2",
35
+ "hono": "4.13.7",
36
+ "jose": "6.2.7",
37
+ "jsonc-parser": "3.3.1",
38
+ "mammoth": "1.12.0",
39
+ "mdast-util-from-markdown": "2.0.2",
40
+ "pdfjs-dist": "6.2.108",
41
+ "rehype-parse": "9.0.1",
42
+ "remark-frontmatter": "5.0.0",
43
+ "remark-gfm": "4.0.1",
44
+ "remark-parse": "11.0.0",
45
+ "sax": "1.6.1",
46
+ "smol-toml": "1.9.0",
47
+ "unified": "11.0.5",
48
+ "yaml": "2.9.0",
49
+ "yauzl": "3.4.0",
50
+ "yazl": "3.3.1"
51
+ },
52
+ "repository": {
53
+ "type": "git",
54
+ "url": "git+https://github.com/burakdede/lorepack.git",
55
+ "directory": "packages/cli"
56
+ },
57
+ "bin": {
58
+ "lorepack": "./dist/public-entry.js"
59
+ },
60
+ "devDependencies": {
61
+ "@lorepack/backend-local": "workspace:*",
62
+ "@lorepack/compiler": "workspace:*",
63
+ "@lorepack/connect-clients": "workspace:*",
64
+ "@lorepack/core": "workspace:*",
65
+ "@lorepack/deploy-cloudflare": "workspace:*",
66
+ "@lorepack/mcp": "workspace:*",
67
+ "@lorepack/parsers": "workspace:*",
68
+ "@lorepack/runtime": "workspace:*",
69
+ "@lorepack/test-support": "workspace:*"
70
+ },
71
+ "publishConfig": {
72
+ "access": "public",
73
+ "provenance": true
74
+ }
75
+ }