@akanjs/cli 3.0.0-beta.13 → 3.0.0-beta.15

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 (92) hide show
  1. package/.build-stamp +1 -1
  2. package/CodeAgent-d3wvbq8q.js +9 -0
  3. package/CodeAgentRpcHost-qvwfv0n9.js +7 -0
  4. package/CodeTui-6c9a2wtk.js +1103 -0
  5. package/README.md +3 -0
  6. package/{TunnelShare-2kwqb1j6.js → TunnelShare-r5tc2qk5.js} +2 -2
  7. package/{agent.command-7357vxd8.js → agent.command-9cg8m87z.js} +6 -6
  8. package/akanCode.js +100 -0
  9. package/{application.command-8s8ns95d.js → application.command-x75men32.js} +6 -15
  10. package/{applicationBuildRunner-4f1wrba0.js → applicationBuildRunner-d3702f1w.js} +2 -2
  11. package/{applicationReleasePackager-jkjmy5ee.js → applicationReleasePackager-2kdyj3te.js} +1 -1
  12. package/buildBatch.proc.js +2 -2
  13. package/{capacitorApp-hqvsrec4.js → capacitorApp-qk975zyz.js} +2 -2
  14. package/{cloud.command-p5dnhft9.js → cloud.command-a09wggfq.js} +10 -22
  15. package/cloud.script-qd3hpybf.js +20 -0
  16. package/code.command-ca7rpmez.js +147 -0
  17. package/commandManifest.json +1 -1
  18. package/consoleToStderr-h5bryj94.js +7 -0
  19. package/{context.command-wsjt98c1.js → context.command-9kbm0527.js} +14 -15
  20. package/context.runner-wtqpw7mh.js +22 -0
  21. package/{devTui-myg3pqeg.js → devTui-v19fbnpk.js} +114 -8
  22. package/{devTuiView-gz2fbf4v.js → devTuiView-pa63jrjq.js} +1 -1
  23. package/guideline.command-qvrh5pnx.js +48 -0
  24. package/guidelines/agentRule/agentRule.instruction.md +46 -15
  25. package/guidelines/conventions/conventions.instruction.md +9 -4
  26. package/guidelines/moduleCodegen/moduleCodegen.instruction.md +1 -1
  27. package/guidelines/workspaceRecipes/workspaceRecipes.generate.json +1 -0
  28. package/guidelines/workspaceRecipes/workspaceRecipes.instruction.md +62 -0
  29. package/incrementalBuilder.proc.js +1 -1
  30. package/{index-bz10w9t2.js → index-0qvq9aeb.js} +6 -16
  31. package/{index-jwjaf9fy.js → index-1p146w4s.js} +44 -44
  32. package/{index-7f4dsf9v.js → index-1sggq0m8.js} +1 -1
  33. package/{index-15r9a10e.js → index-3dmebxnk.js} +2 -2
  34. package/{index-vrwdx0zx.js → index-3hr7cpy1.js} +1 -1
  35. package/{index-s3fvrydw.js → index-5hy11qaq.js} +9 -9
  36. package/{index-8pkvrcv1.js → index-658xafm1.js} +3 -3
  37. package/index-7md2g9vw.js +6 -0
  38. package/{index-ys7dvdb3.js → index-84b080zh.js} +1 -1
  39. package/index-8k16atqy.js +82 -0
  40. package/{index-t3c045et.js → index-91brpnzb.js} +8 -21
  41. package/{index-em4swemt.js → index-bchkysja.js} +3 -3
  42. package/{index-j7rwsd23.js → index-bzjnp9ap.js} +22 -80
  43. package/{index-cnzm1wn5.js → index-chp5gqmm.js} +88 -169
  44. package/{index-h3g1152j.js → index-d35a8vc0.js} +4 -4
  45. package/{index-1nwxbr2y.js → index-ea1smknd.js} +2 -2
  46. package/index-egt4vfgb.js +69 -0
  47. package/index-erzcytap.js +2434 -0
  48. package/{index-sh88vtye.js → index-f4gpcp98.js} +1 -1
  49. package/{index-b3ae16mg.js → index-gca9y01h.js} +1 -1
  50. package/{index-wmb05v4q.js → index-gm76f0qb.js} +1 -1
  51. package/{index-649svkyt.js → index-myj01w9r.js} +8 -15
  52. package/index-sxg87a8f.js +727 -0
  53. package/{index-h7yw2z9n.js → index-twq9p2sp.js} +8 -8
  54. package/index-v156f836.js +234 -0
  55. package/index-v1y3cx0k.js +61 -0
  56. package/{index-t8gvwcrx.js → index-va2je2qm.js} +2 -2
  57. package/index-wfwknnje.js +124 -0
  58. package/index-x7g1qzpt.js +121 -0
  59. package/index.js +21 -20
  60. package/{library.command-1f9h2ex6.js → library.command-n89re6cx.js} +3 -3
  61. package/{localRegistry.command-w6w35j4r.js → localRegistry.command-1mmnegph.js} +9 -9
  62. package/{module.command-8zkq0q9q.js → module.command-4m82zgfp.js} +7 -10
  63. package/{package.command-y2rh4np7.js → package.command-9dv0p6zq.js} +3 -3
  64. package/package.json +9 -5
  65. package/{page.command-e5h29fyt.js → page.command-q86b0m0z.js} +3 -3
  66. package/{primitive.command-qm7tybpn.js → primitive.command-kaneasq6.js} +6 -9
  67. package/prompter-9mn3kp36.js +8 -0
  68. package/{quality.command-5evdd263.js → quality.command-sgapx315.js} +65 -5
  69. package/{repair.command-c2amvt74.js → repair.command-efc5gdbq.js} +5 -5
  70. package/{scalar.command-a1ewkmab.js → scalar.command-e2rpkhqy.js} +6 -9
  71. package/skills/akan-debug/SKILL.md +42 -0
  72. package/skills/akan-deps/SKILL.md +50 -0
  73. package/skills/akan-err/SKILL.md +39 -0
  74. package/skills/akan-module/SKILL.md +45 -0
  75. package/skills/akan-scaffold/SKILL.md +76 -0
  76. package/skills/akan-scalar/SKILL.md +52 -0
  77. package/skills/akan-service/SKILL.md +34 -0
  78. package/skills/akan-store/SKILL.md +63 -0
  79. package/skills/akan-ui/SKILL.md +63 -0
  80. package/skills/akan-validate/SKILL.md +44 -0
  81. package/{subspace.command-3w5x13a1.js → subspace.command-005rz1x6.js} +5 -5
  82. package/{tunnel.command-09n8h4s1.js → tunnel.command-66j9estx.js} +4 -4
  83. package/{workflow.command-y3fct1rq.js → workflow.command-z1xcm4c7.js} +9 -12
  84. package/{workspace.command-p6td4qad.js → workspace.command-4ahrhp3k.js} +23 -22
  85. package/abstractCompactor-g04vqcff.js +0 -102
  86. package/cloud.script-gxpbhras.js +0 -20
  87. package/guideline.command-snqzfyt0.js +0 -360
  88. package/index-5tw8t1ts.js +0 -338
  89. package/index-j1tajctp.js +0 -229
  90. package/index-kpnp2e10.js +0 -841
  91. package/index-meh558jy.js +0 -65
  92. /package/{index-5nyznra1.js → index-p1j0cyvd.js} +0 -0
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: akan-scalar
3
+ description: "Create an embedded value object (scalar) under lib/__scalar/, or add a relation field to another model — including which cascade direction is which."
4
+ ---
5
+
6
+ # Akan scalars and relations
7
+
8
+ ## Scalars
9
+
10
+ A scalar is an embedded value object with no collection of its own. It lives in `lib/__scalar/<name>/`, is
11
+ composed into models with `scalar(...)`, and its dictionary is a `scalarDictionary`. Create one with the
12
+ `create-scalar` workflow; its UI surface is limited to `<Scalar>.Template.tsx` and `<Scalar>.Unit.tsx`.
13
+
14
+ ## Relations
15
+
16
+ A reference to another model is `field(Model)`, or `field([Model])` for many. Files and images are a
17
+ relation to the `File` model — `image: field(File).optional()` — never an `Upload` field; `Upload` is a
18
+ signal-body primitive only. The store then generates `upload<Field>On<Model>(fileList)` for you.
19
+
20
+ **Hydrated vs raw.** A server query returns a hydrated `cnst.<Model>` instance with `set` / `save` /
21
+ `refresh`. A client `fetch` result is raw plain data with the functions stripped. Code that works in a
22
+ service and fails in a store is usually this.
23
+
24
+ **A model's `Date` fields are prototype accessors, not own properties.** `user.createdAt` is a `Dayjs` built
25
+ on first read, so `Object.keys(user)` and `{ ...user }` do **not** include it, while `"createdAt" in user`,
26
+ `JSON.stringify(user)` and `plainFieldsOf(user)` do. To copy a model write `new cnst.X().set(user)`, never a
27
+ spread.
28
+
29
+ ## Cascade — the value names the direction, and getting it wrong loses data
30
+
31
+ The two actions sit on the same field shape, so `cascade` never means "related". It means one of exactly
32
+ these:
33
+
34
+ - `removeRef` — *when I am removed, remove what this field points at.* Declared on the relation the owner
35
+ holds: `image: field(File, { cascade: "removeRef" })`.
36
+ - `removeWith` — *when what this field points at is removed, remove me.* Declared on the child's own
37
+ reference to its owner, so the owner never learns about its children.
38
+
39
+ Nothing checks whether another document still references the same target, and `File` in particular is
40
+ deduped by `origin`, so two parents can share one row. Removal is soft, but the storage delete a
41
+ `_postRemove` performs is not — a cascade is not restorable.
42
+
43
+ Query-level removes fire no hooks and therefore no cascade: `removeManyByQuery`, the generated
44
+ `remove<Filter>`, and the facade's `removeById`. Remove one document at a time when it cascades.
45
+
46
+ ## Field types
47
+
48
+ Import `Int`, `Float`, `ID`, `Any`, `Binary`, `Upload`, `enumOf` and `dayjs` from `akanjs/base`. `String`,
49
+ `Boolean` and `Date` are the globals. **`Number` is not a field type** — use `Int` or `Float`. There is no
50
+ JSON scalar; use `Any`. `Binary` is wire bytes and is never a model field.
51
+
52
+ Full detail: `get_guideline` with `scalarModule`, `scalarConstant`, `fieldRule`, or `queryRule`.
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: akan-service
3
+ description: "Add a service module — behaviour not centred on one stored model — under lib/_<service>/, and keep its abstract current."
4
+ ---
5
+
6
+ # Akan service modules
7
+
8
+ Behaviour that is not centred on a single stored model lives in a **service module**: the folder is
9
+ `lib/_<service>/` and its abstract file is `<service>.abstract.md` — the folder carries the underscore, the
10
+ abstract drops it. Its UI surface is limited to `<Service>.Util.tsx` and `<Service>.Zone.tsx`, and its
11
+ dictionary is a `serviceDictionary`.
12
+
13
+ ## Rules
14
+
15
+ - Read the module's `*.abstract.md` **before** changing it — it states the invariants the code cannot show.
16
+ Update it when an invariant, workflow, or public behaviour changes; not for formatting or imports.
17
+ - Keep the public surface in the signal layer and the decisions in the service.
18
+ - Service methods stay a few lines: load → chain → `return await ….save()`. Write `return await` explicitly
19
+ in tail position. Side effects belong in `_preUpdate` / `_postCreate`, not inline. Fire-and-forget is
20
+ explicitly `void`-ed.
21
+ - Return `null` / `false` for "not allowed" or "not found" and let the signal decide whether that is an
22
+ error.
23
+
24
+ ## Reaching other things
25
+
26
+ Inside a service, in preference order: `service<srv.XService>()` for another module's service,
27
+ `plug(AdapterClass)` for an adapter, `use<T>()` only for an `option.ts`-registered legacy singleton, and
28
+ `env(...)` for config. Injection resolves by field name — a field named `<refName>Service` finds the service
29
+ registered under `<refName>`, and the `Service` suffix is required.
30
+
31
+ An external API or piece of infrastructure is an `adapt()` class in `srvkit/`, injected with `plug`. It
32
+ self-registers, so do **not** add it to `lib/option.ts`.
33
+
34
+ Full detail: `get_guideline` with `modelService`.
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: akan-store
3
+ description: "Fill in a module store, or call module data and actions from UI — what store() already generates (CRUD, form setters, slice actions) and what belongs in your subclass."
4
+ ---
5
+
6
+ # Akan store: what is already generated
7
+
8
+ `class CommentStore extends store(sig.comment, () => ({ /* extra state */ })) { /* extra actions */ }`
9
+ gives you the whole CRUD and form surface for free. **Redeclaring any of it is a typecheck error
10
+ ("already exists"), and the fix is to delete your version and call the generated one** — never rename around
11
+ it, never cast, never reimplement.
12
+
13
+ For a model `comment` (`<Slice>` is a signal slice suffix, e.g. `InPublic`):
14
+
15
+ ## Generated actions — `st.do.*`
16
+
17
+ - write: `createComment(input)`, `updateComment(id, input)`, `removeComment(id)`
18
+ - form: `newComment()`, `editComment(model)`, `writeOnComment(path, value)`, `set<Field>OnComment(value)`,
19
+ `add<Field>OnComment(value)` / `sub<Field>OnComment(idx)` for arrays, `upload<Field>OnComment(fileList)`
20
+ for file fields, `checkCommentSubmitable()`, `submitComment()`, `createCommentInForm()`,
21
+ `updateCommentInForm()`
22
+ - single: `viewComment(model)`, `mergeComment(model, data)`, `setComment(...models)`, `resetComment()`
23
+ - per slice: `initComment<Slice>(...args)`, `refreshComment<Slice>()`, `selectComment<Slice>(model)`,
24
+ `setPageOfComment<Slice>(page)`, `loadMoreOfComment<Slice>()`, `setLimitOfComment<Slice>(limit)`,
25
+ `setQueryArgsOfComment<Slice>(...)`, `setSortOfComment<Slice>(sort)`
26
+
27
+ ## Generated state — `st.use.*`
28
+
29
+ `comment`, `commentLoading`, `commentForm`, `commentFormLoading`, `commentSubmit`, `commentModal`,
30
+ `commentViewAt`, `commentOperation`; per slice `commentList<Slice>`, `commentListLoading<Slice>`,
31
+ `commentInitList<Slice>`, `commentSelection<Slice>`, `commentInsight<Slice>`, `pageOfComment<Slice>`,
32
+ `lastPageOfComment<Slice>`, `hasMoreOfComment<Slice>`, `limitOfComment<Slice>`, `sortOfComment<Slice>`.
33
+
34
+ ## What your subclass is for
35
+
36
+ Only what the generated set does not cover: extra client state, a multi-step or cross-model workflow, and
37
+ calls to the non-CRUD endpoints you added in the signal. Each is an `async` method using `this.set(...)` /
38
+ `this.get()` / `this.pick(...)`.
39
+
40
+ A store that needs none of this stays empty. `store(sig.comment, () => ({}))` with an empty body is the
41
+ correct, complete result — an empty store is not an unfinished one.
42
+
43
+ ## Two rules the linter enforces
44
+
45
+ - **An action returns nothing.** Every method dispatches through `st.do.<action>()` and is typed `void`, so a
46
+ returned value is unreachable. Write it into state with `this.set({ … })`.
47
+ - **Never `import type { RootStore } from "../st"`** — it crashes `akan build` with a Bun SSR segfault.
48
+
49
+ ## From UI
50
+
51
+ Read with `st.use.commentListInPublic()`, act with `st.do.createComment(input)` / `st.do.submitComment()`.
52
+ Do not wrap a generated action in a store method just to rename it.
53
+
54
+ **Pass a form setter by reference**: `onChange={st.do.setTypeOnComment}`, never
55
+ `onChange={(v) => st.do.setTypeOnComment(v)}`. The two run identically, but the arrow is an anonymous
56
+ closure, so the control emits no `data-akan-action` and publishes no agent tool for the field —
57
+ `no-unpublished-form-setter.grit` fails the build on it.
58
+
59
+ ## Signal side
60
+
61
+ The scaffolded `slice(…, { guards: { root, get, cru } })` already exposes get / list / create / update /
62
+ remove. Add a query or mutation only for behaviour beyond CRUD, and give it its own `guards` array — a
63
+ custom endpoint never inherits the slice's.
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: akan-ui
3
+ description: "Build Akan pages and components: the server-by-default rule, the Unit/View vs Template/Zone/Util split, forms, and what never to hand-roll."
4
+ ---
5
+
6
+ # Akan UI
7
+
8
+ A new View / Unit / Template / Zone / Util for an existing module comes from the `create-ui` workflow (the
9
+ `akan-scaffold` skill). Edit the scaffolded component instead of authoring one from scratch.
10
+
11
+ ## The boundary is mechanical, not a judgement call
12
+
13
+ | role | side | directive |
14
+ | --- | --- | --- |
15
+ | `<Model>.Unit.tsx`, `<Model>.View.tsx` | server | never `"use client"` |
16
+ | `<Model>.Template.tsx`, `<Model>.Zone.tsx`, `<Model>.Util.tsx` | client | `"use client"` on line 1 |
17
+ | `page/**` | server | never |
18
+
19
+ **Server is the default and `"use client"` is a cost you justify per component.** A component earns the
20
+ directive only by using a hook, a JSX event handler, the store, a browser global, or a client-only package.
21
+ Rendering markup, reading a param, calling `l()`, and mapping over data are all server work. Measure with
22
+ `akan quality ssr`; treat 50% server share as the floor and a falling share as a regression.
23
+
24
+ Four moves that keep markup on the server: wrap the interaction and render `children` untouched; split a
25
+ compound component so only the provider holds state; fetch in the route and pass the result into a `Zone` as
26
+ an `init` prop; push the boundary down to the leaf that needs it.
27
+
28
+ ## Never hand-roll these
29
+
30
+ - loading / empty / list states → `Load.Units` / `Load.View` / `Load.Edit` with `renderItem`, `renderList`,
31
+ `renderView`, `renderEmpty`; `<Empty />` for a bare placeholder; `Model.New` / `Model.Edit` /
32
+ `Model.SureToRemove` for CRUD modals.
33
+ - a mount-time fetch → the route calls `fetch.init<Model><Slice>(…)` before the first byte. A
34
+ `useEffect(…, [])` that loads data is flagged by `akan quality ssr`, and `fetch.init*` from a client file
35
+ fails lint outright.
36
+ - a model field input → `Field.*`, never a bare `<input>`.
37
+ - a mode switch → `Tab`, not a `useState`.
38
+
39
+ ## Component shape
40
+
41
+ `export const X = ({ … }: XProps) => { return (…); };` — arrow const, block body. Never `React.FC`, never
42
+ `defaultProps`, never `PropsWithChildren`; children are `children: ReactNode`. Declare
43
+ `interface XProps` directly above the component with `className?: string` first.
44
+
45
+ Conditional render is `cond ? <X/> : null`. **Never `{cond && <X/>}`** — in a `className` context it renders
46
+ the literal string `"false"`.
47
+
48
+ ## Classes
49
+
50
+ Never hand-order Tailwind classes; the formatter sorts them and its output is correct. Stay inside the
51
+ semantic token vocabulary — `bg-primary`, `text-foreground/70` — because a raw palette class (`bg-blue-500`),
52
+ an arbitrary colour (`bg-[#3b82f6]`), a daisyUI legacy class, and a colour literal in `style={{…}}` all
53
+ render no CSS and fail lint. Reach for `cn` only for a conditional or to merge an incoming `className`, and
54
+ merge the caller last.
55
+
56
+ ## Forms
57
+
58
+ Store-driven end to end: `value={xForm.field}` with `onChange={st.do.setFieldOnX}`, **the setter passed by
59
+ reference**. An inline arrow silently drops the control's agent annotation and fails
60
+ `no-unpublished-form-setter.grit`. Nested rows use `st.do.writeOnX("payments.3.name", v)`.
61
+
62
+ Full detail: `get_guideline` with `ssrRule`, `componentRule`, `cssRule`, `recipeRule`, or the per-role
63
+ `modelUnit` / `modelView` / `modelZone` / `modelTemplate` / `modelUtil`.
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: akan-validate
3
+ description: "Run the akan check loop after editing and fix each failure class the right way — no silencing, no lint-disable, no gaming the checker."
4
+ ---
5
+
6
+ # Akan validation loop
7
+
8
+ ## One call does the whole chain
9
+
10
+ `akan_verify` runs sync → lint → typecheck → `quality ssr` over everything the working tree has changed, in
11
+ the right order, and reports only what failed. **Call it after editing, before you say you are done.** It
12
+ also runs itself at the end of a turn that changed source, so a failure comes back to you either way.
13
+
14
+ The same chain by hand, for the app you are editing:
15
+
16
+ - `akan sync <app>` — after adding, renaming, or deleting any file. Regenerates the barrels.
17
+ - `akan lint <app>` — fast; run after every edit. Prints up to 200 diagnostics.
18
+ - `akan typecheck <app>` — the client/server boundary violations land here, not in lint.
19
+ - `akan quality ssr` — only when you wrote or changed a `.tsx`. Did the server share hold?
20
+ - `akan build <app>` — the full production build; slower, and only when the build itself is in question.
21
+
22
+ Raw `tsc` misses the generated barrels and reports false errors. Do not reach for it.
23
+
24
+ ## Fixing rules
25
+
26
+ **Apply the real fix the rule intends. Do not silence the checker.** No blanket lint-disable, no throwaway
27
+ re-export, no export-in-place trick, no `as any`, no non-null assertion. Gaming a check is a defect, not a
28
+ fix. When a suppression is genuinely right it carries a reason:
29
+ `// biome-ignore lint/<rule>: <why>` — and a grit plugin diagnostic is suppressed as `lint/plugin`, not the
30
+ bare `plugin` category Biome's own message suggests.
31
+
32
+ Common classes and their real fix:
33
+
34
+ | symptom | fix |
35
+ | --- | --- |
36
+ | a member "already exists" or conflicts with the base class | you redeclared something Akan generates, usually store CRUD. **Delete your version** and call the generated one — do not rename, cast, or suppress. See `akan-store`. |
37
+ | `throw new Error` | a typed `Err` with a dictionary key. See `akan-err`. |
38
+ | an edit to a generated file | regenerate instead: `akan sync <app>` or `repair_generated`. |
39
+ | a file in the wrong place | relocate to `common/` / `webkit/` / `srvkit/` / `ui/`. Never a sibling helper `.ts` inside `lib/<model>/`. |
40
+ | a missing dependency | declare it in the owning app or lib `package.json`. See `akan-deps`. |
41
+ | a Tailwind class order or colour complaint | let the formatter sort; use semantic tokens. See `akan-ui`. |
42
+
43
+ Re-run until clean. If a failure is genuinely outside the scope of what you changed, say so in your reply
44
+ instead of forcing it.
@@ -4,23 +4,23 @@ import {
4
4
  } from "./index-q0y2jq9j.js";
5
5
  import {
6
6
  GlobalConfig
7
- } from "./index-649svkyt.js";
7
+ } from "./index-myj01w9r.js";
8
8
  import {
9
9
  Workspace,
10
10
  CommandContainer,
11
11
  runner,
12
12
  script,
13
13
  command
14
- } from "./index-b3ae16mg.js";
14
+ } from "./index-gca9y01h.js";
15
15
  import {
16
16
  Executor,
17
17
  WorkspaceExecutor,
18
18
  AppExecutor
19
- } from "./index-5nyznra1.js";
19
+ } from "./index-p1j0cyvd.js";
20
20
  import"./index-6wwzs1bc.js";
21
21
  import {
22
22
  SlicePlanner
23
- } from "./index-ys7dvdb3.js";
23
+ } from "./index-84b080zh.js";
24
24
  import {
25
25
  LibSource
26
26
  } from "./index-3d9y066c.js";
@@ -725,7 +725,7 @@ class SubspaceRunner extends runner("subspace") {
725
725
  if (!asked)
726
726
  return { name: subspace.name, workspaceId, host, apps, libs: [], outcome: "cancelled", files: [] };
727
727
  const { libs } = await subspace.slice();
728
- const { CloudScript } = await import("./cloud.script-gxpbhras.js");
728
+ const { CloudScript } = await import("./cloud.script-qd3hpybf.js");
729
729
  const { files } = await CommandContainer.get(CloudScript).uploadEnv(workspace, {
730
730
  host,
731
731
  workspaceId,
@@ -3,20 +3,20 @@ import"./index-q0y2jq9j.js";
3
3
  import {
4
4
  GlobalConfig,
5
5
  CloudApi
6
- } from "./index-649svkyt.js";
6
+ } from "./index-myj01w9r.js";
7
7
  import {
8
8
  Workspace,
9
9
  runner,
10
10
  script,
11
11
  command
12
- } from "./index-b3ae16mg.js";
12
+ } from "./index-gca9y01h.js";
13
13
  import {
14
14
  AppExecutor
15
- } from "./index-5nyznra1.js";
15
+ } from "./index-p1j0cyvd.js";
16
16
  import"./index-6wwzs1bc.js";
17
17
  import {
18
18
  TunnelShare2
19
- } from "./index-wmb05v4q.js";
19
+ } from "./index-gm76f0qb.js";
20
20
  import {
21
21
  writeClipboard
22
22
  } from "./index-p6pbz9n5.js";
@@ -3,31 +3,28 @@ import {
3
3
  Workspace,
4
4
  script,
5
5
  command
6
- } from "./index-b3ae16mg.js";
6
+ } from "./index-gca9y01h.js";
7
7
  import"./index-q0y2jq9j.js";
8
- import"./index-5nyznra1.js";
8
+ import"./index-p1j0cyvd.js";
9
9
  import"./index-6wwzs1bc.js";
10
10
  import {
11
11
  createWorkflowStepRegistry
12
- } from "./index-jwjaf9fy.js";
13
- import"./index-649svkyt.js";
14
- import"./index-5tw8t1ts.js";
12
+ } from "./index-1p146w4s.js";
13
+ import"./index-f4gpcp98.js";
15
14
  import {
16
15
  ModuleScript
17
- } from "./index-kpnp2e10.js";
18
- import"./index-sh88vtye.js";
19
- import"./index-h7yw2z9n.js";
16
+ } from "./index-v156f836.js";
20
17
  import {
21
18
  PrimitiveScript
22
- } from "./index-h3g1152j.js";
19
+ } from "./index-d35a8vc0.js";
23
20
  import {
24
21
  ScalarScript
25
- } from "./index-j1tajctp.js";
22
+ } from "./index-v1y3cx0k.js";
26
23
  import"./index-by5gpp8x.js";
27
- import"./index-15r9a10e.js";
24
+ import"./index-3dmebxnk.js";
28
25
  import {
29
26
  WorkflowRunner
30
- } from "./index-8pkvrcv1.js";
27
+ } from "./index-658xafm1.js";
31
28
 
32
29
  // pkgs/@akanjs/cli/workflow/workflow.script.ts
33
30
  import { Logger } from "akanjs/common";
@@ -4,14 +4,14 @@ import {
4
4
  } from "./index-q0y2jq9j.js";
5
5
  import {
6
6
  GlobalConfig
7
- } from "./index-649svkyt.js";
7
+ } from "./index-myj01w9r.js";
8
8
  import {
9
9
  Exec,
10
10
  Workspace,
11
11
  runner,
12
12
  script,
13
13
  command
14
- } from "./index-b3ae16mg.js";
14
+ } from "./index-gca9y01h.js";
15
15
  import {
16
16
  extractAgentBlock,
17
17
  collectScopeRecipeSources,
@@ -21,7 +21,7 @@ import {
21
21
  AppExecutor,
22
22
  LibExecutor,
23
23
  PkgExecutor
24
- } from "./index-5nyznra1.js";
24
+ } from "./index-p1j0cyvd.js";
25
25
  import"./index-6wwzs1bc.js";
26
26
  import {
27
27
  countBlocking,
@@ -32,42 +32,43 @@ import {
32
32
  collectRecipeSources2,
33
33
  scanRecipes2
34
34
  } from "./index-by5gpp8x.js";
35
- import"./index-jwjaf9fy.js";
36
- import"./index-15r9a10e.js";
37
- import"./index-h7yw2z9n.js";
35
+ import"./index-1p146w4s.js";
36
+ import"./index-3dmebxnk.js";
37
+ import"./index-twq9p2sp.js";
38
38
  import {
39
39
  AgentScript
40
- } from "./index-s3fvrydw.js";
40
+ } from "./index-5hy11qaq.js";
41
41
  import {
42
42
  ApplicationScript
43
- } from "./index-cnzm1wn5.js";
43
+ } from "./index-chp5gqmm.js";
44
44
  import {
45
45
  LibraryScript
46
- } from "./index-1nwxbr2y.js";
46
+ } from "./index-ea1smknd.js";
47
47
  import"./index-hwkygn9s.js";
48
- import"./index-5tw8t1ts.js";
48
+ import"./index-7md2g9vw.js";
49
49
  import"./index-kcxmv48c.js";
50
50
  import {
51
51
  PackageScript
52
- } from "./index-t8gvwcrx.js";
52
+ } from "./index-va2je2qm.js";
53
53
  import {
54
54
  getNpmRegistryUrl,
55
55
  getLatestPackageVersion
56
- } from "./index-bz10w9t2.js";
56
+ } from "./index-0qvq9aeb.js";
57
57
  import {
58
58
  CloudScript2
59
- } from "./index-t3c045et.js";
59
+ } from "./index-91brpnzb.js";
60
+ import"./index-bzjnp9ap.js";
61
+ import"./index-1sggq0m8.js";
62
+ import"./index-bchkysja.js";
63
+ import"./index-658xafm1.js";
64
+ import"./index-f4gpcp98.js";
65
+ import"./index-v156f836.js";
66
+ import"./index-d35a8vc0.js";
67
+ import"./index-v1y3cx0k.js";
60
68
  import {
61
69
  ContextScript
62
- } from "./index-j7rwsd23.js";
63
- import"./index-7f4dsf9v.js";
64
- import"./index-em4swemt.js";
65
- import"./index-8pkvrcv1.js";
66
- import"./index-kpnp2e10.js";
67
- import"./index-sh88vtye.js";
68
- import"./index-h3g1152j.js";
69
- import"./index-j1tajctp.js";
70
- import"./index-ys7dvdb3.js";
70
+ } from "./index-egt4vfgb.js";
71
+ import"./index-84b080zh.js";
71
72
 
72
73
  // pkgs/@akanjs/cli/workspace/workspace.runner.ts
73
74
  import path from "path";
@@ -1,102 +0,0 @@
1
- // @bun
2
- import"./index-q0y2jq9j.js";
3
- import"./index-649svkyt.js";
4
- import {
5
- AiSession
6
- } from "./index-5tw8t1ts.js";
7
- import {
8
- AbstractDoc
9
- } from "./index-meh558jy.js";
10
-
11
- // pkgs/@akanjs/devkit/abstractCompactor.ts
12
- import { Logger } from "akanjs/common";
13
- import chalk from "chalk";
14
- class AbstractCompactor {
15
- static #reviewRequest = `Review the compacted file you just wrote against the original.
16
- - Did you drop an invariant, a security reason, or a workflow step that the source files cannot show by themselves? Restore it.
17
- - Did you keep anything that only restates code, scaffold wording, or history? Remove it.
18
- - Is it in the same language as the original, within the line budget, and one short line per bullet?
19
- Respond with exactly one \`\`\`markdown code block holding the corrected file and nothing else. If nothing needs to change, repeat the file unchanged.`;
20
- #sys;
21
- #minLines;
22
- #interactive;
23
- constructor(sys, { minLines = AbstractDoc.compactMinLines, interactive = false } = {}) {
24
- this.#sys = sys;
25
- this.#minLines = minLines;
26
- this.#interactive = interactive;
27
- }
28
- async compactAll({ module } = {}) {
29
- const docs = await AbstractDoc.findAll(this.#sys, { module });
30
- const targets = docs.filter((doc) => doc.lineCount > this.#minLines);
31
- const reports = [];
32
- for (const doc of targets)
33
- reports.push(await this.compact(doc));
34
- return { scanned: docs.length, reports };
35
- }
36
- async compact(doc) {
37
- const session = new AiSession("compactAbstract", {
38
- workspace: this.#sys.workspace,
39
- cacheKey: `${this.#sys.name}-${doc.moduleName}`
40
- });
41
- const approve = !this.#interactive;
42
- const compacted = await session.editMarkdown(this.#request(doc), { approve });
43
- const reviewed = await session.editMarkdown(AbstractCompactor.#reviewRequest, { approve });
44
- const next = [reviewed, compacted].map((candidate) => candidate.trim()).find((candidate) => doc.canReplaceWith(candidate));
45
- const beforeLines = doc.lineCount;
46
- if (!next) {
47
- Logger.rawLog(chalk.yellow(`${doc.path}: the editor returned no shorter abstract, keeping the current file`));
48
- return { path: doc.path, beforeLines, afterLines: beforeLines, status: "failed" };
49
- }
50
- if (next === doc.content.trim())
51
- return { path: doc.path, beforeLines, afterLines: beforeLines, status: "unchanged" };
52
- const content = `${next}
53
- `;
54
- await this.#sys.writeFile(doc.path, content);
55
- return { path: doc.path, beforeLines, afterLines: AbstractDoc.lineCountOf(content), status: "compacted" };
56
- }
57
- #targetShape(kind) {
58
- if (kind === "other")
59
- return " - keep the headings that still carry information and drop the rest; do not impose a new structure";
60
- return [
61
- " - `# <name> Abstract` title line",
62
- " - one declarative sentence naming what this module owns",
63
- " - `## Rules` \u2014 two to five bullets, each an invariant the code cannot show by itself",
64
- " - optional `## Workflow` \u2014 the lifecycle as an arrow chain (`draft -> signed -> active`) or a few bullets"
65
- ].join(`
66
- `);
67
- }
68
- #request(doc) {
69
- return `You are compacting an Akan.js abstract file.
70
-
71
- An abstract is the summary a coding agent reads before changing a module. Repeated edits have made this one
72
- bloated, and it has to shrink back to what the source files cannot show by themselves.
73
-
74
- # Target file
75
- ${this.#sys.type}s/${this.#sys.name}/${doc.path} (${doc.kind} module "${doc.moduleName}", ${doc.lineCount} lines)
76
-
77
- # Source files in the same folder
78
- ${doc.siblingFiles.join(", ") || "none"}
79
-
80
- # Current content
81
- \`\`\`markdown
82
- ${doc.content}
83
- \`\`\`
84
-
85
- # Rules for the compacted file
86
- - Write it in the SAME language as the current content. Never translate.
87
- - Keep every invariant, constraint, security reason, and workflow step that the source files cannot show by
88
- themselves. Merge duplicates instead of dropping either one.
89
- - Delete what the code already states: field lists, types, labels, signatures, file lists, and imports.
90
- - Delete scaffold and placeholder wording, changelog or migration history, TODOs, and any instruction about
91
- reading or updating this file.
92
- - Never invent a rule that the current content does not state.
93
- - Keep every bullet to one short line, and stay under ${AbstractDoc.compactMinLines} lines in total.
94
- - Shape:
95
- ${this.#targetShape(doc.kind)}
96
-
97
- Respond with exactly one \`\`\`markdown code block holding the whole new file and nothing else.`;
98
- }
99
- }
100
- export {
101
- AbstractCompactor
102
- };
@@ -1,20 +0,0 @@
1
- // @bun
2
- import {
3
- CloudScript2
4
- } from "./index-t3c045et.js";
5
- import"./index-bz10w9t2.js";
6
- import"./index-cnzm1wn5.js";
7
- import"./index-ys7dvdb3.js";
8
- import"./index-1nwxbr2y.js";
9
- import"./index-t8gvwcrx.js";
10
- import"./index-5tw8t1ts.js";
11
- import"./index-649svkyt.js";
12
- import"./index-b3ae16mg.js";
13
- import"./index-hwkygn9s.js";
14
- import"./index-5nyznra1.js";
15
- import"./index-6wwzs1bc.js";
16
- import"./index-kcxmv48c.js";
17
- import"./index-q0y2jq9j.js";
18
- export {
19
- CloudScript2 as CloudScript
20
- };