@ultimat3/cli 19.2.0 → 19.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CLAUDE.md +108 -6
  2. package/package.json +29 -29
  3. package/src/app-boundaries.ts +11 -2
  4. package/src/app-load.ts +5 -1
  5. package/src/budgets.ts +17 -6
  6. package/src/cmd-dev.ts +29 -39
  7. package/src/cmd-doctor.ts +61 -23
  8. package/src/cmd-generate.ts +5 -2
  9. package/src/cmd-i18n.ts +10 -3
  10. package/src/cmd-jobs.ts +56 -10
  11. package/src/cmd-test.ts +15 -10
  12. package/src/db-seed.ts +2 -1
  13. package/src/dev-queue.ts +16 -2
  14. package/src/dev-reload.ts +46 -0
  15. package/src/dev-runtime.ts +4 -1
  16. package/src/dev-sync.ts +11 -3
  17. package/src/dev-watch-tree.ts +226 -0
  18. package/src/dev-watch.ts +59 -37
  19. package/src/doctor-offline.ts +122 -0
  20. package/src/error-catalog.ts +4 -5
  21. package/src/fix-command.ts +40 -1
  22. package/src/fix-path.ts +10 -11
  23. package/src/flag-number.ts +15 -0
  24. package/src/generate-kinds.ts +54 -4
  25. package/src/generate-write.ts +25 -2
  26. package/src/gitignore.ts +145 -0
  27. package/src/hold.ts +50 -17
  28. package/src/index.ts +1 -1
  29. package/src/island-bundle.ts +2 -1
  30. package/src/island-states-load.ts +2 -1
  31. package/src/jobs-driver.ts +4 -1
  32. package/src/mcp-host.ts +18 -9
  33. package/src/parse.ts +17 -0
  34. package/src/path-segments.ts +14 -0
  35. package/src/prerender.ts +46 -20
  36. package/src/retry-memo.ts +37 -0
  37. package/src/serve.ts +5 -1
  38. package/src/source-files.ts +3 -1
  39. package/src/sw-artifacts.ts +71 -7
  40. package/src/templates/admin-page.ts +49 -1
  41. package/src/templates/scaffold-container.ts +12 -0
  42. package/src/templates/scaffold-repo.ts +7 -2
  43. package/src/test-passes.ts +79 -0
  44. package/src/test-shards.ts +110 -36
  45. package/src/verify-checks.ts +6 -6
  46. package/src/verify-step.ts +4 -4
  47. package/src/verify-tests.ts +14 -2
@@ -29,19 +29,19 @@ export const VERIFY_STEP_NAMES = [
29
29
  'drift',
30
30
  'contract-diff',
31
31
  'budgets',
32
- // Eighteenth, and a deliberate widening of a closed list rather than a `HostCheck`: an SEO gate
32
+ // A deliberate widening of a closed list rather than a `HostCheck`: an SEO gate
33
33
  // is a MECHANISM every app with a `site/` surface wants (axiom 8), not a rule one host repo
34
34
  // enforces — and `verifyCommand.run` passes no host checks at all, so the app path could not
35
35
  // have carried it. It runs beside `budgets` because both read the app the same load produced.
36
36
  'seo',
37
- // Nineteenth, by the same test the SEO step above passed and for the same reason it is not a
38
- // rider: `boundaries` asks whether an import was LEGAL and this asks whether a declaration
37
+ // Here by the same test the SEO step above passed, and not a rider for the same reason:
38
+ // `boundaries` asks whether an import was LEGAL and this asks whether a declaration
39
39
  // REACHED the running app, which is a different question with a different fix (axiom 4). It
40
40
  // costs no second app load — `budgets` already imported every module, and this reads the
41
41
  // registries that load filled. Until it existed, an app could ship every user-facing string as
42
42
  // `⟦key⟧` with `x verify` green, because nothing in the gate ever asked (issue #249).
43
43
  'i18n',
44
- // Twentieth, by the same test `seo` and `i18n` each passed: a rider must ask the SAME question
44
+ // Here by the same test `seo` and `i18n` each passed: a rider must ask the SAME question
45
45
  // off the same data, and "was this import legal?" is not "does the permission this app grants
46
46
  // and requires exist?". Reported under `budgets` it would hand the reader a byte budget for an
47
47
  // authz defect (axiom 4). Until it existed, `x new` shipped an app that answered HTTP 500 with
@@ -44,7 +44,9 @@ const TYPED_SUFFIXES = '{contract,live,job,e2e,eval}';
44
44
  * four sweeps. `type` is a closed union here and cannot be `'constructor'` today, which is
45
45
  * exactly the argument every one of those thirteen had before it stopped being true.
46
46
  *
47
- * Same repair, and the same reason, as `packages/i18n/src/catalog.ts`.
47
+ * Same repair, and the same reason, as `packages/i18n/src/catalog.ts`. The read itself is guarded
48
+ * too (`summaryOf`), because a construction three screens above a read is not something a static
49
+ * rule should have to reason about.
48
50
  */
49
51
  const SUMMARIES: Readonly<Record<TypedTest, string>> = Object.assign(
50
52
  Object.create(null) as Record<TypedTest, string>,
@@ -255,6 +257,16 @@ const evalStep: VerifyStep = {
255
257
  },
256
258
  };
257
259
 
260
+ /**
261
+ * The one computed read of `SUMMARIES`, guarded. The table is already prototype-free
262
+ * (`Object.create(null)`), which is what makes the READ safe — and `scripts/proto-index.ts`
263
+ * recognises a guard on the read itself, not a construction three screens above it. So the guard
264
+ * is here: a rule that has to reason about how a table was built is one tightening away from
265
+ * reporting this line, and a pin is a rule with a hole in it.
266
+ */
267
+ const summaryOf = (type: TypedTest): string =>
268
+ Object.hasOwn(SUMMARIES, type) ? SUMMARIES[type] : `${type} tests`;
269
+
258
270
  const stepFor = (type: TestType): VerifyStep => {
259
271
  if (type === 'unit') {
260
272
  return {
@@ -266,7 +278,7 @@ const stepFor = (type: TestType): VerifyStep => {
266
278
  if (type === 'eval') return evalStep;
267
279
  return {
268
280
  name: type,
269
- summary: SUMMARIES[type],
281
+ summary: summaryOf(type),
270
282
  applies: async (ctx) => (await filesFor(ctx.root, type)).length > 0,
271
283
  run: (ctx) => runType(ctx, type),
272
284
  };