@akanjs/cli 3.0.0-beta.29 → 3.0.0-beta.30

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 (61) hide show
  1. package/.build-stamp +1 -1
  2. package/{CodeAgent-86q8d13j.js → CodeAgent-xnfyyz8h.js} +2 -2
  3. package/{CodeTui-r8tgxsyb.js → CodeTui-h66xb1fh.js} +1 -1
  4. package/README.ko.md +72 -0
  5. package/README.md +88 -0
  6. package/{agent.command-q9bmqrag.js → agent.command-c4v7kjff.js} +5 -5
  7. package/akanCode.js +2 -2
  8. package/{application.command-712jd2z8.js → application.command-yzsswrz6.js} +9 -9
  9. package/{applicationBuildRunner-ez37p161.js → applicationBuildRunner-qkt6spd5.js} +3 -3
  10. package/buildBatch.proc.js +3 -3
  11. package/{cloud.command-8eegwcsc.js → cloud.command-v8h688jc.js} +9 -9
  12. package/cloud.script-yct1sk4k.js +20 -0
  13. package/{code.command-n0c2tyzx.js → code.command-jff3tw7y.js} +6 -6
  14. package/{context.command-vxf6d7q2.js → context.command-y5sevk3c.js} +14 -14
  15. package/context.runner-90hsmacr.js +21 -0
  16. package/{guideline.command-ene55fkr.js → guideline.command-11cndccb.js} +2 -2
  17. package/guidelines/conventions/conventions.instruction.md +27 -14
  18. package/guidelines/runtimeRule/runtimeRule.instruction.md +90 -17
  19. package/guidelines/workspaceOnboarding/workspaceOnboarding.instruction.md +20 -0
  20. package/incrementalBuilder.proc.js +2 -2
  21. package/{index-2z30v4k5.js → index-0ncc0mbk.js} +3 -3
  22. package/{index-2yvy9ztj.js → index-167c77aq.js} +4 -4
  23. package/{index-nbg9bfnr.js → index-35mmm9ca.js} +1 -1
  24. package/{index-fy42hyb9.js → index-376gpdds.js} +5 -5
  25. package/{index-n9gxx7bp.js → index-3rh7thcx.js} +13 -13
  26. package/{index-rrt9pnb4.js → index-5rp0h6na.js} +2 -2
  27. package/{index-ttn00pr3.js → index-6x9p8dpb.js} +1 -1
  28. package/{index-8ej6r02m.js → index-8tv7356t.js} +1 -1
  29. package/{index-k7809wmg.js → index-a4s954kq.js} +2 -2
  30. package/{index-rbeahw6j.js → index-bxmejydw.js} +3 -3
  31. package/{index-qtz88kh0.js → index-gxamdf18.js} +2 -2
  32. package/{index-20r2g1t3.js → index-hf6f4xnb.js} +4 -4
  33. package/{index-2s2e5qnd.js → index-hmdq5pqm.js} +1 -1
  34. package/{index-16k7m3cs.js → index-hqd0h1pb.js} +10 -10
  35. package/{index-1hs6jrys.js → index-kb16nzyt.js} +36 -33
  36. package/{index-krwz9ek9.js → index-mk3b9rk1.js} +3 -3
  37. package/{index-r8gp8zk3.js → index-n3jk2501.js} +155 -152
  38. package/{index-g44da4r2.js → index-qcejqgts.js} +5 -5
  39. package/{index-h9ed99ax.js → index-rtwhw4aq.js} +7 -7
  40. package/{index-ss828r32.js → index-se643zvp.js} +1 -1
  41. package/{index-2ctqegdm.js → index-tsb0f8ya.js} +2 -2
  42. package/{index-0pqzrbpr.js → index-tzc1gtrg.js} +2 -2
  43. package/{index-genegfnt.js → index-wfwgcnyc.js} +4 -4
  44. package/{index-b68zfsvz.js → index-xb7qhxa8.js} +1 -1
  45. package/index.js +21 -21
  46. package/{library.command-tz7vnwea.js → library.command-n9kp7yms.js} +3 -3
  47. package/{localRegistry.command-7dd85czz.js → localRegistry.command-jx6kxt2x.js} +8 -8
  48. package/{module.command-qhc9ns0s.js → module.command-q2xjf6cx.js} +5 -5
  49. package/{package.command-z3epnvas.js → package.command-q5a3nsw5.js} +3 -3
  50. package/package.json +3 -3
  51. package/{page.command-exd2vakz.js → page.command-ppenrxjn.js} +3 -3
  52. package/{primitive.command-0w6cha4j.js → primitive.command-dvgg8nem.js} +6 -6
  53. package/{quality.command-je4kc9yv.js → quality.command-pz7kg3pc.js} +2 -2
  54. package/{repair.command-knvwfgtg.js → repair.command-a6py9xvz.js} +5 -5
  55. package/{scalar.command-60nxfchc.js → scalar.command-7f3xfpen.js} +4 -4
  56. package/{subspace.command-683qxcw9.js → subspace.command-z7nqs508.js} +4 -4
  57. package/{tunnel.command-7m2kxtat.js → tunnel.command-zy4wbcgt.js} +2 -2
  58. package/{workflow.command-j5tk13ds.js → workflow.command-f142t17s.js} +10 -10
  59. package/{workspace.command-jxdm0wrb.js → workspace.command-gpk1149x.js} +20 -20
  60. package/cloud.script-55s1cmz9.js +0 -20
  61. package/context.runner-70r2fmty.js +0 -21
@@ -1,4 +1,4 @@
1
- # Runtime Rule — Serving, Processes, Logging, Image, Desktop Server, Assets
1
+ # Runtime Rule — Serving, Processes, Logging, Image, Native Apps, Desktop Server, Assets
2
2
 
3
3
  How an Akan app is built, what it serves, how many processes it runs, where its logs go, and what ends up in
4
4
  its image. Everything here is declared in `akan.config.ts` or narrowed by an env at boot; none of it is reached
@@ -11,14 +11,14 @@ on; the other two are declared in `akan.config.ts` as **`web: true | false | { c
11
11
  narrowed again per deployment.
12
12
 
13
13
  ```ts
14
- const config: AppConfig = { web: { csr: false } }; // web without the mobile bundle
14
+ const config: AppConfig = { web: { csr: false } }; // web without the CSR bundle the native apps ship
15
15
  const config: AppConfig = { web: false }; // api only
16
16
  ```
17
17
 
18
18
  - **`web: { csr: false }`** drops the CSR build phase and the `/__csr` + `?csr=true` routes. The CSR bundle is
19
- what the native mobile build ships, so a web-only deployment never needs it — and an app that declares a
20
- `mobile` section is refused, because `akan build-ios` copies `dist/apps/<app>/csr/<target>.html` into the
21
- target's web root, `.akan/mobile/<target>/web`.
19
+ what the native apps ship, so a web-only deployment never needs it — and an app that declares a `native` section
20
+ is refused, because every native build copies `dist/apps/<app>/csr/<target>.html` into the target's web root,
21
+ `.akan/native/<target>/web`.
22
22
  - **`web: false`** is an API-only build: no base artifact, no pages or client bundles, no RSC worker
23
23
  entrypoint, and no `public/` in the image (the web router's catch-all is its only reader). Nothing under
24
24
  `page/` is served, including routes a lib contributed through `syncPageLibs`.
@@ -184,16 +184,88 @@ const config: AppConfig = { docker: "FROM oven/bun:1-slim\n…" }; // verbatim,
184
184
  - `AkanAppConfig.docker` is the resolved declaration; `AkanAppConfig.dockerfile` is the text `akan build` writes
185
185
  to `dist/apps/<app>/Dockerfile`.
186
186
 
187
+ ## Native Apps — The `native` Section
188
+
189
+ An app's iOS, Android and desktop (macOS, Windows, Linux) apps are the `native` section of its `akan.config.ts`.
190
+ Each ships the CSR bundle on the native runtime, so one set of pages serves the web and every app.
191
+
192
+ ```ts
193
+ const config: AppConfig = {
194
+ native: {
195
+ appName: "Board",
196
+ appId: "com.example.board", // or one per platform: { default, ios, android, macos, windows, linux }
197
+ version: "1.2.0",
198
+ buildNum: 12,
199
+ indexPath: "/explore", // the first page, and where a deep link's stack and a back with no history land
200
+ permissions: ["camera", "push"],
201
+ plugins: ["file-picker", "keep-awake"],
202
+ deepLinks: { schemes: ["board"], domains: ["board.example.com"] },
203
+ ios: { teamId: "ABCDE12345" }, // universal links for deepLinks.domains
204
+ android: { googleServices: "secrets/google-services.json", sha256CertFingerprints: ["…"] }, // FCM, app links
205
+ desktop: { server: true },
206
+ },
207
+ };
208
+ ```
209
+
210
+ - **Without `targets` the app has one target, `default`** — the usual case, with every setting in the section
211
+ itself; `native: { desktop: { server: true } }` alone is a whole desktop app that carries its server. Defaults:
212
+ the app's folder name for `appName` and `fileName`, an id made from the repository's and the app's names for
213
+ `appId`, `0.0.1` and `1`.
214
+ - **A target is another app made from the section.** It has the section's shape minus `targets` and overrides it
215
+ field by field: plain objects merge key by key — `ios`, `android`, `desktop`, `deepLinks`, `updates` and the
216
+ objects inside them — and every other value replaces the section's, a list included, so a target's `plugins` or
217
+ `permissions` is its whole list. An `icon` or `splash` object is one value. Once `targets` is declared, only the
218
+ targets it names are built:
219
+
220
+ ```ts
221
+ native: {
222
+ appId: "com.example.board",
223
+ plugins: ["file-picker"],
224
+ targets: {
225
+ board: {},
226
+ lobby: { appId: "com.example.lobby", plugins: ["file-picker", "keep-awake"], desktop: { recovery: "reload" } },
227
+ },
228
+ },
229
+ ```
230
+
231
+ - **`basePath` is the client a target opens.** An app with no basePaths leaves it out. Without `targets`, the one
232
+ target opens the basePath named like the app when there is one; in an app with basePaths, a target that names
233
+ none is a template, and `--target <basePath>` builds that client from it.
234
+ - Every native command takes `--target <name>`. `build-*`, `release-*`, `update-keygen` and `publish-update` also
235
+ take `all`; `start-*` and `pack-update` handle one target at a time.
236
+ - **Everything a build makes is under `apps/<app>/.akan/native/<target>/`**: `build/<platform>` (`build-ios`,
237
+ `build-android`, `build-desktop`), `dev/<platform>` (the dev builds `start-*` run), `updates` (what
238
+ `publish-update` signs and `pack-update` packs), `web` (the bundle the app loads) and `bin`. `akan start` leaves
239
+ the folder alone.
240
+ - **`start-ios` / `start-android` / `start-desktop` run a dev build that loads its pages from `akan start`.** It has
241
+ to be running — except for a desktop app that carries its server, which starts it when none of this checkout
242
+ answers. `--release true` runs a release build of the app's own bundle instead.
243
+ - **A desktop app builds only for the computer that builds it** — a `.app` on macOS, signed ad hoc or with the
244
+ development identity, and an unsigned folder on Windows and Linux. `build-desktop --installer true` adds a
245
+ per-user NSIS setup on Windows (`/S` installs silently). Distribution signing and notarization are not akan
246
+ commands yet.
247
+ - **`updates: { url, publicKey }` lets an installed app update itself** — the whole app on a desktop, the web
248
+ bundle on a phone. `akan update-keygen <app>` makes the signing key once
249
+ (`~/.akan/native/keys/<app id>.update.key`, or the path `AKAN_NATIVE_UPDATE_KEY` names) and prints the
250
+ `publicKey`. `akan publish-update <app>` builds and signs a release into `updates/`: upload that folder to `url`,
251
+ the manifests last. `akan pack-update` writes an unsigned phone bundle for whoever holds the key to sign. The
252
+ channel is the backend env the binary was built for unless `channel` names one, and a release that does not
253
+ come up is rolled back to the one before.
254
+ - **An unattended screen** — signage, a kiosk — takes `desktop.recovery: "reload"` (a crashed page loads again,
255
+ and the app relaunches when the webview ends), `desktop.window: { fullscreen, skipTaskbar }`,
256
+ `desktop.screenCapture: "auto"` (Windows answers `getDisplayMedia()` with the first screen, no picker) and
257
+ `android.autoplay` (media plays with sound without a tap).
258
+
187
259
  ## A Desktop App's Server — `bin` And `trustedDependencies`
188
260
 
189
- A mobile target that declares `native: { desktop: { server: true } }` carries the app's server: `akan build-desktop`,
190
- `start-desktop --release` and `publish-update` put the backend `akan build` made into the app — everything the
191
- backend build wrote (the `.js`, `akan.build.json`, `private/`, a bundled package's `.node`, `.wasm` or file asset)
192
- but the Dockerfile, the RSC worker, the console, `csr/` and `public/` — and install its packages first with
193
- `bun install --production --prefer-offline`, before `akan build` runs. `start-desktop` without `--release` starts
194
- `akan start` beside the app when no dev server of this checkout answers. The setting is the app's backend,
195
- so it does not change under an installed app: an update whose release carries a server when the app has none, or
196
- none when it has one, is refused, and switching means a reinstall.
261
+ A desktop app whose `native` section, or target, declares `desktop: { server: true }` carries the app's server:
262
+ `akan build-desktop`, `start-desktop --release` and `publish-update` put the backend `akan build` made into the
263
+ app — everything the backend build wrote (the `.js`, `akan.build.json`, `private/`, a bundled package's `.node`,
264
+ `.wasm` or file asset) but the Dockerfile, the RSC worker, the console, `csr/` and `public/` — and install its
265
+ packages first with `bun install --production --prefer-offline`, before `akan build` runs. `start-desktop` without
266
+ `--release` starts `akan start` beside the app when no dev server of this checkout answers. The setting is the
267
+ app's backend, so it does not change under an installed app: an update whose release carries a server when the app
268
+ has none, or none when it has one, is refused, and switching means a reinstall.
197
269
  A desktop app builds only for the computer it is built on, so every native addon's prebuild matches the one it runs
198
270
  on. It runs as an API-only edge server on SQLite, on a loopback port the launcher picks — the last session's when
199
271
  it is free, which is not a guarantee, so a provider that needs an exact redirect URI signs in through a cloud
@@ -278,8 +350,8 @@ was still starting — the server sees its parent gone and ends the group itself
278
350
  later for whatever ignored it. On Windows the job object ends them all with the app. A process started `detached`
279
351
  leaves the group, or the job, and keeps running.
280
352
 
281
- **A file the user picks reaches the server as a grant, never as a copy or a path.** With `native.plugins:
282
- ["file-picker"]` on the target, `filePicker.pickFiles({ forServer: true })` (also `pickDirectory` and `saveFile`,
353
+ **A file the user picks reaches the server as a grant, never as a copy or a path.** With `"file-picker"` in
354
+ `native.plugins`, `filePicker.pickFiles({ forServer: true })` (also `pickDirectory` and `saveFile`,
283
355
  from `akanjs/client/native`) copies nothing, whatever the size: its FileRefs serve the originals for a preview, and
284
356
  each result carries a `grant`. The page hands the grant to an endpoint, and the server exchanges it:
285
357
 
@@ -293,8 +365,9 @@ and nothing else, and no page ever holds a path. Behind a dev build `akan start`
293
365
  against a key in `~/.akan/native` instead, in `operationMode` local only; every other server refuses a grant.
294
366
 
295
367
  **Devices belong to the shell, not the server.** Displays and their changes (`screen`), windows placed on them
296
- (`window`), the system volume and mute (`volume`), global shortcuts, keep-awake and launch at login are native
297
- runtime plugins, each added to the target's `native.plugins`. Every builtin plugin's page API is
368
+ (`window`), the system volume and mute (`volume`), global shortcuts (`global-shortcut`), keep-awake (`keep-awake`)
369
+ and launch at login (`autostart`) are native runtime plugins, each added to `native.plugins`. Every builtin plugin's
370
+ page API is
298
371
  `akanjs/client/native/<id>` (`akanjs/client/native/window`, `…/screen`, `…/global-shortcut`), imported in a `webkit/`
299
372
  hook; `volume` and `filePicker` also come from `akanjs/client/native` itself. A capability the shell
300
373
  lacks is added there: an app's own plugin runs as Bun code in the plugin host and cannot add a native shell op.
@@ -7,6 +7,8 @@
7
7
  - `apps/<app>/page` holds server-side file-routed pages: `<routeName>.tsx` serves `/routeName`, a directory's
8
8
  `_index.tsx` serves that directory, `_layout.tsx` nests a layout, and `[modelId]` is a dynamic segment. Each route
9
9
  file is one chain — `export default page()…render()`, or `layout()` / `rootLayout()` in a `_layout.tsx`.
10
+ - The `native` section of `akan.config.ts` makes the app an iOS, Android and desktop app built from the same pages,
11
+ and `apps/<app>/native/<id>` holds a native plugin the app owns.
10
12
 
11
13
  The file roles inside a module — which file owns persistence, business logic, state, and each UI shape — are in
12
14
  the convention set above under **Domain Module Conventions**.
@@ -112,6 +114,22 @@ For the default generated app, start with:
112
114
  akan start <%= appName %>
113
115
  ```
114
116
 
117
+ ### Native Apps — iOS, Android, Desktop
118
+
119
+ `native: { desktop: { server: true } }` in `akan.config.ts` is all a desktop app that carries its own server needs.
120
+ A `start-*` command loads its pages from `akan start`, so run that first; a desktop app that carries its server
121
+ starts it itself. The full contract — targets, updates, what the carried server ships — is
122
+ `akan guideline show runtimeRule`.
123
+
124
+ ```bash
125
+ akan start-desktop <%= appName %> # Run the desktop app on this computer
126
+ akan start-ios <%= appName %> # Run it in a simulator or on an iPhone (start-android alike)
127
+ akan build-desktop <%= appName %> # Build it for this computer into .akan/native/<target>/build
128
+ akan build-desktop <%= appName %> --installer true # Windows: add a per-user setup program
129
+ akan update-keygen <%= appName %> # Make the update signing key once; print its public key
130
+ akan publish-update <%= appName %> # Build and sign a desktop release to upload to updates.url
131
+ ```
132
+
115
133
  ### The Essential Loop: Workflow -> Sync -> Check
116
134
 
117
135
  Almost every Akan.js change follows this pattern. **Missing sync or repair is the #1 cause of agent confusion.**
@@ -200,6 +218,8 @@ final fallback when no CLI command covers the change.
200
218
  | Add a React hook or browser helper | `webkit/` → camelCase `.ts` with `"use client"` | `akan sync <name>` |
201
219
  | Add a server-only guard, middleware, or adaptor | `srvkit/` → PascalCase `.ts` | `akan sync <name>` |
202
220
  | Add a pure helper (no DOM, no server API) | `common/` → camelCase `.ts` | `akan sync <name>` |
221
+ | Make the app an iOS, Android or desktop app | `akan.config.ts` → `native: { … }`; `desktop: { server: true }` puts the server in the desktop app | `akan start-desktop <name>` (or `start-ios` / `start-android`) |
222
+ | Add a device capability the framework lacks | `native/<id>/` → `native-plugin.json`, `src/index.ts` (page API, used from a `webkit/` hook), `src/desktop.ts`, Kotlin, Swift | the platform's `akan start-*` |
203
223
 
204
224
  ## Workflow Recipes
205
225
 
@@ -8,7 +8,7 @@ import {
8
8
  CodegenLock,
9
9
  WorkspaceExecutor,
10
10
  AppExecutor
11
- } from "./index-r8gp8zk3.js";
11
+ } from "./index-n3jk2501.js";
12
12
  import"./index-52w0fvh8.js";
13
13
  import {
14
14
  GraphClientEntryDiscovery,
@@ -20,7 +20,7 @@ import {
20
20
  DevChangePlanner,
21
21
  DevGeneratedIndexSync,
22
22
  SsrDevBundler
23
- } from "./index-ttn00pr3.js";
23
+ } from "./index-6x9p8dpb.js";
24
24
  import {
25
25
  prepareDevWatchBatch
26
26
  } from "./index-a5vmm6x4.js";
@@ -5,13 +5,13 @@ import {
5
5
  writeGeneratedSyncState,
6
6
  createRepairReport,
7
7
  renderRepairReport
8
- } from "./index-2s2e5qnd.js";
8
+ } from "./index-hmdq5pqm.js";
9
9
  import {
10
10
  AkanContextAnalyzer
11
- } from "./index-0pqzrbpr.js";
11
+ } from "./index-tzc1gtrg.js";
12
12
  import {
13
13
  runner
14
- } from "./index-b68zfsvz.js";
14
+ } from "./index-xb7qhxa8.js";
15
15
 
16
16
  // pkgs/@akanjs/cli/repair/repair.runner.ts
17
17
  var spawnShell = async (workspace, command) => await workspace.spawn("bash", ["-lc", command.startsWith("akan ") ? `bun run ${command}` : command], {
@@ -1,16 +1,16 @@
1
1
  // @bun
2
2
  import {
3
3
  jsonText
4
- } from "./index-2s2e5qnd.js";
4
+ } from "./index-hmdq5pqm.js";
5
5
  import {
6
6
  akanMcpInstallTargets
7
- } from "./index-0pqzrbpr.js";
7
+ } from "./index-tzc1gtrg.js";
8
8
  import {
9
9
  script
10
- } from "./index-b68zfsvz.js";
10
+ } from "./index-xb7qhxa8.js";
11
11
  import {
12
12
  ContextRunner2
13
- } from "./index-16k7m3cs.js";
13
+ } from "./index-hqd0h1pb.js";
14
14
 
15
15
  // pkgs/@akanjs/cli/context/context.script.ts
16
16
  import { Logger } from "akanjs/common";
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  AppInfo
4
- } from "./index-r8gp8zk3.js";
4
+ } from "./index-n3jk2501.js";
5
5
 
6
6
  // pkgs/@akanjs/devkit/slicePlanner.ts
7
7
  class SlicePlanner {
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  resolveSsrPageEntriesForApp
4
- } from "./index-r8gp8zk3.js";
4
+ } from "./index-n3jk2501.js";
5
5
  import {
6
6
  computeRouteSeedIndex,
7
7
  saveRouteSeedIndex,
@@ -16,7 +16,7 @@ import {
16
16
  CsrEntryFiles,
17
17
  PagesEntrySourceGenerator,
18
18
  PagesBundleBuilder
19
- } from "./index-ttn00pr3.js";
19
+ } from "./index-6x9p8dpb.js";
20
20
  import {
21
21
  SOURCE_EXTS
22
22
  } from "./index-48k96p55.js";
@@ -1638,13 +1638,13 @@ class SsrBaseArtifactBuilder {
1638
1638
  i18n: akanConfig.i18n,
1639
1639
  imageConfig: akanConfig.images,
1640
1640
  web: SsrBaseArtifactBuilder.servedWeb(this.#command, akanConfig.web),
1641
- deepLinkAssociations: Object.values(akanConfig.mobile.targets).filter((target) => (target.deepLinks?.domains?.length ?? 0) > 0).map((target) => ({
1641
+ deepLinkAssociations: Object.values(akanConfig.native.targets).filter((target) => (target.deepLinks?.domains?.length ?? 0) > 0).map((target) => ({
1642
1642
  targetName: target.name,
1643
1643
  iosAppId: SsrBaseArtifactBuilder.#appIdOn(target.appId, "ios"),
1644
1644
  androidAppId: SsrBaseArtifactBuilder.#appIdOn(target.appId, "android"),
1645
1645
  domains: target.deepLinks?.domains ?? [],
1646
- iosTeamId: target.deepLinks?.ios?.teamId,
1647
- androidSha256CertFingerprints: target.deepLinks?.android?.sha256CertFingerprints
1646
+ iosTeamId: target.ios?.teamId,
1647
+ androidSha256CertFingerprints: target.android?.sha256CertFingerprints
1648
1648
  }))
1649
1649
  };
1650
1650
  await Bun.write(path8.join(this.#absArtifactDir, "base-artifact.json"), `${JSON.stringify(artifact, null, 2)}
@@ -37,29 +37,29 @@ import {
37
37
  import {
38
38
  runner,
39
39
  script
40
- } from "./index-b68zfsvz.js";
40
+ } from "./index-xb7qhxa8.js";
41
41
  import {
42
42
  WorkspaceExecutor,
43
43
  AppExecutor,
44
44
  LibExecutor,
45
45
  PkgExecutor
46
- } from "./index-r8gp8zk3.js";
46
+ } from "./index-n3jk2501.js";
47
47
  import {
48
48
  DesktopServerStage,
49
49
  resolveMobileTargets,
50
50
  resolveAppId,
51
51
  NativeApp
52
- } from "./index-1hs6jrys.js";
52
+ } from "./index-kb16nzyt.js";
53
53
  import {
54
54
  LibraryScript
55
- } from "./index-qtz88kh0.js";
55
+ } from "./index-gxamdf18.js";
56
56
  import {
57
57
  stripAnsi
58
58
  } from "./index-7md2g9vw.js";
59
59
  import {
60
60
  SlicePlanner,
61
61
  formatSlicePlan
62
- } from "./index-nbg9bfnr.js";
62
+ } from "./index-35mmm9ca.js";
63
63
  import {
64
64
  openBrowser
65
65
  } from "./index-9dp031by.js";
@@ -1867,7 +1867,7 @@ ${uniqueCandidates.map((candidate) => ` - ${candidate}`).join(`
1867
1867
 
1868
1868
  // pkgs/@akanjs/cli/application/application.runner.ts
1869
1869
  import { Logger as Logger3 } from "akanjs/common";
1870
- var loadBuildRunner = async () => (await import("./applicationBuildRunner-ez37p161.js")).ApplicationBuildRunner;
1870
+ var loadBuildRunner = async () => (await import("./applicationBuildRunner-qkt6spd5.js")).ApplicationBuildRunner;
1871
1871
  var loadPrompts = async () => await import("@inquirer/prompts");
1872
1872
 
1873
1873
  class ApplicationRunner extends runner("application") {
@@ -2109,7 +2109,7 @@ try {
2109
2109
  const targets = await resolveMobileTargets(app, target);
2110
2110
  const [mobileTarget] = targets;
2111
2111
  if (!mobileTarget || targets.length > 1)
2112
- throw new Error(`start-${platform === "ios" || platform === "android" ? platform : "desktop"} runs one mobile target at a time; pass --target <name>.`);
2112
+ throw new Error(`start-${platform === "ios" || platform === "android" ? platform : "desktop"} runs one native target at a time; pass --target <name>.`);
2113
2113
  return mobileTarget;
2114
2114
  }
2115
2115
  static async answers(url, appName, workspaceRoot) {
@@ -2156,7 +2156,7 @@ try {
2156
2156
  const targets = await resolveMobileTargets(app, target);
2157
2157
  const [mobileTarget] = targets;
2158
2158
  if (!mobileTarget || targets.length > 1)
2159
- throw new Error("pack-update packs one mobile target at a time; pass --target <name>.");
2159
+ throw new Error("pack-update packs one native target at a time; pass --target <name>.");
2160
2160
  await this.#buildMobileCsr(app, env);
2161
2161
  const packed = await new NativeApp(app, mobileTarget, env).packUpdate(platform, { out });
2162
2162
  const size = packed.manifest.files.reduce((sum, file) => sum + file.size, 0);
@@ -2183,10 +2183,10 @@ try {
2183
2183
  seen.add(appId);
2184
2184
  const { publicKey, keyPath, created } = await new NativeApp(app, mobileTarget).updateKeygen(nativePlatform);
2185
2185
  app.log(`${appId}: ${created ? "made" : "read"} ${keyPath}${created ? " (keep it private and backed up: without it, installed apps take no more updates)" : ""}`);
2186
- app.log(` mobile: { updates: { url: "https://\u2026/${app.name}", publicKey: ${JSON.stringify(publicKey)} } }`);
2186
+ app.log(` native: { updates: { url: "https://\u2026/${app.name}", publicKey: ${JSON.stringify(publicKey)} } }`);
2187
2187
  const declared = mobileTarget.config.updates?.publicKey;
2188
2188
  if (declared && declared !== publicKey)
2189
- app.logger.warn(`mobile.targets.${mobileTarget.name}.updates.publicKey is another key's; releases would not verify.`);
2189
+ app.logger.warn(`native.targets.${mobileTarget.name}.updates.publicKey is another key's; releases would not verify.`);
2190
2190
  }
2191
2191
  }
2192
2192
  async publishUpdate(app, platform, { target, env = "main", channel } = {}) {
@@ -2218,7 +2218,7 @@ try {
2218
2218
  app.log(`${app.name}/${mobileTarget.name} ${artifact.kind}: ${artifact.path}`);
2219
2219
  }
2220
2220
  static carriesServer({ config }, platform = NativeApp.desktopPlatform()) {
2221
- return platform !== "ios" && platform !== "android" && config.native?.desktop?.server === true;
2221
+ return platform !== "ios" && platform !== "android" && config.desktop?.server === true;
2222
2222
  }
2223
2223
  async#stageMobile(app, platform, targets, env) {
2224
2224
  const stage = targets.some((mobileTarget) => ApplicationRunner.carriesServer(mobileTarget, platform)) ? new DesktopServerStage(app) : null;
@@ -2263,9 +2263,9 @@ try {
2263
2263
  return;
2264
2264
  for (const failure of failures) {
2265
2265
  const message = failure.error instanceof Error ? failure.error.message : String(failure.error);
2266
- Logger3.rawLog(`Mobile target ${failure.target} failed: ${message}`, undefined, "error");
2266
+ Logger3.rawLog(`Native target ${failure.target} failed: ${message}`, undefined, "error");
2267
2267
  }
2268
- throw new Error(`${failures.length}/${results.length} mobile targets failed`);
2268
+ throw new Error(`${failures.length}/${results.length} native targets failed`);
2269
2269
  }
2270
2270
  #getLocalDatabaseServices(mode) {
2271
2271
  if (mode === "single")
@@ -6,11 +6,11 @@ import {
6
6
  } from "./index-94s080qm.js";
7
7
  import {
8
8
  runner
9
- } from "./index-b68zfsvz.js";
9
+ } from "./index-xb7qhxa8.js";
10
10
  import {
11
11
  WorkspaceExecutor,
12
12
  AppExecutor
13
- } from "./index-r8gp8zk3.js";
13
+ } from "./index-n3jk2501.js";
14
14
  import {
15
15
  openBrowser
16
16
  } from "./index-9dp031by.js";
@@ -9,7 +9,7 @@ import {
9
9
  import {
10
10
  AsyncDefaultExportDetector,
11
11
  resolveSsrPageEntriesForApp
12
- } from "./index-r8gp8zk3.js";
12
+ } from "./index-n3jk2501.js";
13
13
 
14
14
  // pkgs/@akanjs/devkit/artifact/routeSeedIndex.ts
15
15
  import path from "path";
@@ -116,7 +116,7 @@ class SubagentPool2 {
116
116
  }
117
117
  }
118
118
  async#run(id, kind, prompt, signal) {
119
- const { CodeAgent } = await import("./CodeAgent-86q8d13j.js");
119
+ const { CodeAgent } = await import("./CodeAgent-xnfyyz8h.js");
120
120
  const budget = this.#options.parent.tools.subagent;
121
121
  const child = SubagentPool2.childOf(this.#options.parent, kind);
122
122
  const agent = await CodeAgent.create({
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  runner,
4
4
  script
5
- } from "./index-b68zfsvz.js";
5
+ } from "./index-xb7qhxa8.js";
6
6
  import {
7
7
  FileSys2
8
8
  } from "./index-52w0fvh8.js";
9
9
  import {
10
10
  PkgExecutor
11
- } from "./index-r8gp8zk3.js";
11
+ } from "./index-n3jk2501.js";
12
12
  import {
13
13
  TypeScriptDependencyScanner2
14
14
  } from "./index-2ahj896a.js";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  runner,
4
4
  script
5
- } from "./index-b68zfsvz.js";
5
+ } from "./index-xb7qhxa8.js";
6
6
  import {
7
7
  AGENT_BLOCK_START,
8
8
  AGENT_BLOCK_END,
@@ -13,14 +13,14 @@ import {
13
13
  CLAUDE_COMMENT_RULE,
14
14
  AppExecutor,
15
15
  LibExecutor
16
- } from "./index-r8gp8zk3.js";
16
+ } from "./index-n3jk2501.js";
17
17
  import {
18
18
  collectRecipeSources2,
19
19
  scanRecipes2
20
20
  } from "./index-hj6w4ka1.js";
21
21
  import {
22
22
  AkanContextAnalyzer
23
- } from "./index-0pqzrbpr.js";
23
+ } from "./index-tzc1gtrg.js";
24
24
  import {
25
25
  Prompter2
26
26
  } from "./index-zzvvc845.js";
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  runner,
4
4
  script
5
- } from "./index-b68zfsvz.js";
5
+ } from "./index-xb7qhxa8.js";
6
6
  import {
7
7
  LibExecutor
8
- } from "./index-r8gp8zk3.js";
8
+ } from "./index-n3jk2501.js";
9
9
  import {
10
10
  LibSource,
11
11
  formatLibStatuses
@@ -1,12 +1,12 @@
1
1
  // @bun
2
2
  import {
3
3
  script
4
- } from "./index-b68zfsvz.js";
4
+ } from "./index-xb7qhxa8.js";
5
5
  import {
6
6
  AppExecutor,
7
7
  LibExecutor,
8
8
  ModuleExecutor
9
- } from "./index-r8gp8zk3.js";
9
+ } from "./index-n3jk2501.js";
10
10
  import {
11
11
  workflowStatus,
12
12
  compactDiagnostics,
@@ -41,10 +41,10 @@ import {
41
41
  hasSignalFactoryEntry,
42
42
  insertSignalFactoryEntry,
43
43
  addFieldUiPolicyForType
44
- } from "./index-2s2e5qnd.js";
44
+ } from "./index-hmdq5pqm.js";
45
45
  import {
46
46
  ModuleScript
47
- } from "./index-genegfnt.js";
47
+ } from "./index-wfwgcnyc.js";
48
48
 
49
49
  // pkgs/@akanjs/cli/primitive/primitive.script.ts
50
50
  import { capitalize, lowerlize } from "akanjs/common";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  AppExecutor,
4
4
  LibExecutor
5
- } from "./index-r8gp8zk3.js";
5
+ } from "./index-n3jk2501.js";
6
6
 
7
7
  // pkgs/@akanjs/devkit/workflow/utils.ts
8
8
  var jsonText = (value, { trailingNewline = true } = {}) => `${JSON.stringify(value, null, 2)}${trailingNewline ? `
@@ -1,13 +1,13 @@
1
1
  // @bun
2
2
  import {
3
3
  AppExecutor
4
- } from "./index-r8gp8zk3.js";
4
+ } from "./index-n3jk2501.js";
5
5
  import {
6
6
  jsonText,
7
7
  createWorkflowBaselineSummary,
8
8
  buildAkanModuleContextIndex,
9
9
  toolingRolloutGate
10
- } from "./index-2s2e5qnd.js";
10
+ } from "./index-hmdq5pqm.js";
11
11
  import {
12
12
  buildResourceList,
13
13
  codexMcpConfigPath,
@@ -17,25 +17,25 @@ import {
17
17
  upsertCodexMcpServerBlock,
18
18
  renderDoctorText,
19
19
  AkanContextAnalyzer
20
- } from "./index-0pqzrbpr.js";
20
+ } from "./index-tzc1gtrg.js";
21
21
  import {
22
22
  runner
23
- } from "./index-b68zfsvz.js";
23
+ } from "./index-xb7qhxa8.js";
24
24
  import {
25
25
  getMobileTargets,
26
26
  appIdsOf,
27
27
  NativeApp,
28
28
  isPlaceholderAppId
29
- } from "./index-1hs6jrys.js";
29
+ } from "./index-kb16nzyt.js";
30
30
  import {
31
31
  Prompter2
32
32
  } from "./index-zzvvc845.js";
33
33
  import {
34
34
  RepairRunner
35
- } from "./index-2z30v4k5.js";
35
+ } from "./index-0ncc0mbk.js";
36
36
  import {
37
37
  WorkflowRunner
38
- } from "./index-h9ed99ax.js";
38
+ } from "./index-rtwhw4aq.js";
39
39
 
40
40
  // pkgs/@akanjs/devkit/akanMcpContract.ts
41
41
  import path from "path";
@@ -593,7 +593,7 @@ class ContextRunner2 extends runner("context") {
593
593
  for (const appName of appNames) {
594
594
  const app = AppExecutor.from(workspace, appName);
595
595
  const config = await app.getConfig();
596
- if (!config.hasMobileConfig)
596
+ if (!config.hasNativeConfig)
597
597
  continue;
598
598
  if (!toolchainChecked) {
599
599
  toolchainChecked = true;
@@ -614,7 +614,7 @@ class ContextRunner2 extends runner("context") {
614
614
  severity: "warning",
615
615
  code: "mobile-appid-placeholder",
616
616
  path: `apps/${appName}/akan.config.ts`,
617
- message: `Mobile target '${name}' uses placeholder bundle id '${placeholder}'. Apple's developer portal almost always already claims it, so signing to a physical device fails with "cannot be registered to your development team". Set a unique mobile.appId (reverse-DNS of your org).`
617
+ message: `Native target '${name}' uses placeholder bundle id '${placeholder}'. Apple's developer portal almost always already claims it, so signing to a physical device fails with "cannot be registered to your development team". Set a unique native.appId (reverse-DNS of your org).`
618
618
  });
619
619
  }
620
620
  }
@@ -623,7 +623,7 @@ class ContextRunner2 extends runner("context") {
623
623
  return jsonText({ schemaVersion: 1, kind: "ios", status, diagnostics });
624
624
  const lines = [`Akan iOS diagnostics for ${workspace.repoName}`];
625
625
  if (diagnostics.length === 0)
626
- lines.push(" No mobile configuration issues found.");
626
+ lines.push(" No native configuration issues found.");
627
627
  else
628
628
  for (const diagnostic of diagnostics) {
629
629
  lines.push(` [${diagnostic.severity}] ${diagnostic.code}: ${diagnostic.message}`);