@akanjs/cli 3.0.0-alpha.68 → 3.0.0-alpha.69

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 (50) hide show
  1. package/.build-stamp +1 -1
  2. package/README.ko.md +72 -0
  3. package/README.md +85 -0
  4. package/{agent.command-0cmqr1jg.js → agent.command-964bf8qg.js} +5 -5
  5. package/{application.command-rb1dtwdd.js → application.command-n45n18sc.js} +4 -4
  6. package/buildBatch.proc.js +1 -1
  7. package/{capacitorApp-eep7xz8f.js → capacitorApp-vnvnvdhf.js} +2 -2
  8. package/{cloud.command-8v0kdhsk.js → cloud.command-kx1bh5yq.js} +7 -7
  9. package/{context.command-rbfvzdr5.js → context.command-g1a65x6j.js} +12 -12
  10. package/{guideline.command-92fb2x3p.js → guideline.command-xphyhvwh.js} +2 -2
  11. package/guidelines/conventions/conventions.instruction.md +17 -3
  12. package/guidelines/mcpRule/mcpRule.instruction.md +46 -5
  13. package/incrementalBuilder.proc.js +1 -1
  14. package/{index-c60r0ch7.js → index-0ngvvgry.js} +2 -2
  15. package/{index-dnaz1wgm.js → index-4rw4qhe6.js} +3 -3
  16. package/{index-wda1nmq9.js → index-8gybxemv.js} +5 -5
  17. package/{index-0c7xjgq8.js → index-bqqts262.js} +1 -1
  18. package/{index-54kzhhbz.js → index-e31ghfp5.js} +1 -1
  19. package/{index-n6sd13k2.js → index-fahkq20v.js} +3 -3
  20. package/{index-1rdjjbh3.js → index-hee7egtm.js} +1 -1
  21. package/{index-h0mh2q0g.js → index-mkn5qagt.js} +4 -4
  22. package/{index-1ngstd4e.js → index-nj3w0r34.js} +3 -3
  23. package/{index-8ve7n6yj.js → index-nkwmnqwn.js} +2 -1
  24. package/{index-mj0gjph9.js → index-p681w089.js} +2 -2
  25. package/{index-gzvqqkv0.js → index-qt4nfr0n.js} +10 -10
  26. package/{index-9rhhv7kt.js → index-rb65xnw9.js} +4 -4
  27. package/{index-zsey7djg.js → index-rbnpe8cp.js} +3 -3
  28. package/{index-4z07epxz.js → index-v5fdxdre.js} +2 -2
  29. package/{index-64yeb8sh.js → index-va15r8h5.js} +2 -2
  30. package/{index-xgd380f4.js → index-yg3hxk2k.js} +4 -4
  31. package/{index-vgntcq1j.js → index-ytaqtc04.js} +1 -1
  32. package/index.js +18 -18
  33. package/{library.command-6q9vgf8d.js → library.command-rfpd27yv.js} +3 -3
  34. package/{localRegistry.command-qt958fj0.js → localRegistry.command-pyxfe0fs.js} +6 -6
  35. package/{module.command-t6ex0rqw.js → module.command-qhaxad0p.js} +5 -5
  36. package/{package.command-mkkpq9yy.js → package.command-2k22q9nt.js} +3 -3
  37. package/package.json +3 -3
  38. package/{page.command-tkqmvxx6.js → page.command-ymk9dqh4.js} +3 -3
  39. package/{primitive.command-pb07v3w4.js → primitive.command-9k45zpc1.js} +6 -6
  40. package/{quality.command-10bbw5qf.js → quality.command-bf6vkxe5.js} +2 -2
  41. package/{repair.command-rx25p4yr.js → repair.command-egvvm6xf.js} +5 -5
  42. package/{scalar.command-hf0pg397.js → scalar.command-bt1facyj.js} +4 -4
  43. package/templates/app/env/env.client.debug.ts.template +1 -1
  44. package/templates/app/env/env.client.develop.ts.template +1 -1
  45. package/templates/app/env/env.client.local.ts.template +1 -1
  46. package/templates/app/env/env.client.main.ts.template +1 -1
  47. package/templates/app/env/env.client.testing.ts.template +1 -1
  48. package/templates/workspaceRoot/package.json.template +1 -1
  49. package/{workflow.command-b2twqrg9.js → workflow.command-v1n3wg7v.js} +9 -9
  50. package/{workspace.command-8ggh81wd.js → workspace.command-yvvqvhzz.js} +18 -18
package/.build-stamp CHANGED
@@ -1 +1 @@
1
- 45913df1b25861ac83c5cec54131c1edd97946b5e28ceb2297776a553e68d432
1
+ f854deee45ba7fb5cde828e62164657386dfc13e55f0b7da760161ad709daa32
package/README.ko.md ADDED
@@ -0,0 +1,72 @@
1
+ # @akanjs/cli
2
+
3
+ [문서](https://akanjs.com/docs) | [npm](https://www.npmjs.com/package/@akanjs/cli) | [런타임](https://www.npmjs.com/package/akanjs)
4
+
5
+ Akan.js 워크스페이스를 위한 command-line tooling입니다.
6
+
7
+ `@akanjs/cli`는 Akan 애플리케이션, 라이브러리, 프레임워크 패키지를 생성, 빌드, 테스트, 린트,
8
+ 릴리즈, 유지보수하는 데 사용하는 `akan` 실행 파일을 제공합니다. Bun-first CLI 패키지이며 Akan
9
+ 개발 tooling을 내부에 번들링하므로, 애플리케이션 런타임은 더 작은 `akanjs` 패키지에만 의존할 수
10
+ 있습니다.
11
+
12
+ ## 설치
13
+
14
+ 새 워크스페이스를 바로 만들 수 있습니다.
15
+
16
+ ```bash
17
+ bunx create-akan-workspace@latest
18
+ ```
19
+
20
+ 또는 CLI를 전역으로 설치할 수 있습니다.
21
+
22
+ ```bash
23
+ bun install -g @akanjs/cli@latest
24
+ akan --help
25
+ ```
26
+
27
+ ## 자주 쓰는 명령
28
+
29
+ ```bash
30
+ akan create-workspace <workspace-name>
31
+ akan start <app-name>
32
+ akan build <app-name>
33
+ akan test <app-or-lib-or-pkg>
34
+ akan lint <app-or-lib-or-pkg>
35
+ akan create-application <app-name>
36
+ akan create-library <lib-name>
37
+ akan create-module <module-name>
38
+ akan create-scalar <scalar-name>
39
+ ```
40
+
41
+ 패키지 유지보수 명령도 같은 실행 파일에서 제공합니다.
42
+
43
+ ```bash
44
+ akan build-package akanjs
45
+ akan build-package @akanjs/cli
46
+ akan build-package @akanjs/devkit
47
+ akan build-package create-akan-workspace
48
+ akan verify-akan-publish-packages
49
+ akan smoke-registry --test=true --tag=rc
50
+ ```
51
+
52
+ Akan framework 패키지는 반드시 `dist/pkgs/*` 산출물 기준으로 publish합니다. `verify-akan-publish-packages`는
53
+ 빌드된 패키지에 `npm pack --dry-run --json`을 실행하고, `deploy-akan` 또는 local registry smoke 전에 필요한
54
+ metadata를 검증합니다.
55
+ 저장소 릴리즈에서는 root `akan` bootstrap script가 CLI dist를 덮어쓰지 않도록
56
+ `bun run release:build-packages && bun run release:verify-packages`를 우선 사용합니다.
57
+
58
+ ## 패키지 경계
59
+
60
+ - 애플리케이션과 런타임 코드는 `akanjs`를 사용합니다.
61
+ - 사용자-facing 실행 패키지는 `@akanjs/cli`입니다.
62
+ - `@akanjs/devkit`은 published CLI 사용을 위해 CLI 안에 번들링됩니다. 일반 CLI 사용자가 별도의
63
+ runtime dependency로 설치할 필요는 없습니다.
64
+
65
+ ## 요구사항
66
+
67
+ - [Bun](https://bun.sh) `>=1.4.0`
68
+ - TypeScript 기반 Akan 워크스페이스
69
+
70
+ ## 라이선스
71
+
72
+ MIT
package/README.md ADDED
@@ -0,0 +1,85 @@
1
+ # @akanjs/cli
2
+
3
+ [Docs](https://akanjs.com/docs) | [npm](https://www.npmjs.com/package/@akanjs/cli) | [Runtime](https://www.npmjs.com/package/akanjs)
4
+
5
+ Command-line tooling for Akan.js workspaces.
6
+
7
+ `@akanjs/cli` provides the `akan` executable used to create, build, test, lint, release, and maintain Akan
8
+ applications, libraries, and framework packages. It is a Bun-first CLI package and bundles Akan development
9
+ tooling internally so application runtimes can depend on the smaller `akanjs` package.
10
+
11
+ ## Install
12
+
13
+ Create a new workspace:
14
+
15
+ ```bash
16
+ bunx create-akan-workspace@latest
17
+ ```
18
+
19
+ Or install the CLI globally:
20
+
21
+ ```bash
22
+ bun install -g @akanjs/cli@latest
23
+ akan --help
24
+ ```
25
+
26
+ ## Common Commands
27
+
28
+ ```bash
29
+ akan create-workspace <workspace-name>
30
+ akan start <app-name>
31
+ akan build <app-name>
32
+ akan test <app-or-lib-or-pkg>
33
+ akan lint <app-or-lib-or-pkg>
34
+ akan create-application <app-name>
35
+ akan create-library <lib-name>
36
+ akan create-module <module-name>
37
+ akan create-scalar <scalar-name>
38
+ ```
39
+
40
+ ## Agent And MCP Commands
41
+
42
+ ```bash
43
+ akan context --format markdown
44
+ akan context --format json --module <module-name>
45
+ akan doctor --format json
46
+ akan guideline list
47
+ akan guideline show framework
48
+ akan agent install cursor
49
+ akan mcp
50
+ ```
51
+
52
+ These commands expose Akan workspace structure, module abstracts, diagnostics, and guideline instructions for
53
+ coding agents. The MCP server is read-only and is intended to provide context rather than edit files directly.
54
+
55
+ Package maintenance commands are also exposed through the same executable:
56
+
57
+ ```bash
58
+ akan build-package akanjs
59
+ akan build-package @akanjs/cli
60
+ akan build-package @akanjs/devkit
61
+ akan build-package create-akan-workspace
62
+ akan verify-akan-publish-packages
63
+ akan smoke-registry --test=true --tag=rc
64
+ ```
65
+
66
+ Publish Akan framework packages from `dist/pkgs/*` only. `verify-akan-publish-packages` runs `npm pack --dry-run --json`
67
+ against the built packages and checks metadata that must be correct before `deploy-akan` or local registry smoke.
68
+ For repository releases, prefer `bun run release:build-packages && bun run release:verify-packages` so the CLI package
69
+ artifact is built last and is not overwritten by the root `akan` bootstrap script.
70
+
71
+ ## Package Boundary
72
+
73
+ - Use `akanjs` from application and runtime code.
74
+ - Use `@akanjs/cli` as the user-facing executable package.
75
+ - `@akanjs/devkit` is bundled into the CLI for published CLI usage; it is not required as a separate
76
+ runtime dependency for ordinary CLI users.
77
+
78
+ ## Requirements
79
+
80
+ - [Bun](https://bun.sh) `>=1.4.0`
81
+ - A TypeScript Akan workspace
82
+
83
+ ## License
84
+
85
+ MIT
@@ -1,15 +1,15 @@
1
1
  // @bun
2
2
  import {
3
3
  AgentScript
4
- } from "./index-zsey7djg.js";
5
- import"./index-64yeb8sh.js";
6
- import"./index-vgntcq1j.js";
4
+ } from "./index-rbnpe8cp.js";
5
+ import"./index-va15r8h5.js";
6
+ import"./index-ytaqtc04.js";
7
7
  import"./index-j37qq1f2.js";
8
8
  import {
9
9
  Workspace,
10
10
  command
11
- } from "./index-54kzhhbz.js";
12
- import"./index-8ve7n6yj.js";
11
+ } from "./index-e31ghfp5.js";
12
+ import"./index-nkwmnqwn.js";
13
13
  import"./index-f39512t6.js";
14
14
  import"./index-mxvakhsm.js";
15
15
  import"./index-xys926f2.js";
@@ -4,8 +4,8 @@ import {
4
4
  } from "./index-0wae5ebk.js";
5
5
  import {
6
6
  ApplicationScript
7
- } from "./index-h0mh2q0g.js";
8
- import"./index-mj0gjph9.js";
7
+ } from "./index-mkn5qagt.js";
8
+ import"./index-p681w089.js";
9
9
  import {
10
10
  getMobileTargetChoices
11
11
  } from "./index-76rn3g2c.js";
@@ -15,10 +15,10 @@ import {
15
15
  Sys,
16
16
  Workspace,
17
17
  command
18
- } from "./index-54kzhhbz.js";
18
+ } from "./index-e31ghfp5.js";
19
19
  import"./index-fgc8r6dj.js";
20
20
  import"./index-5vy2jzar.js";
21
- import"./index-8ve7n6yj.js";
21
+ import"./index-nkwmnqwn.js";
22
22
  import"./index-f39512t6.js";
23
23
  import"./index-mxvakhsm.js";
24
24
  import"./index-1577bej2.js";
@@ -12,7 +12,7 @@ import"./index-5vy2jzar.js";
12
12
  import {
13
13
  AppExecutor,
14
14
  WorkspaceExecutor
15
- } from "./index-8ve7n6yj.js";
15
+ } from "./index-nkwmnqwn.js";
16
16
  import"./index-f39512t6.js";
17
17
  import"./index-mxvakhsm.js";
18
18
  import"./index-1577bej2.js";
@@ -25,9 +25,9 @@ import {
25
25
  selectLocalDevHost,
26
26
  sortIosRunTargets,
27
27
  writeRootCapacitorConfig
28
- } from "./index-1rdjjbh3.js";
28
+ } from "./index-hee7egtm.js";
29
29
  import"./index-76rn3g2c.js";
30
- import"./index-8ve7n6yj.js";
30
+ import"./index-nkwmnqwn.js";
31
31
  import"./index-f39512t6.js";
32
32
  import"./index-mxvakhsm.js";
33
33
  import"./index-1577bej2.js";
@@ -1,22 +1,22 @@
1
1
  // @bun
2
2
  import {
3
3
  CloudScript
4
- } from "./index-wda1nmq9.js";
5
- import"./index-dnaz1wgm.js";
6
- import"./index-c60r0ch7.js";
4
+ } from "./index-8gybxemv.js";
5
+ import"./index-4rw4qhe6.js";
6
+ import"./index-0ngvvgry.js";
7
7
  import {
8
8
  GlobalConfig
9
9
  } from "./index-sh01r3pm.js";
10
- import"./index-h0mh2q0g.js";
11
- import"./index-mj0gjph9.js";
10
+ import"./index-mkn5qagt.js";
11
+ import"./index-p681w089.js";
12
12
  import"./index-76rn3g2c.js";
13
13
  import {
14
14
  Workspace,
15
15
  command
16
- } from "./index-54kzhhbz.js";
16
+ } from "./index-e31ghfp5.js";
17
17
  import"./index-fgc8r6dj.js";
18
18
  import"./index-5vy2jzar.js";
19
- import"./index-8ve7n6yj.js";
19
+ import"./index-nkwmnqwn.js";
20
20
  import"./index-f39512t6.js";
21
21
  import"./index-mxvakhsm.js";
22
22
  import"./index-1577bej2.js";
@@ -1,25 +1,25 @@
1
1
  // @bun
2
2
  import {
3
3
  ContextScript
4
- } from "./index-gzvqqkv0.js";
5
- import"./index-1ngstd4e.js";
6
- import"./index-n6sd13k2.js";
7
- import"./index-4z07epxz.js";
8
- import"./index-9rhhv7kt.js";
9
- import"./index-xgd380f4.js";
4
+ } from "./index-qt4nfr0n.js";
5
+ import"./index-nj3w0r34.js";
6
+ import"./index-fahkq20v.js";
7
+ import"./index-v5fdxdre.js";
8
+ import"./index-rb65xnw9.js";
9
+ import"./index-yg3hxk2k.js";
10
10
  import"./index-ss469dec.js";
11
- import"./index-0c7xjgq8.js";
12
- import"./index-1rdjjbh3.js";
11
+ import"./index-bqqts262.js";
12
+ import"./index-hee7egtm.js";
13
13
  import"./index-sh01r3pm.js";
14
- import"./index-64yeb8sh.js";
15
- import"./index-vgntcq1j.js";
14
+ import"./index-va15r8h5.js";
15
+ import"./index-ytaqtc04.js";
16
16
  import"./index-j37qq1f2.js";
17
17
  import"./index-76rn3g2c.js";
18
18
  import {
19
19
  Workspace,
20
20
  command
21
- } from "./index-54kzhhbz.js";
22
- import"./index-8ve7n6yj.js";
21
+ } from "./index-e31ghfp5.js";
22
+ import"./index-nkwmnqwn.js";
23
23
  import"./index-f39512t6.js";
24
24
  import"./index-mxvakhsm.js";
25
25
  import"./index-xys926f2.js";
@@ -10,8 +10,8 @@ import {
10
10
  command,
11
11
  runner,
12
12
  script
13
- } from "./index-54kzhhbz.js";
14
- import"./index-8ve7n6yj.js";
13
+ } from "./index-e31ghfp5.js";
14
+ import"./index-nkwmnqwn.js";
15
15
  import"./index-f39512t6.js";
16
16
  import"./index-mxvakhsm.js";
17
17
  import {
@@ -691,12 +691,26 @@ that declares a real guard is published; one that declares none is refused, and
691
691
  `Public`. The guards are already the authorization decision, so a second switch would say nothing they do not —
692
692
  while guaranteeing that every endpoint added later is invisible to agents until somebody remembers it.
693
693
 
694
+ - **`mcp: false` keeps an endpoint off the shelf without touching its guards.** Guards answer "may an agent call
695
+ this"; they cannot answer "does this belong on a shelf", and a step of a UI-driven state machine
696
+ (`requestPhoneCodeForSignin`) is perfectly guarded and still a mistake for a model to reach. Write it in the
697
+ signal option (`mutation(Boolean, { guards: [Every], mcp: false })`, `init({ guards: [SignedIn], mcp: false })`
698
+ — which covers that slice's list and insight together), or as an `mcp` map on `slice()` that **mirrors the
699
+ `guards` map key for key** (`mcp: { cru: false }`), with the same `cru` fallbacks and the same scope: the root
700
+ slice and generated CRUD only, never a named slice or a custom endpoint. It is an opt-**out**, so everything
701
+ added later still publishes. **It is curation, not authorization — HTTP serves the endpoint exactly as before.**
702
+ - **Narrow by cost, and read the boot log first.** MCP has no shared component section and forbids a `$ref` across
703
+ entries, so every entry inlines the full schema of every model it mentions, and the listing is re-sent whole to
704
+ every agent that connects. `MCP catalogue: … · listing 214KB` plus a per-signal `MCP catalogue cost:` line says
705
+ where it went. A plain 21-field model costs 12.6KB over eight entries; `mcp: { cru: false }` takes it to 4.7KB,
706
+ because the generated writes carry the input *and* the full model.
694
707
  - Settings live in the app's `lib/option.ts` — `option.setMcp({ enabled, readOnly, path, version, instructions,
695
708
  allowedOrigins, pageSize, language, auth })`, **not `main.ts`**. Every lib's option is read in mount order with
696
709
  the app's last, and each field has an `AKAN_MCP_*` env spelling the option overrides.
697
- - **The refusals are fail-closed**: an endpoint with no `guards`, a mutation with no real guard (`[Public]` is
698
- having none), `pubsub` and `message`, an `Any` or `Upload` return, a file upload, and a required `Any` argument.
699
- A `prompt` also refuses a list argument and any `Any` argument.
710
+ - **The refusals are fail-closed**: a declared `mcp: false`, an endpoint with no `guards`, a mutation with no real guard (`[Public]` is
711
+ having none), `pubsub` and `message`, an `Any` or `Upload` return, a file upload, a required `Any` argument, and
712
+ the generated `light<Model>` read — it is `<Model>` in a smaller shape, so one read never costs two entries of
713
+ every listing. A `prompt` also refuses a list argument and any `Any` argument.
700
714
  - **Every refusal is named in the boot log**, with a `MCP catalogue: tools=… prompts=…` count. Read that line
701
715
  first when a tool you expected is missing — with no opt-in to notice, it is the only place the answer exists.
702
716
  The boot log also names every published entry with no dictionary `.desc()`: an agent picks a tool by its
@@ -14,6 +14,36 @@ authorization decision and `filterForAccount` re-reads them per caller on every
14
14
  switch says nothing the guards do not — while guaranteeing that every endpoint added later is invisible to agents
15
15
  until somebody remembers it.
16
16
 
17
+ ## Keeping An Endpoint Off The Shelf — `mcp: false`
18
+
19
+ Guards answer "may an agent call this". They do not answer "does this belong on a shelf", and those are different
20
+ questions: a step of a UI-driven state machine (`requestPhoneCodeForSignin`, `setPasswordInPrepareUser`) is
21
+ perfectly guarded, perfectly callable, and a model would only ever call it by mistake. **`mcp: false` is that
22
+ second answer, and it is an opt-*out*: everything still publishes by default, so an endpoint added later is
23
+ visible without anyone remembering it.**
24
+
25
+ ```ts
26
+ requestPhoneCodeForSignin: mutation(Boolean, { guards: [Every], mcp: false }),
27
+ inTodo: init({ guards: [SignedIn], mcp: false }), // the slice's list and insight together
28
+ export class FileSlice extends slice(srv.file, {
29
+ guards: { root: Admin, get: SignedIn, cru: SignedIn },
30
+ mcp: { cru: false }, // reads yes, generated writes no
31
+ }) {}
32
+ ```
33
+
34
+ - **It is curation, not authorization.** HTTP serves the endpoint exactly as before and the guards are still the
35
+ only thing deciding who may call it. Never write `mcp: false` where you meant a guard.
36
+ - **The `mcp` map on `slice()` mirrors the `guards` map above it** — same keys (`root`, `get`, `cru`, `create`,
37
+ `update`, `remove`), same fallbacks (`create`/`update`/`remove` inherit `cru`), and the same scope: it narrows
38
+ the root slice and the generated CRUD, and never reaches a named slice or a custom endpoint. Those declare
39
+ their own `mcp` beside their own `guards`. The bare `mcp: false` is every key at once, still within that scope.
40
+ - **`mcp: true` is the default and is a no-op**; write it only to say out loud that an entry is deliberately on
41
+ the shelf. It does not override a shape refusal (an `Any` return stays refused) and it cannot publish something
42
+ the guard rules keep out.
43
+ - **Reach for it by cost, not by taste.** Every entry inlines the schema of every model it mentions, so a plain
44
+ 21-field model with one named slice costs 12.6KB across its eight entries. `mcp: { cru: false }` on that model
45
+ takes it to 4.7KB — the write entries carry both the input *and* the full model, and are 63% of it.
46
+
17
47
  ## Configuration
18
48
  Settings live in the app's `lib/option.ts` — `option.setMcp({ … })`, taking `enabled`, `readOnly`, `path`,
19
49
  `version`, `instructions`, `allowedOrigins`, `pageSize`, `language`, `legacyTextBlock`, and `auth`. **Not `main.ts`**: the gateway
@@ -67,13 +97,23 @@ export class TaskEndpoint extends endpoint(srv.task, ({ mutation, prompt }) => (
67
97
  ```
68
98
 
69
99
  ## Refusals And Wire Behaviour
100
+ - **`mcp: false` is read first**, because it is the one answer nobody had to derive — somebody stated it. Its
101
+ reason says "HTTP still serves it", because that is the sentence that stops the next reader treating it as a lock.
70
102
  - **The refusals are fail-closed**: **an endpoint that declares no `guards` at all** (nobody decided who may reach
71
103
  it), **a mutation with no real `guards`** (`[Public]` is having none, spelled out — it answers true
72
104
  unconditionally), `pubsub` and `message` (their internal args read a socket an MCP request does not have), an
73
- `Any` or `Upload` return, a file upload, and **an argument typed `Any` that must be filled**.
105
+ `Any` or `Upload` return, a file upload, **an argument typed `Any` that must be filled**, and the generated
106
+ **`light<Model>` read** — it returns the same document as `<Model>` under the same guards, in a shape trimmed
107
+ for a page's payload, so publishing both put two entries per model in a listing an agent pays for every turn
108
+ and gave it nothing but the word "light" to choose between them.
74
109
  A `prompt` refuses two more, because its `arguments` is one string per name with no schema beside it: a **list
75
110
  argument**, which could never carry a second value, and **any `Any` argument** — a tool leaves that out of its
76
111
  schema, and a prompt has no schema to leave it out of.
112
+ - **The boot log sizes the catalogue and says which signals it went to** — `MCP catalogue: tools=48 … · listing
113
+ 214KB` and `MCP catalogue cost: user 27/71KB · file 6/22KB · …`, heaviest first. Read it before narrowing
114
+ anything: the number is nobody's intuition, because MCP has no shared component section and forbids a `$ref`
115
+ across entries, so **every entry inlines the full schema of every model it mentions** and a listing is re-sent
116
+ whole to every agent that connects, before its first turn. Past 100KB it says so as a `warn`.
77
117
  - **Every refusal is named in the boot log**: one `warn` per endpoint plus a `MCP catalogue: tools=… prompts=…`
78
118
  count. Read that line first when a tool you expected is missing — and it is the *only* place the answer exists,
79
119
  because there is no absent opt-in to notice. The API explorer badges the same rule per endpoint (`MCP` /
@@ -144,10 +184,11 @@ export class TaskEndpoint extends endpoint(srv.task, ({ mutation, prompt }) => (
144
184
  - **An expired or wrongly-audienced bearer token is refused up front**, so an agent is told to authenticate rather
145
185
  than that the tool does not exist. Its **signature is not checked** — that needs your app's own secret — so a
146
186
  token signed wrong, like an opaque one, still degrades to an anonymous caller.
147
- - **Resource URIs**: `akan://<model>/{id}`, `akan://<model>/light/{id}`, `akan://<model>/list` for the model's own
148
- list, and `akan://<model>/list/<sliceKey>` for a slice's. The root list takes no third segment on purpose — any
149
- token there is one a slice could also be named. **Those four are the whole set**, so only the generated reads are
150
- addressable: a custom endpoint keeps its tool and gets no resource template.
187
+ - **Resource URIs**: `akan://<model>/{id}`, `akan://<model>/list` for the model's own list, and
188
+ `akan://<model>/list/<sliceKey>` for a slice's. The root list takes no third segment on purpose — any token
189
+ there is one a slice could also be named. **Those three are the whole set**, so only the generated reads that
190
+ publish are addressable: a custom endpoint keeps its tool and gets no resource template, and the refused
191
+ `light<Model>` read has no address either.
151
192
  - **The catalogue is one language**, `en` unless `language` says otherwise: it is built once at boot and cached by
152
193
  clients, so there is no `Accept-Language` negotiation.
153
194
 
@@ -16,7 +16,7 @@ import {
16
16
  import {
17
17
  AppExecutor,
18
18
  WorkspaceExecutor
19
- } from "./index-8ve7n6yj.js";
19
+ } from "./index-nkwmnqwn.js";
20
20
  import"./index-f39512t6.js";
21
21
  import"./index-mxvakhsm.js";
22
22
  import"./index-1577bej2.js";
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  runner,
4
4
  script
5
- } from "./index-54kzhhbz.js";
5
+ } from "./index-e31ghfp5.js";
6
6
  import {
7
7
  PkgExecutor
8
- } from "./index-8ve7n6yj.js";
8
+ } from "./index-nkwmnqwn.js";
9
9
  import {
10
10
  TypeScriptDependencyScanner
11
11
  } from "./index-46tjzh6s.js";
@@ -7,14 +7,14 @@ import {
7
7
  } from "./index-sh01r3pm.js";
8
8
  import {
9
9
  openBrowser
10
- } from "./index-h0mh2q0g.js";
10
+ } from "./index-mkn5qagt.js";
11
11
  import {
12
12
  runner
13
- } from "./index-54kzhhbz.js";
13
+ } from "./index-e31ghfp5.js";
14
14
  import {
15
15
  AppExecutor,
16
16
  WorkspaceExecutor
17
- } from "./index-8ve7n6yj.js";
17
+ } from "./index-nkwmnqwn.js";
18
18
 
19
19
  // pkgs/@akanjs/cli/npmRegistry.ts
20
20
  var defaultNpmRegistry = "https://registry.npmjs.org";
@@ -1,10 +1,10 @@
1
1
  // @bun
2
2
  import {
3
3
  CloudRunner
4
- } from "./index-dnaz1wgm.js";
4
+ } from "./index-4rw4qhe6.js";
5
5
  import {
6
6
  PackageScript
7
- } from "./index-c60r0ch7.js";
7
+ } from "./index-0ngvvgry.js";
8
8
  import {
9
9
  AiSession,
10
10
  CloudApi,
@@ -12,13 +12,13 @@ import {
12
12
  } from "./index-sh01r3pm.js";
13
13
  import {
14
14
  ApplicationScript
15
- } from "./index-h0mh2q0g.js";
15
+ } from "./index-mkn5qagt.js";
16
16
  import {
17
17
  script
18
- } from "./index-54kzhhbz.js";
18
+ } from "./index-e31ghfp5.js";
19
19
  import {
20
20
  PkgExecutor
21
- } from "./index-8ve7n6yj.js";
21
+ } from "./index-nkwmnqwn.js";
22
22
 
23
23
  // pkgs/@akanjs/cli/cloud/cloud.script.ts
24
24
  import { Logger } from "akanjs/common";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  runner,
4
4
  script
5
- } from "./index-54kzhhbz.js";
5
+ } from "./index-e31ghfp5.js";
6
6
 
7
7
  // pkgs/@akanjs/cli/page/page.runner.ts
8
8
  class PageRunner extends runner("page") {
@@ -6,7 +6,7 @@ import {
6
6
  ModuleExecutor,
7
7
  PkgExecutor,
8
8
  WorkspaceExecutor
9
- } from "./index-8ve7n6yj.js";
9
+ } from "./index-nkwmnqwn.js";
10
10
  import {
11
11
  getDirname
12
12
  } from "./index-1577bej2.js";
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  AkanContextAnalyzer
4
- } from "./index-64yeb8sh.js";
4
+ } from "./index-va15r8h5.js";
5
5
  import {
6
6
  WorkflowExecutor,
7
7
  compactWorkflowInputs,
@@ -23,10 +23,10 @@ import {
23
23
  workflowCommandsForPlan,
24
24
  workflowPlanApproval,
25
25
  writeWorkflowRunArtifact
26
- } from "./index-vgntcq1j.js";
26
+ } from "./index-ytaqtc04.js";
27
27
  import {
28
28
  runner
29
- } from "./index-54kzhhbz.js";
29
+ } from "./index-e31ghfp5.js";
30
30
 
31
31
  // pkgs/@akanjs/cli/workflow/workflow.runner.ts
32
32
  import { mkdir, readFile, writeFile } from "fs/promises";
@@ -5,7 +5,7 @@ import {
5
5
  } from "./index-76rn3g2c.js";
6
6
  import {
7
7
  CommandExecutionError
8
- } from "./index-8ve7n6yj.js";
8
+ } from "./index-nkwmnqwn.js";
9
9
 
10
10
  // pkgs/@akanjs/devkit/capacitorApp.ts
11
11
  import { cp, mkdir, readFile, rm, writeFile } from "fs/promises";
@@ -1,14 +1,14 @@
1
1
  // @bun
2
2
  import {
3
3
  LibraryScript
4
- } from "./index-mj0gjph9.js";
4
+ } from "./index-p681w089.js";
5
5
  import {
6
6
  resolveMobileTargets
7
7
  } from "./index-76rn3g2c.js";
8
8
  import {
9
9
  runner,
10
10
  script
11
- } from "./index-54kzhhbz.js";
11
+ } from "./index-e31ghfp5.js";
12
12
  import {
13
13
  HmrWatcher,
14
14
  WatchRootResolver
@@ -18,7 +18,7 @@ import {
18
18
  LibExecutor,
19
19
  PkgExecutor,
20
20
  WorkspaceExecutor
21
- } from "./index-8ve7n6yj.js";
21
+ } from "./index-nkwmnqwn.js";
22
22
  import {
23
23
  __require
24
24
  } from "./index-yb2wsc7f.js";
@@ -1900,7 +1900,7 @@ function openBrowser(url) {
1900
1900
  // pkgs/@akanjs/cli/application/application.runner.ts
1901
1901
  var loadBuildRunner = async () => (await import("./applicationBuildRunner-af0wtspv.js")).ApplicationBuildRunner;
1902
1902
  var loadReleasePackager = async () => (await import("./applicationReleasePackager-93nzdfsy.js")).ApplicationReleasePackager;
1903
- var loadCapacitorApp = async () => (await import("./capacitorApp-eep7xz8f.js")).CapacitorApp;
1903
+ var loadCapacitorApp = async () => (await import("./capacitorApp-vnvnvdhf.js")).CapacitorApp;
1904
1904
  var loadAbstractCompactor = async () => (await import("./abstractCompactor-20e0cwbs.js")).AbstractCompactor;
1905
1905
  var loadPrompts = async () => await import("@inquirer/prompts");
1906
1906
 
@@ -1,17 +1,17 @@
1
1
  // @bun
2
2
  import {
3
3
  AkanContextAnalyzer
4
- } from "./index-64yeb8sh.js";
4
+ } from "./index-va15r8h5.js";
5
5
  import {
6
6
  createRepairReport,
7
7
  generatedFilePathsForTarget,
8
8
  renderRepairReport,
9
9
  writeGeneratedSyncState,
10
10
  writeWorkflowRunArtifact
11
- } from "./index-vgntcq1j.js";
11
+ } from "./index-ytaqtc04.js";
12
12
  import {
13
13
  runner
14
- } from "./index-54kzhhbz.js";
14
+ } from "./index-e31ghfp5.js";
15
15
 
16
16
  // pkgs/@akanjs/cli/repair/repair.runner.ts
17
17
  var commandForShell = (command) => command.startsWith("akan ") ? `bun run ${command}` : command;
@@ -1960,7 +1960,8 @@ class Executor {
1960
1960
  const dir = path5.dirname(writePath);
1961
1961
  if (!await FileSys.dirExists(dir))
1962
1962
  await mkdir(dir, { recursive: true });
1963
- let contentStr = typeof content === "string" ? content : JSON.stringify(content, null, 2);
1963
+ let contentStr = typeof content === "string" ? content : `${JSON.stringify(content, null, 2)}
1964
+ `;
1964
1965
  if (await FileSys.fileExists(writePath)) {
1965
1966
  const currentContent = await FileSys.readText(writePath);
1966
1967
  if (currentContent === contentStr || !overwrite) {
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  runner,
4
4
  script
5
- } from "./index-54kzhhbz.js";
5
+ } from "./index-e31ghfp5.js";
6
6
  import {
7
7
  LibExecutor
8
- } from "./index-8ve7n6yj.js";
8
+ } from "./index-nkwmnqwn.js";
9
9
 
10
10
  // pkgs/@akanjs/cli/semver.ts
11
11
  var stripRangeOperator = (version) => version.replace(/^[\s^~>=<v]+/, "").trim();