@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.
- package/.build-stamp +1 -1
- package/README.ko.md +72 -0
- package/README.md +85 -0
- package/{agent.command-0cmqr1jg.js → agent.command-964bf8qg.js} +5 -5
- package/{application.command-rb1dtwdd.js → application.command-n45n18sc.js} +4 -4
- package/buildBatch.proc.js +1 -1
- package/{capacitorApp-eep7xz8f.js → capacitorApp-vnvnvdhf.js} +2 -2
- package/{cloud.command-8v0kdhsk.js → cloud.command-kx1bh5yq.js} +7 -7
- package/{context.command-rbfvzdr5.js → context.command-g1a65x6j.js} +12 -12
- package/{guideline.command-92fb2x3p.js → guideline.command-xphyhvwh.js} +2 -2
- package/guidelines/conventions/conventions.instruction.md +17 -3
- package/guidelines/mcpRule/mcpRule.instruction.md +46 -5
- package/incrementalBuilder.proc.js +1 -1
- package/{index-c60r0ch7.js → index-0ngvvgry.js} +2 -2
- package/{index-dnaz1wgm.js → index-4rw4qhe6.js} +3 -3
- package/{index-wda1nmq9.js → index-8gybxemv.js} +5 -5
- package/{index-0c7xjgq8.js → index-bqqts262.js} +1 -1
- package/{index-54kzhhbz.js → index-e31ghfp5.js} +1 -1
- package/{index-n6sd13k2.js → index-fahkq20v.js} +3 -3
- package/{index-1rdjjbh3.js → index-hee7egtm.js} +1 -1
- package/{index-h0mh2q0g.js → index-mkn5qagt.js} +4 -4
- package/{index-1ngstd4e.js → index-nj3w0r34.js} +3 -3
- package/{index-8ve7n6yj.js → index-nkwmnqwn.js} +2 -1
- package/{index-mj0gjph9.js → index-p681w089.js} +2 -2
- package/{index-gzvqqkv0.js → index-qt4nfr0n.js} +10 -10
- package/{index-9rhhv7kt.js → index-rb65xnw9.js} +4 -4
- package/{index-zsey7djg.js → index-rbnpe8cp.js} +3 -3
- package/{index-4z07epxz.js → index-v5fdxdre.js} +2 -2
- package/{index-64yeb8sh.js → index-va15r8h5.js} +2 -2
- package/{index-xgd380f4.js → index-yg3hxk2k.js} +4 -4
- package/{index-vgntcq1j.js → index-ytaqtc04.js} +1 -1
- package/index.js +18 -18
- package/{library.command-6q9vgf8d.js → library.command-rfpd27yv.js} +3 -3
- package/{localRegistry.command-qt958fj0.js → localRegistry.command-pyxfe0fs.js} +6 -6
- package/{module.command-t6ex0rqw.js → module.command-qhaxad0p.js} +5 -5
- package/{package.command-mkkpq9yy.js → package.command-2k22q9nt.js} +3 -3
- package/package.json +3 -3
- package/{page.command-tkqmvxx6.js → page.command-ymk9dqh4.js} +3 -3
- package/{primitive.command-pb07v3w4.js → primitive.command-9k45zpc1.js} +6 -6
- package/{quality.command-10bbw5qf.js → quality.command-bf6vkxe5.js} +2 -2
- package/{repair.command-rx25p4yr.js → repair.command-egvvm6xf.js} +5 -5
- package/{scalar.command-hf0pg397.js → scalar.command-bt1facyj.js} +4 -4
- package/templates/app/env/env.client.debug.ts.template +1 -1
- package/templates/app/env/env.client.develop.ts.template +1 -1
- package/templates/app/env/env.client.local.ts.template +1 -1
- package/templates/app/env/env.client.main.ts.template +1 -1
- package/templates/app/env/env.client.testing.ts.template +1 -1
- package/templates/workspaceRoot/package.json.template +1 -1
- package/{workflow.command-b2twqrg9.js → workflow.command-v1n3wg7v.js} +9 -9
- package/{workspace.command-8ggh81wd.js → workspace.command-yvvqvhzz.js} +18 -18
package/.build-stamp
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
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-
|
|
5
|
-
import"./index-
|
|
6
|
-
import"./index-
|
|
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-
|
|
12
|
-
import"./index-
|
|
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-
|
|
8
|
-
import"./index-
|
|
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-
|
|
18
|
+
} from "./index-e31ghfp5.js";
|
|
19
19
|
import"./index-fgc8r6dj.js";
|
|
20
20
|
import"./index-5vy2jzar.js";
|
|
21
|
-
import"./index-
|
|
21
|
+
import"./index-nkwmnqwn.js";
|
|
22
22
|
import"./index-f39512t6.js";
|
|
23
23
|
import"./index-mxvakhsm.js";
|
|
24
24
|
import"./index-1577bej2.js";
|
package/buildBatch.proc.js
CHANGED
|
@@ -25,9 +25,9 @@ import {
|
|
|
25
25
|
selectLocalDevHost,
|
|
26
26
|
sortIosRunTargets,
|
|
27
27
|
writeRootCapacitorConfig
|
|
28
|
-
} from "./index-
|
|
28
|
+
} from "./index-hee7egtm.js";
|
|
29
29
|
import"./index-76rn3g2c.js";
|
|
30
|
-
import"./index-
|
|
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-
|
|
5
|
-
import"./index-
|
|
6
|
-
import"./index-
|
|
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-
|
|
11
|
-
import"./index-
|
|
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-
|
|
16
|
+
} from "./index-e31ghfp5.js";
|
|
17
17
|
import"./index-fgc8r6dj.js";
|
|
18
18
|
import"./index-5vy2jzar.js";
|
|
19
|
-
import"./index-
|
|
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-
|
|
5
|
-
import"./index-
|
|
6
|
-
import"./index-
|
|
7
|
-
import"./index-
|
|
8
|
-
import"./index-
|
|
9
|
-
import"./index-
|
|
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-
|
|
12
|
-
import"./index-
|
|
11
|
+
import"./index-bqqts262.js";
|
|
12
|
+
import"./index-hee7egtm.js";
|
|
13
13
|
import"./index-sh01r3pm.js";
|
|
14
|
-
import"./index-
|
|
15
|
-
import"./index-
|
|
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-
|
|
22
|
-
import"./index-
|
|
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";
|
|
@@ -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,
|
|
699
|
-
|
|
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,
|
|
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>/
|
|
148
|
-
|
|
149
|
-
|
|
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
|
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
import {
|
|
3
3
|
runner,
|
|
4
4
|
script
|
|
5
|
-
} from "./index-
|
|
5
|
+
} from "./index-e31ghfp5.js";
|
|
6
6
|
import {
|
|
7
7
|
PkgExecutor
|
|
8
|
-
} from "./index-
|
|
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-
|
|
10
|
+
} from "./index-mkn5qagt.js";
|
|
11
11
|
import {
|
|
12
12
|
runner
|
|
13
|
-
} from "./index-
|
|
13
|
+
} from "./index-e31ghfp5.js";
|
|
14
14
|
import {
|
|
15
15
|
AppExecutor,
|
|
16
16
|
WorkspaceExecutor
|
|
17
|
-
} from "./index-
|
|
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-
|
|
4
|
+
} from "./index-4rw4qhe6.js";
|
|
5
5
|
import {
|
|
6
6
|
PackageScript
|
|
7
|
-
} from "./index-
|
|
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-
|
|
15
|
+
} from "./index-mkn5qagt.js";
|
|
16
16
|
import {
|
|
17
17
|
script
|
|
18
|
-
} from "./index-
|
|
18
|
+
} from "./index-e31ghfp5.js";
|
|
19
19
|
import {
|
|
20
20
|
PkgExecutor
|
|
21
|
-
} from "./index-
|
|
21
|
+
} from "./index-nkwmnqwn.js";
|
|
22
22
|
|
|
23
23
|
// pkgs/@akanjs/cli/cloud/cloud.script.ts
|
|
24
24
|
import { Logger } from "akanjs/common";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
3
|
AkanContextAnalyzer
|
|
4
|
-
} from "./index-
|
|
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-
|
|
26
|
+
} from "./index-ytaqtc04.js";
|
|
27
27
|
import {
|
|
28
28
|
runner
|
|
29
|
-
} from "./index-
|
|
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";
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
3
|
LibraryScript
|
|
4
|
-
} from "./index-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
11
|
+
} from "./index-ytaqtc04.js";
|
|
12
12
|
import {
|
|
13
13
|
runner
|
|
14
|
-
} from "./index-
|
|
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-
|
|
5
|
+
} from "./index-e31ghfp5.js";
|
|
6
6
|
import {
|
|
7
7
|
LibExecutor
|
|
8
|
-
} from "./index-
|
|
8
|
+
} from "./index-nkwmnqwn.js";
|
|
9
9
|
|
|
10
10
|
// pkgs/@akanjs/cli/semver.ts
|
|
11
11
|
var stripRangeOperator = (version) => version.replace(/^[\s^~>=<v]+/, "").trim();
|