@akanjs/cli 3.0.0-beta.17 → 3.0.0-beta.19

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 (149) hide show
  1. package/.build-stamp +1 -1
  2. package/{CodeAgent-gjqnc2mg.js → CodeAgent-6cm97kay.js} +2 -2
  3. package/{CodeAgentRpcHost-qvwfv0n9.js → CodeAgentRpcHost-p7h6n2hp.js} +1 -1
  4. package/CodeAgentRpcListener-7p7z5dd7.js +97 -0
  5. package/{CodeTui-nd9hqvrw.js → CodeTui-za4jsm41.js} +205 -34
  6. package/{TunnelShare-r5tc2qk5.js → TunnelShare-2j6s511d.js} +2 -2
  7. package/{agent.command-n664dtcv.js → agent.command-e0wpbbyg.js} +6 -6
  8. package/akanCode.js +7 -5
  9. package/{application.command-t5542jte.js → application.command-8wyxqc8q.js} +28 -15
  10. package/{applicationBuildRunner-x4gbfn7y.js → applicationBuildRunner-n9gzaxd0.js} +35 -10
  11. package/{applicationReleasePackager-z61ep017.js → applicationReleasePackager-vpggfqgq.js} +1 -1
  12. package/buildBatch.proc.js +3 -3
  13. package/{capacitorApp-shv3ajh5.js → capacitorApp-q3z0qht0.js} +2 -2
  14. package/{cloud.command-dk5tj39k.js → cloud.command-4zwa5dsx.js} +34 -12
  15. package/cloud.script-fwx3vb34.js +20 -0
  16. package/{code.command-88sebgnn.js → code.command-468c9d7s.js} +41 -19
  17. package/commandManifest.json +1 -1
  18. package/{context.command-pqsm5jrk.js → context.command-dsnw0jby.js} +14 -14
  19. package/context.runner-rs4rj15d.js +22 -0
  20. package/{dependencyScanner-shs82ynp.js → dependencyScanner-0z2h2tks.js} +1 -1
  21. package/{devTui-gy6mendg.js → devTui-ffjsarqa.js} +3 -3
  22. package/{devTuiView-y1548wy6.js → devTuiView-1q1mdgrv.js} +1 -1
  23. package/{guideline.command-rpc2emw8.js → guideline.command-vhw13pqr.js} +8 -13
  24. package/guidelines/agentRule/agentRule.instruction.md +27 -10
  25. package/guidelines/conventions/conventions.instruction.md +53 -26
  26. package/guidelines/queryRule/queryRule.instruction.md +17 -7
  27. package/guidelines/runtimeRule/runtimeRule.instruction.md +74 -0
  28. package/guidelines/ssrRule/ssrRule.instruction.md +4 -2
  29. package/guidelines/transportRule/transportRule.instruction.md +10 -8
  30. package/guidelines/workspaceRecipes/workspaceRecipes.instruction.md +4 -3
  31. package/incrementalBuilder.proc.js +3 -2
  32. package/{index-4n4821gp.js → index-10dkrrww.js} +4 -4
  33. package/{index-bzakk0c2.js → index-14zrtgfa.js} +5 -3
  34. package/{index-v17gj504.js → index-18zybgkc.js} +2 -2
  35. package/{index-qh7brn20.js → index-22xtgmhn.js} +6 -2
  36. package/{index-qhtj9y6j.js → index-2446k7b4.js} +74 -21
  37. package/{index-g9zghs4h.js → index-3jrp517k.js} +12 -12
  38. package/{index-vpx68e4x.js → index-4m929vvn.js} +2 -2
  39. package/{index-4cvpzkq6.js → index-53176s7j.js} +3 -3
  40. package/{index-jwrpsrg3.js → index-667w0yah.js} +1 -1
  41. package/{index-3mg4h788.js → index-7ep8qtvp.js} +2 -2
  42. package/{index-w8kmx1b6.js → index-89hy31kf.js} +30 -7
  43. package/index-9d6nvkz2.js +656 -0
  44. package/index-9dp031by.js +12 -0
  45. package/{index-zn8qgeqx.js → index-a1w6934z.js} +3 -3
  46. package/{index-p0tew3fq.js → index-ab0c38ea.js} +10 -5
  47. package/index-bc88j1ry.js +1166 -0
  48. package/{index-ns128c4q.js → index-bftkz6cp.js} +280 -73
  49. package/{index-kcxmv48c.js → index-bhtmj233.js} +4 -1
  50. package/{index-kvzjda3v.js → index-bwf965h6.js} +5 -5
  51. package/{index-p4p9t45x.js → index-crmeqnmf.js} +56 -44
  52. package/{index-8k16atqy.js → index-d2242ksy.js} +23 -6
  53. package/{index-2sq06vv0.js → index-e4v6vhxq.js} +417 -105
  54. package/{index-xjc7gg65.js → index-esk82rvk.js} +23 -33
  55. package/{index-sn7dnzq4.js → index-kwaq3n9n.js} +1 -1
  56. package/{index-gm76f0qb.js → index-n3cv0tm4.js} +1 -1
  57. package/{index-6na0sd2b.js → index-qdgzsnhg.js} +5 -2
  58. package/{index-twq9p2sp.js → index-s5rhm04y.js} +0 -6
  59. package/{index-n8kt2wh6.js → index-sq2dzkzm.js} +35 -10
  60. package/{index-myj01w9r.js → index-srmay5jw.js} +15 -2
  61. package/{index-2pm1j01n.js → index-txr7dj2g.js} +4 -4
  62. package/{index-3cymrzsb.js → index-vqx8bdxz.js} +17 -3
  63. package/{index-te0y1c0m.js → index-zqgj2rt2.js} +12 -7
  64. package/index.js +21 -21
  65. package/{library.command-m8p2r1dh.js → library.command-cqr175dy.js} +3 -3
  66. package/{localRegistry.command-yppdqrxv.js → localRegistry.command-49z55qqz.js} +9 -9
  67. package/{module.command-mfzvqt0n.js → module.command-9p8mm3b0.js} +5 -5
  68. package/{package.command-cgp2p2v5.js → package.command-wxyz909t.js} +5 -5
  69. package/package.json +2 -2
  70. package/{page.command-taenb02b.js → page.command-gsrsfqqs.js} +3 -3
  71. package/{primitive.command-7kpncmkk.js → primitive.command-ns1mptje.js} +6 -6
  72. package/{prompter-9mn3kp36.js → prompter-1f8d9pcc.js} +1 -1
  73. package/{quality.command-1ar94hrw.js → quality.command-e76k2q9k.js} +18 -17
  74. package/{repair.command-n08t6j8p.js → repair.command-pkrsm3cw.js} +5 -5
  75. package/{routeSourceValidator-apyqw7wk.js → routeSourceValidator-7ycnfz0e.js} +0 -6
  76. package/{scalar.command-mq8qfp4t.js → scalar.command-0cpt3fc8.js} +4 -4
  77. package/skills/akan-code/SKILL.md +122 -0
  78. package/skills/akan-module/SKILL.md +2 -2
  79. package/skills/akan-store/SKILL.md +6 -2
  80. package/{subspace.command-jqv5n79w.js → subspace.command-fktpwp0g.js} +20 -10
  81. package/templates/__scalar/__model__/__model__.abstract.md.template +8 -0
  82. package/templates/appSample/lib/__scalar/workHistory/workHistory.abstract.ts +8 -39
  83. package/templates/appSample/lib/_noti/noti.abstract.ts +6 -29
  84. package/templates/appSample/lib/task/task.abstract.ts +12 -32
  85. package/templates/appSample/lib/task/task.signal.spec.ts +15 -18
  86. package/templates/appSample/lib/task/task.signal.test.ts +15 -1
  87. package/templates/appSample/lib/task/task.signal.ts +1 -1
  88. package/templates/appSample/srvkit/AuthGuard.ts +4 -1
  89. package/templates/appSample/srvkit/SessionInternalArg.ts +3 -1
  90. package/templates/crudPages/[__model__Id]/edit/page.tsx +2 -1
  91. package/templates/crudPages/[__model__Id]/page.tsx +2 -1
  92. package/templates/crudPages/new/page.tsx +2 -1
  93. package/templates/crudPages/page.tsx +2 -1
  94. package/templates/crudSinglePage/page.tsx +2 -1
  95. package/templates/localDev/docker-compose.yaml.template +3 -14
  96. package/templates/module/__model__.signal.ts +12 -4
  97. package/templates/pkgRoot/tsconfig.json.template +2 -7
  98. package/templates/service/__model__.abstract.md.template +8 -0
  99. package/{tunnel.command-ht2es78c.js → tunnel.command-d5jy9gk8.js} +4 -4
  100. package/{workflow.command-tvz4nm9n.js → workflow.command-6tkcysmx.js} +9 -9
  101. package/{workspace.command-txv1yv5e.js → workspace.command-gv84eh1p.js} +25 -24
  102. package/cloud.script-ch3xrw3s.js +0 -20
  103. package/context.runner-bys6ykcp.js +0 -22
  104. package/guidelines/agentRule/agentRule.generate.json +0 -31
  105. package/guidelines/componentRule/componentRule.generate.json +0 -31
  106. package/guidelines/conventions/conventions.generate.json +0 -25
  107. package/guidelines/cssRule/cssRule.generate.json +0 -31
  108. package/guidelines/docPageRule/docPageRule.generate.json +0 -31
  109. package/guidelines/docPageRule/docPageRule.instruction.md +0 -25
  110. package/guidelines/docSyncRule/docSyncRule.generate.json +0 -31
  111. package/guidelines/docSyncRule/docSyncRule.instruction.md +0 -25
  112. package/guidelines/enumConstant/enumConstant.generate.json +0 -31
  113. package/guidelines/enumConstant/enumConstant.instruction.md +0 -28
  114. package/guidelines/fieldRule/fieldRule.generate.json +0 -31
  115. package/guidelines/framework/framework.generate.json +0 -32
  116. package/guidelines/mcpRule/mcpRule.generate.json +0 -35
  117. package/guidelines/modelConstant/modelConstant.generate.json +0 -32
  118. package/guidelines/modelDictionary/modelDictionary.generate.json +0 -32
  119. package/guidelines/modelDocument/modelDocument.generate.json +0 -31
  120. package/guidelines/modelService/modelService.generate.json +0 -31
  121. package/guidelines/modelSignal/modelSignal.generate.json +0 -31
  122. package/guidelines/modelStore/modelStore.generate.json +0 -31
  123. package/guidelines/modelTemplate/modelTemplate.generate.json +0 -31
  124. package/guidelines/modelUnit/modelUnit.generate.json +0 -31
  125. package/guidelines/modelUtil/modelUtil.generate.json +0 -31
  126. package/guidelines/modelView/modelView.generate.json +0 -31
  127. package/guidelines/modelZone/modelZone.generate.json +0 -31
  128. package/guidelines/moduleCodegen/moduleCodegen.generate.json +0 -31
  129. package/guidelines/moduleCodegen/moduleCodegen.instruction.md +0 -28
  130. package/guidelines/moduleOverview/moduleOverview.generate.json +0 -31
  131. package/guidelines/queryRule/queryRule.generate.json +0 -31
  132. package/guidelines/recipeRule/recipeRule.generate.json +0 -31
  133. package/guidelines/runtimeRule/runtimeRule.generate.json +0 -25
  134. package/guidelines/scalarConstant/scalarConstant.generate.json +0 -32
  135. package/guidelines/scalarDictionary/scalarDictionary.generate.json +0 -32
  136. package/guidelines/scalarModule/scalarModule.generate.json +0 -31
  137. package/guidelines/sharedUiUsage/sharedUiUsage.generate.json +0 -31
  138. package/guidelines/sharedUiUsage/sharedUiUsage.instruction.md +0 -25
  139. package/guidelines/ssrRule/ssrRule.generate.json +0 -31
  140. package/guidelines/transportRule/transportRule.generate.json +0 -31
  141. package/guidelines/utilUiUsage/utilUiUsage.generate.json +0 -31
  142. package/guidelines/utilUiUsage/utilUiUsage.instruction.md +0 -25
  143. package/guidelines/workspaceOnboarding/workspaceOnboarding.generate.json +0 -24
  144. package/guidelines/workspaceRecipes/workspaceRecipes.generate.json +0 -34
  145. package/index-57p9p179.js +0 -461
  146. package/index-qt8dqgnf.js +0 -250
  147. package/templates/__scalar/__model__/__model__.abstract.md +0 -28
  148. package/templates/module/__model__.abstract.md +0 -28
  149. package/templates/service/__model__.abstract.md +0 -28
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  runner,
4
4
  script
5
- } from "./index-6na0sd2b.js";
5
+ } from "./index-qdgzsnhg.js";
6
6
  import {
7
7
  ModuleExecutor
8
- } from "./index-p4p9t45x.js";
8
+ } from "./index-crmeqnmf.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-qhtj9y6j.js";
16
+ } from "./index-2446k7b4.js";
17
17
  import {
18
18
  PageScript
19
- } from "./index-qh7brn20.js";
19
+ } from "./index-22xtgmhn.js";
20
20
  import {
21
21
  pluralizeName
22
22
  } from "./index-nz8prx9g.js";
@@ -31,37 +31,17 @@ var purposeByModule = {
31
31
  project: "Project represents a project workspace or business initiative managed by the app.",
32
32
  task: "Task represents work items that move through the app workflow."
33
33
  };
34
- var moduleAbstractContent = (moduleName) => {
34
+ var moduleAbstractContent = (moduleName, sharedGuards) => {
35
35
  const title = capitalize(moduleName);
36
- const label = bilingualLabelForField(moduleName);
37
- const purpose = purposeByModule[moduleName] ?? `${title} represents ${label.en.toLowerCase()} records managed by the app.`;
38
- return `# ${title} Module Abstract
39
-
40
- ## Purpose
41
-
36
+ const noun = bilingualLabelForField(moduleName).en.toLowerCase();
37
+ const purpose = purposeByModule[moduleName] ?? `${title} represents ${noun} records managed by the app.`;
38
+ const writeRule = sharedGuards ? `Anyone may read a ${noun}; only an admin creates, updates or removes one.` : `Anyone may read a ${noun}; nobody creates, updates or removes one until the slice names a guard.`;
39
+ return `# ${moduleName} Abstract
42
40
  ${purpose}
43
41
 
44
- ## Domain Rules
45
-
46
- - Keep ${label.en.toLowerCase()} data consistent with user-facing dictionary labels.
47
-
48
- ## Data Meaning
49
-
50
- ${label.en} (${label.ko}) is the primary business concept for this module.
51
-
52
- ## Workflows
53
-
54
- No lifecycle workflow yet.
55
-
56
- ## Agent Notes
57
-
58
- - Read this abstract before changing the module.
59
- - Update this file when business invariants, workflows, or public behavior change.
60
- - Do not update this file for formatting-only, import-only, or style-only changes.
61
-
62
- ## Related Modules
63
-
64
- - None yet.
42
+ ## Rules
43
+ - ${writeRule}
44
+ - Removal is soft: a removed ${noun} keeps its row with \`removedAt\` set.
65
45
  `;
66
46
  };
67
47
  var localModuleFilename = (moduleName, pathKey) => moduleSourcePaths(moduleName)[pathKey].replace(`lib/${moduleName}/`, "");
@@ -92,6 +72,14 @@ class ModuleRunner extends runner("module") {
92
72
  async removeModule(module) {
93
73
  await module.sys.removeDir(`lib/${module.name}`);
94
74
  }
75
+ async#hasSharedGuards(module) {
76
+ const { sys } = module;
77
+ if (sys.type === "lib" && sys.name === "shared")
78
+ return true;
79
+ if (!await sys.exists("lib/srv.ts"))
80
+ return false;
81
+ return (await sys.readFile("lib/srv.ts")).includes('"@libs/shared/lib/srv"');
82
+ }
95
83
  async createComponentTemplate(module, type) {
96
84
  await module.sys.applyTemplate({
97
85
  basePath: `./lib/${module.name}`,
@@ -122,9 +110,11 @@ class ModuleRunner extends runner("module") {
122
110
  zone: localModuleFilename(module.name, "zone"),
123
111
  util: localModuleFilename(module.name, "util")
124
112
  };
113
+ const sharedGuards = await this.#hasSharedGuards(module);
125
114
  await module.applyTemplate({
126
115
  basePath: `.`,
127
116
  template: "module",
117
+ options: { sharedGuards },
128
118
  dict: {
129
119
  model: module.name,
130
120
  models: names,
@@ -136,7 +126,7 @@ class ModuleRunner extends runner("module") {
136
126
  modelDescKo: modelDescription.ko
137
127
  }
138
128
  });
139
- await module.writeFile(filenames.abstract, moduleAbstractContent(module.name));
129
+ await module.writeFile(filenames.abstract, moduleAbstractContent(module.name, sharedGuards));
140
130
  const [
141
131
  abstractContent,
142
132
  constantContent,
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  AppInfo
4
- } from "./index-p4p9t45x.js";
4
+ } from "./index-crmeqnmf.js";
5
5
 
6
6
  // pkgs/@akanjs/devkit/slicePlanner.ts
7
7
  class SlicePlanner {
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  GlobalConfig,
4
4
  CloudApi
5
- } from "./index-myj01w9r.js";
5
+ } from "./index-srmay5jw.js";
6
6
 
7
7
  // pkgs/@akanjs/cli/tunnel/TunnelShare.ts
8
8
  import { TunnelAgent } from "akanjs/server/tunnel";
@@ -9,7 +9,7 @@ import {
9
9
  LibExecutor,
10
10
  PkgExecutor,
11
11
  ModuleExecutor
12
- } from "./index-p4p9t45x.js";
12
+ } from "./index-crmeqnmf.js";
13
13
  import {
14
14
  getDirname2
15
15
  } from "./index-6wwzs1bc.js";
@@ -327,7 +327,8 @@ var formatCommandHelp = (command, key) => {
327
327
  const opt = arg.argsOption;
328
328
  const flag = opt.flag ? `-${opt.flag}, ` : "";
329
329
  const kebabName = camelToKebabCase2(arg.name);
330
- const optName = `${flag}--${kebabName}`;
330
+ const negation = opt.type === "boolean" && opt.default === true ? `, --no-${kebabName}` : "";
331
+ const optName = `${flag}--${kebabName}${negation}`;
331
332
  const optDesc = opt.desc ?? "";
332
333
  const defaultVal = opt.default !== undefined ? chalk.gray(` [default: ${String(opt.default)}]`) : "";
333
334
  const choices = opt.enum ? chalk.gray(typeof opt.enum === "function" ? " ([dynamic choices])" : ` (${opt.enum.map(formatChoice).join(", ")})`) : "";
@@ -384,6 +385,8 @@ var handleOption = (programCommand, argMeta) => {
384
385
  const kebabName = camelToKebabCase3(argMeta.name);
385
386
  const choices = enumChoices && typeof enumChoices !== "function" ? normalizeEnumChoices(enumChoices) : null;
386
387
  programCommand.option(`-${flag}, --${kebabName}${type === "boolean" ? " [boolean]" : ` <${kebabName}>`}`, `${desc}${ask ? ` (${ask})` : ""}${example ? ` (example: ${example})` : ""}${choices ? ` (choices: ${choices.map((choice) => choice.name).join(", ")})` : ""}`);
388
+ if (type === "boolean" && argMeta.argsOption.default === true)
389
+ programCommand.option(`--no-${kebabName}`, `turn off --${kebabName}`);
387
390
  return programCommand;
388
391
  };
389
392
  var handleArgument = (programCommand, argMeta) => {
@@ -29,12 +29,6 @@ class Prompter2 {
29
29
  const guidelineRoot = await Prompter2.#getGuidelineRoot();
30
30
  return (await fsPromise.readdir(guidelineRoot)).filter((name) => !name.startsWith("_")).sort();
31
31
  }
32
- static async getGuideJson(guideName) {
33
- const guidelineRoot = await Prompter2.#getGuidelineRoot();
34
- const filePath = `${guidelineRoot}/${guideName}/${guideName}.generate.json`;
35
- const guideJson = await fsPromise.readFile(filePath, "utf-8");
36
- return JSON.parse(guideJson);
37
- }
38
32
  static async getInstruction(guideName) {
39
33
  const guideNames = await Prompter2.listGuidelines();
40
34
  if (!guideNames.includes(guideName))
@@ -2,22 +2,22 @@
2
2
  import {
3
3
  GlobalConfig,
4
4
  CloudApi
5
- } from "./index-myj01w9r.js";
5
+ } from "./index-srmay5jw.js";
6
6
  import {
7
7
  script
8
- } from "./index-6na0sd2b.js";
8
+ } from "./index-qdgzsnhg.js";
9
9
  import {
10
10
  PkgExecutor
11
- } from "./index-p4p9t45x.js";
11
+ } from "./index-crmeqnmf.js";
12
12
  import {
13
13
  ApplicationScript
14
- } from "./index-ns128c4q.js";
14
+ } from "./index-bftkz6cp.js";
15
15
  import {
16
16
  PackageScript
17
- } from "./index-p0tew3fq.js";
17
+ } from "./index-ab0c38ea.js";
18
18
  import {
19
19
  CloudRunner
20
- } from "./index-57p9p179.js";
20
+ } from "./index-bc88j1ry.js";
21
21
 
22
22
  // pkgs/@akanjs/cli/cloud/cloud.script.ts
23
23
  import { Logger } from "akanjs/common";
@@ -55,18 +55,43 @@ class CloudScript2 extends script("cloud", [CloudRunner, ApplicationScript, Pack
55
55
  await this.cloudRunner.uploadEnvByScp(workspace, path);
56
56
  return { workspaceId: null, files };
57
57
  }
58
- async deployAkan(workspace, { test = true, registryUrl } = {}) {
58
+ async deployAkan(workspace, {
59
+ test = true,
60
+ registryUrl,
61
+ platforms = []
62
+ } = {}) {
59
63
  const akanPkgs = await this.cloudRunner.getAkanPkgs(workspace);
60
64
  await this.packageScript.updateWorskpaceRootPackageJson(workspace);
61
65
  const pkgs = akanPkgs.map((pkgName) => PkgExecutor.from(workspace, pkgName));
62
- if (test)
63
- for (const pkg of pkgs)
64
- await this.applicationScript.test(pkg);
66
+ if (test) {
67
+ const platformRun = platforms.length ? await this.cloudRunner.startPlatformTests(workspace, platforms, akanPkgs) : null;
68
+ let localFailure = null;
69
+ try {
70
+ for (const pkg of pkgs)
71
+ await this.applicationScript.test(pkg);
72
+ } catch (error) {
73
+ localFailure = error;
74
+ }
75
+ if (platformRun)
76
+ await this.cloudRunner.settlePlatformTests(platformRun, {
77
+ interactive: !localFailure,
78
+ recordStreaks: !localFailure,
79
+ checkDrift: true
80
+ });
81
+ if (localFailure)
82
+ throw localFailure;
83
+ }
65
84
  for (const pkg of pkgs)
66
85
  await this.packageScript.buildPackage(pkg);
67
86
  await this.packageScript.verifyAkanPublishPackages(workspace);
68
87
  await this.cloudRunner.deployAkan(workspace, akanPkgs, { registryUrl });
69
88
  }
89
+ async testPlatforms(workspace, { platforms, pkgs }) {
90
+ if (!platforms.length)
91
+ throw new Error("No platform to test on \u2014 pass --platforms linux,windows");
92
+ const run = await this.cloudRunner.startPlatformTests(workspace, platforms, pkgs ?? await this.cloudRunner.getAkanPkgs(workspace));
93
+ await this.cloudRunner.settlePlatformTests(run, { interactive: false, recordStreaks: false, checkDrift: false });
94
+ }
70
95
  async update(workspace, tag = "latest", { registryUrl } = {}) {
71
96
  const spinner = workspace.spinning("Updating Akan.js packages and CLI...");
72
97
  await this.cloudRunner.update(workspace, tag, { registryUrl });
@@ -13,7 +13,8 @@ var configPath = `${basePath}/config.json`;
13
13
  var getDefaultHostConfig = (host = GlobalConfig.akanCloudHost) => ({ host });
14
14
  var defaultAkanGlobalConfig = {
15
15
  cloudHost: {},
16
- remoteEnvServers: {}
16
+ remoteEnvServers: {},
17
+ testTargets: {}
17
18
  };
18
19
 
19
20
  // pkgs/@akanjs/devkit/cloud/globalConfig.ts
@@ -26,7 +27,8 @@ class GlobalConfig {
26
27
  ...defaultAkanGlobalConfig,
27
28
  ...akanConfig,
28
29
  cloudHost: akanConfig.cloudHost ?? defaultAkanGlobalConfig.cloudHost,
29
- remoteEnvServers: akanConfig.remoteEnvServers ?? defaultAkanGlobalConfig.remoteEnvServers
30
+ remoteEnvServers: akanConfig.remoteEnvServers ?? defaultAkanGlobalConfig.remoteEnvServers,
31
+ testTargets: akanConfig.testTargets ?? defaultAkanGlobalConfig.testTargets
30
32
  };
31
33
  }
32
34
  static async#setAkanGlobalConfig(akanConfig) {
@@ -65,6 +67,17 @@ class GlobalConfig {
65
67
  remoteEnvServers
66
68
  });
67
69
  }
70
+ static async getTestTargets() {
71
+ const akanConfig = await GlobalConfig.#getAkanGlobalConfig();
72
+ return akanConfig.testTargets;
73
+ }
74
+ static async setTestTargets(testTargets) {
75
+ const akanConfig = await GlobalConfig.#getAkanGlobalConfig();
76
+ await GlobalConfig.#setAkanGlobalConfig({
77
+ ...akanConfig,
78
+ testTargets: { ...akanConfig.testTargets, ...testTargets }
79
+ });
80
+ }
68
81
  static needRefreshToken(accessToken) {
69
82
  return !!accessToken?.expiresAt?.isBefore(dayjs().add(1, "hour"));
70
83
  }
@@ -20,13 +20,13 @@ import {
20
20
  renderWorkflowApply,
21
21
  renderWorkflowValidation,
22
22
  renderWorkflowRunArtifact
23
- } from "./index-qhtj9y6j.js";
23
+ } from "./index-2446k7b4.js";
24
24
  import {
25
25
  AkanContextAnalyzer
26
- } from "./index-v17gj504.js";
26
+ } from "./index-18zybgkc.js";
27
27
  import {
28
28
  runner
29
- } from "./index-6na0sd2b.js";
29
+ } from "./index-qdgzsnhg.js";
30
30
 
31
31
  // pkgs/@akanjs/cli/workflow/workflow.runner.ts
32
32
  import { mkdir, readFile, writeFile } from "fs/promises";
@@ -146,7 +146,7 @@ var addFieldWorkflowSpec = {
146
146
  values: { type: "string-list", description: "Comma-separated enum values when type is enum." },
147
147
  default: {
148
148
  type: "string",
149
- description: "Optional default value. plan/apply coerce by field type: Int/Float to numeric literals, Boolean to true/false, Date to new Date(...), String/scalar to string literals, and enum only when the value is in values."
149
+ description: "Optional default value. plan/apply coerce by field type: Int/Float to numeric literals, Boolean to true/false, Date (now, a timestamp, or a date string) to a () => dayjs(...) thunk, String/scalar to string literals, and enum only when the value is in values."
150
150
  },
151
151
  surfaces: {
152
152
  type: "string-list",
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  CommandExecutionError
4
- } from "./index-p4p9t45x.js";
4
+ } from "./index-crmeqnmf.js";
5
5
  import {
6
6
  resolveMobilePath,
7
7
  targetHtmlFilename
@@ -450,7 +450,7 @@ function classifyIosRunFailure(log) {
450
450
  return {
451
451
  kind: "unknown",
452
452
  title: "iOS native run failed.",
453
- detail: "Review the xcodebuild/devicectl output above. You can retry with --noAllowProvisioningUpdates to use the conservative path."
453
+ detail: "Review the xcodebuild/devicectl output above. You can retry with --no-allow-provisioning-updates to use the conservative path."
454
454
  };
455
455
  }
456
456
  function formatIosRunFailureMessage(input) {
@@ -528,6 +528,20 @@ function raiseGradleMinSdkVersion(content, floor = ANDROID_MIN_SDK_VERSION) {
528
528
  return null;
529
529
  return content.replace(/(minSdkVersion\s*=\s*)\d+/, `$1${floor}`);
530
530
  }
531
+ var iosUsageDescriptionKeys = {
532
+ cameraUsageDescription: ["NSCameraUsageDescription"],
533
+ photoAddUsageDescription: ["NSPhotoLibraryAddUsageDescription"],
534
+ photoUsageDescription: ["NSPhotoLibraryUsageDescription"],
535
+ contactsUsageDescription: ["NSContactsUsageDescription"],
536
+ locationAlwaysUsageDescription: ["NSLocationAlwaysAndWhenInUseUsageDescription", "NSLocationAlwaysUsageDescription"],
537
+ locationWhenInUseUsageDescription: ["NSLocationWhenInUseUsageDescription"],
538
+ microphoneUsageDescription: ["NSMicrophoneUsageDescription"],
539
+ speechRecognitionUsageDescription: ["NSSpeechRecognitionUsageDescription"]
540
+ };
541
+ var toIosInfoPlistUsageDescriptions = (descriptions) => Object.fromEntries(Object.entries(descriptions).flatMap(([key, value]) => {
542
+ const plistKeys = Object.hasOwn(iosUsageDescriptionKeys, key) ? iosUsageDescriptionKeys[key] : [`NS${capitalize(key)}`];
543
+ return plistKeys.map((plistKey) => [plistKey, value]);
544
+ }));
531
545
  var mergeAllowNavigation = (configured, localIp) => {
532
546
  const values = Array.isArray(configured) ? configured.filter((value) => typeof value === "string") : [];
533
547
  if (localIp)
@@ -1329,7 +1343,7 @@ ${error.message}`;
1329
1343
  await editor.setContent(next).save();
1330
1344
  }
1331
1345
  async#setPermissionInIos(permissions) {
1332
- const updateNs = Object.fromEntries(Object.entries(permissions).map(([key, value]) => [`NS${capitalize(key)}`, value]));
1346
+ const updateNs = toIosInfoPlistUsageDescriptions(permissions);
1333
1347
  await Promise.all([
1334
1348
  this.project.ios.updateInfoPlist(this.iosTargetName, "Debug", updateNs),
1335
1349
  this.project.ios.updateInfoPlist(this.iosTargetName, "Release", updateNs)
@@ -1,12 +1,12 @@
1
1
  // @bun
2
2
  import {
3
3
  script
4
- } from "./index-6na0sd2b.js";
4
+ } from "./index-qdgzsnhg.js";
5
5
  import {
6
6
  AppExecutor,
7
7
  LibExecutor,
8
8
  ModuleExecutor
9
- } from "./index-p4p9t45x.js";
9
+ } from "./index-crmeqnmf.js";
10
10
  import {
11
11
  compactDiagnostics,
12
12
  createPrimitiveWriteReport,
@@ -18,6 +18,8 @@ import {
18
18
  nextActionsForTarget,
19
19
  lowerlize,
20
20
  normalizeFieldType,
21
+ ensureNamedImport,
22
+ ensureBaseImport,
21
23
  ensureBaseTypeImport,
22
24
  coerceFieldDefault,
23
25
  fieldExpression,
@@ -39,10 +41,10 @@ import {
39
41
  hasSignalFactoryEntry,
40
42
  insertSignalFactoryEntry,
41
43
  addFieldUiPolicyForType
42
- } from "./index-qhtj9y6j.js";
44
+ } from "./index-2446k7b4.js";
43
45
  import {
44
46
  ModuleScript
45
- } from "./index-xjc7gg65.js";
47
+ } from "./index-esk82rvk.js";
46
48
 
47
49
  // pkgs/@akanjs/cli/primitive/primitive.script.ts
48
50
  import { capitalize } from "akanjs/common";
@@ -210,6 +212,8 @@ class PrimitiveScript extends script("primitive", [ModuleScript]) {
210
212
  if (defaultCoercion.diagnostic)
211
213
  diagnostics.push(defaultCoercion.diagnostic);
212
214
  constantContent = ensureBaseTypeImport(constantContent, input.type);
215
+ if (input.type === "Date" && defaultCoercion.expression)
216
+ constantContent = ensureBaseImport(constantContent, "dayjs");
213
217
  }
214
218
  if (enumValues) {
215
219
  const defaultCoercion = coerceFieldDefault("enum", input.defaultValue, { enumValues });
@@ -353,7 +357,7 @@ class PrimitiveScript extends script("primitive", [ModuleScript]) {
353
357
  signal: name ? {
354
358
  className: `${moduleClassName}Endpoint`,
355
359
  entryLine: [
356
- `${name}: mutation(Boolean)`,
360
+ `${name}: mutation(Boolean, { guards: [None] })`,
357
361
  ` .exec(async function () {`,
358
362
  ` return await this.${serviceRef}Service.${name}();`,
359
363
  ` }),`
@@ -388,7 +392,7 @@ class PrimitiveScript extends script("primitive", [ModuleScript]) {
388
392
  signal: name && queryName ? {
389
393
  className: `${moduleClassName}Slice`,
390
394
  entryLine: [
391
- `${name}: init()`,
395
+ `${name}: init({ guards: [None] })`,
392
396
  ` .exec(function () {`,
393
397
  ` return this.${serviceRef}Service.${queryName}();`,
394
398
  ` }),`
@@ -476,7 +480,8 @@ class PrimitiveScript extends script("primitive", [ModuleScript]) {
476
480
  });
477
481
  }
478
482
  const nextServiceContent = serviceMethodExists ? serviceContent : insertClassMethod(serviceContent, serviceClassName, spec.serviceMethod.block);
479
- const nextSignalContent = insertSignalFactoryEntry(signalContent, spec.signal.className, spec.entryName, spec.signal.entryLine, spec.signal.param);
483
+ const insertedSignalContent = insertSignalFactoryEntry(signalContent, spec.signal.className, spec.entryName, spec.signal.entryLine, spec.signal.param);
484
+ const nextSignalContent = insertedSignalContent ? ensureNamedImport(insertedSignalContent, "akanjs/signal", "None") : insertedSignalContent;
480
485
  if (!nextServiceContent) {
481
486
  diagnostics.push({
482
487
  severity: "error",
package/index.js CHANGED
@@ -4,9 +4,9 @@ import {
4
4
  getTargetMetas,
5
5
  getTargetCommandNames,
6
6
  runCommands
7
- } from "./index-6na0sd2b.js";
7
+ } from "./index-qdgzsnhg.js";
8
8
  import"./index-q0y2jq9j.js";
9
- import"./index-p4p9t45x.js";
9
+ import"./index-crmeqnmf.js";
10
10
  import"./index-6wwzs1bc.js";
11
11
 
12
12
  // pkgs/@akanjs/cli/commandManifest.ts
@@ -14,25 +14,25 @@ import path from "path";
14
14
 
15
15
  // pkgs/@akanjs/cli/commandModules.ts
16
16
  var commandModules = {
17
- workspace: async () => (await import("./workspace.command-txv1yv5e.js")).WorkspaceCommand,
18
- agent: async () => (await import("./agent.command-n664dtcv.js")).AgentCommand,
19
- code: async () => (await import("./code.command-88sebgnn.js")).CodeCommand,
20
- application: async () => (await import("./application.command-t5542jte.js")).ApplicationCommand,
21
- library: async () => (await import("./library.command-m8p2r1dh.js")).LibraryCommand,
22
- localRegistry: async () => (await import("./localRegistry.command-yppdqrxv.js")).LocalRegistryCommand,
23
- package: async () => (await import("./package.command-cgp2p2v5.js")).PackageCommand,
24
- module: async () => (await import("./module.command-mfzvqt0n.js")).ModuleCommand,
25
- page: async () => (await import("./page.command-taenb02b.js")).PageCommand,
26
- context: async () => (await import("./context.command-pqsm5jrk.js")).ContextCommand,
27
- cloud: async () => (await import("./cloud.command-dk5tj39k.js")).CloudCommand,
28
- subspace: async () => (await import("./subspace.command-jqv5n79w.js")).SubspaceCommand,
29
- guideline: async () => (await import("./guideline.command-rpc2emw8.js")).GuidelineCommand,
30
- scalar: async () => (await import("./scalar.command-mq8qfp4t.js")).ScalarCommand,
31
- primitive: async () => (await import("./primitive.command-7kpncmkk.js")).PrimitiveCommand,
32
- quality: async () => (await import("./quality.command-1ar94hrw.js")).QualityCommand,
33
- repair: async () => (await import("./repair.command-n08t6j8p.js")).RepairCommand,
34
- workflow: async () => (await import("./workflow.command-tvz4nm9n.js")).WorkflowCommand,
35
- tunnel: async () => (await import("./tunnel.command-ht2es78c.js")).TunnelCommand
17
+ workspace: async () => (await import("./workspace.command-gv84eh1p.js")).WorkspaceCommand,
18
+ agent: async () => (await import("./agent.command-e0wpbbyg.js")).AgentCommand,
19
+ code: async () => (await import("./code.command-468c9d7s.js")).CodeCommand,
20
+ application: async () => (await import("./application.command-8wyxqc8q.js")).ApplicationCommand,
21
+ library: async () => (await import("./library.command-cqr175dy.js")).LibraryCommand,
22
+ localRegistry: async () => (await import("./localRegistry.command-49z55qqz.js")).LocalRegistryCommand,
23
+ package: async () => (await import("./package.command-wxyz909t.js")).PackageCommand,
24
+ module: async () => (await import("./module.command-9p8mm3b0.js")).ModuleCommand,
25
+ page: async () => (await import("./page.command-gsrsfqqs.js")).PageCommand,
26
+ context: async () => (await import("./context.command-dsnw0jby.js")).ContextCommand,
27
+ cloud: async () => (await import("./cloud.command-4zwa5dsx.js")).CloudCommand,
28
+ subspace: async () => (await import("./subspace.command-fktpwp0g.js")).SubspaceCommand,
29
+ guideline: async () => (await import("./guideline.command-vhw13pqr.js")).GuidelineCommand,
30
+ scalar: async () => (await import("./scalar.command-0cpt3fc8.js")).ScalarCommand,
31
+ primitive: async () => (await import("./primitive.command-ns1mptje.js")).PrimitiveCommand,
32
+ quality: async () => (await import("./quality.command-e76k2q9k.js")).QualityCommand,
33
+ repair: async () => (await import("./repair.command-pkrsm3cw.js")).RepairCommand,
34
+ workflow: async () => (await import("./workflow.command-6tkcysmx.js")).WorkflowCommand,
35
+ tunnel: async () => (await import("./tunnel.command-d5jy9gk8.js")).TunnelCommand
36
36
  };
37
37
  var commandModuleIds = Object.keys(commandModules);
38
38
 
@@ -3,13 +3,13 @@ import {
3
3
  Lib,
4
4
  Workspace,
5
5
  command
6
- } from "./index-6na0sd2b.js";
6
+ } from "./index-qdgzsnhg.js";
7
7
  import"./index-q0y2jq9j.js";
8
- import"./index-p4p9t45x.js";
8
+ import"./index-crmeqnmf.js";
9
9
  import"./index-6wwzs1bc.js";
10
10
  import {
11
11
  LibraryScript
12
- } from "./index-3mg4h788.js";
12
+ } from "./index-7ep8qtvp.js";
13
13
 
14
14
  // pkgs/@akanjs/cli/library/library.command.ts
15
15
  class LibraryCommand extends command("library", [LibraryScript], ({ public: target }) => ({
@@ -4,28 +4,28 @@ import {
4
4
  runner,
5
5
  script,
6
6
  command
7
- } from "./index-6na0sd2b.js";
7
+ } from "./index-qdgzsnhg.js";
8
8
  import"./index-q0y2jq9j.js";
9
9
  import {
10
10
  PkgExecutor
11
- } from "./index-p4p9t45x.js";
11
+ } from "./index-crmeqnmf.js";
12
12
  import"./index-6wwzs1bc.js";
13
13
  import {
14
14
  ApplicationScript
15
- } from "./index-ns128c4q.js";
16
- import"./index-3mg4h788.js";
15
+ } from "./index-bftkz6cp.js";
16
+ import"./index-7ep8qtvp.js";
17
17
  import"./index-hwkygn9s.js";
18
18
  import"./index-7md2g9vw.js";
19
- import"./index-myj01w9r.js";
19
+ import"./index-srmay5jw.js";
20
20
  import {
21
21
  getNpmRegistryUrl,
22
22
  CloudRunner
23
- } from "./index-57p9p179.js";
24
- import"./index-kcxmv48c.js";
23
+ } from "./index-bc88j1ry.js";
24
+ import"./index-bhtmj233.js";
25
25
  import {
26
26
  PackageScript
27
- } from "./index-p0tew3fq.js";
28
- import"./index-sn7dnzq4.js";
27
+ } from "./index-ab0c38ea.js";
28
+ import"./index-kwaq3n9n.js";
29
29
 
30
30
  // pkgs/@akanjs/cli/localRegistry/localRegistry.runner.ts
31
31
  import { mkdir, rm } from "fs/promises";
@@ -3,17 +3,17 @@ import {
3
3
  Sys,
4
4
  Module,
5
5
  command
6
- } from "./index-6na0sd2b.js";
6
+ } from "./index-qdgzsnhg.js";
7
7
  import"./index-q0y2jq9j.js";
8
- import"./index-p4p9t45x.js";
8
+ import"./index-crmeqnmf.js";
9
9
  import"./index-6wwzs1bc.js";
10
10
  import {
11
11
  renderPrimitiveReport
12
- } from "./index-qhtj9y6j.js";
13
- import"./index-qh7brn20.js";
12
+ } from "./index-2446k7b4.js";
13
+ import"./index-22xtgmhn.js";
14
14
  import {
15
15
  ModuleScript
16
- } from "./index-xjc7gg65.js";
16
+ } from "./index-esk82rvk.js";
17
17
 
18
18
  // pkgs/@akanjs/cli/module/module.command.ts
19
19
  import { Logger, lowerlize } from "akanjs/common";
@@ -3,21 +3,21 @@ import {
3
3
  Pkg,
4
4
  Workspace,
5
5
  command
6
- } from "./index-6na0sd2b.js";
6
+ } from "./index-qdgzsnhg.js";
7
7
  import"./index-q0y2jq9j.js";
8
- import"./index-p4p9t45x.js";
8
+ import"./index-crmeqnmf.js";
9
9
  import"./index-6wwzs1bc.js";
10
- import"./index-kcxmv48c.js";
10
+ import"./index-bhtmj233.js";
11
11
  import {
12
12
  PackageScript
13
- } from "./index-p0tew3fq.js";
13
+ } from "./index-ab0c38ea.js";
14
14
 
15
15
  // pkgs/@akanjs/cli/package/package.command.ts
16
16
  class PackageCommand extends command("package", [PackageScript], ({ public: target }) => ({
17
17
  version: target({ desc: "Show version information for all packages" }).with(Workspace).exec(async function(workspace) {
18
18
  await this.packageScript.version(workspace);
19
19
  }),
20
- createPackage: target({ desc: "Create a new package in pkgs/akanjs/" }).option("name", String, { desc: "name of package" }).with(Workspace).exec(async function(name, workspace) {
20
+ createPackage: target({ desc: "Create a new package in pkgs/<name>/" }).option("name", String, { desc: "name of package" }).with(Workspace).exec(async function(name, workspace) {
21
21
  await this.packageScript.createPackage(workspace, name.toLowerCase().replace(/ /g, "-"));
22
22
  }),
23
23
  removePackage: target({ desc: "Remove a package from the workspace" }).with(Pkg).exec(async function(pkg) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akanjs/cli",
3
- "version": "3.0.0-beta.17",
3
+ "version": "3.0.0-beta.19",
4
4
  "sourceType": "module",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -40,7 +40,7 @@
40
40
  "@inquirer/prompts": "^8.4.3",
41
41
  "@tailwindcss/node": "^4.3.0",
42
42
  "@trapezedev/project": "^7.1.4",
43
- "akanjs": "3.0.0-beta.17",
43
+ "akanjs": "3.0.0-beta.19",
44
44
  "chalk": "^5.6.2",
45
45
  "commander": "^14.0.3",
46
46
  "dayjs": "^1.11.20",
@@ -3,13 +3,13 @@ import {
3
3
  App,
4
4
  Module,
5
5
  command
6
- } from "./index-6na0sd2b.js";
6
+ } from "./index-qdgzsnhg.js";
7
7
  import"./index-q0y2jq9j.js";
8
- import"./index-p4p9t45x.js";
8
+ import"./index-crmeqnmf.js";
9
9
  import"./index-6wwzs1bc.js";
10
10
  import {
11
11
  PageScript
12
- } from "./index-qh7brn20.js";
12
+ } from "./index-22xtgmhn.js";
13
13
 
14
14
  // pkgs/@akanjs/cli/page/page.command.ts
15
15
  class PageCommand extends command("page", [PageScript], ({ public: target }) => ({