@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.
- package/.build-stamp +1 -1
- package/{CodeAgent-86q8d13j.js → CodeAgent-xnfyyz8h.js} +2 -2
- package/{CodeTui-r8tgxsyb.js → CodeTui-h66xb1fh.js} +1 -1
- package/README.ko.md +72 -0
- package/README.md +88 -0
- package/{agent.command-q9bmqrag.js → agent.command-c4v7kjff.js} +5 -5
- package/akanCode.js +2 -2
- package/{application.command-712jd2z8.js → application.command-yzsswrz6.js} +9 -9
- package/{applicationBuildRunner-ez37p161.js → applicationBuildRunner-qkt6spd5.js} +3 -3
- package/buildBatch.proc.js +3 -3
- package/{cloud.command-8eegwcsc.js → cloud.command-v8h688jc.js} +9 -9
- package/cloud.script-yct1sk4k.js +20 -0
- package/{code.command-n0c2tyzx.js → code.command-jff3tw7y.js} +6 -6
- package/{context.command-vxf6d7q2.js → context.command-y5sevk3c.js} +14 -14
- package/context.runner-90hsmacr.js +21 -0
- package/{guideline.command-ene55fkr.js → guideline.command-11cndccb.js} +2 -2
- package/guidelines/conventions/conventions.instruction.md +27 -14
- package/guidelines/runtimeRule/runtimeRule.instruction.md +90 -17
- package/guidelines/workspaceOnboarding/workspaceOnboarding.instruction.md +20 -0
- package/incrementalBuilder.proc.js +2 -2
- package/{index-2z30v4k5.js → index-0ncc0mbk.js} +3 -3
- package/{index-2yvy9ztj.js → index-167c77aq.js} +4 -4
- package/{index-nbg9bfnr.js → index-35mmm9ca.js} +1 -1
- package/{index-fy42hyb9.js → index-376gpdds.js} +5 -5
- package/{index-n9gxx7bp.js → index-3rh7thcx.js} +13 -13
- package/{index-rrt9pnb4.js → index-5rp0h6na.js} +2 -2
- package/{index-ttn00pr3.js → index-6x9p8dpb.js} +1 -1
- package/{index-8ej6r02m.js → index-8tv7356t.js} +1 -1
- package/{index-k7809wmg.js → index-a4s954kq.js} +2 -2
- package/{index-rbeahw6j.js → index-bxmejydw.js} +3 -3
- package/{index-qtz88kh0.js → index-gxamdf18.js} +2 -2
- package/{index-20r2g1t3.js → index-hf6f4xnb.js} +4 -4
- package/{index-2s2e5qnd.js → index-hmdq5pqm.js} +1 -1
- package/{index-16k7m3cs.js → index-hqd0h1pb.js} +10 -10
- package/{index-1hs6jrys.js → index-kb16nzyt.js} +36 -33
- package/{index-krwz9ek9.js → index-mk3b9rk1.js} +3 -3
- package/{index-r8gp8zk3.js → index-n3jk2501.js} +155 -152
- package/{index-g44da4r2.js → index-qcejqgts.js} +5 -5
- package/{index-h9ed99ax.js → index-rtwhw4aq.js} +7 -7
- package/{index-ss828r32.js → index-se643zvp.js} +1 -1
- package/{index-2ctqegdm.js → index-tsb0f8ya.js} +2 -2
- package/{index-0pqzrbpr.js → index-tzc1gtrg.js} +2 -2
- package/{index-genegfnt.js → index-wfwgcnyc.js} +4 -4
- package/{index-b68zfsvz.js → index-xb7qhxa8.js} +1 -1
- package/index.js +21 -21
- package/{library.command-tz7vnwea.js → library.command-n9kp7yms.js} +3 -3
- package/{localRegistry.command-7dd85czz.js → localRegistry.command-jx6kxt2x.js} +8 -8
- package/{module.command-qhc9ns0s.js → module.command-q2xjf6cx.js} +5 -5
- package/{package.command-z3epnvas.js → package.command-q5a3nsw5.js} +3 -3
- package/package.json +3 -3
- package/{page.command-exd2vakz.js → page.command-ppenrxjn.js} +3 -3
- package/{primitive.command-0w6cha4j.js → primitive.command-dvgg8nem.js} +6 -6
- package/{quality.command-je4kc9yv.js → quality.command-pz7kg3pc.js} +2 -2
- package/{repair.command-knvwfgtg.js → repair.command-a6py9xvz.js} +5 -5
- package/{scalar.command-60nxfchc.js → scalar.command-7f3xfpen.js} +4 -4
- package/{subspace.command-683qxcw9.js → subspace.command-z7nqs508.js} +4 -4
- package/{tunnel.command-7m2kxtat.js → tunnel.command-zy4wbcgt.js} +2 -2
- package/{workflow.command-j5tk13ds.js → workflow.command-f142t17s.js} +10 -10
- package/{workspace.command-jxdm0wrb.js → workspace.command-gpk1149x.js} +20 -20
- package/cloud.script-55s1cmz9.js +0 -20
- 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
|
|
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
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
190
|
-
`start-desktop --release` and `publish-update` put the backend `akan build` made into the
|
|
191
|
-
backend build wrote (the `.js`, `akan.build.json`, `private/`, a bundled package's `.node`,
|
|
192
|
-
but the Dockerfile, the RSC worker, the console, `csr/` and `public/` — and install its
|
|
193
|
-
`bun install --production --prefer-offline`, before `akan build` runs. `start-desktop` without
|
|
194
|
-
`akan start` beside the app when no dev server of this checkout answers. The setting is the
|
|
195
|
-
so it does not change under an installed app: an update whose release carries a server when the app
|
|
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 `
|
|
282
|
-
|
|
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
|
|
297
|
-
runtime plugins, each added to
|
|
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-
|
|
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-
|
|
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-
|
|
8
|
+
} from "./index-hmdq5pqm.js";
|
|
9
9
|
import {
|
|
10
10
|
AkanContextAnalyzer
|
|
11
|
-
} from "./index-
|
|
11
|
+
} from "./index-tzc1gtrg.js";
|
|
12
12
|
import {
|
|
13
13
|
runner
|
|
14
|
-
} from "./index-
|
|
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-
|
|
4
|
+
} from "./index-hmdq5pqm.js";
|
|
5
5
|
import {
|
|
6
6
|
akanMcpInstallTargets
|
|
7
|
-
} from "./index-
|
|
7
|
+
} from "./index-tzc1gtrg.js";
|
|
8
8
|
import {
|
|
9
9
|
script
|
|
10
|
-
} from "./index-
|
|
10
|
+
} from "./index-xb7qhxa8.js";
|
|
11
11
|
import {
|
|
12
12
|
ContextRunner2
|
|
13
|
-
} from "./index-
|
|
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
|
resolveSsrPageEntriesForApp
|
|
4
|
-
} from "./index-
|
|
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-
|
|
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.
|
|
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.
|
|
1647
|
-
androidSha256CertFingerprints: target.
|
|
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-
|
|
40
|
+
} from "./index-xb7qhxa8.js";
|
|
41
41
|
import {
|
|
42
42
|
WorkspaceExecutor,
|
|
43
43
|
AppExecutor,
|
|
44
44
|
LibExecutor,
|
|
45
45
|
PkgExecutor
|
|
46
|
-
} from "./index-
|
|
46
|
+
} from "./index-n3jk2501.js";
|
|
47
47
|
import {
|
|
48
48
|
DesktopServerStage,
|
|
49
49
|
resolveMobileTargets,
|
|
50
50
|
resolveAppId,
|
|
51
51
|
NativeApp
|
|
52
|
-
} from "./index-
|
|
52
|
+
} from "./index-kb16nzyt.js";
|
|
53
53
|
import {
|
|
54
54
|
LibraryScript
|
|
55
|
-
} from "./index-
|
|
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-
|
|
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-
|
|
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
|
|
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
|
|
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(`
|
|
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(`
|
|
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.
|
|
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(`
|
|
2266
|
+
Logger3.rawLog(`Native target ${failure.target} failed: ${message}`, undefined, "error");
|
|
2267
2267
|
}
|
|
2268
|
-
throw new Error(`${failures.length}/${results.length}
|
|
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-
|
|
9
|
+
} from "./index-xb7qhxa8.js";
|
|
10
10
|
import {
|
|
11
11
|
WorkspaceExecutor,
|
|
12
12
|
AppExecutor
|
|
13
|
-
} from "./index-
|
|
13
|
+
} from "./index-n3jk2501.js";
|
|
14
14
|
import {
|
|
15
15
|
openBrowser
|
|
16
16
|
} from "./index-9dp031by.js";
|
|
@@ -116,7 +116,7 @@ class SubagentPool2 {
|
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
118
|
async#run(id, kind, prompt, signal) {
|
|
119
|
-
const { CodeAgent } = await import("./CodeAgent-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
23
|
+
} from "./index-tzc1gtrg.js";
|
|
24
24
|
import {
|
|
25
25
|
Prompter2
|
|
26
26
|
} from "./index-zzvvc845.js";
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
3
|
script
|
|
4
|
-
} from "./index-
|
|
4
|
+
} from "./index-xb7qhxa8.js";
|
|
5
5
|
import {
|
|
6
6
|
AppExecutor,
|
|
7
7
|
LibExecutor,
|
|
8
8
|
ModuleExecutor
|
|
9
|
-
} from "./index-
|
|
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-
|
|
44
|
+
} from "./index-hmdq5pqm.js";
|
|
45
45
|
import {
|
|
46
46
|
ModuleScript
|
|
47
|
-
} from "./index-
|
|
47
|
+
} from "./index-wfwgcnyc.js";
|
|
48
48
|
|
|
49
49
|
// pkgs/@akanjs/cli/primitive/primitive.script.ts
|
|
50
50
|
import { capitalize, lowerlize } from "akanjs/common";
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
3
|
AppExecutor
|
|
4
|
-
} from "./index-
|
|
4
|
+
} from "./index-n3jk2501.js";
|
|
5
5
|
import {
|
|
6
6
|
jsonText,
|
|
7
7
|
createWorkflowBaselineSummary,
|
|
8
8
|
buildAkanModuleContextIndex,
|
|
9
9
|
toolingRolloutGate
|
|
10
|
-
} from "./index-
|
|
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-
|
|
20
|
+
} from "./index-tzc1gtrg.js";
|
|
21
21
|
import {
|
|
22
22
|
runner
|
|
23
|
-
} from "./index-
|
|
23
|
+
} from "./index-xb7qhxa8.js";
|
|
24
24
|
import {
|
|
25
25
|
getMobileTargets,
|
|
26
26
|
appIdsOf,
|
|
27
27
|
NativeApp,
|
|
28
28
|
isPlaceholderAppId
|
|
29
|
-
} from "./index-
|
|
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-
|
|
35
|
+
} from "./index-0ncc0mbk.js";
|
|
36
36
|
import {
|
|
37
37
|
WorkflowRunner
|
|
38
|
-
} from "./index-
|
|
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.
|
|
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: `
|
|
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
|
|
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}`);
|