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

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 (85) hide show
  1. package/.build-stamp +1 -1
  2. package/{CodeAgent-xnfyyz8h.js → CodeAgent-2vmp9qe0.js} +2 -2
  3. package/{CodeTui-h66xb1fh.js → CodeTui-5ed6bg2a.js} +1 -1
  4. package/{agent.command-c4v7kjff.js → agent.command-gn73rhe7.js} +5 -5
  5. package/akanCode.js +2 -2
  6. package/{application.command-yzsswrz6.js → application.command-e968t0hw.js} +14 -9
  7. package/{applicationBuildRunner-qkt6spd5.js → applicationBuildRunner-64taxseg.js} +3 -3
  8. package/buildBatch.proc.js +3 -3
  9. package/{cloud.command-v8h688jc.js → cloud.command-0jm301rr.js} +9 -9
  10. package/cloud.script-nemnzjpv.js +20 -0
  11. package/{code.command-jff3tw7y.js → code.command-18kcm7hq.js} +6 -6
  12. package/{context.command-y5sevk3c.js → context.command-trd9bn18.js} +13 -13
  13. package/context.runner-y5hwh673.js +21 -0
  14. package/{guideline.command-11cndccb.js → guideline.command-bdmdn2de.js} +2 -2
  15. package/guidelines/conventions/conventions.instruction.md +7 -4
  16. package/guidelines/runtimeRule/runtimeRule.instruction.md +29 -6
  17. package/incrementalBuilder.proc.js +2 -2
  18. package/{index-mk3b9rk1.js → index-0wpybxtr.js} +3 -3
  19. package/{index-n3jk2501.js → index-3w94e7n3.js} +27 -4
  20. package/{index-wfwgcnyc.js → index-4npz05nm.js} +4 -4
  21. package/{index-6x9p8dpb.js → index-6he6gvfg.js} +1 -1
  22. package/{index-0ncc0mbk.js → index-93j60em0.js} +3 -3
  23. package/{index-tzc1gtrg.js → index-9z771ptz.js} +2 -2
  24. package/{index-hqd0h1pb.js → index-abxpehf8.js} +7 -7
  25. package/{index-a4s954kq.js → index-by9pxkr0.js} +2 -2
  26. package/{index-5rp0h6na.js → index-drehwpdt.js} +2 -2
  27. package/{index-rtwhw4aq.js → index-f3c78nd6.js} +7 -7
  28. package/{index-kb16nzyt.js → index-gbggbqcp.js} +96 -35
  29. package/{index-tsb0f8ya.js → index-hsmtysz4.js} +2 -2
  30. package/{index-35mmm9ca.js → index-jmrn54tt.js} +1 -1
  31. package/{index-376gpdds.js → index-kcdj1z5v.js} +2 -2
  32. package/{index-hf6f4xnb.js → index-kqabytj7.js} +4 -4
  33. package/{index-se643zvp.js → index-mbxbhay5.js} +1 -1
  34. package/{index-gxamdf18.js → index-mgxpx3f2.js} +2 -2
  35. package/{index-3rh7thcx.js → index-p993efkq.js} +33 -18
  36. package/{index-qcejqgts.js → index-pmhqttv3.js} +5 -5
  37. package/{index-8tv7356t.js → index-tqm7jjcn.js} +1 -1
  38. package/{index-xb7qhxa8.js → index-vpj42xwt.js} +1 -1
  39. package/{index-bxmejydw.js → index-wprnsjms.js} +3 -3
  40. package/{index-hmdq5pqm.js → index-y3mphr1m.js} +1 -1
  41. package/{index-167c77aq.js → index-yg7jhz8x.js} +4 -4
  42. package/index.js +21 -21
  43. package/{library.command-n9kp7yms.js → library.command-9h749a1x.js} +3 -3
  44. package/{localRegistry.command-jx6kxt2x.js → localRegistry.command-2bqqhxyz.js} +8 -8
  45. package/{module.command-q2xjf6cx.js → module.command-nv8nzgft.js} +5 -5
  46. package/{package.command-q5a3nsw5.js → package.command-mq4bggp6.js} +3 -3
  47. package/package.json +2 -2
  48. package/{page.command-ppenrxjn.js → page.command-j639n707.js} +3 -3
  49. package/{primitive.command-dvgg8nem.js → primitive.command-kz6849th.js} +6 -6
  50. package/{quality.command-pz7kg3pc.js → quality.command-4hyabwkb.js} +2 -2
  51. package/{repair.command-a6py9xvz.js → repair.command-a9awpbqr.js} +5 -5
  52. package/{scalar.command-7f3xfpen.js → scalar.command-ma4fpm9m.js} +4 -4
  53. package/{subspace.command-z7nqs508.js → subspace.command-3k2pmrs4.js} +4 -4
  54. package/templates/app/page/_index.tsx +257 -258
  55. package/templates/app/page/_layout.tsx +5 -1
  56. package/templates/app/page/_overrides.tsx +12 -0
  57. package/templates/app/page/styles.css.template +316 -14
  58. package/templates/app/public/apple-touch-icon.png +0 -0
  59. package/templates/app/public/favicon.ico +0 -0
  60. package/templates/app/public/jelly/cloud.webp +0 -0
  61. package/templates/app/public/jelly/comet.webp +0 -0
  62. package/templates/app/public/jelly/moon.webp +0 -0
  63. package/templates/app/public/jelly/planet.webp +0 -0
  64. package/templates/app/public/jelly/rocket.webp +0 -0
  65. package/templates/app/public/jelly/star.webp +0 -0
  66. package/templates/app/public/jelly/sugar.webp +0 -0
  67. package/templates/app/public/logo.png +0 -0
  68. package/templates/app/ui/Recipe/index.ts +9 -0
  69. package/templates/app/ui/Recipe/jellyButton.ts +63 -0
  70. package/templates/appSample/lib/task/Task.Unit.tsx +1 -1
  71. package/templates/appSample/lib/task/Task.Util.tsx +10 -13
  72. package/templates/appSample/lib/task/Task.View.tsx +2 -2
  73. package/templates/appSample/lib/task/Task.Zone.tsx +5 -2
  74. package/templates/appSample/page/task/[taskId]/_index.tsx +6 -6
  75. package/templates/appSample/page/task/[taskId]/edit.tsx +5 -4
  76. package/templates/appSample/page/task/_index.tsx +4 -3
  77. package/templates/appSample/page/task/_layout.tsx +1 -1
  78. package/templates/appSample/page/task/new.tsx +5 -4
  79. package/templates/appSample/ui/GlobalLoading.tsx +2 -1
  80. package/templates/appSample/ui/QuantityControl.tsx +3 -3
  81. package/{tunnel.command-zy4wbcgt.js → tunnel.command-xwr46b66.js} +2 -2
  82. package/{workflow.command-f142t17s.js → workflow.command-t7wqe4h7.js} +10 -10
  83. package/{workspace.command-gpk1149x.js → workspace.command-4derhzrh.js} +24 -21
  84. package/cloud.script-yct1sk4k.js +0 -20
  85. package/context.runner-90hsmacr.js +0 -21
package/.build-stamp CHANGED
@@ -1 +1 @@
1
- 0e7a5dcd028f8a43952646d4bbd60e5a0917f2ef29d8a7e26e3125a4fe291e06
1
+ 77b0a64e9eb50e1874e7999dae93ff4b583b816ed3d996834a3ee44fd9ec81ad
@@ -1,8 +1,8 @@
1
1
  // @bun
2
2
  import {
3
3
  CodeAgent2
4
- } from "./index-mk3b9rk1.js";
5
- import"./index-8tv7356t.js";
4
+ } from "./index-0wpybxtr.js";
5
+ import"./index-tqm7jjcn.js";
6
6
  import"./index-7md2g9vw.js";
7
7
  export {
8
8
  CodeAgent2 as CodeAgent
@@ -4,7 +4,7 @@ import {
4
4
  McpServerConfig,
5
5
  McpTokenStore,
6
6
  McpSignIn
7
- } from "./index-8tv7356t.js";
7
+ } from "./index-tqm7jjcn.js";
8
8
  import {
9
9
  CodeTuiLines2,
10
10
  CodeTuiAgents2,
@@ -2,16 +2,16 @@
2
2
  import {
3
3
  Workspace,
4
4
  command
5
- } from "./index-xb7qhxa8.js";
5
+ } from "./index-vpj42xwt.js";
6
6
  import"./index-52w0fvh8.js";
7
- import"./index-n3jk2501.js";
7
+ import"./index-3w94e7n3.js";
8
8
  import"./index-hj6w4ka1.js";
9
- import"./index-hmdq5pqm.js";
10
- import"./index-tzc1gtrg.js";
9
+ import"./index-y3mphr1m.js";
10
+ import"./index-9z771ptz.js";
11
11
  import"./index-zzvvc845.js";
12
12
  import {
13
13
  AgentScript
14
- } from "./index-bxmejydw.js";
14
+ } from "./index-wprnsjms.js";
15
15
 
16
16
  // pkgs/@akanjs/cli/agent/agent.command.ts
17
17
  class AgentCommand extends command("agent", [AgentScript], ({ public: target }) => ({
package/akanCode.js CHANGED
@@ -28,7 +28,7 @@ import {
28
28
  CodeMailbox2,
29
29
  CodeSessionFork2,
30
30
  CodeAgent2
31
- } from "./index-mk3b9rk1.js";
31
+ } from "./index-0wpybxtr.js";
32
32
  import {
33
33
  akanCodeDefaultModel2,
34
34
  akanCodeModel2,
@@ -39,7 +39,7 @@ import {
39
39
  import {
40
40
  SubagentPool2,
41
41
  akanCodePaths2
42
- } from "./index-8tv7356t.js";
42
+ } from "./index-tqm7jjcn.js";
43
43
  import"./index-7md2g9vw.js";
44
44
  import {
45
45
  CodeAgentRpcHost2
@@ -6,19 +6,19 @@ import {
6
6
  Exec,
7
7
  Workspace,
8
8
  command
9
- } from "./index-xb7qhxa8.js";
9
+ } from "./index-vpj42xwt.js";
10
10
  import"./index-52w0fvh8.js";
11
- import"./index-n3jk2501.js";
11
+ import"./index-3w94e7n3.js";
12
12
  import {
13
13
  getMobileTargetChoices
14
- } from "./index-kb16nzyt.js";
14
+ } from "./index-gbggbqcp.js";
15
15
  import"./index-48k96p55.js";
16
- import"./index-gxamdf18.js";
16
+ import"./index-mgxpx3f2.js";
17
17
  import {
18
18
  ApplicationScript
19
- } from "./index-3rh7thcx.js";
19
+ } from "./index-p993efkq.js";
20
20
  import"./index-7md2g9vw.js";
21
- import"./index-35mmm9ca.js";
21
+ import"./index-jmrn54tt.js";
22
22
 
23
23
  // pkgs/@akanjs/cli/application/application.command.ts
24
24
  var mobileTargetOption = {
@@ -109,15 +109,20 @@ class ApplicationCommand extends command("application", [ApplicationScript], ({
109
109
  await this.applicationScript.buildAndroid(app, { target, env, profile: debug ? "debug" : "release", write });
110
110
  }),
111
111
  buildDesktop: target({ short: true, desc: "Build the desktop app for this computer (macOS, Windows or Linux)" }).with(App).option("target", String, mobileTargetOption).option("env", String, buildEnvOption).option("debug", Boolean, { desc: "debug build instead of release", default: false }).option("installer", Boolean, {
112
- desc: "Windows: also an NSIS setup program (per user, /S for a silent install)",
112
+ desc: "also what a person downloads: a Windows setup program (NSIS, /S for silent), a macOS dmg, a Linux AppImage",
113
113
  default: false
114
- }).option("write", Boolean, { desc: "write code generation", default: true }).exec(async function(app, target, env, debug, installer, write) {
114
+ }).option("arch", String, {
115
+ desc: "the CPU the app runs on, arm64 or x64 of this OS (default this computer's); a macOS app is arm64 only",
116
+ enum: ["arm64", "x64"],
117
+ nullable: true
118
+ }).option("write", Boolean, { desc: "write code generation", default: true }).exec(async function(app, target, env, debug, installer, arch, write) {
115
119
  await this.applicationScript.buildDesktop(app, {
116
120
  target,
117
121
  env,
118
122
  profile: debug ? "debug" : "release",
119
123
  installer,
120
- write
124
+ write,
125
+ ...arch ? { arch } : {}
121
126
  });
122
127
  }),
123
128
  start: target({ short: true, desc: "Start development server(s) (frontend SSR + backend)" }).with(Apps).option("plain", Boolean, { desc: "print prefixed lines instead of the full-screen view", default: false }).option("kill", Boolean, { flag: "k", desc: "free the dev ports first, whoever is holding them", default: false }).option("concurrency", Number, {
@@ -1,15 +1,15 @@
1
1
  // @bun
2
2
  import {
3
3
  Spinner
4
- } from "./index-n3jk2501.js";
5
- import"./index-6x9p8dpb.js";
4
+ } from "./index-3w94e7n3.js";
5
+ import"./index-6he6gvfg.js";
6
6
  import {
7
7
  AllRoutesBuilder,
8
8
  CsrArtifactBuilder,
9
9
  FontPruner,
10
10
  precompressArtifacts,
11
11
  SsrBaseArtifactBuilder
12
- } from "./index-376gpdds.js";
12
+ } from "./index-kcdj1z5v.js";
13
13
  import"./index-52w0fvh8.js";
14
14
  import"./index-n68jx79w.js";
15
15
 
@@ -6,7 +6,7 @@ import {
6
6
  resolveSsrPageEntriesForApp,
7
7
  WorkspaceExecutor,
8
8
  AppExecutor
9
- } from "./index-n3jk2501.js";
9
+ } from "./index-3w94e7n3.js";
10
10
  import {
11
11
  computeRouteSeedIndex,
12
12
  saveRouteSeedIndex,
@@ -14,14 +14,14 @@ import {
14
14
  PagesBundleBuilder,
15
15
  CsrDevBundler,
16
16
  SsrDevBundler
17
- } from "./index-6x9p8dpb.js";
17
+ } from "./index-6he6gvfg.js";
18
18
  import"./index-52w0fvh8.js";
19
19
  import {
20
20
  CsrArtifactBuilder,
21
21
  CssCompiler,
22
22
  FontOptimizer,
23
23
  SsrBaseArtifactBuilder
24
- } from "./index-376gpdds.js";
24
+ } from "./index-kcdj1z5v.js";
25
25
  import"./index-n68jx79w.js";
26
26
 
27
27
  // pkgs/@akanjs/devkit/incrementalBuilder/buildBatch.proc.ts
@@ -6,22 +6,22 @@ import {
6
6
  import {
7
7
  Workspace,
8
8
  command
9
- } from "./index-xb7qhxa8.js";
10
- import"./index-n3jk2501.js";
9
+ } from "./index-vpj42xwt.js";
10
+ import"./index-3w94e7n3.js";
11
11
  import {
12
12
  PlatformTestRun
13
- } from "./index-5rp0h6na.js";
13
+ } from "./index-drehwpdt.js";
14
14
  import"./index-48k96p55.js";
15
- import"./index-kb16nzyt.js";
16
- import"./index-gxamdf18.js";
17
- import"./index-3rh7thcx.js";
15
+ import"./index-gbggbqcp.js";
16
+ import"./index-mgxpx3f2.js";
17
+ import"./index-p993efkq.js";
18
18
  import"./index-7md2g9vw.js";
19
19
  import"./index-2ahj896a.js";
20
- import"./index-a4s954kq.js";
20
+ import"./index-by9pxkr0.js";
21
21
  import {
22
22
  CloudScript2
23
- } from "./index-qcejqgts.js";
24
- import"./index-35mmm9ca.js";
23
+ } from "./index-pmhqttv3.js";
24
+ import"./index-jmrn54tt.js";
25
25
 
26
26
  // pkgs/@akanjs/cli/cloud/cloud.command.ts
27
27
  var localRegistryUrl = () => process.env.AKAN_NPM_REGISTRY ?? "http://127.0.0.1:4873";
@@ -0,0 +1,20 @@
1
+ // @bun
2
+ import {
3
+ CloudScript2
4
+ } from "./index-pmhqttv3.js";
5
+ import"./index-drehwpdt.js";
6
+ import"./index-by9pxkr0.js";
7
+ import"./index-p993efkq.js";
8
+ import"./index-jmrn54tt.js";
9
+ import"./index-mgxpx3f2.js";
10
+ import"./index-gbggbqcp.js";
11
+ import"./index-94s080qm.js";
12
+ import"./index-vpj42xwt.js";
13
+ import"./index-7md2g9vw.js";
14
+ import"./index-48k96p55.js";
15
+ import"./index-3w94e7n3.js";
16
+ import"./index-2ahj896a.js";
17
+ import"./index-52w0fvh8.js";
18
+ export {
19
+ CloudScript2 as CloudScript
20
+ };
@@ -4,9 +4,9 @@ import {
4
4
  runner,
5
5
  script,
6
6
  command
7
- } from "./index-xb7qhxa8.js";
7
+ } from "./index-vpj42xwt.js";
8
8
  import"./index-52w0fvh8.js";
9
- import"./index-n3jk2501.js";
9
+ import"./index-3w94e7n3.js";
10
10
  import {
11
11
  akanCodeDefaultModel2,
12
12
  CodeAgentStreamPrinter2
@@ -19,7 +19,7 @@ class CodeRunner extends runner("code") {
19
19
  async serve(options, listen) {
20
20
  await import("./consoleToStderr-h5bryj94.js");
21
21
  const [{ CodeAgent }, { CodeAgentRpcHost }, { CodeAgentRpcListener }] = await Promise.all([
22
- import("./CodeAgent-xnfyyz8h.js"),
22
+ import("./CodeAgent-2vmp9qe0.js"),
23
23
  import("./CodeAgentRpcHost-p7h6n2hp.js"),
24
24
  import("./CodeAgentRpcListener-7p7z5dd7.js")
25
25
  ]);
@@ -34,8 +34,8 @@ class CodeRunner extends runner("code") {
34
34
  }
35
35
  async tui(options, seed) {
36
36
  const [{ CodeAgent }, { CodeTui }] = await Promise.all([
37
- import("./CodeAgent-xnfyyz8h.js"),
38
- import("./CodeTui-h66xb1fh.js")
37
+ import("./CodeAgent-2vmp9qe0.js"),
38
+ import("./CodeTui-5ed6bg2a.js")
39
39
  ]);
40
40
  const agentOptions = await CodeRunner.#agentOptions(options, false);
41
41
  let resume = options.resume;
@@ -60,7 +60,7 @@ class CodeRunner extends runner("code") {
60
60
  }
61
61
  }
62
62
  async run(prompt, options) {
63
- const { CodeAgent } = await import("./CodeAgent-xnfyyz8h.js");
63
+ const { CodeAgent } = await import("./CodeAgent-2vmp9qe0.js");
64
64
  const agent = await CodeAgent.create(await CodeRunner.#agentOptions(options, false));
65
65
  const printer = new CodeAgentStreamPrinter2({ json: options.json, thinking: options.thinking });
66
66
  agent.on((event) => printer.print(event));
@@ -2,24 +2,24 @@
2
2
  import {
3
3
  Workspace,
4
4
  command
5
- } from "./index-xb7qhxa8.js";
5
+ } from "./index-vpj42xwt.js";
6
6
  import"./index-52w0fvh8.js";
7
- import"./index-n3jk2501.js";
7
+ import"./index-3w94e7n3.js";
8
8
  import"./index-hj6w4ka1.js";
9
- import"./index-hmdq5pqm.js";
10
- import"./index-tzc1gtrg.js";
11
- import"./index-hqd0h1pb.js";
12
- import"./index-kb16nzyt.js";
9
+ import"./index-y3mphr1m.js";
10
+ import"./index-9z771ptz.js";
11
+ import"./index-abxpehf8.js";
12
+ import"./index-gbggbqcp.js";
13
13
  import"./index-zzvvc845.js";
14
- import"./index-0ncc0mbk.js";
15
- import"./index-se643zvp.js";
16
- import"./index-wfwgcnyc.js";
17
- import"./index-hf6f4xnb.js";
18
- import"./index-tsb0f8ya.js";
19
- import"./index-rtwhw4aq.js";
14
+ import"./index-93j60em0.js";
15
+ import"./index-mbxbhay5.js";
16
+ import"./index-4npz05nm.js";
17
+ import"./index-kqabytj7.js";
18
+ import"./index-hsmtysz4.js";
19
+ import"./index-f3c78nd6.js";
20
20
  import {
21
21
  ContextScript
22
- } from "./index-167c77aq.js";
22
+ } from "./index-yg7jhz8x.js";
23
23
 
24
24
  // pkgs/@akanjs/cli/context/context.command.ts
25
25
  class ContextCommand extends command("context", [ContextScript], ({ public: target }) => ({
@@ -0,0 +1,21 @@
1
+ // @bun
2
+ import {
3
+ ContextRunner2
4
+ } from "./index-abxpehf8.js";
5
+ import"./index-f3c78nd6.js";
6
+ import"./index-hsmtysz4.js";
7
+ import"./index-kqabytj7.js";
8
+ import"./index-93j60em0.js";
9
+ import"./index-4npz05nm.js";
10
+ import"./index-mbxbhay5.js";
11
+ import"./index-gbggbqcp.js";
12
+ import"./index-9z771ptz.js";
13
+ import"./index-y3mphr1m.js";
14
+ import"./index-zzvvc845.js";
15
+ import"./index-vpj42xwt.js";
16
+ import"./index-3w94e7n3.js";
17
+ import"./index-hj6w4ka1.js";
18
+ import"./index-52w0fvh8.js";
19
+ export {
20
+ ContextRunner2 as ContextRunner
21
+ };
@@ -2,9 +2,9 @@
2
2
  import {
3
3
  script,
4
4
  command
5
- } from "./index-xb7qhxa8.js";
5
+ } from "./index-vpj42xwt.js";
6
6
  import"./index-52w0fvh8.js";
7
- import"./index-n3jk2501.js";
7
+ import"./index-3w94e7n3.js";
8
8
  import {
9
9
  Prompter2
10
10
  } from "./index-zzvvc845.js";
@@ -352,16 +352,19 @@ Full contract: `get_guideline` with `runtimeRule`, or `akan guideline show runti
352
352
  declares the steps its own runtime needs and every mounting app inherits them.
353
353
  - **Native apps are the `native` section** — iOS, Android and a desktop app (macOS, Windows, Linux), each shipping
354
354
  the CSR bundle on the native runtime. Shared fields (`appName`, `appId`, `version`, `indexPath`, `permissions`,
355
- `plugins`, `deepLinks`, `updates`, …) sit beside one section per platform: `ios`, `android`, `desktop`. Without
355
+ `plugins`, `deepLinks`, `updates`, …) sit beside one section per platform: `ios`, `android`, `desktop`, and a
356
+ platform section's own `indexPath` wins on that platform (`desktop: { indexPath: "/" }`). Without
356
357
  `targets` the app has one target, `default`, and an app with no basePaths leaves `basePath` out; a target takes
357
358
  the same shape and overrides the section field by field — objects merge key by key, a list or any other value
358
359
  replaces the section's. `akan start-ios` / `start-android` / `start-desktop` run a dev build that loads its pages
359
360
  from `akan start`; `build-ios` / `build-android` / `build-desktop` write
360
- `apps/<app>/.akan/native/<target>/build/<platform>`, a desktop app only for the computer that builds it
361
- (`--installer true` adds a Windows setup). With `updates: { url, publicKey }` an installed app takes the signed
361
+ `apps/<app>/.akan/native/<target>/build/<platform>`, a desktop app only for the OS that builds it — `--arch` picks
362
+ a Windows or Linux app's CPU, and a macOS app is Apple silicon only. `--installer true` adds a Windows setup, a
363
+ macOS dmg or a Linux AppImage; `AKAN_NATIVE_MACOS_*` signs with a Developer ID and notarizes,
364
+ `AKAN_NATIVE_WINDOWS_*` signs with Authenticode. With `updates: { url, publicKey }` an installed app takes the signed
362
365
  releases `akan publish-update` makes; `akan update-keygen` makes the key and prints its `publicKey`.
363
366
  - **A desktop app that carries its server (`desktop: { server: true }` in `native`, or in one target) gets nothing
364
- from `docker`.** That server is API-only, runs in database mode `single`, and listens on a loopback port any
367
+ from `docker`** — and `server: { omit: [...] }` leaves out packages only the image needs. That server is API-only, runs in database mode `single`, and listens on a loopback port any
365
368
  program on the computer can call, so guard its endpoints as a network server's. An executable the app spawns
366
369
  goes in `bin` — per platform, a download checked against its `sha256` or a file beside the config, put first on
367
370
  the app's PATH so the server's `spawn("ffmpeg")` finds it, and in `ctx.binDir` for a native plugin — and a package
@@ -228,6 +228,9 @@ const config: AppConfig = {
228
228
  },
229
229
  ```
230
230
 
231
+ - **A platform section may name its own `indexPath`**, which wins on that platform: `indexPath: "/mobile"` with
232
+ `desktop: { indexPath: "/" }` opens the phones on `/mobile` and the desktop app on `/`, from one target, so no
233
+ command needs `--target`. It moves the dev build's first page and the `indexPath` its bundle carries alike.
231
234
  - **`basePath` is the client a target opens.** An app with no basePaths leaves it out. Without `targets`, the one
232
235
  target opens the basePath named like the app when there is one; in an app with basePaths, a target that names
233
236
  none is a template, and `--target <basePath>` builds that client from it.
@@ -240,10 +243,27 @@ const config: AppConfig = {
240
243
  - **`start-ios` / `start-android` / `start-desktop` run a dev build that loads its pages from `akan start`.** It has
241
244
  to be running — except for a desktop app that carries its server, which starts it when none of this checkout
242
245
  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.
246
+ - **A desktop app builds only for the computer that builds it** — a `.app` on macOS, and an unsigned folder on
247
+ Windows and Linux. `build-desktop --installer true` adds what a person downloads: a per-user NSIS setup on Windows
248
+ (`/S` installs silently), a dmg on macOS, an AppImage on Linux (it needs `mksquashfs`; an AppImage cannot update
249
+ itself, so a release with `updates` ships a new one). `--arch arm64|x64` builds a Windows or Linux app for the
250
+ other CPU of that OS: the Rust library, Bun's executable, the server's `bun install --cpu` and each `bin` file
251
+ follow it, and a server addon with no binary for that CPU stops the build. A macOS app is Apple silicon only —
252
+ Intel Macs are not a target, so `--arch x64` on macOS is refused.
253
+ - **A macOS release for download is signed with a Developer ID and notarized, from the environment.**
254
+ `AKAN_NATIVE_MACOS_IDENTITY` names a keychain identity, or `AKAN_NATIVE_MACOS_CERTIFICATE` +
255
+ `_CERTIFICATE_PASSWORD` a `.p12` the build imports into a keychain of its own (a CI runner);
256
+ `AKAN_NATIVE_MACOS_NOTARY_KEY` + `_KEY_ID` + `_ISSUER` (an App Store Connect API key) or `_NOTARY_PROFILE` turn on
257
+ notarization and stapling of the app and the dmg. Every Mach-O file — the server's addons and `bin` included — is
258
+ signed inside out with the hardened runtime and a timestamp; the executable gets Bun's JIT entitlements and the
259
+ camera's or microphone's when a usage text asks for them, and `desktop.entitlements` adds the app's own.
260
+ `publish-update` signs with the same identity, since the updater checks the installed app's signature. Without a
261
+ Developer ID the build warns, because Gatekeeper blocks a downloaded copy.
262
+ - **A Windows release is signed with Authenticode, from the environment.** `AKAN_NATIVE_WINDOWS_CERTIFICATE` +
263
+ `_CERTIFICATE_PASSWORD` (a `.pfx`), `AKAN_NATIVE_WINDOWS_THUMBPRINT` (a certificate in the store, a token's or an
264
+ HSM's), or `AKAN_NATIVE_WINDOWS_SIGN_COMMAND` (a JSON array run per file with `{file}`, e.g. signtool with Azure
265
+ Trusted Signing's dlib) signs every PE file of the app — the server's `.node` and `bin` included — the setup program
266
+ and the uninstaller it writes, SHA-256 with a timestamp (`AKAN_NATIVE_WINDOWS_TIMESTAMP_URL`).
247
267
  - **`updates: { url, publicKey }` lets an installed app update itself** — the whole app on a desktop, the web
248
268
  bundle on a phone. `akan update-keygen <app>` makes the signing key once
249
269
  (`~/.akan/native/keys/<app id>.update.key`, or the path `AKAN_NATIVE_UPDATE_KEY` names) and prints the
@@ -266,8 +286,11 @@ packages first with `bun install --production --prefer-offline`, before `akan bu
266
286
  `--release` starts `akan start` beside the app when no dev server of this checkout answers. The setting is the
267
287
  app's backend, so it does not change under an installed app: an update whose release carries a server when the app
268
288
  has none, or none when it has one, is refused, and switching means a reinstall.
269
- A desktop app builds only for the computer it is built on, so every native addon's prebuild matches the one it runs
270
- on. It runs as an API-only edge server on SQLite, on a loopback port the launcher picks — the last session's when
289
+ `desktop: { server: { omit: ["rclnodejs"] } }` carries the server without packages only the image needs — an addon
290
+ tied to the image's system, code only a process the app never starts loads — and whatever only they pull in; the
291
+ image keeps them, and the server's own bundle must not import them. A package another dependency still installs
292
+ stops the build, naming who needs it. So does a native addon that would not load on a user's computer: no binary
293
+ for the app's OS and CPU, a link outside the system, or a `binding.gyp` its install never compiled. It runs as an API-only edge server on SQLite, on a loopback port the launcher picks — the last session's when
271
294
  it is free, which is not a guarantee, so a provider that needs an exact redirect URI signs in through a cloud
272
295
  server's adapter. It refuses a `Host` other than its own, but any program on the computer can still call that port:
273
296
  guard its endpoints as a network server's. It runs in one process, so a `main.ts` or an env asking for replicas (`replica`,
@@ -8,7 +8,7 @@ import {
8
8
  CodegenLock,
9
9
  WorkspaceExecutor,
10
10
  AppExecutor
11
- } from "./index-n3jk2501.js";
11
+ } from "./index-3w94e7n3.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-6x9p8dpb.js";
23
+ } from "./index-6he6gvfg.js";
24
24
  import {
25
25
  prepareDevWatchBatch
26
26
  } from "./index-a5vmm6x4.js";
@@ -4,7 +4,7 @@ import {
4
4
  akanCodePaths2,
5
5
  McpServerConfig,
6
6
  McpSignIn
7
- } from "./index-8tv7356t.js";
7
+ } from "./index-tqm7jjcn.js";
8
8
  import {
9
9
  stripAnsi
10
10
  } from "./index-7md2g9vw.js";
@@ -511,7 +511,7 @@ class AkanToolPack2 {
511
511
  return { name: "akan-tools", factory: async (pi) => await this.#register(pi) };
512
512
  }
513
513
  async names() {
514
- const { ContextRunner } = await import("./context.runner-90hsmacr.js");
514
+ const { ContextRunner } = await import("./context.runner-y5hwh673.js");
515
515
  return [
516
516
  ...new ContextRunner().listMcpTools(this.#options.mode).map((tool) => tool.name),
517
517
  AkanToolPack2.verifyToolName
@@ -519,7 +519,7 @@ class AkanToolPack2 {
519
519
  }
520
520
  static verifyToolName = "akan_verify";
521
521
  async#register(pi) {
522
- const { ContextRunner } = await import("./context.runner-90hsmacr.js");
522
+ const { ContextRunner } = await import("./context.runner-y5hwh673.js");
523
523
  const runner = new ContextRunner;
524
524
  const guidelineNames = await AkanToolPack2.#guidelineNames();
525
525
  for (const tool of runner.listMcpTools(this.#options.mode, { guidelineNames })) {
@@ -949,9 +949,9 @@ class AkanAppConfig {
949
949
  } = merged;
950
950
  const indexPath = normalizeIndexPath(rawIndexPath);
951
951
  const deepLinks = normalizeDeepLinks(rawDeepLinks);
952
- const { teamId: rawTeamId, ...iosRest } = merged.ios ?? {};
952
+ const { teamId: rawTeamId, ...iosRest } = AkanAppConfig.#platformIndexPath(merged.ios ?? {});
953
953
  const teamId = rawTeamId?.trim();
954
- const { sha256CertFingerprints: rawFingerprints, ...androidRest } = merged.android ?? {};
954
+ const { sha256CertFingerprints: rawFingerprints, ...androidRest } = AkanAppConfig.#platformIndexPath(merged.android ?? {});
955
955
  const fingerprints = normalizeStringList(rawFingerprints);
956
956
  const target = {
957
957
  ...rest,
@@ -961,6 +961,9 @@ class AkanAppConfig {
961
961
  ...deepLinks ? { deepLinks } : {},
962
962
  ...merged.ios ? { ios: { ...iosRest, ...teamId ? { teamId } : {} } } : {},
963
963
  ...merged.android ? { android: { ...androidRest, ...fingerprints ? { sha256CertFingerprints: fingerprints } : {} } } : {},
964
+ ...merged.desktop ? {
965
+ desktop: AkanAppConfig.#desktopServer(AkanAppConfig.#platformIndexPath(merged.desktop), `${where}.desktop.server`, configPath)
966
+ } : {},
964
967
  appName: merged.appName ?? this.app.name,
965
968
  appId: merged.appId ?? appId,
966
969
  version: merged.version ?? version,
@@ -971,6 +974,23 @@ class AkanAppConfig {
971
974
  }));
972
975
  return { appName, appId, ...root.fileName ? { fileName: root.fileName } : {}, version, buildNum, targets };
973
976
  }
977
+ static #desktopServer(desktop, where, configPath) {
978
+ const { server } = desktop;
979
+ if (server === undefined || typeof server === "boolean")
980
+ return desktop;
981
+ if (!AkanAppConfig.#isPlainObject(server))
982
+ throw new Error(`${where} in ${configPath} must be true or { omit: string[] }.`);
983
+ const omit = server.omit;
984
+ if (omit !== undefined && (!Array.isArray(omit) || omit.some((name) => typeof name !== "string" || !name.trim())))
985
+ throw new Error(`${where}.omit in ${configPath} must be a list of package names.`);
986
+ const names = [...new Set((omit ?? []).map((name) => name.trim()))].sort();
987
+ return { ...desktop, server: { omit: names } };
988
+ }
989
+ static #platformIndexPath(section) {
990
+ const { indexPath: rawIndexPath, ...rest } = section;
991
+ const indexPath = normalizeIndexPath(rawIndexPath);
992
+ return { ...rest, ...indexPath ? { indexPath } : {} };
993
+ }
974
994
  static #overlay(base, own) {
975
995
  const merge = (kept, value, top, key) => {
976
996
  if (!AkanAppConfig.#isPlainObject(kept) || !AkanAppConfig.#isPlainObject(value))
@@ -1011,8 +1031,9 @@ class AkanAppConfig {
1011
1031
  "android",
1012
1032
  "desktop"
1013
1033
  ],
1014
- ios: ["teamId", "infoPlist", "entitlements", "privacy", "files"],
1034
+ ios: ["indexPath", "teamId", "infoPlist", "entitlements", "privacy", "files"],
1015
1035
  android: [
1036
+ "indexPath",
1016
1037
  "sha256CertFingerprints",
1017
1038
  "googleServices",
1018
1039
  "push",
@@ -1022,7 +1043,8 @@ class AkanAppConfig {
1022
1043
  "activity",
1023
1044
  "files"
1024
1045
  ],
1025
- desktop: ["server", "recovery", "window", "screenCapture"],
1046
+ desktop: ["indexPath", "server", "recovery", "window", "screenCapture", "entitlements"],
1047
+ desktopServer: ["omit"],
1026
1048
  deepLinks: ["schemes", "domains"]
1027
1049
  };
1028
1050
  static #movedKeys = {
@@ -1050,6 +1072,7 @@ class AkanAppConfig {
1050
1072
  check(settings.ios, AkanAppConfig.#nativeKeys.ios, `${where}.ios`, "ios");
1051
1073
  check(settings.android, AkanAppConfig.#nativeKeys.android, `${where}.android`, "android");
1052
1074
  check(settings.desktop, AkanAppConfig.#nativeKeys.desktop, `${where}.desktop`, "desktop");
1075
+ check(settings.desktop?.server, AkanAppConfig.#nativeKeys.desktopServer, `${where}.desktop.server`, "desktopServer");
1053
1076
  check(settings.deepLinks, AkanAppConfig.#nativeKeys.deepLinks, `${where}.deepLinks`, "deepLinks");
1054
1077
  }
1055
1078
  static #androidFilePattern = /^(?:res\/[^/]+\/[^/]+|assets\/.+)$/;
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  runner,
4
4
  script
5
- } from "./index-xb7qhxa8.js";
5
+ } from "./index-vpj42xwt.js";
6
6
  import {
7
7
  ModuleExecutor
8
- } from "./index-n3jk2501.js";
8
+ } from "./index-3w94e7n3.js";
9
9
  import {
10
10
  sourceFile,
11
11
  moduleSourcePaths,
@@ -13,10 +13,10 @@ import {
13
13
  createPassedPrimitiveReport,
14
14
  bilingualLabelForField,
15
15
  bilingualDescriptionForField
16
- } from "./index-hmdq5pqm.js";
16
+ } from "./index-y3mphr1m.js";
17
17
  import {
18
18
  PageScript
19
- } from "./index-se643zvp.js";
19
+ } from "./index-mbxbhay5.js";
20
20
  import {
21
21
  pluralizeName
22
22
  } from "./index-nz8prx9g.js";
@@ -9,7 +9,7 @@ import {
9
9
  import {
10
10
  AsyncDefaultExportDetector,
11
11
  resolveSsrPageEntriesForApp
12
- } from "./index-n3jk2501.js";
12
+ } from "./index-3w94e7n3.js";
13
13
 
14
14
  // pkgs/@akanjs/devkit/artifact/routeSeedIndex.ts
15
15
  import path from "path";
@@ -5,13 +5,13 @@ import {
5
5
  writeGeneratedSyncState,
6
6
  createRepairReport,
7
7
  renderRepairReport
8
- } from "./index-hmdq5pqm.js";
8
+ } from "./index-y3mphr1m.js";
9
9
  import {
10
10
  AkanContextAnalyzer
11
- } from "./index-tzc1gtrg.js";
11
+ } from "./index-9z771ptz.js";
12
12
  import {
13
13
  runner
14
- } from "./index-xb7qhxa8.js";
14
+ } from "./index-vpj42xwt.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], {
@@ -8,7 +8,7 @@ import {
8
8
  isScannedRootEntry,
9
9
  AppExecutor,
10
10
  LibExecutor
11
- } from "./index-n3jk2501.js";
11
+ } from "./index-3w94e7n3.js";
12
12
  import {
13
13
  FileSys2
14
14
  } from "./index-52w0fvh8.js";
@@ -21,7 +21,7 @@ import {
21
21
  workflowPathsForPlan,
22
22
  workflowRunArtifactPath,
23
23
  workflowSyncDir
24
- } from "./index-hmdq5pqm.js";
24
+ } from "./index-y3mphr1m.js";
25
25
 
26
26
  // pkgs/@akanjs/devkit/akanContext.ts
27
27
  import { readdir } from "fs/promises";