@akanjs/cli 3.0.0-alpha.96 → 3.0.0-alpha.98

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.
package/.build-stamp CHANGED
@@ -1 +1 @@
1
- 97b04ea43cf58fa306823f262329027509339fbc8e621c950b73f9c701d2c2f5
1
+ 0c4679d28a49e946ce43ea1d5ce8a4fe26f612a4ba3e51ad5ce716ce794ef12f
@@ -12,9 +12,9 @@ import"./index-q8sn827n.js";
12
12
  import"./index-6wwzs1bc.js";
13
13
  import {
14
14
  ApplicationScript
15
- } from "./index-hk3ms50t.js";
15
+ } from "./index-8qcydz5h.js";
16
16
  import"./index-zkvpaggp.js";
17
- import"./index-9wtbw98m.js";
17
+ import"./index-hwkygn9s.js";
18
18
  import {
19
19
  AbstractDoc
20
20
  } from "./index-meh558jy.js";
@@ -11,7 +11,7 @@ import {
11
11
  } from "./index-jydtyzva.js";
12
12
  import"./index-w8kmx1b6.js";
13
13
  import"./index-q0y2jq9j.js";
14
- import"./index-9wtbw98m.js";
14
+ import"./index-hwkygn9s.js";
15
15
  import"./index-n68jx79w.js";
16
16
 
17
17
  // pkgs/@akanjs/devkit/applicationBuildRunner.ts
@@ -13,7 +13,7 @@ import {
13
13
  SsrBaseArtifactBuilder
14
14
  } from "./index-jydtyzva.js";
15
15
  import"./index-w8kmx1b6.js";
16
- import"./index-9wtbw98m.js";
16
+ import"./index-hwkygn9s.js";
17
17
  import"./index-n68jx79w.js";
18
18
 
19
19
  // pkgs/@akanjs/devkit/incrementalBuilder/buildBatch.proc.ts
@@ -9,15 +9,15 @@ import {
9
9
  } from "./index-cezy7yb3.js";
10
10
  import"./index-q8sn827n.js";
11
11
  import"./index-6wwzs1bc.js";
12
- import"./index-hk3ms50t.js";
12
+ import"./index-8qcydz5h.js";
13
13
  import"./index-zkvpaggp.js";
14
- import"./index-9wtbw98m.js";
14
+ import"./index-hwkygn9s.js";
15
15
  import"./index-kcxmv48c.js";
16
16
  import"./index-sjak5v5b.js";
17
- import"./index-6y5sthxr.js";
17
+ import"./index-vp0509kc.js";
18
18
  import {
19
19
  CloudScript
20
- } from "./index-tfz4faj3.js";
20
+ } from "./index-4ravxy65.js";
21
21
  import"./index-pvb4vdwr.js";
22
22
 
23
23
  // pkgs/@akanjs/cli/cloud/cloud.command.ts
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  openBrowser
4
- } from "./index-hk3ms50t.js";
4
+ } from "./index-8qcydz5h.js";
5
5
 
6
6
  // pkgs/@akanjs/cli/application/devTui.tsx
7
7
  import { render } from "ink";
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  // pkgs/@akanjs/cli/application/devTuiView.ts
3
3
  var createDevTuiView = async (supervisor) => {
4
- const { DevTui } = await import("./devTui-m7a5gzet.js");
4
+ const { DevTui } = await import("./devTui-jbn7cjfg.js");
5
5
  return new DevTui(supervisor);
6
6
  };
7
7
  export {
@@ -516,6 +516,13 @@ Full contract — filter-arg `ref` pickers, `getQueryMeta` summary counters, `la
516
516
  - A slice's `exec` returns a `QueryOf` (an opaque query descriptor); you **cannot** chain `.sort()`/`.limit()` on
517
517
  it. Apply ordering/paging via the store `init` fetch option instead: `initX(..., { sort, page, limit })`. For a
518
518
  chainable builder use the model facade's `findMany`/`findOne`.
519
+ - **A slice list is either one window or an accumulated one.** `setPageOf<Model>` swaps the window;
520
+ `loadMoreOf<Model>()` appends the rows after the ones loaded and takes **no page number** — it skips by
521
+ `<model>List.length`, so the offset cannot drift from what is on screen when a live insertion moves the server's
522
+ baseline, and `pageOf<Model>` stays 1, which is what keeps live placement (first page only) working past the
523
+ first "more". `isCumulativeOf<Model>` is the mode.
524
+ - **"Is there more" is `hasMoreOf<Model>`, never `count > page * limit`.** It comes from the length of the batch
525
+ the server returned, so it survives `{ insight: false }` and cannot drift from a count a live event moved.
519
526
  - **Hydrated vs raw:** server queries return hydrated `cnst.<Model>` instances (with `set`/`save`/`refresh`);
520
527
  client fetch results are raw `GetStateObject` plain data, functions stripped.
521
528
  - Every filter generates fourteen methods: `list` · `listIds` · `find` · `findId` · `pick` · `pickId` · `exists` ·
@@ -872,6 +879,11 @@ when two shapes disagree.
872
879
  from overlapping. `--kill` frees the dev ports first — it resolves each port's listener, walks up to the top
873
880
  of that akan dev tree and signals it, so another checkout's server or a stale orphan on the same port is
874
881
  reclaimed. A holder that is not recognisably an akan process is reported and left alone.
882
+ - **A dev server watches its own app directory and the libs it actually depends on**, transitively, resolved
883
+ once at boot from the synced manifests — so a save under a lib the app never imports rebuilds and reloads
884
+ nothing, and neither does a save in a sibling app. An import that makes a new lib a dependency needs a
885
+ fresh `akan start`, because it needs a `sync` first anyway. Before the first `sync` the manifests do not
886
+ exist yet and the whole `libs/` container is watched, which is the safe direction.
875
887
  - Test production build generation with `bun run akan build <appName>`.
876
888
  - To test a built artifact locally, run it from the generated app directory with the required Akan runtime environment variables.
877
889
 
@@ -31,6 +31,18 @@ with it. `conventions` carries the invariants — this is the full contract behi
31
31
  A model with none renders ids and says so in the picker.
32
32
  - A slice's `exec` returns a `QueryOf` (an opaque query descriptor, `pkgs/akanjs/constant/types.ts`); you **cannot** chain `.sort()`/`.limit()` on it.
33
33
  - Apply ordering/paging via the store `init` fetch option instead: `initX(..., { sort, page, limit })` (`pkgs/akanjs/fetch/fetchType/sliceFetch.type.ts`).
34
+ - **A slice list is either one window or an accumulated one, and the store says which.** `setPageOf<Model>` swaps
35
+ the window and `pageOf<Model>` names it; `loadMoreOf<Model>()` appends the rows *after* the ones already loaded
36
+ and takes no page number, because in an accumulated list no page number names anything. It skips by
37
+ `<model>List.length` rather than by `page * limit`, which is what keeps the offset from drifting from what is on
38
+ screen: a live insertion at the front moves the server's baseline by one, so a page number asks for rows the
39
+ list already shows. It also leaves `pageOf<Model>` at 1 — live placement is refused anywhere but the first page,
40
+ so paging by number used to switch live sync off permanently on the first "more", silently. `isCumulativeOf<Model>`
41
+ is the mode, and it is what stops a live insertion from truncating an accumulated list back to one page's worth.
42
+ - **"Is there more" is `hasMoreOf<Model>`, never `count > page * limit`.** It is set from the length of the batch
43
+ the server just returned, so it survives `{ insight: false }` — which makes no count query at all — and cannot
44
+ drift from the count a live event moved. `loadMoreOf<Model>()` is a no-op once it is false, and `Load.Units`
45
+ draws no infinite-scroll sentinel.
34
46
  - Generated list accessors like `listBy(...)` return `Promise<Doc[]>`. For a chainable builder (`.sort().skip().limit().select()`) use the model facade's `findMany`/`findOne` (`FindManyChain`, `pkgs/akanjs/document/into.ts`).
35
47
  - **Hydrated vs raw:** server queries return hydrated `cnst.<Model>` instances (with `set`/`save`/`refresh`); client fetch results are raw `GetStateObject` plain data (functions stripped, `pkgs/akanjs/base/types.ts`).
36
48
  - Every filter generates fourteen methods: `list` · `listIds` · `find` · `findId` · `pick` · `pickId` · `exists` ·
@@ -379,8 +379,8 @@ akan sync automatically generates APIs across all layers. Only write custom logi
379
379
  | `[model]` (cached full model), `[model]Loading`, `[model]Form`, `[model]Modal` | Base model states |
380
380
  | `create[Model](data)`, `update[Model](id, data)`, `remove[Model](id)` | CRUD actions |
381
381
  | `new[Model](partial)`, `edit[Model](model)`, `view[Model](model)` | Form/view state actions |
382
- | `[slice]List`, `[slice]InitList`, `[slice]Insight`, `[slice]Selection` | Slice states |
383
- | `init[Slice](args)`, `refresh[Slice]()`, `setPageOf[Slice](page)` | Slice actions |
382
+ | `[slice]List`, `[slice]InitList`, `[slice]Insight`, `[slice]Selection`, `hasMoreOf[Slice]` | Slice states |
383
+ | `init[Slice](args)`, `refresh[Slice]()`, `setPageOf[Slice](page)`, `loadMoreOf[Slice]()` | Slice actions |
384
384
  | `set[Field]On[Model](value)` | Auto-setters for each model field |
385
385
 
386
386
  **Rule**: Write custom store actions only for toast messages (`msg.loading`/`msg.success`) or multi-step workflows. State fields and CRUD actions are already auto-generated.
@@ -16,7 +16,7 @@ import {
16
16
  import {
17
17
  HmrWatcher,
18
18
  WatchRootResolver
19
- } from "./index-9wtbw98m.js";
19
+ } from "./index-hwkygn9s.js";
20
20
  import {
21
21
  prepareDevWatchBatch
22
22
  } from "./index-a5vmm6x4.js";
@@ -12,13 +12,13 @@ import {
12
12
  } from "./index-cezy7yb3.js";
13
13
  import {
14
14
  ApplicationScript
15
- } from "./index-hk3ms50t.js";
15
+ } from "./index-8qcydz5h.js";
16
16
  import {
17
17
  PackageScript
18
18
  } from "./index-sjak5v5b.js";
19
19
  import {
20
20
  CloudRunner
21
- } from "./index-6y5sthxr.js";
21
+ } from "./index-vp0509kc.js";
22
22
 
23
23
  // pkgs/@akanjs/cli/cloud/cloud.script.ts
24
24
  import { Logger } from "akanjs/common";
@@ -15,7 +15,7 @@ import {
15
15
  import {
16
16
  HmrWatcher,
17
17
  WatchRootResolver
18
- } from "./index-9wtbw98m.js";
18
+ } from "./index-hwkygn9s.js";
19
19
  import {
20
20
  SlicePlanner,
21
21
  formatSlicePlan
@@ -1964,7 +1964,7 @@ ${uniqueCandidates.map((candidate) => ` - ${candidate}`).join(`
1964
1964
  // pkgs/@akanjs/cli/application/application.runner.ts
1965
1965
  import { Logger as Logger4 } from "akanjs/common";
1966
1966
  import ora from "ora";
1967
- var loadBuildRunner = async () => (await import("./applicationBuildRunner-cpajk38f.js")).ApplicationBuildRunner;
1967
+ var loadBuildRunner = async () => (await import("./applicationBuildRunner-nqvj15x7.js")).ApplicationBuildRunner;
1968
1968
  var loadReleasePackager = async () => (await import("./applicationReleasePackager-3wh58n2m.js")).ApplicationReleasePackager;
1969
1969
  var loadCapacitorApp = async () => (await import("./capacitorApp-gzcx6txb.js")).CapacitorApp;
1970
1970
  var loadAbstractCompactor = async () => (await import("./abstractCompactor-cefxzggj.js")).AbstractCompactor;
@@ -3040,7 +3040,7 @@ class ApplicationScript extends script("application", [ApplicationRunner, Librar
3040
3040
  throw new Error("No app selected to start");
3041
3041
  const startedDatabase = dbup ? await this.#prepareSharedDatabase(apps) : false;
3042
3042
  const supervisor = new DevSupervisor({ apps, mode, concurrency, open, write });
3043
- const view = mode === "tui" ? await (await import("./devTuiView-gb7ta8rv.js")).createDevTuiView(supervisor) : new DevStreamView(apps.map((app) => app.name));
3043
+ const view = mode === "tui" ? await (await import("./devTuiView-2jffndk4.js")).createDevTuiView(supervisor) : new DevStreamView(apps.map((app) => app.name));
3044
3044
  await supervisor.run(view);
3045
3045
  if (startedDatabase)
3046
3046
  await this.#stopDatabase(workspace);
@@ -463,6 +463,7 @@ class HmrWatcher {
463
463
 
464
464
  // pkgs/@akanjs/devkit/frontendBuild/watchRootResolver.ts
465
465
  import fs2 from "fs";
466
+ import { readFile } from "fs/promises";
466
467
  import path4 from "path";
467
468
 
468
469
  class WatchRootResolver {
@@ -474,6 +475,8 @@ class WatchRootResolver {
474
475
  const tsconfig = await this.#app.getTsConfig();
475
476
  const appDir = path4.resolve(this.#app.cwdPath);
476
477
  const appsContainer = path4.dirname(appDir);
478
+ const libsContainer = path4.resolve(this.#app.workspace.workspaceRoot, "libs");
479
+ const libRoots = await this.#resolveLibRoots(libsContainer);
477
480
  const set = new Set;
478
481
  set.add(path4.resolve(`${this.#app.cwdPath}/page`));
479
482
  for (const targets of Object.values(tsconfig.compilerOptions.paths ?? {})) {
@@ -484,6 +487,11 @@ class WatchRootResolver {
484
487
  continue;
485
488
  const cleaned = target.replace(/\/?\*+.*$/, "").replace(/\/[^/]+\.[^/]+$/, "");
486
489
  const resolved = path4.resolve(this.#app.workspace.workspaceRoot, cleaned);
490
+ if (resolved === libsContainer && libRoots) {
491
+ for (const root of libRoots)
492
+ set.add(root);
493
+ continue;
494
+ }
487
495
  const root = resolved === appsContainer ? appDir : resolved;
488
496
  if (fs2.existsSync(root))
489
497
  set.add(root);
@@ -491,6 +499,43 @@ class WatchRootResolver {
491
499
  }
492
500
  return [...set];
493
501
  }
502
+ async#resolveLibRoots(libsContainer) {
503
+ const libDeps = await this.#resolveLibDeps(libsContainer);
504
+ if (!libDeps)
505
+ return null;
506
+ return libDeps.map((name) => path4.join(libsContainer, name)).filter((dir) => fs2.existsSync(dir));
507
+ }
508
+ async#resolveLibDeps(libsContainer) {
509
+ const scanInfo = this.#app.getScanInfo({ allowEmpty: true });
510
+ if (scanInfo?.type === "app")
511
+ return scanInfo.libDeps;
512
+ const direct = await WatchRootResolver.#readManifestLibDeps(path4.join(this.#app.cwdPath, "akan.app.json"));
513
+ if (!direct)
514
+ return null;
515
+ const closure = new Set;
516
+ const queue = [...direct];
517
+ while (queue.length > 0) {
518
+ const name = queue.shift();
519
+ if (!name || closure.has(name))
520
+ continue;
521
+ closure.add(name);
522
+ const nested = await WatchRootResolver.#readManifestLibDeps(path4.join(libsContainer, name, "akan.lib.json"));
523
+ if (!nested)
524
+ return null;
525
+ queue.push(...nested);
526
+ }
527
+ return [...closure];
528
+ }
529
+ static async#readManifestLibDeps(manifestPath) {
530
+ try {
531
+ const parsed = JSON.parse(await readFile(manifestPath, "utf8"));
532
+ if (!Array.isArray(parsed.libDeps))
533
+ return null;
534
+ return parsed.libDeps.filter((name) => typeof name === "string" && name.length > 0);
535
+ } catch {
536
+ return null;
537
+ }
538
+ }
494
539
  }
495
540
 
496
541
  export { HmrWatcher, WatchRootResolver };
@@ -14,7 +14,7 @@ import {
14
14
  } from "./index-cezy7yb3.js";
15
15
  import {
16
16
  openBrowser
17
- } from "./index-hk3ms50t.js";
17
+ } from "./index-8qcydz5h.js";
18
18
 
19
19
  // pkgs/@akanjs/cli/npmRegistry.ts
20
20
  var defaultNpmRegistry = "https://registry.npmjs.org";
package/index.js CHANGED
@@ -14,16 +14,16 @@ import path from "path";
14
14
 
15
15
  // pkgs/@akanjs/cli/commandModules.ts
16
16
  var commandModules = {
17
- workspace: async () => (await import("./workspace.command-w7ennb3r.js")).WorkspaceCommand,
17
+ workspace: async () => (await import("./workspace.command-t2v12ewm.js")).WorkspaceCommand,
18
18
  agent: async () => (await import("./agent.command-r93wmq7m.js")).AgentCommand,
19
- application: async () => (await import("./application.command-b4jch2m8.js")).ApplicationCommand,
19
+ application: async () => (await import("./application.command-c4zsbmjj.js")).ApplicationCommand,
20
20
  library: async () => (await import("./library.command-em103wtn.js")).LibraryCommand,
21
- localRegistry: async () => (await import("./localRegistry.command-bqpjr1ck.js")).LocalRegistryCommand,
21
+ localRegistry: async () => (await import("./localRegistry.command-81acqng9.js")).LocalRegistryCommand,
22
22
  package: async () => (await import("./package.command-rfhyf38t.js")).PackageCommand,
23
23
  module: async () => (await import("./module.command-451pztkc.js")).ModuleCommand,
24
24
  page: async () => (await import("./page.command-kt19da5g.js")).PageCommand,
25
25
  context: async () => (await import("./context.command-qd8kqrnh.js")).ContextCommand,
26
- cloud: async () => (await import("./cloud.command-xgxxq49a.js")).CloudCommand,
26
+ cloud: async () => (await import("./cloud.command-me9e9dwb.js")).CloudCommand,
27
27
  subspace: async () => (await import("./subspace.command-kqzqtk0p.js")).SubspaceCommand,
28
28
  guideline: async () => (await import("./guideline.command-f38x8jhw.js")).GuidelineCommand,
29
29
  scalar: async () => (await import("./scalar.command-jcf4e5sv.js")).ScalarCommand,
@@ -12,14 +12,14 @@ import {
12
12
  import"./index-6wwzs1bc.js";
13
13
  import {
14
14
  ApplicationScript
15
- } from "./index-hk3ms50t.js";
15
+ } from "./index-8qcydz5h.js";
16
16
  import"./index-zkvpaggp.js";
17
- import"./index-9wtbw98m.js";
17
+ import"./index-hwkygn9s.js";
18
18
  import"./index-n85fer99.js";
19
19
  import {
20
20
  getNpmRegistryUrl,
21
21
  CloudRunner
22
- } from "./index-6y5sthxr.js";
22
+ } from "./index-vp0509kc.js";
23
23
  import"./index-kcxmv48c.js";
24
24
  import {
25
25
  PackageScript
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akanjs/cli",
3
- "version": "3.0.0-alpha.96",
3
+ "version": "3.0.0-alpha.98",
4
4
  "sourceType": "module",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -33,7 +33,7 @@
33
33
  "@langchain/openai": "^1.4.6",
34
34
  "@tailwindcss/node": "^4.3.0",
35
35
  "@trapezedev/project": "^7.1.4",
36
- "akanjs": "3.0.0-alpha.96",
36
+ "akanjs": "3.0.0-alpha.98",
37
37
  "chalk": "^5.6.2",
38
38
  "commander": "^14.0.3",
39
39
  "dayjs": "^1.11.20",
@@ -40,11 +40,11 @@ import {
40
40
  } from "./index-rntcdss1.js";
41
41
  import {
42
42
  ApplicationScript
43
- } from "./index-hk3ms50t.js";
43
+ } from "./index-8qcydz5h.js";
44
44
  import {
45
45
  LibraryScript
46
46
  } from "./index-zkvpaggp.js";
47
- import"./index-9wtbw98m.js";
47
+ import"./index-hwkygn9s.js";
48
48
  import"./index-kcxmv48c.js";
49
49
  import {
50
50
  PackageScript
@@ -52,10 +52,10 @@ import {
52
52
  import {
53
53
  getNpmRegistryUrl,
54
54
  getLatestPackageVersion
55
- } from "./index-6y5sthxr.js";
55
+ } from "./index-vp0509kc.js";
56
56
  import {
57
57
  CloudScript
58
- } from "./index-tfz4faj3.js";
58
+ } from "./index-4ravxy65.js";
59
59
  import {
60
60
  ContextScript
61
61
  } from "./index-r50qen0z.js";