@akanjs/cli 3.0.0-alpha.63 → 3.0.0-alpha.65

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 (43) hide show
  1. package/.build-stamp +1 -1
  2. package/{agent.command-tsx1nsdj.js → agent.command-99yaptk3.js} +5 -5
  3. package/{application.command-n8ex8g9h.js → application.command-77nxchr4.js} +4 -4
  4. package/{applicationBuildRunner-x8h12rp0.js → applicationBuildRunner-k6dna8sz.js} +9 -7
  5. package/buildBatch.proc.js +2 -2
  6. package/{capacitorApp-8mv9e537.js → capacitorApp-4g1s9n37.js} +2 -2
  7. package/{cloud.command-f0rhw014.js → cloud.command-gegy1qxv.js} +7 -7
  8. package/{context.command-s7a41qjs.js → context.command-a0pwgc3v.js} +12 -12
  9. package/{guideline.command-qrw84ttb.js → guideline.command-83p3y9w7.js} +2 -2
  10. package/guidelines/conventions/conventions.instruction.md +84 -1
  11. package/incrementalBuilder.proc.js +1 -1
  12. package/{index-ek4mkwxp.js → index-1t5r09v4.js} +10 -10
  13. package/{index-tn46rr6w.js → index-27jj517n.js} +4 -4
  14. package/{index-kkya2ped.js → index-4etexq7j.js} +1 -1
  15. package/{index-ryns915y.js → index-4sgv0wcr.js} +3 -3
  16. package/{index-ce9755av.js → index-cwa0jvjt.js} +1 -1
  17. package/{index-0g9ajdz8.js → index-db89awmp.js} +5 -5
  18. package/{index-dvg362vq.js → index-ejr3h3wc.js} +3 -3
  19. package/{index-f0t3wjyr.js → index-emsw8h3b.js} +2 -2
  20. package/{index-x1dbhd80.js → index-j35ceh2c.js} +2 -2
  21. package/{index-r8z20vnj.js → index-m285dkby.js} +5 -5
  22. package/{index-g44fykfw.js → index-mr02v9xp.js} +1 -1
  23. package/{index-681sx6nt.js → index-n57kkvtg.js} +20 -5
  24. package/{index-ckpwq052.js → index-qch3r961.js} +1 -1
  25. package/{index-4mtyaqj2.js → index-rm7xj6bc.js} +2 -2
  26. package/{index-cc1mgv1f.js → index-rzekxec9.js} +4 -4
  27. package/{index-wc19q8mb.js → index-v76gy4dn.js} +2 -2
  28. package/{index-8md8zszv.js → index-wm5hw5mr.js} +3 -3
  29. package/{index-h0mnt0b0.js → index-wxc9p0n0.js} +3 -3
  30. package/{index-xj5b8c0w.js → index-xesyg6bc.js} +1 -0
  31. package/index.js +18 -18
  32. package/{library.command-p3jgf5h2.js → library.command-2b20rx36.js} +3 -3
  33. package/{localRegistry.command-bms0qn6t.js → localRegistry.command-tdn3373t.js} +6 -6
  34. package/{module.command-hb3xm07r.js → module.command-ez5psv7q.js} +5 -5
  35. package/{package.command-fbpa6r4w.js → package.command-dcdya2hn.js} +3 -3
  36. package/package.json +2 -2
  37. package/{page.command-92vrmw96.js → page.command-he49r0vd.js} +3 -3
  38. package/{primitive.command-k6b9jfxr.js → primitive.command-w2hyrf9c.js} +6 -6
  39. package/{quality.command-89vwmjvf.js → quality.command-8xewbve2.js} +2 -2
  40. package/{repair.command-nh9jn8rh.js → repair.command-9f9wy32e.js} +5 -5
  41. package/{scalar.command-zcsjgvax.js → scalar.command-q4ravcd9.js} +4 -4
  42. package/{workflow.command-jj0cphfm.js → workflow.command-3stj54ek.js} +9 -9
  43. package/{workspace.command-ma3g994j.js → workspace.command-2pfnrhmw.js} +18 -18
package/.build-stamp CHANGED
@@ -1 +1 @@
1
- 766fec76fb1eaf8c5b0fe9ce5f5368d31232118a41ead868a0c1b0b30ed68570
1
+ d9a9cb283fc6902d147352f88eeb5fbd6d7ea8772a5b896f6abb475c2581fb44
@@ -1,15 +1,15 @@
1
1
  // @bun
2
2
  import {
3
3
  AgentScript
4
- } from "./index-h0mnt0b0.js";
5
- import"./index-wc19q8mb.js";
6
- import"./index-g44fykfw.js";
4
+ } from "./index-wxc9p0n0.js";
5
+ import"./index-v76gy4dn.js";
6
+ import"./index-mr02v9xp.js";
7
7
  import"./index-j37qq1f2.js";
8
8
  import {
9
9
  Workspace,
10
10
  command
11
- } from "./index-ckpwq052.js";
12
- import"./index-681sx6nt.js";
11
+ } from "./index-qch3r961.js";
12
+ import"./index-n57kkvtg.js";
13
13
  import"./index-f39512t6.js";
14
14
  import"./index-mxvakhsm.js";
15
15
  import"./index-xys926f2.js";
@@ -4,8 +4,8 @@ import {
4
4
  } from "./index-0wae5ebk.js";
5
5
  import {
6
6
  ApplicationScript
7
- } from "./index-r8z20vnj.js";
8
- import"./index-f0t3wjyr.js";
7
+ } from "./index-m285dkby.js";
8
+ import"./index-emsw8h3b.js";
9
9
  import {
10
10
  getMobileTargetChoices
11
11
  } from "./index-76rn3g2c.js";
@@ -15,10 +15,10 @@ import {
15
15
  Sys,
16
16
  Workspace,
17
17
  command
18
- } from "./index-ckpwq052.js";
18
+ } from "./index-qch3r961.js";
19
19
  import"./index-fgc8r6dj.js";
20
20
  import"./index-5vy2jzar.js";
21
- import"./index-681sx6nt.js";
21
+ import"./index-n57kkvtg.js";
22
22
  import"./index-f39512t6.js";
23
23
  import"./index-mxvakhsm.js";
24
24
  import"./index-1577bej2.js";
@@ -4,7 +4,7 @@ import {
4
4
  CsrArtifactBuilder,
5
5
  SsrBaseArtifactBuilder,
6
6
  precompressArtifacts
7
- } from "./index-xj5b8c0w.js";
7
+ } from "./index-xesyg6bc.js";
8
8
  import"./index-xjd3rqzj.js";
9
9
  import"./index-qnv0aqmm.js";
10
10
  import"./index-5vy2jzar.js";
@@ -58,14 +58,15 @@ class ApplicationBuildRunner {
58
58
  }
59
59
  async build({ spinner = false } = {}) {
60
60
  const phaseOptions = { spinner };
61
+ const { web } = await this.#app.getConfig();
61
62
  await this.#runPhase("prepare", "Preparing output directory", () => this.#app.prepareCommand("build"), undefined, {
62
63
  spinner
63
64
  });
64
65
  if (!this.#fast)
65
66
  await this.#runPhase("typecheck", "Typechecking", () => this.typecheck(), undefined, phaseOptions);
66
67
  await this.#runPhase("backend", "Compiling backend", () => this.#buildBackend(), (result) => `${result.entrypoints} entrypoints, ${result.outputs} outputs`, phaseOptions);
67
- await this.#runPhase("ssr", "Building SSR route artifacts", () => this.#buildSsr(), (result) => result ? `${result.allRoutes.manifest.routeIds.length} routes, ${result.allRoutes.manifest.knownEntries.length} entries` : "skipped", phaseOptions);
68
- await this.#runPhase("csr", "Building CSR assets", () => this.#buildCsr(), (result) => result?.outputDir ?? "skipped", phaseOptions);
68
+ await this.#runPhase("ssr", "Building SSR route artifacts", async () => web.ssr ? await this.#buildSsr() : null, (result) => result ? `${result.allRoutes.manifest.routeIds.length} routes, ${result.allRoutes.manifest.knownEntries.length} entries` : web.ssr ? "skipped" : "disabled by akan.config.ts web.ssr", phaseOptions);
69
+ await this.#runPhase("csr", "Building CSR assets", async () => web.csr ? await this.#buildCsr() : null, (result) => result?.outputDir ?? (web.csr ? "skipped" : "disabled by akan.config.ts web.csr"), phaseOptions);
69
70
  await this.#runPhase("compress", "Compressing static assets", () => precompressArtifacts(this.#app), (result) => result.files > 0 ? `${result.files} files, ${ApplicationBuildRunner.formatBytes(result.inputBytes)} -> gzip ${ApplicationBuildRunner.formatBytes(result.outputBytes)} / br ${ApplicationBuildRunner.formatBytes(result.brotliBytes)}` : "no files", phaseOptions);
70
71
  await this.#runPhase("metadata", "Writing production metadata", () => this.#buildAppMeta(), undefined, {
71
72
  spinner
@@ -115,6 +116,7 @@ class ApplicationBuildRunner {
115
116
  const backendExternals = [
116
117
  ...new Set([...akanConfig.externalLibs, ...SSR_RENDER_EXTERNALS, ...AKAN_OPTIONAL_BACKEND_EXTERNALS])
117
118
  ];
119
+ const { web } = akanConfig;
118
120
  const backendEntryPoints = [`${this.#app.cwdPath}/main.ts`, `${this.#app.cwdPath}/server.ts`];
119
121
  for (const entrypoint of backendEntryPoints) {
120
122
  if (!await Bun.file(entrypoint).exists())
@@ -129,7 +131,7 @@ class ApplicationBuildRunner {
129
131
  define: { "process.env.NODE_ENV": JSON.stringify("production") },
130
132
  plugins: backendExternals.length > 0 ? [this.#createExternalSpecifiersPlugin(backendExternals)] : []
131
133
  });
132
- const rscWorkerResult = await this.#buildOrThrow("rsc-worker", {
134
+ const rscWorkerResult = web.ssr ? await this.#buildOrThrow("rsc-worker", {
133
135
  entrypoints: [this.#resolveRscWorkerBuildEntry()],
134
136
  outdir: this.#app.dist.cwdPath,
135
137
  target: "bun",
@@ -138,7 +140,7 @@ class ApplicationBuildRunner {
138
140
  conditions: ["react-server"],
139
141
  define: { "process.env.NODE_ENV": JSON.stringify("production") },
140
142
  plugins: backendExternals.length > 0 ? [this.#createExternalSpecifiersPlugin(backendExternals)] : []
141
- });
143
+ }) : null;
142
144
  const consoleRuntimeResult = await this.#buildOrThrow("console-runtime", {
143
145
  entrypoints: [this.#resolveConsoleRuntimeBuildEntry()],
144
146
  outdir: this.#app.dist.cwdPath,
@@ -149,8 +151,8 @@ class ApplicationBuildRunner {
149
151
  });
150
152
  await this.#writeConsoleShim();
151
153
  return {
152
- entrypoints: backendEntryPoints.length + 2,
153
- outputs: backendResult.outputs.length + rscWorkerResult.outputs.length + consoleRuntimeResult.outputs.length + 1
154
+ entrypoints: backendEntryPoints.length + (rscWorkerResult ? 2 : 1),
155
+ outputs: backendResult.outputs.length + (rscWorkerResult?.outputs.length ?? 0) + consoleRuntimeResult.outputs.length + 1
154
156
  };
155
157
  }
156
158
  async#writeConsoleShim() {
@@ -5,14 +5,14 @@ import {
5
5
  FontOptimizer,
6
6
  PagesBundleBuilder,
7
7
  SsrBaseArtifactBuilder
8
- } from "./index-xj5b8c0w.js";
8
+ } from "./index-xesyg6bc.js";
9
9
  import"./index-xjd3rqzj.js";
10
10
  import"./index-qnv0aqmm.js";
11
11
  import"./index-5vy2jzar.js";
12
12
  import {
13
13
  AppExecutor,
14
14
  WorkspaceExecutor
15
- } from "./index-681sx6nt.js";
15
+ } from "./index-n57kkvtg.js";
16
16
  import"./index-f39512t6.js";
17
17
  import"./index-mxvakhsm.js";
18
18
  import"./index-1577bej2.js";
@@ -25,9 +25,9 @@ import {
25
25
  selectLocalDevHost,
26
26
  sortIosRunTargets,
27
27
  writeRootCapacitorConfig
28
- } from "./index-ce9755av.js";
28
+ } from "./index-cwa0jvjt.js";
29
29
  import"./index-76rn3g2c.js";
30
- import"./index-681sx6nt.js";
30
+ import"./index-n57kkvtg.js";
31
31
  import"./index-f39512t6.js";
32
32
  import"./index-mxvakhsm.js";
33
33
  import"./index-1577bej2.js";
@@ -1,22 +1,22 @@
1
1
  // @bun
2
2
  import {
3
3
  CloudScript
4
- } from "./index-0g9ajdz8.js";
5
- import"./index-8md8zszv.js";
6
- import"./index-x1dbhd80.js";
4
+ } from "./index-db89awmp.js";
5
+ import"./index-wm5hw5mr.js";
6
+ import"./index-j35ceh2c.js";
7
7
  import {
8
8
  GlobalConfig
9
9
  } from "./index-sh01r3pm.js";
10
- import"./index-r8z20vnj.js";
11
- import"./index-f0t3wjyr.js";
10
+ import"./index-m285dkby.js";
11
+ import"./index-emsw8h3b.js";
12
12
  import"./index-76rn3g2c.js";
13
13
  import {
14
14
  Workspace,
15
15
  command
16
- } from "./index-ckpwq052.js";
16
+ } from "./index-qch3r961.js";
17
17
  import"./index-fgc8r6dj.js";
18
18
  import"./index-5vy2jzar.js";
19
- import"./index-681sx6nt.js";
19
+ import"./index-n57kkvtg.js";
20
20
  import"./index-f39512t6.js";
21
21
  import"./index-mxvakhsm.js";
22
22
  import"./index-1577bej2.js";
@@ -1,25 +1,25 @@
1
1
  // @bun
2
2
  import {
3
3
  ContextScript
4
- } from "./index-ek4mkwxp.js";
5
- import"./index-ryns915y.js";
6
- import"./index-dvg362vq.js";
7
- import"./index-4mtyaqj2.js";
8
- import"./index-cc1mgv1f.js";
9
- import"./index-tn46rr6w.js";
4
+ } from "./index-1t5r09v4.js";
5
+ import"./index-4sgv0wcr.js";
6
+ import"./index-ejr3h3wc.js";
7
+ import"./index-rm7xj6bc.js";
8
+ import"./index-rzekxec9.js";
9
+ import"./index-27jj517n.js";
10
10
  import"./index-ss469dec.js";
11
- import"./index-kkya2ped.js";
12
- import"./index-ce9755av.js";
11
+ import"./index-4etexq7j.js";
12
+ import"./index-cwa0jvjt.js";
13
13
  import"./index-sh01r3pm.js";
14
- import"./index-wc19q8mb.js";
15
- import"./index-g44fykfw.js";
14
+ import"./index-v76gy4dn.js";
15
+ import"./index-mr02v9xp.js";
16
16
  import"./index-j37qq1f2.js";
17
17
  import"./index-76rn3g2c.js";
18
18
  import {
19
19
  Workspace,
20
20
  command
21
- } from "./index-ckpwq052.js";
22
- import"./index-681sx6nt.js";
21
+ } from "./index-qch3r961.js";
22
+ import"./index-n57kkvtg.js";
23
23
  import"./index-f39512t6.js";
24
24
  import"./index-mxvakhsm.js";
25
25
  import"./index-xys926f2.js";
@@ -10,8 +10,8 @@ import {
10
10
  command,
11
11
  runner,
12
12
  script
13
- } from "./index-ckpwq052.js";
14
- import"./index-681sx6nt.js";
13
+ } from "./index-qch3r961.js";
14
+ import"./index-n57kkvtg.js";
15
15
  import"./index-f39512t6.js";
16
16
  import"./index-mxvakhsm.js";
17
17
  import {
@@ -271,6 +271,44 @@ are, because those are the ones the server could have done.
271
271
  Full version with code, the `Tab` composition example, and a review checklist: `get_guideline` with `ssrRule`, or
272
272
  `akan guideline show ssrRule`.
273
273
 
274
+ ## Web Surfaces — Building And Serving Without SSR/CSR
275
+
276
+ An app serves three things: the API, the SSR/RSC web renderer, and the CSR single-file bundle. The API is always
277
+ on; the other two are declared in `akan.config.ts` as **`web: true | false | { csr: boolean }`** and can be
278
+ narrowed again per deployment.
279
+
280
+ ```ts
281
+ const config: AppConfig = { web: { csr: false } }; // web without the mobile bundle
282
+ const config: AppConfig = { web: false }; // api only
283
+ ```
284
+
285
+ - **`web: { csr: false }`** drops the CSR build phase and the `/__csr` + `?csr=true` routes. The CSR bundle is
286
+ what the Capacitor mobile build ships, so a web-only deployment never needs it — and an app that declares a
287
+ `mobile` section is refused, because `akan build-ios` copies `dist/apps/<app>/csr/<target>.html` into the
288
+ native project.
289
+ - **`web: false`** is an API-only build: no base artifact, no pages or client bundles, no RSC worker
290
+ entrypoint, and no `public/` in the image (the web router's catch-all is its only reader). Nothing under
291
+ `page/` is served, including routes a lib contributed through `syncPageLibs`.
292
+ - **There is no CSR-without-SSR option, by type.** The CSR bundle inlines the stylesheet the SSR base artifact
293
+ compiles, so it would ship an unstyled app — the object form therefore carries only `csr`, and SSR goes off
294
+ only through the whole-surface `false`.
295
+ - **At runtime, `AKAN_SSR` and `AKAN_CSR` narrow further and never widen** — `false` or `0` turns one off, and
296
+ `AKAN_SSR=false` takes CSR with it for the same reason the option has no such pair. A surface the build left
297
+ out cannot be switched back on, and the boot log names what the process ended up serving. The generated
298
+ Dockerfile writes the build's own answer as the image default.
299
+ - **A build with no web artifact boots the API instead of crashing.** `WebRouter.create` returns `null` when
300
+ `.akan/artifact/base-artifact.json` is absent — an api-only build, or a workspace with no `page/` at all.
301
+ - `akan start` ignores `web` and keeps the whole dev surface: the incremental builder is also the file watcher,
302
+ so switching it off would take server-code HMR with it. It warns once when the config and the dev server
303
+ disagree.
304
+ - The saving is mostly the RSC worker, which is a **separate process per web-serving replica**. Measured on
305
+ `apps/akan` at boot plus one render: 350MB across 3 processes with SSR on, 120MB across 2 with
306
+ `AKAN_SSR=false`, and the built image goes 86MB → 6.2MB when the artifacts are left out of it too.
307
+ - **The generated image installs `ca-certificates` and `tzdata` and nothing else.** It used to carry the whole
308
+ Chromium runtime, ffmpeg, `build-essential`, `python3` and `redis` in every app's image whether or not the app
309
+ reached for any of them. An app that needs one declares it in `docker.preRuns` / `docker.postRuns`, which are
310
+ emitted around the `bun install` — that is the migration for a `puppeteer` or `ffmpeg` app.
311
+
274
312
  ## React Components And Styling (`**/*.tsx`)
275
313
 
276
314
  - Components are `export const X = ({ … }: XProps) => { return (…); };` — arrow const with a block body. `export default` is reserved for pages, layouts, and `lazy()` targets.
@@ -369,8 +407,23 @@ workflow changes.
369
407
  - Slice-level `guards` only reach the generated query/mutation endpoints. A `pubsub`/`message` endpoint is unguarded unless it declares its own `guards` in its signal option.
370
408
  - A pubsub room is authorized once, at subscribe. When a socket's credential changes the framework re-runs each room's guards and unsubscribes the ones that now fail (`SignalResolver.revalidateWsRooms`), so guards must stay side-effect free and safe to re-run.
371
409
  - A websocket carries its credential in the handshake snapshot on `ws.data` (`AppWsData`); clients that hold the token in memory send it with `fetch.setJwt(...)`, which forwards an auth frame over the socket.
410
+ - **Never read the caller's IP off the socket or the request peer — take `.with(Ip)`.** Every app runs behind
411
+ the federation gateway, so `ws.remoteAddress` and the child's own peer are the *gateway* (`127.0.0.1`) for
412
+ every caller and for the whole life of every socket. `Ip` reads what the gateway recorded
413
+ (`x-real-ip`, then the first `x-forwarded-for` entry) and falls back to the peer only when nothing proxied
414
+ the call; `context.getClientIp()` is the same answer inside a guard or middleware. It arrives unwrapped from
415
+ its `::ffff:` IPv4-mapped form, so it can address a `udp4` socket as well as identify a caller, and it is
416
+ `null` rather than a placeholder when genuinely unknown — a loopback-looking address for an unknown caller
417
+ is the failure this replaced. The gateway also forwards the client port (`x-forwarded-port`, read with
418
+ `context.getClientPort()`) along with host and protocol.
372
419
  - **Every socket carries a `socketId`, and only the framework mints one.** `AppWsData` assigns it at the handshake, and a `message` / `pubsub` handler reads it off the `Ws` internal arg — `.with(Ws)` hands `{ ws, socketId, subscribe, on, off }`. Never mint your own from `ws.data`: the room bookkeeping keys on the framework's id, and a second one fails to match it silently. It identifies a **connection**, not a caller — a reconnect gets a new id and the federation gateway's own socket is a different one — so per-user state keys on the account, never on this.
373
420
 
421
+ - **A cleanup registered with `ws.on("disconnect" | "unsubscribe", fn)` is scoped to the call that registered it.**
422
+ From a `pubsub` subscribe it belongs to that room — `unsubscribe` runs when the client leaves it or a credential
423
+ change revokes it, `disconnect` when the socket closes while still subscribed — so a room already left runs
424
+ neither again, and cleanup that must happen either way registers for both. From a `message` handler it belongs to
425
+ the socket and runs at close. A handler that throws is logged and never blocks the rest of the teardown.
426
+
374
427
  ### Authorization Defaults
375
428
 
376
429
  - **Every `slice()` takes an explicit `{ guards: {…} }` second argument, and `root:` is always `Admin`.**
@@ -389,6 +442,28 @@ workflow changes.
389
442
  - `.body(...)` / `.param(...)` args accept `ConstantFieldTypeInput` only: scalars, model refs, or `enumOf(...)`.
390
443
  - Numbers must use `Int` or `Float` — `Number` is rejected (`pkgs/akanjs/signal/endpointInfo.ts`).
391
444
  - `Upload` is valid only inside a mutation flagged for file upload: `mutation([cnst.File], { fileUpload: true }).body("files", [Upload])`, as the `file` module does. It is not a model field type.
445
+ - Bytes are `Binary`, never `Any` — see Scalar & Field Type Reference.
446
+
447
+ ### Binary Pubsub
448
+
449
+ - **`pubsub(Binary)` sends its payload in a websocket binary frame**, skipping the JSON `{ type: "pub" }`
450
+ envelope and the base64 a JSON wire would need. The client's subscribe callback receives a `Uint8Array`.
451
+ Nothing else is declared: the return type is the whole switch, and text and binary frames coexist on one
452
+ socket, so every JSON endpoint is untouched. The optimization applies only when the **whole** return is
453
+ `Binary` — `[Binary]`, or a `Binary` inside a model, falls back to base64.
454
+ - **A declared `Binary` room coalesces under backpressure**: while a socket cannot keep up the room keeps only
455
+ its newest frame and drops the rest, which is what a telemetry or video stream wants. Declare
456
+ `pubsub(Binary, { backpressure: "queue" })` when the frames are a sequence a subscriber must see in full, such
457
+ as deltas against a base it already holds; the send buffer then grows with the slowest subscriber. Coalescing
458
+ is keyed by the endpoint, not carried with the frame, so this process, an IPC deliver and a Redis fan-out all
459
+ reach the same answer. Coalesced frames are counted in `pubsubCoalesceCount` on the replica's metrics report.
460
+ - **A `pubsub(Any)` that happens to carry bytes is framed too, and warns once.** `Any` passes a `Buffer` through
461
+ untouched, so the transport sees bytes and sends them whole rather than as a number array — an undeclared
462
+ publisher is fixed rather than left corrupt. It is still not the contract: it queues rather than coalescing
463
+ (nobody declared lossy delivery for that room), and a Redis fan-out still JSON-stringifies it. Declare
464
+ `Binary`.
465
+ - The federation gateway relays a binary frame unchanged, and Bun IPC carries bytes as bytes, so the only hop
466
+ that needed teaching was the socket itself. A cross-server (Redis) fan-out encodes it as protobuf `bytes`.
392
467
 
393
468
  ### Mutation HTTP Verb
394
469
 
@@ -634,10 +709,18 @@ commands, transcript compaction, and the built-in tool semantics: `get_guideline
634
709
 
635
710
  ### Scalar & Field Type Reference
636
711
 
637
- - **Import from `akanjs/base`** (real classes/helpers, not globals): `Int`, `Float`, `ID`, `Any`, `Upload`, `enumOf`, and the `dayjs` factory. There is **no `JSON` scalar** — use `Any` for open/flexible payloads.
712
+ - **Import from `akanjs/base`** (real classes/helpers, not globals): `Int`, `Float`, `ID`, `Any`, `Binary`, `Upload`, `enumOf`, and the `dayjs` factory. There is **no `JSON` scalar** — use `Any` for open/flexible payloads.
638
713
  - **Use the JS globals directly (no import needed)**: `String`, `Boolean`, `Date`. They are monkey-patched to behave like scalars, so `field(String)` typechecks.
639
714
  - **`Number` is not a valid field/body type.** `NumberConstructor` is intentionally not augmented, so `field(Number)` / `.body("x", Number)` fails to typecheck. Use `Int` or `Float` instead.
640
715
  - Runtime resolution of every scalar (globals included) goes through `PrimitiveRegistry` by `refName` (`pkgs/akanjs/base/primitiveRegistry.ts`).
716
+ - **`Binary` is raw bytes on the wire, and never a model field.** It is `Uint8Array` on both sides — a Node
717
+ `Buffer` is one, so a server handler may pass one straight in — and it accepts base64 in either direction, so
718
+ the same declaration serves a JSON body and a binary frame. It is **not storable**: the class build refuses
719
+ `field(Binary)` naming the `File` model instead, because every non-base field lives in the `_doc` JSON column
720
+ and bytes would sit there as base64 and ride every read of the row. Never send bytes as `Any` — `Any` passes a
721
+ `Buffer` through untouched and `JSON.stringify` then spells it `{ type: "Buffer", data: number[] }`, which
722
+ `JSON.parse` never restores; the result is 3.6x the wire and a shape that only breaks at the first byte-offset
723
+ read. MCP refuses a `Binary` return for the same reason it refuses `Any`.
641
724
 
642
725
  ### Text Search Fields — the `text` role
643
726
 
@@ -16,7 +16,7 @@ import {
16
16
  import {
17
17
  AppExecutor,
18
18
  WorkspaceExecutor
19
- } from "./index-681sx6nt.js";
19
+ } from "./index-n57kkvtg.js";
20
20
  import"./index-f39512t6.js";
21
21
  import"./index-mxvakhsm.js";
22
22
  import"./index-1577bej2.js";
@@ -1,22 +1,22 @@
1
1
  // @bun
2
2
  import {
3
3
  RepairRunner
4
- } from "./index-ryns915y.js";
4
+ } from "./index-4sgv0wcr.js";
5
5
  import {
6
6
  WorkflowRunner
7
- } from "./index-dvg362vq.js";
7
+ } from "./index-ejr3h3wc.js";
8
8
  import {
9
9
  ScalarScript
10
- } from "./index-4mtyaqj2.js";
10
+ } from "./index-rm7xj6bc.js";
11
11
  import {
12
12
  PrimitiveScript
13
- } from "./index-cc1mgv1f.js";
13
+ } from "./index-rzekxec9.js";
14
14
  import {
15
15
  ModuleScript
16
- } from "./index-tn46rr6w.js";
16
+ } from "./index-27jj517n.js";
17
17
  import {
18
18
  isPlaceholderAppId
19
- } from "./index-ce9755av.js";
19
+ } from "./index-cwa0jvjt.js";
20
20
  import {
21
21
  AkanContextAnalyzer,
22
22
  akanMcpInstallConfigPaths,
@@ -27,14 +27,14 @@ import {
27
27
  renderDoctorText,
28
28
  resourceList,
29
29
  upsertCodexMcpServerBlock
30
- } from "./index-wc19q8mb.js";
30
+ } from "./index-v76gy4dn.js";
31
31
  import {
32
32
  buildAkanModuleContextIndex,
33
33
  createWorkflowBaselineSummary,
34
34
  createWorkflowStepRegistry,
35
35
  jsonText,
36
36
  toolingRolloutGate
37
- } from "./index-g44fykfw.js";
37
+ } from "./index-mr02v9xp.js";
38
38
  import {
39
39
  Prompter
40
40
  } from "./index-j37qq1f2.js";
@@ -45,10 +45,10 @@ import {
45
45
  CommandContainer,
46
46
  runner,
47
47
  script
48
- } from "./index-ckpwq052.js";
48
+ } from "./index-qch3r961.js";
49
49
  import {
50
50
  AppExecutor
51
- } from "./index-681sx6nt.js";
51
+ } from "./index-n57kkvtg.js";
52
52
 
53
53
  // pkgs/@akanjs/cli/context/context.script.ts
54
54
  import { Logger } from "akanjs/common";
@@ -4,7 +4,7 @@ import {
4
4
  } from "./index-ss469dec.js";
5
5
  import {
6
6
  PageScript
7
- } from "./index-kkya2ped.js";
7
+ } from "./index-4etexq7j.js";
8
8
  import {
9
9
  AiSession
10
10
  } from "./index-sh01r3pm.js";
@@ -15,17 +15,17 @@ import {
15
15
  generatedFilesForSync,
16
16
  moduleSourcePaths,
17
17
  sourceFile
18
- } from "./index-g44fykfw.js";
18
+ } from "./index-mr02v9xp.js";
19
19
  import {
20
20
  Prompter
21
21
  } from "./index-j37qq1f2.js";
22
22
  import {
23
23
  runner,
24
24
  script
25
- } from "./index-ckpwq052.js";
25
+ } from "./index-qch3r961.js";
26
26
  import {
27
27
  ModuleExecutor
28
- } from "./index-681sx6nt.js";
28
+ } from "./index-n57kkvtg.js";
29
29
  import {
30
30
  FileSys
31
31
  } from "./index-67546d0j.js";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  runner,
4
4
  script
5
- } from "./index-ckpwq052.js";
5
+ } from "./index-qch3r961.js";
6
6
 
7
7
  // pkgs/@akanjs/cli/page/page.runner.ts
8
8
  class PageRunner extends runner("page") {
@@ -1,17 +1,17 @@
1
1
  // @bun
2
2
  import {
3
3
  AkanContextAnalyzer
4
- } from "./index-wc19q8mb.js";
4
+ } from "./index-v76gy4dn.js";
5
5
  import {
6
6
  createRepairReport,
7
7
  generatedFilePathsForTarget,
8
8
  renderRepairReport,
9
9
  writeGeneratedSyncState,
10
10
  writeWorkflowRunArtifact
11
- } from "./index-g44fykfw.js";
11
+ } from "./index-mr02v9xp.js";
12
12
  import {
13
13
  runner
14
- } from "./index-ckpwq052.js";
14
+ } from "./index-qch3r961.js";
15
15
 
16
16
  // pkgs/@akanjs/cli/repair/repair.runner.ts
17
17
  var commandForShell = (command) => command.startsWith("akan ") ? `bun run ${command}` : command;
@@ -5,7 +5,7 @@ import {
5
5
  } from "./index-76rn3g2c.js";
6
6
  import {
7
7
  CommandExecutionError
8
- } from "./index-681sx6nt.js";
8
+ } from "./index-n57kkvtg.js";
9
9
 
10
10
  // pkgs/@akanjs/devkit/capacitorApp.ts
11
11
  import { cp, mkdir, readFile, rm, writeFile } from "fs/promises";
@@ -1,10 +1,10 @@
1
1
  // @bun
2
2
  import {
3
3
  CloudRunner
4
- } from "./index-8md8zszv.js";
4
+ } from "./index-wm5hw5mr.js";
5
5
  import {
6
6
  PackageScript
7
- } from "./index-x1dbhd80.js";
7
+ } from "./index-j35ceh2c.js";
8
8
  import {
9
9
  AiSession,
10
10
  CloudApi,
@@ -12,13 +12,13 @@ import {
12
12
  } from "./index-sh01r3pm.js";
13
13
  import {
14
14
  ApplicationScript
15
- } from "./index-r8z20vnj.js";
15
+ } from "./index-m285dkby.js";
16
16
  import {
17
17
  script
18
- } from "./index-ckpwq052.js";
18
+ } from "./index-qch3r961.js";
19
19
  import {
20
20
  PkgExecutor
21
- } from "./index-681sx6nt.js";
21
+ } from "./index-n57kkvtg.js";
22
22
 
23
23
  // pkgs/@akanjs/cli/cloud/cloud.script.ts
24
24
  import { Logger } from "akanjs/common";
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  AkanContextAnalyzer
4
- } from "./index-wc19q8mb.js";
4
+ } from "./index-v76gy4dn.js";
5
5
  import {
6
6
  WorkflowExecutor,
7
7
  compactWorkflowInputs,
@@ -23,10 +23,10 @@ import {
23
23
  workflowCommandsForPlan,
24
24
  workflowPlanApproval,
25
25
  writeWorkflowRunArtifact
26
- } from "./index-g44fykfw.js";
26
+ } from "./index-mr02v9xp.js";
27
27
  import {
28
28
  runner
29
- } from "./index-ckpwq052.js";
29
+ } from "./index-qch3r961.js";
30
30
 
31
31
  // pkgs/@akanjs/cli/workflow/workflow.runner.ts
32
32
  import { mkdir, readFile, writeFile } from "fs/promises";
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  runner,
4
4
  script
5
- } from "./index-ckpwq052.js";
5
+ } from "./index-qch3r961.js";
6
6
  import {
7
7
  LibExecutor
8
- } from "./index-681sx6nt.js";
8
+ } from "./index-n57kkvtg.js";
9
9
 
10
10
  // pkgs/@akanjs/cli/semver.ts
11
11
  var stripRangeOperator = (version) => version.replace(/^[\s^~>=<v]+/, "").trim();
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  runner,
4
4
  script
5
- } from "./index-ckpwq052.js";
5
+ } from "./index-qch3r961.js";
6
6
  import {
7
7
  PkgExecutor
8
- } from "./index-681sx6nt.js";
8
+ } from "./index-n57kkvtg.js";
9
9
  import {
10
10
  TypeScriptDependencyScanner
11
11
  } from "./index-46tjzh6s.js";
@@ -1,14 +1,14 @@
1
1
  // @bun
2
2
  import {
3
3
  LibraryScript
4
- } from "./index-f0t3wjyr.js";
4
+ } from "./index-emsw8h3b.js";
5
5
  import {
6
6
  resolveMobileTargets
7
7
  } from "./index-76rn3g2c.js";
8
8
  import {
9
9
  runner,
10
10
  script
11
- } from "./index-ckpwq052.js";
11
+ } from "./index-qch3r961.js";
12
12
  import {
13
13
  HmrWatcher,
14
14
  WatchRootResolver
@@ -18,7 +18,7 @@ import {
18
18
  LibExecutor,
19
19
  PkgExecutor,
20
20
  WorkspaceExecutor
21
- } from "./index-681sx6nt.js";
21
+ } from "./index-n57kkvtg.js";
22
22
  import {
23
23
  __require
24
24
  } from "./index-yb2wsc7f.js";
@@ -1898,9 +1898,9 @@ function openBrowser(url) {
1898
1898
  }
1899
1899
 
1900
1900
  // pkgs/@akanjs/cli/application/application.runner.ts
1901
- var loadBuildRunner = async () => (await import("./applicationBuildRunner-x8h12rp0.js")).ApplicationBuildRunner;
1901
+ var loadBuildRunner = async () => (await import("./applicationBuildRunner-k6dna8sz.js")).ApplicationBuildRunner;
1902
1902
  var loadReleasePackager = async () => (await import("./applicationReleasePackager-93nzdfsy.js")).ApplicationReleasePackager;
1903
- var loadCapacitorApp = async () => (await import("./capacitorApp-8mv9e537.js")).CapacitorApp;
1903
+ var loadCapacitorApp = async () => (await import("./capacitorApp-4g1s9n37.js")).CapacitorApp;
1904
1904
  var loadAbstractCompactor = async () => (await import("./abstractCompactor-20e0cwbs.js")).AbstractCompactor;
1905
1905
  var loadPrompts = async () => await import("@inquirer/prompts");
1906
1906
 
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  AppExecutor,
4
4
  LibExecutor
5
- } from "./index-681sx6nt.js";
5
+ } from "./index-n57kkvtg.js";
6
6
 
7
7
  // pkgs/@akanjs/devkit/workflow/utils.ts
8
8
  var jsonText = (value, { trailingNewline = true } = {}) => `${JSON.stringify(value, null, 2)}${trailingNewline ? `
@@ -320,6 +320,7 @@ class AkanAppConfig {
320
320
  rootPackageJson;
321
321
  docker;
322
322
  defaultDatabaseMode;
323
+ web;
323
324
  externalLibs;
324
325
  barrelImports;
325
326
  optimizeImports;
@@ -362,8 +363,15 @@ class AkanAppConfig {
362
363
  this.syncPageLibs = config?.syncPageLibs ?? false;
363
364
  this.hasMobileConfig = Boolean(config.mobile);
364
365
  this.mobile = this.#resolveMobileConfig(config.mobile);
366
+ this.web = this.#resolveWebConfig(config.web);
365
367
  this.docker = this.#makeDockerContent(config?.docker ?? {});
366
368
  }
369
+ #resolveWebConfig(web) {
370
+ const resolved = typeof web === "object" ? { ssr: true, csr: web.csr } : { ssr: web ?? true, csr: web ?? true };
371
+ if (!resolved.csr && this.hasMobileConfig)
372
+ throw new Error(`apps/${this.app.name}/akan.config.ts turns the CSR bundle off but declares mobile targets; the Capacitor build ships that bundle. Drop the mobile section or leave CSR on.`);
373
+ return resolved;
374
+ }
367
375
  #resolveMobileConfig(mobile) {
368
376
  const {
369
377
  targets: rawTargets,
@@ -485,10 +493,14 @@ class AkanAppConfig {
485
493
  const postRunScripts = this.#getDockerRunScripts(docker.postRuns ?? []);
486
494
  const imageScript = docker.image ? this.#getDockerImageScript(docker.image, "oven/bun:1-slim") : "FROM oven/bun:1-slim";
487
495
  const command = docker.command ?? ["bun", "main.js"];
496
+ const webEnvLines = [
497
+ ...this.web.ssr ? [] : ["ENV AKAN_SSR=false"],
498
+ ...this.web.csr ? [] : ["ENV AKAN_CSR=false"]
499
+ ].join(`
500
+ `);
488
501
  const content = `${imageScript}
502
+ RUN apt-get update && apt-get upgrade -y && apt-get install -y --no-install-recommends ca-certificates tzdata && rm -rf /var/lib/apt/lists/*
489
503
  RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
490
- RUN apt-get update && apt-get upgrade -y
491
- RUN apt-get install -y --no-install-recommends git redis build-essential python3 ca-certificates fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 lsb-release wget xdg-utils udev ffmpeg
492
504
  ARG TARGETARCH
493
505
  ${preRunScripts.join(`
494
506
  `)}
@@ -509,7 +521,7 @@ ${this.basePaths.size ? `ENV AKAN_PUBLIC_BASE_PATHS=${[...this.basePaths].join("
509
521
  ENV AKAN_PUBLIC_DEFAULT_LOCALE=${this.i18n.defaultLocale}
510
522
  ENV AKAN_PUBLIC_LOCALES=${this.i18n.locales.join(",")}
511
523
  ENV AKAN_PUBLIC_OPERATION_MODE=cloud
512
-
524
+ ${webEnvLines}
513
525
  CMD [${command.map((c) => `"${c}"`).join(",")}]`;
514
526
  return {
515
527
  content,
@@ -2656,10 +2668,13 @@ class AppExecutor extends SysExecutor {
2656
2668
  await Promise.all([this.dist.mkdir("private"), this.dist.mkdir("public")]);
2657
2669
  await Promise.all([
2658
2670
  this.cp("private", `${this.dist.cwdPath}/private`, { dereference: true }),
2659
- this.cp("public", `${this.dist.cwdPath}/public`, { dereference: true })
2671
+ ...akanConfig2.web.ssr ? [this.cp("public", `${this.dist.cwdPath}/public`, { dereference: true })] : []
2660
2672
  ]);
2661
- } else
2673
+ } else {
2662
2674
  await this.removeDir(".akan");
2675
+ if (!akanConfig2.web.ssr || !akanConfig2.web.csr)
2676
+ this.logger.warn(`akan.config.ts disables web.${!akanConfig2.web.ssr ? "ssr" : "csr"}; \`akan start\` still serves it, \`akan build\` will not`);
2677
+ }
2663
2678
  if (type === "start")
2664
2679
  process.env.NODE_ENV = "development";
2665
2680
  const devPort = type === "start" ? (await this.getDevPort()).toString() : undefined;
@@ -6,7 +6,7 @@ import {
6
6
  ModuleExecutor,
7
7
  PkgExecutor,
8
8
  WorkspaceExecutor
9
- } from "./index-681sx6nt.js";
9
+ } from "./index-n57kkvtg.js";
10
10
  import {
11
11
  getDirname
12
12
  } from "./index-1577bej2.js";
@@ -9,14 +9,14 @@ import {
9
9
  createPassedPrimitiveReport,
10
10
  generatedFilesForSync,
11
11
  scalarChangedFiles
12
- } from "./index-g44fykfw.js";
12
+ } from "./index-mr02v9xp.js";
13
13
  import {
14
14
  Prompter
15
15
  } from "./index-j37qq1f2.js";
16
16
  import {
17
17
  runner,
18
18
  script
19
- } from "./index-ckpwq052.js";
19
+ } from "./index-qch3r961.js";
20
20
 
21
21
  // pkgs/@akanjs/cli/scalar/scalar.prompt.ts
22
22
  import { input } from "@inquirer/prompts";
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  ModuleScript
4
- } from "./index-tn46rr6w.js";
4
+ } from "./index-27jj517n.js";
5
5
  import {
6
6
  addFieldUiPolicyForType,
7
7
  coerceFieldDefault,
@@ -34,15 +34,15 @@ import {
34
34
  sourceFile,
35
35
  validationCommandsForTarget,
36
36
  viaBuilderParameterName
37
- } from "./index-g44fykfw.js";
37
+ } from "./index-mr02v9xp.js";
38
38
  import {
39
39
  script
40
- } from "./index-ckpwq052.js";
40
+ } from "./index-qch3r961.js";
41
41
  import {
42
42
  AppExecutor,
43
43
  LibExecutor,
44
44
  ModuleExecutor
45
- } from "./index-681sx6nt.js";
45
+ } from "./index-n57kkvtg.js";
46
46
 
47
47
  // pkgs/@akanjs/cli/primitive/primitive.script.ts
48
48
  import { capitalize } from "akanjs/common";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  workflowRunArtifactPath,
4
4
  workflowSyncDir
5
- } from "./index-g44fykfw.js";
5
+ } from "./index-mr02v9xp.js";
6
6
  import {
7
7
  AppExecutor,
8
8
  LibExecutor,
@@ -11,7 +11,7 @@ import {
11
11
  readDevkitVersion,
12
12
  rootAllowedDirs,
13
13
  rootAllowedFiles
14
- } from "./index-681sx6nt.js";
14
+ } from "./index-n57kkvtg.js";
15
15
  import {
16
16
  collectRecipeSources,
17
17
  findInlineRecipeDuplicates,
@@ -7,14 +7,14 @@ import {
7
7
  } from "./index-sh01r3pm.js";
8
8
  import {
9
9
  openBrowser
10
- } from "./index-r8z20vnj.js";
10
+ } from "./index-m285dkby.js";
11
11
  import {
12
12
  runner
13
- } from "./index-ckpwq052.js";
13
+ } from "./index-qch3r961.js";
14
14
  import {
15
15
  AppExecutor,
16
16
  WorkspaceExecutor
17
- } from "./index-681sx6nt.js";
17
+ } from "./index-n57kkvtg.js";
18
18
 
19
19
  // pkgs/@akanjs/cli/npmRegistry.ts
20
20
  var defaultNpmRegistry = "https://registry.npmjs.org";
@@ -1,14 +1,14 @@
1
1
  // @bun
2
2
  import {
3
3
  AkanContextAnalyzer
4
- } from "./index-wc19q8mb.js";
4
+ } from "./index-v76gy4dn.js";
5
5
  import {
6
6
  Prompter
7
7
  } from "./index-j37qq1f2.js";
8
8
  import {
9
9
  runner,
10
10
  script
11
- } from "./index-ckpwq052.js";
11
+ } from "./index-qch3r961.js";
12
12
  import {
13
13
  AGENT_BLOCK_END,
14
14
  AGENT_BLOCK_START,
@@ -19,7 +19,7 @@ import {
19
19
  renderRecipeEntries,
20
20
  stampBlockVersion,
21
21
  upsertAgentBlock
22
- } from "./index-681sx6nt.js";
22
+ } from "./index-n57kkvtg.js";
23
23
  import {
24
24
  collectRecipeSources,
25
25
  scanRecipes
@@ -1976,6 +1976,7 @@ class SsrBaseArtifactBuilder {
1976
1976
  branches: [...akanConfig.branches],
1977
1977
  i18n: akanConfig.i18n,
1978
1978
  imageConfig: akanConfig.images,
1979
+ web: akanConfig.web,
1979
1980
  deepLinkAssociations: Object.values(akanConfig.mobile.targets).filter((target) => (target.deepLinks?.domains?.length ?? 0) > 0).map((target) => ({
1980
1981
  targetName: target.name,
1981
1982
  appId: target.appId,
package/index.js CHANGED
@@ -4,8 +4,8 @@ import {
4
4
  getTargetCommandNames,
5
5
  getTargetMetas,
6
6
  runCommands
7
- } from "./index-ckpwq052.js";
8
- import"./index-681sx6nt.js";
7
+ } from "./index-qch3r961.js";
8
+ import"./index-n57kkvtg.js";
9
9
  import"./index-f39512t6.js";
10
10
  import"./index-mxvakhsm.js";
11
11
  import"./index-1577bej2.js";
@@ -19,22 +19,22 @@ import path from "path";
19
19
 
20
20
  // pkgs/@akanjs/cli/commandModules.ts
21
21
  var commandModules = {
22
- workspace: async () => (await import("./workspace.command-ma3g994j.js")).WorkspaceCommand,
23
- agent: async () => (await import("./agent.command-tsx1nsdj.js")).AgentCommand,
24
- application: async () => (await import("./application.command-n8ex8g9h.js")).ApplicationCommand,
25
- library: async () => (await import("./library.command-p3jgf5h2.js")).LibraryCommand,
26
- localRegistry: async () => (await import("./localRegistry.command-bms0qn6t.js")).LocalRegistryCommand,
27
- package: async () => (await import("./package.command-fbpa6r4w.js")).PackageCommand,
28
- module: async () => (await import("./module.command-hb3xm07r.js")).ModuleCommand,
29
- page: async () => (await import("./page.command-92vrmw96.js")).PageCommand,
30
- context: async () => (await import("./context.command-s7a41qjs.js")).ContextCommand,
31
- cloud: async () => (await import("./cloud.command-f0rhw014.js")).CloudCommand,
32
- guideline: async () => (await import("./guideline.command-qrw84ttb.js")).GuidelineCommand,
33
- scalar: async () => (await import("./scalar.command-zcsjgvax.js")).ScalarCommand,
34
- primitive: async () => (await import("./primitive.command-k6b9jfxr.js")).PrimitiveCommand,
35
- quality: async () => (await import("./quality.command-89vwmjvf.js")).QualityCommand,
36
- repair: async () => (await import("./repair.command-nh9jn8rh.js")).RepairCommand,
37
- workflow: async () => (await import("./workflow.command-jj0cphfm.js")).WorkflowCommand
22
+ workspace: async () => (await import("./workspace.command-2pfnrhmw.js")).WorkspaceCommand,
23
+ agent: async () => (await import("./agent.command-99yaptk3.js")).AgentCommand,
24
+ application: async () => (await import("./application.command-77nxchr4.js")).ApplicationCommand,
25
+ library: async () => (await import("./library.command-2b20rx36.js")).LibraryCommand,
26
+ localRegistry: async () => (await import("./localRegistry.command-tdn3373t.js")).LocalRegistryCommand,
27
+ package: async () => (await import("./package.command-dcdya2hn.js")).PackageCommand,
28
+ module: async () => (await import("./module.command-ez5psv7q.js")).ModuleCommand,
29
+ page: async () => (await import("./page.command-he49r0vd.js")).PageCommand,
30
+ context: async () => (await import("./context.command-a0pwgc3v.js")).ContextCommand,
31
+ cloud: async () => (await import("./cloud.command-gegy1qxv.js")).CloudCommand,
32
+ guideline: async () => (await import("./guideline.command-83p3y9w7.js")).GuidelineCommand,
33
+ scalar: async () => (await import("./scalar.command-q4ravcd9.js")).ScalarCommand,
34
+ primitive: async () => (await import("./primitive.command-w2hyrf9c.js")).PrimitiveCommand,
35
+ quality: async () => (await import("./quality.command-8xewbve2.js")).QualityCommand,
36
+ repair: async () => (await import("./repair.command-9f9wy32e.js")).RepairCommand,
37
+ workflow: async () => (await import("./workflow.command-3stj54ek.js")).WorkflowCommand
38
38
  };
39
39
  var commandModuleIds = Object.keys(commandModules);
40
40
 
@@ -1,13 +1,13 @@
1
1
  // @bun
2
2
  import {
3
3
  LibraryScript
4
- } from "./index-f0t3wjyr.js";
4
+ } from "./index-emsw8h3b.js";
5
5
  import {
6
6
  Lib,
7
7
  Workspace,
8
8
  command
9
- } from "./index-ckpwq052.js";
10
- import"./index-681sx6nt.js";
9
+ } from "./index-qch3r961.js";
10
+ import"./index-n57kkvtg.js";
11
11
  import"./index-f39512t6.js";
12
12
  import"./index-mxvakhsm.js";
13
13
  import"./index-1577bej2.js";
@@ -2,27 +2,27 @@
2
2
  import {
3
3
  CloudRunner,
4
4
  getNpmRegistryUrl
5
- } from "./index-8md8zszv.js";
5
+ } from "./index-wm5hw5mr.js";
6
6
  import {
7
7
  PackageScript
8
- } from "./index-x1dbhd80.js";
8
+ } from "./index-j35ceh2c.js";
9
9
  import"./index-sh01r3pm.js";
10
10
  import {
11
11
  ApplicationScript
12
- } from "./index-r8z20vnj.js";
13
- import"./index-f0t3wjyr.js";
12
+ } from "./index-m285dkby.js";
13
+ import"./index-emsw8h3b.js";
14
14
  import"./index-76rn3g2c.js";
15
15
  import {
16
16
  Workspace,
17
17
  command,
18
18
  runner,
19
19
  script
20
- } from "./index-ckpwq052.js";
20
+ } from "./index-qch3r961.js";
21
21
  import"./index-fgc8r6dj.js";
22
22
  import"./index-5vy2jzar.js";
23
23
  import {
24
24
  PkgExecutor
25
- } from "./index-681sx6nt.js";
25
+ } from "./index-n57kkvtg.js";
26
26
  import"./index-f39512t6.js";
27
27
  import"./index-mxvakhsm.js";
28
28
  import"./index-1577bej2.js";
@@ -1,20 +1,20 @@
1
1
  // @bun
2
2
  import {
3
3
  ModuleScript
4
- } from "./index-tn46rr6w.js";
4
+ } from "./index-27jj517n.js";
5
5
  import"./index-ss469dec.js";
6
- import"./index-kkya2ped.js";
6
+ import"./index-4etexq7j.js";
7
7
  import"./index-sh01r3pm.js";
8
8
  import {
9
9
  renderPrimitiveReport
10
- } from "./index-g44fykfw.js";
10
+ } from "./index-mr02v9xp.js";
11
11
  import"./index-j37qq1f2.js";
12
12
  import {
13
13
  Module,
14
14
  Sys,
15
15
  command
16
- } from "./index-ckpwq052.js";
17
- import"./index-681sx6nt.js";
16
+ } from "./index-qch3r961.js";
17
+ import"./index-n57kkvtg.js";
18
18
  import"./index-f39512t6.js";
19
19
  import"./index-mxvakhsm.js";
20
20
  import"./index-1577bej2.js";
@@ -1,13 +1,13 @@
1
1
  // @bun
2
2
  import {
3
3
  PackageScript
4
- } from "./index-x1dbhd80.js";
4
+ } from "./index-j35ceh2c.js";
5
5
  import {
6
6
  Pkg,
7
7
  Workspace,
8
8
  command
9
- } from "./index-ckpwq052.js";
10
- import"./index-681sx6nt.js";
9
+ } from "./index-qch3r961.js";
10
+ import"./index-n57kkvtg.js";
11
11
  import"./index-f39512t6.js";
12
12
  import"./index-mxvakhsm.js";
13
13
  import"./index-1577bej2.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akanjs/cli",
3
- "version": "3.0.0-alpha.63",
3
+ "version": "3.0.0-alpha.65",
4
4
  "sourceType": "module",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -34,7 +34,7 @@
34
34
  "@langchain/openai": "^1.4.6",
35
35
  "@tailwindcss/node": "^4.3.0",
36
36
  "@trapezedev/project": "^7.1.4",
37
- "akanjs": "3.0.0-alpha.63",
37
+ "akanjs": "3.0.0-alpha.65",
38
38
  "chalk": "^5.6.2",
39
39
  "commander": "^14.0.3",
40
40
  "dayjs": "^1.11.20",
@@ -1,13 +1,13 @@
1
1
  // @bun
2
2
  import {
3
3
  PageScript
4
- } from "./index-kkya2ped.js";
4
+ } from "./index-4etexq7j.js";
5
5
  import {
6
6
  App,
7
7
  Module,
8
8
  command
9
- } from "./index-ckpwq052.js";
10
- import"./index-681sx6nt.js";
9
+ } from "./index-qch3r961.js";
10
+ import"./index-n57kkvtg.js";
11
11
  import"./index-f39512t6.js";
12
12
  import"./index-mxvakhsm.js";
13
13
  import"./index-1577bej2.js";
@@ -1,20 +1,20 @@
1
1
  // @bun
2
2
  import {
3
3
  PrimitiveScript
4
- } from "./index-cc1mgv1f.js";
5
- import"./index-tn46rr6w.js";
4
+ } from "./index-rzekxec9.js";
5
+ import"./index-27jj517n.js";
6
6
  import"./index-ss469dec.js";
7
- import"./index-kkya2ped.js";
7
+ import"./index-4etexq7j.js";
8
8
  import"./index-sh01r3pm.js";
9
9
  import {
10
10
  renderPrimitiveReport
11
- } from "./index-g44fykfw.js";
11
+ } from "./index-mr02v9xp.js";
12
12
  import"./index-j37qq1f2.js";
13
13
  import {
14
14
  Workspace,
15
15
  command
16
- } from "./index-ckpwq052.js";
17
- import"./index-681sx6nt.js";
16
+ } from "./index-qch3r961.js";
17
+ import"./index-n57kkvtg.js";
18
18
  import"./index-f39512t6.js";
19
19
  import"./index-mxvakhsm.js";
20
20
  import"./index-1577bej2.js";
@@ -7,12 +7,12 @@ import {
7
7
  command,
8
8
  runner,
9
9
  script
10
- } from "./index-ckpwq052.js";
10
+ } from "./index-qch3r961.js";
11
11
  import {
12
12
  isAllowedLibFacetRootFile,
13
13
  rootAllowedDirs,
14
14
  rootAllowedFiles
15
- } from "./index-681sx6nt.js";
15
+ } from "./index-n57kkvtg.js";
16
16
  import"./index-f39512t6.js";
17
17
  import"./index-mxvakhsm.js";
18
18
  import"./index-1577bej2.js";
@@ -1,15 +1,15 @@
1
1
  // @bun
2
2
  import {
3
3
  RepairRunner
4
- } from "./index-ryns915y.js";
5
- import"./index-wc19q8mb.js";
6
- import"./index-g44fykfw.js";
4
+ } from "./index-4sgv0wcr.js";
5
+ import"./index-v76gy4dn.js";
6
+ import"./index-mr02v9xp.js";
7
7
  import {
8
8
  Workspace,
9
9
  command,
10
10
  script
11
- } from "./index-ckpwq052.js";
12
- import"./index-681sx6nt.js";
11
+ } from "./index-qch3r961.js";
12
+ import"./index-n57kkvtg.js";
13
13
  import"./index-f39512t6.js";
14
14
  import"./index-mxvakhsm.js";
15
15
  import"./index-xys926f2.js";
@@ -1,18 +1,18 @@
1
1
  // @bun
2
2
  import {
3
3
  ScalarScript
4
- } from "./index-4mtyaqj2.js";
4
+ } from "./index-rm7xj6bc.js";
5
5
  import"./index-ss469dec.js";
6
6
  import"./index-sh01r3pm.js";
7
7
  import {
8
8
  renderPrimitiveReport
9
- } from "./index-g44fykfw.js";
9
+ } from "./index-mr02v9xp.js";
10
10
  import"./index-j37qq1f2.js";
11
11
  import {
12
12
  Sys,
13
13
  command
14
- } from "./index-ckpwq052.js";
15
- import"./index-681sx6nt.js";
14
+ } from "./index-qch3r961.js";
15
+ import"./index-n57kkvtg.js";
16
16
  import"./index-f39512t6.js";
17
17
  import"./index-mxvakhsm.js";
18
18
  import"./index-1577bej2.js";
@@ -1,30 +1,30 @@
1
1
  // @bun
2
2
  import {
3
3
  WorkflowRunner
4
- } from "./index-dvg362vq.js";
4
+ } from "./index-ejr3h3wc.js";
5
5
  import {
6
6
  ScalarScript
7
- } from "./index-4mtyaqj2.js";
7
+ } from "./index-rm7xj6bc.js";
8
8
  import {
9
9
  PrimitiveScript
10
- } from "./index-cc1mgv1f.js";
10
+ } from "./index-rzekxec9.js";
11
11
  import {
12
12
  ModuleScript
13
- } from "./index-tn46rr6w.js";
13
+ } from "./index-27jj517n.js";
14
14
  import"./index-ss469dec.js";
15
- import"./index-kkya2ped.js";
15
+ import"./index-4etexq7j.js";
16
16
  import"./index-sh01r3pm.js";
17
- import"./index-wc19q8mb.js";
17
+ import"./index-v76gy4dn.js";
18
18
  import {
19
19
  createWorkflowStepRegistry
20
- } from "./index-g44fykfw.js";
20
+ } from "./index-mr02v9xp.js";
21
21
  import"./index-j37qq1f2.js";
22
22
  import {
23
23
  Workspace,
24
24
  command,
25
25
  script
26
- } from "./index-ckpwq052.js";
27
- import"./index-681sx6nt.js";
26
+ } from "./index-qch3r961.js";
27
+ import"./index-n57kkvtg.js";
28
28
  import"./index-f39512t6.js";
29
29
  import"./index-mxvakhsm.js";
30
30
  import"./index-xys926f2.js";
@@ -1,40 +1,40 @@
1
1
  // @bun
2
2
  import {
3
3
  ContextScript
4
- } from "./index-ek4mkwxp.js";
5
- import"./index-ryns915y.js";
6
- import"./index-dvg362vq.js";
7
- import"./index-4mtyaqj2.js";
8
- import"./index-cc1mgv1f.js";
9
- import"./index-tn46rr6w.js";
4
+ } from "./index-1t5r09v4.js";
5
+ import"./index-4sgv0wcr.js";
6
+ import"./index-ejr3h3wc.js";
7
+ import"./index-rm7xj6bc.js";
8
+ import"./index-rzekxec9.js";
9
+ import"./index-27jj517n.js";
10
10
  import"./index-ss469dec.js";
11
- import"./index-kkya2ped.js";
11
+ import"./index-4etexq7j.js";
12
12
  import {
13
13
  CloudScript
14
- } from "./index-0g9ajdz8.js";
14
+ } from "./index-db89awmp.js";
15
15
  import {
16
16
  getLatestPackageVersion,
17
17
  getNpmRegistryUrl
18
- } from "./index-8md8zszv.js";
18
+ } from "./index-wm5hw5mr.js";
19
19
  import {
20
20
  PackageScript
21
- } from "./index-x1dbhd80.js";
22
- import"./index-ce9755av.js";
21
+ } from "./index-j35ceh2c.js";
22
+ import"./index-cwa0jvjt.js";
23
23
  import {
24
24
  GlobalConfig
25
25
  } from "./index-sh01r3pm.js";
26
26
  import {
27
27
  AgentScript
28
- } from "./index-h0mnt0b0.js";
29
- import"./index-wc19q8mb.js";
30
- import"./index-g44fykfw.js";
28
+ } from "./index-wxc9p0n0.js";
29
+ import"./index-v76gy4dn.js";
30
+ import"./index-mr02v9xp.js";
31
31
  import"./index-j37qq1f2.js";
32
32
  import {
33
33
  ApplicationScript
34
- } from "./index-r8z20vnj.js";
34
+ } from "./index-m285dkby.js";
35
35
  import {
36
36
  LibraryScript
37
- } from "./index-f0t3wjyr.js";
37
+ } from "./index-emsw8h3b.js";
38
38
  import"./index-76rn3g2c.js";
39
39
  import {
40
40
  Exec,
@@ -42,7 +42,7 @@ import {
42
42
  command,
43
43
  runner,
44
44
  script
45
- } from "./index-ckpwq052.js";
45
+ } from "./index-qch3r961.js";
46
46
  import"./index-fgc8r6dj.js";
47
47
  import {
48
48
  ThemeValidator,
@@ -59,7 +59,7 @@ import {
59
59
  collectScopeRecipeSources,
60
60
  extractAgentBlock,
61
61
  renderScopeAgentBlock
62
- } from "./index-681sx6nt.js";
62
+ } from "./index-n57kkvtg.js";
63
63
  import"./index-f39512t6.js";
64
64
  import"./index-mxvakhsm.js";
65
65
  import {