@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
package/index-qt8dqgnf.js DELETED
@@ -1,250 +0,0 @@
1
- // @bun
2
- // pkgs/@akanjs/devkit/codeAgent/agent/SubagentPool.ts
3
- import { codeAgentReadOnlyBuiltins } from "akanjs/common";
4
- import { Type } from "typebox";
5
- var maxResultChars = 8000;
6
- var tickMs = 1000;
7
-
8
- class SubagentPool2 {
9
- static kinds = {
10
- explore: {
11
- readOnly: true,
12
- desc: "reads, searches and reports back. It cannot write a file or run a command."
13
- },
14
- code: {
15
- readOnly: false,
16
- desc: "makes the change itself, with the same tools as this session."
17
- }
18
- };
19
- static defaultKind = "explore";
20
- #options;
21
- #children = new Map;
22
- #running = 0;
23
- #spent = 0;
24
- #ticker = null;
25
- constructor(options) {
26
- this.#options = options;
27
- }
28
- static extensionFor(options) {
29
- if (!options.parent.tools.subagent)
30
- return;
31
- if (options.depth >= options.parent.tools.subagent.maxDepth)
32
- return;
33
- const pool = new SubagentPool2(options);
34
- return { name: "akan-subagent", factory: (pi) => pool.#register(pi) };
35
- }
36
- static toolName = "task";
37
- #register(pi) {
38
- pi.registerTool({
39
- name: SubagentPool2.toolName,
40
- label: "Task",
41
- description: "Run a focused sub-agent on one self-contained question and get back its answer. Use it for searching and reading that would otherwise fill this conversation \u2014 the sub-agent's own reading does not come back, only its answer. Give it everything it needs: it cannot see this conversation.",
42
- promptSnippet: "task: run a sub-agent on one self-contained question and get back only its answer",
43
- parameters: Type.Object({
44
- description: Type.String({ description: "Three to five words naming the task, for the activity log." }),
45
- prompt: Type.String({
46
- description: "The complete instruction. The sub-agent sees nothing of this conversation."
47
- }),
48
- type: Type.Optional(Type.Union(Object.entries(SubagentPool2.kinds).map(([kind, spec]) => Type.Literal(kind, { description: spec.desc })), { description: `What the sub-agent may do. Defaults to ${SubagentPool2.defaultKind}.` }))
49
- }),
50
- execute: async (id, params, signal) => {
51
- const kind = params.type ?? SubagentPool2.defaultKind;
52
- const refusal = this.#refuse();
53
- if (refusal)
54
- return { content: [{ type: "text", text: refusal }], details: undefined, isError: true };
55
- this.#running += 1;
56
- this.#children.set(id, { kind, description: params.description, startedAt: Date.now() });
57
- this.#report();
58
- this.#options.onNotice?.(`${kind} sub-agent \xB7 ${params.description}`);
59
- try {
60
- const text = await this.#run(id, kind, params.prompt, signal);
61
- return { content: [{ type: "text", text }], details: undefined };
62
- } finally {
63
- this.#running -= 1;
64
- this.#children.delete(id);
65
- this.#report();
66
- }
67
- }
68
- });
69
- }
70
- #refuse() {
71
- const budget = this.#options.parent.tools.subagent;
72
- if (!budget)
73
- return "Sub-agents are disabled by this profile.";
74
- if (this.#running >= budget.maxConcurrent)
75
- return `Too many sub-agents are already running (limit ${budget.maxConcurrent}). Wait for one to finish.`;
76
- if (this.#spent >= budget.budget)
77
- return `The sub-agent token budget (${budget.budget}) is spent. Do the rest of this work yourself.`;
78
- return;
79
- }
80
- static childOf(parent, kind) {
81
- const budget = parent.tools.subagent;
82
- return {
83
- ...parent,
84
- name: `${parent.name}:${kind}`,
85
- tools: {
86
- ...parent.tools,
87
- builtin: SubagentPool2.kinds[kind].readOnly ? parent.tools.builtin.filter((tool) => codeAgentReadOnlyBuiltins.includes(tool)) : parent.tools.builtin,
88
- subagent: budget ? { ...budget, maxDepth: budget.maxDepth } : false
89
- },
90
- session: { store: "memory", crossSession: false },
91
- ui: { canPrompt: false },
92
- context: { projectFiles: false, skills: parent.context.skills }
93
- };
94
- }
95
- #report() {
96
- const onAgents = this.#options.onAgents;
97
- if (!onAgents)
98
- return;
99
- onAgents([...this.#children].map(([id, child]) => ({
100
- id,
101
- kind: child.kind,
102
- description: child.description,
103
- startedAt: child.startedAt,
104
- tokens: child.agent?.tokensUsed ?? 0
105
- })));
106
- if (this.#children.size && !this.#ticker) {
107
- this.#ticker = setInterval(() => this.#report(), tickMs);
108
- this.#ticker.unref?.();
109
- } else if (!this.#children.size && this.#ticker) {
110
- clearInterval(this.#ticker);
111
- this.#ticker = null;
112
- }
113
- }
114
- async#run(id, kind, prompt, signal) {
115
- const { CodeAgent } = await import("./CodeAgent-gjqnc2mg.js");
116
- const budget = this.#options.parent.tools.subagent;
117
- const child = SubagentPool2.childOf(this.#options.parent, kind);
118
- const agent = await CodeAgent.create({
119
- workspace: this.#options.workspace,
120
- cwd: this.#options.cwd,
121
- profile: child,
122
- apps: [],
123
- depth: this.#options.depth + 1
124
- });
125
- const running = this.#children.get(id);
126
- if (running)
127
- running.agent = agent;
128
- const abort = () => void agent.abort();
129
- signal?.addEventListener("abort", abort, { once: true });
130
- try {
131
- let answer = "";
132
- agent.on((event) => {
133
- if (event.type === "message" && event.role === "assistant")
134
- answer = event.text;
135
- });
136
- await agent.prompt(prompt);
137
- await agent.waitForIdle();
138
- this.#spent += agent.tokensUsed;
139
- const ceiling = budget ? budget.budget : 0;
140
- this.#options.onNotice?.(`${kind} sub-agent finished, ${agent.tokensUsed} tokens (${this.#spent} of ${ceiling} spent)`);
141
- return answer.length > maxResultChars ? `${answer.slice(0, maxResultChars)}
142
- \u2026(truncated)` : answer || "(no answer)";
143
- } finally {
144
- signal?.removeEventListener("abort", abort);
145
- agent.dispose();
146
- }
147
- }
148
- }
149
-
150
- // pkgs/@akanjs/devkit/codeAgent/agent/akanCodePaths.ts
151
- import { existsSync } from "fs";
152
- import { homedir } from "os";
153
- import path from "path";
154
- var builtinSkillsDir = () => {
155
- const candidates = [path.join(import.meta.dir, "skills"), path.join(import.meta.dir, "..", "skills")];
156
- return candidates.find((candidate) => existsSync(candidate));
157
- };
158
- var akanCodePaths2 = {
159
- workspaceDir: (workspaceRoot) => path.join(workspaceRoot, ".akan", "code"),
160
- sessionsDir: (workspaceRoot) => path.join(workspaceRoot, ".akan", "code", "sessions"),
161
- extensionsDir: (workspaceRoot) => path.join(workspaceRoot, ".akan", "code", "extensions"),
162
- skillsDir: (workspaceRoot) => path.join(workspaceRoot, ".akan", "code", "skills"),
163
- mailDir: (workspaceRoot) => path.join(workspaceRoot, ".akan", "code", "mail"),
164
- builtinSkillsDir,
165
- mcpFile: (workspaceRoot) => path.join(workspaceRoot, ".akan", "code", "mcp.json"),
166
- globalDir: () => path.join(homedir(), ".akan", "code"),
167
- authFile: () => path.join(homedir(), ".akan", "code", "auth.json"),
168
- modelsFile: () => path.join(homedir(), ".akan", "code", "models.json")
169
- };
170
-
171
- // pkgs/@akanjs/devkit/codeAgent/tools/McpServerConfig.ts
172
- import { existsSync as existsSync2, mkdirSync, readFileSync, writeFileSync } from "fs";
173
- import path2 from "path";
174
- class McpServerConfig {
175
- static file(workspaceRoot) {
176
- return akanCodePaths2.mcpFile(workspaceRoot);
177
- }
178
- static read(workspaceRoot) {
179
- const entries = Object.entries(McpServerConfig.#parse(workspaceRoot).map);
180
- return entries.filter(([, entry]) => !entry.disabled).map(([name, entry]) => McpServerConfig.#refOf(name, entry));
181
- }
182
- static declared(workspaceRoot) {
183
- return Object.entries(McpServerConfig.#parse(workspaceRoot).map).map(([name, entry]) => ({
184
- ref: McpServerConfig.#refOf(name, entry),
185
- disabled: !!entry.disabled
186
- }));
187
- }
188
- static add(workspaceRoot, name, target) {
189
- const [head, ...rest] = target;
190
- if (!head)
191
- throw new Error("Give the server a command to run, or a url to reach.");
192
- const entry = /^https?:\/\//.test(head) ? { url: head } : { command: head, args: rest };
193
- const { file, key, map } = McpServerConfig.#parse(workspaceRoot);
194
- const next = { ...map, [name]: entry };
195
- mkdirSync(path2.dirname(file), { recursive: true });
196
- writeFileSync(file, `${JSON.stringify({ [key]: next }, null, 2)}
197
- `);
198
- return McpServerConfig.#refOf(name, entry);
199
- }
200
- static remove(workspaceRoot, name) {
201
- const { file, key, map } = McpServerConfig.#parse(workspaceRoot);
202
- if (!(name in map))
203
- return false;
204
- const next = { ...map };
205
- delete next[name];
206
- writeFileSync(file, `${JSON.stringify({ [key]: next }, null, 2)}
207
- `);
208
- return true;
209
- }
210
- static #refOf(name, entry) {
211
- return {
212
- name,
213
- transport: entry.url ? "http" : "stdio",
214
- ...entry.command ? { command: entry.command } : {},
215
- ...entry.args ? { args: entry.args } : {},
216
- ...entry.url ? { url: entry.url } : {},
217
- ...entry.env ? { env: entry.env } : {}
218
- };
219
- }
220
- static targetOf(ref) {
221
- return ref.url ?? [ref.command, ...ref.args ?? []].filter(Boolean).join(" ");
222
- }
223
- static problem(workspaceRoot) {
224
- const file = McpServerConfig.file(workspaceRoot);
225
- if (!existsSync2(file))
226
- return;
227
- try {
228
- JSON.parse(readFileSync(file, "utf8"));
229
- return;
230
- } catch (error) {
231
- return `${file} is not valid JSON \u2014 ${String(error)}`;
232
- }
233
- }
234
- static #parse(workspaceRoot) {
235
- const file = McpServerConfig.file(workspaceRoot);
236
- const empty = { file, key: "mcpServers", map: {} };
237
- if (!existsSync2(file))
238
- return empty;
239
- try {
240
- const parsed = JSON.parse(readFileSync(file, "utf8"));
241
- if (parsed.servers && !parsed.mcpServers)
242
- return { file, key: "servers", map: parsed.servers };
243
- return { ...empty, map: parsed.mcpServers ?? {} };
244
- } catch {
245
- return empty;
246
- }
247
- }
248
- }
249
-
250
- export { SubagentPool2, akanCodePaths2, McpServerConfig };
@@ -1,28 +0,0 @@
1
- # Scalar Abstract
2
-
3
- ## Purpose
4
-
5
- Describe the embedded value object or reusable data concept this scalar owns.
6
-
7
- ## Domain Rules
8
-
9
- - Keep durable validation and meaning rules here.
10
- - Avoid repeating field types that are already clear in the constant file.
11
-
12
- ## Data Meaning
13
-
14
- Explain the meaning of the scalar fields and when this scalar should be used.
15
-
16
- ## Workflows
17
-
18
- Describe lifecycle or normalization behavior when relevant.
19
-
20
- ## Agent Notes
21
-
22
- - Read this abstract before changing the scalar.
23
- - Update this file when validation meaning, public behavior, or reuse rules change.
24
- - Do not update this file for formatting-only, import-only, or style-only changes.
25
-
26
- ## Related Modules
27
-
28
- - None yet.
@@ -1,28 +0,0 @@
1
- # Module Abstract
2
-
3
- ## Purpose
4
-
5
- Describe the business concept this module owns.
6
-
7
- ## Domain Rules
8
-
9
- - Keep durable business invariants here.
10
- - Avoid repeating field types that are already clear in the constant file.
11
-
12
- ## Data Meaning
13
-
14
- Explain the meaning of important data only when the code does not make the intent obvious.
15
-
16
- ## Workflows
17
-
18
- Describe create, update, approval, deletion, state transition, or other business flows.
19
-
20
- ## Agent Notes
21
-
22
- - Read this abstract before changing the module.
23
- - Update this file when business invariants, workflows, or public behavior change.
24
- - Do not update this file for formatting-only, import-only, or style-only changes.
25
-
26
- ## Related Modules
27
-
28
- - None yet.
@@ -1,28 +0,0 @@
1
- # Service Abstract
2
-
3
- ## Purpose
4
-
5
- Describe the business workflow or integration this service owns.
6
-
7
- ## Domain Rules
8
-
9
- - Keep durable business invariants here.
10
- - Avoid repeating implementation details already clear in the service or signal files.
11
-
12
- ## Data Meaning
13
-
14
- Explain important input, output, and state meanings only when the code does not make the intent obvious.
15
-
16
- ## Workflows
17
-
18
- Describe the service workflows, background jobs, external calls, or state transitions.
19
-
20
- ## Agent Notes
21
-
22
- - Read this abstract before changing the service module.
23
- - Keep business behavior in service code and expose callable actions through signals.
24
- - Update this file when business invariants, workflows, or public behavior change.
25
-
26
- ## Related Modules
27
-
28
- - None yet.