mia-code 0.2.0 → 0.3.0

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 (410) hide show
  1. package/.miette/260321.md +1 -0
  2. package/.miette/260323.md +9 -0
  3. package/.miette/260331.md +2 -0
  4. package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/2604020008--d3417f2c-df12-4f0f-8a1b-d88e7968f822/d3417f2c-df12-4f0f-8a1b-d88e7968f822.md +63 -0
  5. package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/2604020008--e6c3fc5d-4a70-4523-ba7d-a3250da4c235/e6c3fc5d-4a70-4523-ba7d-a3250da4c235.md +72 -0
  6. package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/2604020008--efeb00a2-b17a-4d32-b1f0-b90c37a8d24e/efeb00a2-b17a-4d32-b1f0-b90c37a8d24e.md +62 -0
  7. package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/83a2d7f9-24a5-4cf4-98d5-036c82f872e8.json +302 -0
  8. package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/83a2d7f9-24a5-4cf4-98d5-036c82f872e8.md +149 -0
  9. package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/AGENTS.md +31 -0
  10. package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/meta-decomposition-3-children.md +67 -0
  11. package/.pde/2604040129--61f9dd4d-7aa6-45e6-a58b-e480b1aa6737/61f9dd4d-7aa6-45e6-a58b-e480b1aa6737--from-mia-openclaw-workspace.md +125 -0
  12. package/.pde/2604040129--61f9dd4d-7aa6-45e6-a58b-e480b1aa6737/STATUS.md +1 -0
  13. package/.pde/4f02ba94-9f52-422e-9389-b16f9b37f358.json +177 -0
  14. package/.pde/4f02ba94-9f52-422e-9389-b16f9b37f358.md +77 -0
  15. package/.pde/6ad9244d-5340-490f-b76c-c86728b9de52.json +222 -0
  16. package/.pde/6ad9244d-5340-490f-b76c-c86728b9de52.md +99 -0
  17. package/.pde/8b566792-ed15-4606-96f9-2b6f593d7e6b.json +111 -0
  18. package/.pde/8b566792-ed15-4606-96f9-2b6f593d7e6b.md +67 -0
  19. package/.pde/c7f1e74b-05a5-40e2-9f01-4cc48d2528f7.json +349 -0
  20. package/.pde/c7f1e74b-05a5-40e2-9f01-4cc48d2528f7.md +147 -0
  21. package/.pde/dfc00a78-1da0-4c09-8a16-c6982644051b.json +118 -0
  22. package/.pde/dfc00a78-1da0-4c09-8a16-c6982644051b.md +64 -0
  23. package/GUILLAUME.md +8 -0
  24. package/KINSHIP.md +9 -0
  25. package/MIA_CODE_ARCHITECTURE_REPORT.md +718 -0
  26. package/contextual_research/260119-MIA-CODE--98090899-8aff-4e11-9dc3-8b99466d1.md +1101 -0
  27. package/contextual_research/MIA.md +38 -0
  28. package/contextual_research/MIAWAPASCONE.md +59 -0
  29. package/contextual_research/MIETTE.md +38 -0
  30. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/2504.00218v2.pdf +7483 -12
  31. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/2505.00212v3.pdf +0 -0
  32. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/CONTENT.md +1014 -0
  33. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/DESIGN.gemini.md +242 -0
  34. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/INDEX.md +45 -0
  35. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/2504.00218v2.md +2025 -0
  36. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/2504.00218v2.pdf +7483 -12
  37. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/2505.00212v3.md +1755 -0
  38. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/2505.00212v3.pdf +0 -0
  39. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_12_decomposed_prompting.pdf +0 -0
  40. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_19_hugginggpt_planning.pdf +0 -0
  41. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_1_coordination_challenges.md +766 -0
  42. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_1_coordination_challenges.pdf +3431 -4
  43. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_28_guardrails_multi_agent.md +260 -0
  44. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_28_guardrails_multi_agent.pdf +0 -0
  45. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_2_navigating_complexity.md +558 -0
  46. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_2_navigating_complexity.pdf +0 -0
  47. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_34_hierarchical_multi_agent.pdf +0 -0
  48. package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_5_open_intent_extraction.pdf +0 -0
  49. package/contextual_research/PODCAST.md +109 -0
  50. package/contextual_research/langchain-principles-roadmap.md +157 -0
  51. package/contextual_research/persona-to-narrative-character-inquiry_260201.md +50 -0
  52. package/dist/cli.js +35 -11
  53. package/dist/geminiHeadless.js +8 -2
  54. package/dist/index.js +2 -1
  55. package/dist/mcp/miaco-server.js +10 -1
  56. package/dist/mcp/miatel-server.js +10 -1
  57. package/dist/mcp/miawa-server.js +10 -1
  58. package/dist/mcp/utils.d.ts +6 -1
  59. package/dist/mcp/utils.js +24 -3
  60. package/dist/sessionStore.d.ts +8 -2
  61. package/dist/sessionStore.js +39 -3
  62. package/dist/types.d.ts +1 -0
  63. package/miaco/README.md +124 -0
  64. package/miaco/dist/commands/chart.d.ts +6 -0
  65. package/miaco/dist/commands/chart.d.ts.map +1 -0
  66. package/miaco/dist/commands/chart.js +222 -0
  67. package/miaco/dist/commands/chart.js.map +1 -0
  68. package/miaco/dist/commands/decompose.d.ts +6 -0
  69. package/miaco/dist/commands/decompose.d.ts.map +1 -0
  70. package/miaco/dist/commands/decompose.js +98 -0
  71. package/miaco/dist/commands/decompose.js.map +1 -0
  72. package/miaco/dist/commands/schema.d.ts +6 -0
  73. package/miaco/dist/commands/schema.d.ts.map +1 -0
  74. package/miaco/dist/commands/schema.js +66 -0
  75. package/miaco/dist/commands/schema.js.map +1 -0
  76. package/miaco/dist/commands/stc.d.ts +11 -0
  77. package/miaco/dist/commands/stc.d.ts.map +1 -0
  78. package/miaco/dist/commands/stc.js +590 -0
  79. package/miaco/dist/commands/stc.js.map +1 -0
  80. package/miaco/dist/commands/trace.d.ts +6 -0
  81. package/miaco/dist/commands/trace.d.ts.map +1 -0
  82. package/miaco/dist/commands/trace.js +83 -0
  83. package/miaco/dist/commands/trace.js.map +1 -0
  84. package/miaco/dist/commands/validate.d.ts +6 -0
  85. package/miaco/dist/commands/validate.d.ts.map +1 -0
  86. package/miaco/dist/commands/validate.js +58 -0
  87. package/miaco/dist/commands/validate.js.map +1 -0
  88. package/miaco/dist/decompose.d.ts +93 -0
  89. package/miaco/dist/decompose.d.ts.map +1 -0
  90. package/miaco/dist/decompose.js +562 -0
  91. package/miaco/dist/decompose.js.map +1 -0
  92. package/miaco/dist/index.d.ts +18 -0
  93. package/miaco/dist/index.d.ts.map +1 -0
  94. package/miaco/dist/index.js +83 -0
  95. package/miaco/dist/index.js.map +1 -0
  96. package/miaco/dist/storage.d.ts +60 -0
  97. package/miaco/dist/storage.d.ts.map +1 -0
  98. package/miaco/dist/storage.js +100 -0
  99. package/miaco/dist/storage.js.map +1 -0
  100. package/miaco/package-lock.json +4103 -0
  101. package/miaco/package.json +40 -0
  102. package/miaco/tsconfig.json +18 -0
  103. package/miaco/version-patch-commit-and-publish.sh +1 -0
  104. package/miatel/MISSION_251231.md +3 -0
  105. package/miatel/README.md +107 -0
  106. package/miatel/dist/commands/analyze.d.ts +6 -0
  107. package/miatel/dist/commands/analyze.d.ts.map +1 -0
  108. package/miatel/dist/commands/analyze.js +100 -0
  109. package/miatel/dist/commands/analyze.js.map +1 -0
  110. package/miatel/dist/commands/arc.d.ts +6 -0
  111. package/miatel/dist/commands/arc.d.ts.map +1 -0
  112. package/miatel/dist/commands/arc.js +71 -0
  113. package/miatel/dist/commands/arc.js.map +1 -0
  114. package/miatel/dist/commands/beat.d.ts +6 -0
  115. package/miatel/dist/commands/beat.d.ts.map +1 -0
  116. package/miatel/dist/commands/beat.js +165 -0
  117. package/miatel/dist/commands/beat.js.map +1 -0
  118. package/miatel/dist/commands/theme.d.ts +6 -0
  119. package/miatel/dist/commands/theme.d.ts.map +1 -0
  120. package/miatel/dist/commands/theme.js +54 -0
  121. package/miatel/dist/commands/theme.js.map +1 -0
  122. package/miatel/dist/index.d.ts +18 -0
  123. package/miatel/dist/index.d.ts.map +1 -0
  124. package/miatel/dist/index.js +80 -0
  125. package/miatel/dist/index.js.map +1 -0
  126. package/miatel/dist/storage.d.ts +55 -0
  127. package/miatel/dist/storage.d.ts.map +1 -0
  128. package/miatel/dist/storage.js +100 -0
  129. package/miatel/dist/storage.js.map +1 -0
  130. package/miatel/package-lock.json +4103 -0
  131. package/miatel/package.json +35 -0
  132. package/miatel/src/commands/analyze.ts +109 -0
  133. package/miatel/src/commands/arc.ts +78 -0
  134. package/miatel/src/commands/beat.ts +176 -0
  135. package/miatel/src/commands/theme.ts +60 -0
  136. package/miatel/src/index.ts +94 -0
  137. package/miatel/src/storage.ts +156 -0
  138. package/miatel/tsconfig.json +18 -0
  139. package/miawa/MISSION_251231.md +144 -0
  140. package/miawa/README.md +133 -0
  141. package/miawa/dist/commands/beat.d.ts +6 -0
  142. package/miawa/dist/commands/beat.d.ts.map +1 -0
  143. package/miawa/dist/commands/beat.js +69 -0
  144. package/miawa/dist/commands/beat.js.map +1 -0
  145. package/miawa/dist/commands/ceremony.d.ts +6 -0
  146. package/miawa/dist/commands/ceremony.d.ts.map +1 -0
  147. package/miawa/dist/commands/ceremony.js +239 -0
  148. package/miawa/dist/commands/ceremony.js.map +1 -0
  149. package/miawa/dist/commands/circle.d.ts +6 -0
  150. package/miawa/dist/commands/circle.d.ts.map +1 -0
  151. package/miawa/dist/commands/circle.js +75 -0
  152. package/miawa/dist/commands/circle.js.map +1 -0
  153. package/miawa/dist/commands/eva.d.ts +6 -0
  154. package/miawa/dist/commands/eva.d.ts.map +1 -0
  155. package/miawa/dist/commands/eva.js +73 -0
  156. package/miawa/dist/commands/eva.js.map +1 -0
  157. package/miawa/dist/commands/wound.d.ts +6 -0
  158. package/miawa/dist/commands/wound.d.ts.map +1 -0
  159. package/miawa/dist/commands/wound.js +74 -0
  160. package/miawa/dist/commands/wound.js.map +1 -0
  161. package/miawa/dist/index.d.ts +19 -0
  162. package/miawa/dist/index.d.ts.map +1 -0
  163. package/miawa/dist/index.js +91 -0
  164. package/miawa/dist/index.js.map +1 -0
  165. package/miawa/dist/storage.d.ts +73 -0
  166. package/miawa/dist/storage.d.ts.map +1 -0
  167. package/miawa/dist/storage.js +100 -0
  168. package/miawa/dist/storage.js.map +1 -0
  169. package/miawa/package-lock.json +4103 -0
  170. package/miawa/package.json +36 -0
  171. package/miawa/src/commands/beat.ts +74 -0
  172. package/miawa/src/commands/ceremony.ts +256 -0
  173. package/miawa/src/commands/circle.ts +83 -0
  174. package/miawa/src/commands/eva.ts +84 -0
  175. package/miawa/src/commands/wound.ts +79 -0
  176. package/miawa/src/index.ts +108 -0
  177. package/miawa/src/storage.ts +179 -0
  178. package/miawa/tsconfig.json +18 -0
  179. package/package.json +7 -5
  180. package/references/acp/CLAUDE.md +7 -0
  181. package/references/acp/agent-plan.md +84 -0
  182. package/references/acp/clients.md +31 -0
  183. package/references/acp/extensibility.md +137 -0
  184. package/references/acp/initialization.md +225 -0
  185. package/references/acp/prompt-turn.md +321 -0
  186. package/references/acp/proxy-chains.md +562 -0
  187. package/references/acp/schema.md +3171 -0
  188. package/references/acp/session-list.md +334 -0
  189. package/references/acp/session-modes.md +170 -0
  190. package/references/acp/slash-commands.md +99 -0
  191. package/references/acp/terminals.md +281 -0
  192. package/references/acp/tool-calls.md +311 -0
  193. package/references/acp/typescript.md +29 -0
  194. package/references/claude/agent-teams.md +399 -0
  195. package/references/claude/chrome.md +231 -0
  196. package/references/claude/headless.md +158 -0
  197. package/references/claude/hooks-guide.md +708 -0
  198. package/references/claude/output-styles.md +112 -0
  199. package/references/claude/plugins.md +432 -0
  200. package/references/claude/skills.md +693 -0
  201. package/references/claude/sub-agents.md +816 -0
  202. package/references/copilot/acp/agents.md +32 -0
  203. package/references/copilot/acp/architecture.md +37 -0
  204. package/references/copilot/acp/clients.md +31 -0
  205. package/references/copilot/acp/introduction.md +42 -0
  206. package/references/copilot/acp/registry.md +339 -0
  207. package/references/copilot/acp-server.md +117 -0
  208. package/references/copilot/create-copilot-instructions.md +840 -0
  209. package/references/langchain/llms.txt +833 -0
  210. package/references/langchain/python/agents.md +677 -0
  211. package/references/langchain/python/context-engineering.md +1195 -0
  212. package/references/langchain/python/human-in-the-loop.md +326 -0
  213. package/references/langchain/python/long-term-memory.md +168 -0
  214. package/references/langchain/python/mcp.md +949 -0
  215. package/references/langchain/python/multi-agents/custom-workflow.md +187 -0
  216. package/references/langchain/python/multi-agents/handoffs.md +436 -0
  217. package/references/langchain/python/multi-agents/overview.md +295 -0
  218. package/references/langchain/python/multi-agents/router.md +150 -0
  219. package/references/langchain/python/multi-agents/skills.md +92 -0
  220. package/references/langchain/python/multi-agents/subagents.md +486 -0
  221. package/references/langchain/python/retrieval.md +320 -0
  222. package/references/langchain/python/runtime.md +141 -0
  223. package/references/langchain/python/short-term-memory.md +658 -0
  224. package/references/langchain/python/structured-output.md +712 -0
  225. package/references/langfuse/llms.txt +148 -0
  226. package/references/langgraph/javascript/llms.txt +275 -0
  227. package/references/skills/home.md +259 -0
  228. package/references/skills/integrate-skills.md +103 -0
  229. package/references/skills/specification.md +254 -0
  230. package/references/skills/what-are-skills.md +74 -0
  231. package/rispecs/README.md +164 -0
  232. package/rispecs/_sync_/miadi-code/SPEC.md +313 -0
  233. package/rispecs/_sync_/miadi-code/STATUS.md +177 -0
  234. package/rispecs/_sync_/miadi-code/dashboard/SPEC.md +465 -0
  235. package/rispecs/_sync_/miadi-code/dashboard/STATUS.md +212 -0
  236. package/rispecs/_sync_/miadi-code/multiline-input/SPEC.md +232 -0
  237. package/rispecs/_sync_/miadi-code/multiline-input/STATUS.md +108 -0
  238. package/rispecs/_sync_/miadi-code/pde/SPEC.md +253 -0
  239. package/rispecs/_sync_/miadi-code/pde/STATUS.md +56 -0
  240. package/rispecs/_sync_/miadi-code/stc/SPEC.md +397 -0
  241. package/rispecs/_sync_/miadi-code/stc/STATUS.md +70 -0
  242. package/rispecs/ava-langstack/inquiry-routing-upgrade.spec.md +119 -0
  243. package/rispecs/borrowed_from_opencode/001-client-server-architecture.rispec.md +98 -0
  244. package/rispecs/borrowed_from_opencode/002-event-bus-system.rispec.md +125 -0
  245. package/rispecs/borrowed_from_opencode/003-instance-state-pattern.rispec.md +136 -0
  246. package/rispecs/borrowed_from_opencode/004-namespace-module-pattern.rispec.md +151 -0
  247. package/rispecs/borrowed_from_opencode/005-zod-schema-validation.rispec.md +139 -0
  248. package/rispecs/borrowed_from_opencode/006-named-error-system.rispec.md +155 -0
  249. package/rispecs/borrowed_from_opencode/007-structured-logging.rispec.md +138 -0
  250. package/rispecs/borrowed_from_opencode/008-lazy-initialization.rispec.md +127 -0
  251. package/rispecs/borrowed_from_opencode/009-multi-agent-system.rispec.md +97 -0
  252. package/rispecs/borrowed_from_opencode/010-agent-definition-config.rispec.md +135 -0
  253. package/rispecs/borrowed_from_opencode/011-agent-permission-rulesets.rispec.md +151 -0
  254. package/rispecs/borrowed_from_opencode/012-agent-prompt-templates.rispec.md +141 -0
  255. package/rispecs/borrowed_from_opencode/013-agent-generation.rispec.md +142 -0
  256. package/rispecs/borrowed_from_opencode/014-plan-build-mode-toggle.rispec.md +155 -0
  257. package/rispecs/borrowed_from_opencode/015-subagent-task-delegation.rispec.md +146 -0
  258. package/rispecs/borrowed_from_opencode/016-agent-model-selection.rispec.md +151 -0
  259. package/rispecs/borrowed_from_opencode/017-compaction-agent.rispec.md +150 -0
  260. package/rispecs/borrowed_from_opencode/018-session-persistence.rispec.md +125 -0
  261. package/rispecs/borrowed_from_opencode/019-session-compaction.rispec.md +132 -0
  262. package/rispecs/borrowed_from_opencode/020-session-forking.rispec.md +134 -0
  263. package/rispecs/borrowed_from_opencode/021-session-revert-snapshot.rispec.md +135 -0
  264. package/rispecs/borrowed_from_opencode/022-session-sharing.rispec.md +165 -0
  265. package/rispecs/borrowed_from_opencode/023-session-summary-diffs.rispec.md +165 -0
  266. package/rispecs/borrowed_from_opencode/024-child-sessions.rispec.md +164 -0
  267. package/rispecs/borrowed_from_opencode/025-session-title-generation.rispec.md +162 -0
  268. package/rispecs/borrowed_from_opencode/026-message-parts-model.rispec.md +201 -0
  269. package/rispecs/borrowed_from_opencode/027-streaming-message-deltas.rispec.md +212 -0
  270. package/rispecs/borrowed_from_opencode/028-multi-provider-architecture.rispec.md +184 -0
  271. package/rispecs/borrowed_from_opencode/029-provider-authentication.rispec.md +225 -0
  272. package/rispecs/borrowed_from_opencode/030-model-registry.rispec.md +222 -0
  273. package/rispecs/borrowed_from_opencode/031-cost-tracking.rispec.md +243 -0
  274. package/rispecs/borrowed_from_opencode/032-provider-transform-pipeline.rispec.md +282 -0
  275. package/rispecs/borrowed_from_opencode/033-provider-sdk-abstraction.rispec.md +338 -0
  276. package/rispecs/borrowed_from_opencode/034-tool-registry.rispec.md +110 -0
  277. package/rispecs/borrowed_from_opencode/035-tool-context-injection.rispec.md +155 -0
  278. package/rispecs/borrowed_from_opencode/036-tool-output-truncation.rispec.md +138 -0
  279. package/rispecs/borrowed_from_opencode/037-batch-tool.rispec.md +129 -0
  280. package/rispecs/borrowed_from_opencode/038-multi-edit-tool.rispec.md +167 -0
  281. package/rispecs/borrowed_from_opencode/039-apply-patch-tool.rispec.md +161 -0
  282. package/rispecs/borrowed_from_opencode/040-code-search-tool.rispec.md +143 -0
  283. package/rispecs/borrowed_from_opencode/041-web-fetch-tool.rispec.md +131 -0
  284. package/rispecs/borrowed_from_opencode/042-web-search-tool.rispec.md +159 -0
  285. package/rispecs/borrowed_from_opencode/043-todo-tool.rispec.md +156 -0
  286. package/rispecs/borrowed_from_opencode/044-plan-mode-tool.rispec.md +139 -0
  287. package/rispecs/borrowed_from_opencode/045-task-tool.rispec.md +146 -0
  288. package/rispecs/borrowed_from_opencode/046-question-tool.rispec.md +170 -0
  289. package/rispecs/borrowed_from_opencode/047-external-directory-tool.rispec.md +166 -0
  290. package/rispecs/borrowed_from_opencode/048-file-read-write-tools.rispec.md +205 -0
  291. package/rispecs/borrowed_from_opencode/049-lsp-server-management.rispec.md +104 -0
  292. package/rispecs/borrowed_from_opencode/050-lsp-hover-completion.rispec.md +102 -0
  293. package/rispecs/borrowed_from_opencode/051-lsp-diagnostics.rispec.md +86 -0
  294. package/rispecs/borrowed_from_opencode/052-lsp-root-detection.rispec.md +109 -0
  295. package/rispecs/borrowed_from_opencode/053-remote-mcp-servers.rispec.md +119 -0
  296. package/rispecs/borrowed_from_opencode/054-mcp-oauth-flow.rispec.md +107 -0
  297. package/rispecs/borrowed_from_opencode/055-mcp-tool-conversion.rispec.md +118 -0
  298. package/rispecs/borrowed_from_opencode/056-mcp-connection-monitoring.rispec.md +106 -0
  299. package/rispecs/borrowed_from_opencode/057-local-mcp-servers.rispec.md +116 -0
  300. package/rispecs/borrowed_from_opencode/058-rich-tui.rispec.md +108 -0
  301. package/rispecs/borrowed_from_opencode/059-streaming-display.rispec.md +116 -0
  302. package/rispecs/borrowed_from_opencode/060-permission-prompts.rispec.md +130 -0
  303. package/rispecs/borrowed_from_opencode/061-session-navigation.rispec.md +155 -0
  304. package/rispecs/borrowed_from_opencode/062-syntax-highlighting.rispec.md +151 -0
  305. package/rispecs/borrowed_from_opencode/063-keybinding-system.rispec.md +181 -0
  306. package/rispecs/borrowed_from_opencode/064-multi-level-config.rispec.md +155 -0
  307. package/rispecs/borrowed_from_opencode/065-jsonc-config.rispec.md +190 -0
  308. package/rispecs/borrowed_from_opencode/066-config-env-variables.rispec.md +153 -0
  309. package/rispecs/borrowed_from_opencode/067-config-deep-merging.rispec.md +178 -0
  310. package/rispecs/borrowed_from_opencode/068-remote-org-config.rispec.md +183 -0
  311. package/rispecs/borrowed_from_opencode/069-config-markdown-frontmatter.rispec.md +206 -0
  312. package/rispecs/borrowed_from_opencode/070-managed-config-directory.rispec.md +232 -0
  313. package/rispecs/borrowed_from_opencode/071-plugin-architecture.rispec.md +104 -0
  314. package/rispecs/borrowed_from_opencode/072-plugin-hooks.rispec.md +123 -0
  315. package/rispecs/borrowed_from_opencode/073-plugin-auto-install.rispec.md +115 -0
  316. package/rispecs/borrowed_from_opencode/074-permission-system.rispec.md +133 -0
  317. package/rispecs/borrowed_from_opencode/075-git-worktree-management.rispec.md +126 -0
  318. package/rispecs/borrowed_from_opencode/076-snapshot-system.rispec.md +124 -0
  319. package/rispecs/borrowed_from_opencode/077-snapshot-diff.rispec.md +117 -0
  320. package/rispecs/borrowed_from_opencode/078-snapshot-restore.rispec.md +128 -0
  321. package/rispecs/borrowed_from_opencode/079-worktree-branch-naming.rispec.md +122 -0
  322. package/rispecs/borrowed_from_opencode/080-sqlite-storage.rispec.md +134 -0
  323. package/rispecs/borrowed_from_opencode/081-database-migrations.rispec.md +148 -0
  324. package/rispecs/borrowed_from_opencode/082-database-transactions.rispec.md +138 -0
  325. package/rispecs/borrowed_from_opencode/083-deferred-effects.rispec.md +148 -0
  326. package/rispecs/borrowed_from_opencode/084-permission-rules.rispec.md +123 -0
  327. package/rispecs/borrowed_from_opencode/085-permission-glob-patterns.rispec.md +113 -0
  328. package/rispecs/borrowed_from_opencode/086-permission-merging.rispec.md +134 -0
  329. package/rispecs/borrowed_from_opencode/087-permission-modes.rispec.md +145 -0
  330. package/rispecs/borrowed_from_opencode/088-http-api-server.rispec.md +165 -0
  331. package/rispecs/borrowed_from_opencode/089-openapi-spec-generation.rispec.md +164 -0
  332. package/rispecs/borrowed_from_opencode/090-websocket-support.rispec.md +136 -0
  333. package/rispecs/borrowed_from_opencode/091-sse-streaming.rispec.md +168 -0
  334. package/rispecs/borrowed_from_opencode/092-mdns-discovery.rispec.md +145 -0
  335. package/rispecs/borrowed_from_opencode/093-javascript-sdk.rispec.md +200 -0
  336. package/rispecs/borrowed_from_opencode/094-skill-system.rispec.md +187 -0
  337. package/rispecs/borrowed_from_opencode/095-skill-discovery.rispec.md +182 -0
  338. package/rispecs/borrowed_from_opencode/096-desktop-remote-driving.rispec.md +175 -0
  339. package/rispecs/borrowed_from_opencode/INDEX.md +255 -0
  340. package/rispecs/core.rispecs.md +261 -0
  341. package/rispecs/engines.rispecs.md +241 -0
  342. package/rispecs/formatting.rispecs.md +252 -0
  343. package/rispecs/living-specifications.rispecs.md +361 -0
  344. package/rispecs/mcp.rispecs.md +197 -0
  345. package/rispecs/pde.rispecs.md +399 -0
  346. package/rispecs/pi-mono-envisionning/ENVISIONING.md +366 -0
  347. package/rispecs/pi-mono-envisionning/storytelling-horizon.rispecs.md +76 -0
  348. package/rispecs/pi-mono-envisionning/widget.rispecs.md +2 -0
  349. package/rispecs/relation-to-mcp-structural-thinking.kin.md +72 -0
  350. package/rispecs/research-for-better-framework/CLAUDE.md +7 -0
  351. package/rispecs/research-for-better-framework/survey-pi-openclaw-opencode-openhands.md +210 -0
  352. package/rispecs/session.rispecs.md +277 -0
  353. package/rispecs/stc.rispecs.md +138 -0
  354. package/rispecs/unifier.rispecs.md +317 -0
  355. package/scripts/LAUNCH--mcp-mia-code--testing--2603141315--ac705a66-2c15-4a1c-a26d-9491018c5ba8.sh +2 -0
  356. package/scripts/RESUME--mia-code--mcps--260313--ac705a66-2c15-4a1c-a26d-9491018c5ba8.sh +1 -0
  357. package/scripts/install-widget-in-home-pi-agent-extensions.sh +4 -0
  358. package/scripts/sample-decompose--2604011535-prompt.sh +1 -0
  359. package/skills/deep-search/AGENTS.md +17 -0
  360. package/skills/deep-search/SKILL.md +281 -0
  361. package/skills/deep-search/agent-templates.md +224 -0
  362. package/skills/deep-search/orchestration-patterns.md +95 -0
  363. package/skills/miaco-pde-inquiry-routing-deep-search/AGENTS.md +13 -0
  364. package/skills/miaco-pde-inquiry-routing-deep-search/SKILL.md +136 -0
  365. package/skills/miaco-pde-inquiry-routing-internal-external-relationship/AGENTS.md +4 -0
  366. package/skills/miaco-pde-inquiry-routing-internal-external-relationship/SKILL.md +157 -0
  367. package/skills/miaco-pde-inquiry-routing-local-qmd/AGENTS.md +42 -0
  368. package/skills/miaco-pde-inquiry-routing-local-qmd/SKILL.md +135 -0
  369. package/skills/qmd/AGENTS.md +3 -0
  370. package/skills/qmd/SKILL.md +144 -0
  371. package/skills/qmd/references/mcp-setup.md +102 -0
  372. package/skills/rise-pde-inquiry-session-multi-agents-v3/SKILL.md +234 -0
  373. package/skills/rise-pde-inquiry-session-multi-agents-v3/agent-templates.md +436 -0
  374. package/skills/rise-pde-inquiry-session-multi-agents-v3/orchestration-patterns.md +197 -0
  375. package/skills/rise-pde-inquiry-session-multi-agents-v3/references/ceremonial-technology.md +102 -0
  376. package/skills/rise-pde-inquiry-session-multi-agents-v3/references/creative-orientation.md +99 -0
  377. package/skills/rise-pde-inquiry-session-multi-agents-v3/references/prompt-decomposition.md +73 -0
  378. package/skills/rise-pde-inquiry-session-multi-agents-v3/references/rise-framework.md +74 -0
  379. package/skills/rise-pde-inquiry-session-multi-agents-v3/references/structural-tension.md +82 -0
  380. package/src/cli.ts +35 -11
  381. package/src/geminiHeadless.ts +7 -2
  382. package/src/index.ts +2 -1
  383. package/src/mcp/miaco-server.ts +13 -1
  384. package/src/mcp/miatel-server.ts +13 -1
  385. package/src/mcp/miawa-server.ts +13 -1
  386. package/src/mcp/utils.ts +41 -8
  387. package/src/sessionStore.ts +44 -4
  388. package/src/types.ts +2 -1
  389. package/widget/mia-ceremony/README.md +36 -0
  390. package/widget/mia-ceremony/index.ts +143 -0
  391. package/widget/mia-interceptor/README.md +39 -0
  392. package/widget/mia-interceptor/index.ts +221 -0
  393. package/widget/mia-tools/README.md +37 -0
  394. package/widget/mia-tools/index.ts +569 -0
  395. package/widget/miette-echo/README.md +44 -0
  396. package/widget/miette-echo/index.ts +164 -0
  397. package/.claude/settings.local.json +0 -9
  398. package/.hch/issue_.env +0 -4
  399. package/.hch/issue_add__2601211715.json +0 -77
  400. package/.hch/issue_add__2601211715.md +0 -4
  401. package/.hch/issue_add__2602242020.json +0 -78
  402. package/.hch/issue_add__2602242020.md +0 -7
  403. package/.hch/issues.json +0 -2312
  404. package/.hch/issues.md +0 -30
  405. package/WS__mia-code__260214__IAIP_PDE.code-workspace +0 -29
  406. package/WS__mia-code__src332__260122.code-workspace +0 -23
  407. package/samples/copilot/session-state/be76abaa-a27f-4725-b2a9-22fb45f7e0f7/checkpoints/index.md +0 -6
  408. package/samples/copilot/session-state/be76abaa-a27f-4725-b2a9-22fb45f7e0f7/events.jsonl +0 -213
  409. package/samples/copilot/session-state/be76abaa-a27f-4725-b2a9-22fb45f7e0f7/plan.md +0 -243
  410. package/samples/copilot/session-state/be76abaa-a27f-4725-b2a9-22fb45f7e0f7/workspace.yaml +0 -5
@@ -0,0 +1,125 @@
1
+ # RISE-002: Event Bus System
2
+
3
+ > RISE Framework Specification — Borrowed from OpenCode for mia-code
4
+ > Document: rispecs/borrowed_from_opencode/002-event-bus-system.rispec.md
5
+
6
+ ## Creative Intent
7
+
8
+ mia-code enables modules to communicate without knowing each other exist. A session module publishes that a session was created; the UI module, the persistence module, and the logging module each react independently. The event bus is the nervous system — it carries signals between organs that never need to touch.
9
+
10
+ ## Structural Tension Analysis
11
+
12
+ **Current Reality:**
13
+ - Modules in mia-code call each other directly: `commands.ts` imports `sessionStore.ts`, calls `formatting.ts`, invokes `geminiHeadless.ts`
14
+ - Adding a new consumer of session events (e.g., analytics, sharing, web UI) requires modifying the producer
15
+ - The unifier in `unifier.ts` is tightly coupled to the agent execution flow — it must be called explicitly after each agent response
16
+ - There is no way for an external plugin or module to observe internal events without code changes
17
+ - Cross-cutting concerns (logging every tool execution, timing every agent call) require threading logic through every call site
18
+
19
+ **Desired State:**
20
+ - Any module can publish a typed event without knowing who listens
21
+ - Any module can subscribe to events without modifying the publisher
22
+ - Events carry structured, validated payloads (via Zod schemas)
23
+ - Events are scoped to an instance (project directory) — events from project A never trigger handlers in project B
24
+ - Subscription cleanup happens automatically when an instance is disposed
25
+ - The event catalog is discoverable: a developer can list all event types and their payload shapes
26
+
27
+ ## Desired Outcome Definition
28
+
29
+ A centralized `Bus` module that provides `publish()` and `subscribe()` functions. Events are defined as typed constants with Zod-validated payloads. The bus is instance-scoped, meaning each project directory gets its own isolated event channel.
30
+
31
+ ## Natural Language Functional Description
32
+
33
+ ### Event Definition
34
+
35
+ Each event type is defined as a constant using a factory function:
36
+
37
+ ```
38
+ BusEvent.define("session.created", z.object({
39
+ sessionId: z.string(),
40
+ projectRoot: z.string(),
41
+ engine: z.enum(["gemini", "claude"]),
42
+ timestamp: z.number()
43
+ }))
44
+ ```
45
+
46
+ This returns an event descriptor object containing the event name string, the Zod schema for its payload, and TypeScript type inference. The descriptor is used for both publishing and subscribing — ensuring type safety at both ends.
47
+
48
+ ### Publishing Events
49
+
50
+ Any module publishes an event by calling:
51
+
52
+ ```
53
+ Bus.publish(Session.Event.Created, {
54
+ sessionId: "abc-123",
55
+ projectRoot: "/home/dev/myproject",
56
+ engine: "gemini",
57
+ timestamp: Date.now()
58
+ })
59
+ ```
60
+
61
+ The bus validates the payload against the event's Zod schema at publish time. If validation fails, it throws a `NamedError("bus.invalid_payload", ...)` with details about which fields failed. In production, invalid payloads are logged and dropped rather than crashing.
62
+
63
+ ### Subscribing to Events
64
+
65
+ Modules subscribe by providing a handler function:
66
+
67
+ ```
68
+ const unsubscribe = Bus.subscribe(Session.Event.Created, (payload) => {
69
+ // payload is fully typed as { sessionId: string, projectRoot: string, ... }
70
+ log.info("session created", { sessionId: payload.sessionId });
71
+ });
72
+ ```
73
+
74
+ The returned `unsubscribe` function removes the handler when called. Handlers execute synchronously in subscription order. If a handler throws, the error is caught and logged — it does not prevent other handlers from running.
75
+
76
+ ### Instance Scoping
77
+
78
+ The bus is scoped to an instance (see RISE-003). When `Bus.publish()` is called, only subscribers within the same instance context receive the event. This prevents a session created in `/project-a` from triggering handlers registered by `/project-b`.
79
+
80
+ Implementation: the bus stores handlers in a `Map<instanceId, Map<eventName, Set<handler>>>`. Instance ID is derived from the project root directory.
81
+
82
+ ### Event Catalog
83
+
84
+ The standard event types for mia-code include:
85
+
86
+ - `session.created` — new session started
87
+ - `session.resumed` — existing session resumed
88
+ - `session.ended` — session explicitly ended
89
+ - `message.sent` — user sent a prompt
90
+ - `message.received` — agent produced a response
91
+ - `message.chunk` — streaming chunk received from agent
92
+ - `tool.started` — agent began executing a tool
93
+ - `tool.completed` — tool execution finished
94
+ - `tool.failed` — tool execution errored
95
+ - `config.changed` — configuration value updated
96
+ - `ceremonial.output` — Mia/Miette interpretation produced
97
+ - `error.occurred` — unhandled error captured
98
+
99
+ Each event lives as a constant in the namespace of its domain module (e.g., `Session.Event.Created`, `Tool.Event.Started`).
100
+
101
+ ### Cleanup
102
+
103
+ When an instance is disposed (project context ends), all subscriptions for that instance are removed. The `Bus.disposeInstance(instanceId)` function clears all handlers for that instance. This prevents memory leaks from accumulated handlers across long-running server processes.
104
+
105
+ ## Supporting Structures
106
+
107
+ - **Instance State (RISE-003)** provides the scoping mechanism — the bus uses instance IDs to isolate events
108
+ - **Namespace Module Pattern (RISE-004)** organizes event constants within domain namespaces
109
+ - **Zod Schema Validation (RISE-005)** validates every event payload at publish time
110
+ - **Named Error System (RISE-006)** provides typed errors for invalid payloads
111
+ - **Structured Logging (RISE-007)** logs event publication and handler errors
112
+
113
+ ## Creative Advancement Scenarios
114
+
115
+ **Scenario 1 — Decoupled Session Persistence:**
116
+ The `sessionStore` module subscribes to `Session.Event.Created`. When a new session starts, the store persists it — without the session creation code ever importing or calling the store. If the store module is removed, sessions still work; they just aren't saved.
117
+
118
+ **Scenario 2 — Real-Time UI Updates:**
119
+ The TUI subscribes to `Message.Event.Chunk`. As streaming chunks arrive from the agent, the UI renders them immediately. The agent execution code in `geminiHeadless.ts` publishes chunks without knowing whether a TUI, a web client, or nothing at all is listening.
120
+
121
+ **Scenario 3 — Metrics Collection:**
122
+ A lightweight metrics module subscribes to `Tool.Event.Completed`. It records tool execution durations, success rates, and frequency. No existing code is modified — the metrics module is a pure subscriber.
123
+
124
+ **Scenario 4 — Plugin System Foundation:**
125
+ A user-authored plugin subscribes to `Message.Event.Received`. After every agent response, the plugin automatically saves a summary to a project journal file. The plugin is loaded dynamically and communicates entirely through the event bus.
@@ -0,0 +1,136 @@
1
+ # RISE-003: Instance State Pattern
2
+
3
+ > RISE Framework Specification — Borrowed from OpenCode for mia-code
4
+ > Document: rispecs/borrowed_from_opencode/003-instance-state-pattern.rispec.md
5
+
6
+ ## Creative Intent
7
+
8
+ mia-code enables clean isolation between project contexts. When a developer works on two projects simultaneously, each project's agent sessions, configuration overrides, tool state, and event subscriptions remain completely separate. The instance state pattern makes "per-project singleton" a first-class primitive — initialize once per directory, share within that directory, clean up when done.
9
+
10
+ ## Structural Tension Analysis
11
+
12
+ **Current Reality:**
13
+ - mia-code uses global singletons: one `~/.mia-code-sessions.json` file, one `~/.mia-code.json` config
14
+ - The `sessionStore.ts` module reads/writes a global file — if two mia-code processes run for different projects, they race on the same file
15
+ - There is no concept of "project scope" for runtime state — all state is either global (config files) or local (function variables)
16
+ - Agent process handles (the spawned Gemini/Claude CLI) are held in closure variables, not in a managed state container
17
+ - Cleanup of resources (killing agent subprocesses, closing file handles) depends on process exit handlers, not structured disposal
18
+
19
+ **Desired State:**
20
+ - Each project directory gets an isolated state container that holds all runtime state for that context
21
+ - State is lazily initialized: the container is created on first access, not at startup
22
+ - State is a singleton per directory: multiple calls to `state()` within the same project return the same instance
23
+ - Disposal runs cleanup functions in reverse initialization order
24
+ - Parallel project operation is safe — project A's state never leaks into project B
25
+ - The pattern is generic: any module can declare its own instance-scoped state
26
+
27
+ ## Desired Outcome Definition
28
+
29
+ A generic `Instance.state<T>(initFn, cleanupFn)` function that returns a lazy accessor. The accessor initializes state on first call, returns the cached value on subsequent calls, and runs cleanup when the instance is disposed.
30
+
31
+ ## Natural Language Functional Description
32
+
33
+ ### State Declaration
34
+
35
+ A module declares instance-scoped state by calling:
36
+
37
+ ```
38
+ const sessionState = Instance.state(
39
+ async () => {
40
+ // init: runs once per project directory
41
+ const store = await loadSessionIndex(projectRoot);
42
+ return { store, activeSessions: new Map() };
43
+ },
44
+ async (state) => {
45
+ // cleanup: runs when instance is disposed
46
+ await saveSessionIndex(state.store);
47
+ for (const session of state.activeSessions.values()) {
48
+ await session.kill();
49
+ }
50
+ }
51
+ );
52
+ ```
53
+
54
+ This returns a `StateAccessor<T>` — a callable that resolves to the state value.
55
+
56
+ ### State Access
57
+
58
+ Any code within the same instance context accesses the state by awaiting the accessor:
59
+
60
+ ```
61
+ const { store, activeSessions } = await sessionState();
62
+ activeSessions.set(id, newSession);
63
+ ```
64
+
65
+ The first call triggers the init function. Subsequent calls return the cached result immediately (resolved promise). The accessor is typed — TypeScript infers the return type from the init function.
66
+
67
+ ### Concurrent First Access
68
+
69
+ If two code paths call `await sessionState()` simultaneously before initialization completes, only one init function executes. The second caller awaits the same initialization promise. This prevents double-initialization bugs.
70
+
71
+ ### Instance Identity
72
+
73
+ The instance is identified by the project root directory (resolved to an absolute path). When `Instance.state()` is called, it captures the current project context from the call stack or an explicit context parameter:
74
+
75
+ ```
76
+ const state = Instance.state(initFn, cleanupFn, { scope: "/home/dev/myproject" });
77
+ ```
78
+
79
+ If no scope is provided, it defaults to `process.cwd()` resolved to the nearest git root (or cwd if no git root exists).
80
+
81
+ ### Instance Lifecycle
82
+
83
+ - **Creation**: Implicit on first `state()` access within a project directory
84
+ - **Active**: State is cached and returned on every subsequent access
85
+ - **Disposal**: Explicit via `Instance.dispose(projectRoot)` or automatic on process exit
86
+
87
+ Disposal runs all cleanup functions registered for that project root, in reverse order of registration (LIFO). After disposal, accessing state for that project root re-triggers initialization (the instance is "reset").
88
+
89
+ ### Multiple State Declarations
90
+
91
+ Different modules declare their own state independently:
92
+
93
+ ```
94
+ // In session module
95
+ const sessionState = Instance.state(async () => ({ sessions: new Map() }));
96
+
97
+ // In config module
98
+ const configState = Instance.state(async () => await loadConfig(projectRoot));
99
+
100
+ // In agent module
101
+ const agentState = Instance.state(async () => ({ processes: [] }), async (s) => {
102
+ for (const p of s.processes) p.kill();
103
+ });
104
+ ```
105
+
106
+ All three are scoped to the same instance (project root) but initialized independently, on demand.
107
+
108
+ ### Instance Registry
109
+
110
+ Internally, a global registry maps project roots to their state containers:
111
+
112
+ ```
113
+ Map<projectRoot, Map<stateKey, { value: T, cleanup: (v: T) => Promise<void> }>>
114
+ ```
115
+
116
+ Each `Instance.state()` call generates a unique `stateKey` (via symbol or auto-incrementing ID) to distinguish different state declarations within the same instance.
117
+
118
+ ## Supporting Structures
119
+
120
+ - **Event Bus (RISE-002)** is instance-scoped — it uses the same project root identity to isolate events
121
+ - **Namespace Module Pattern (RISE-004)** co-locates state declarations with their domain modules
122
+ - **Lazy Initialization (RISE-008)** is the underlying mechanism — `Instance.state()` is a specialized lazy with scope and cleanup
123
+
124
+ ## Creative Advancement Scenarios
125
+
126
+ **Scenario 1 — Multi-Project Server:**
127
+ The mia-code server (RISE-001) handles requests for `/project-a` and `/project-b` simultaneously. Each project's session state, agent processes, and event subscriptions are isolated. A request to `/project-a/sessions` never sees `/project-b`'s sessions.
128
+
129
+ **Scenario 2 — Safe Agent Process Management:**
130
+ The agent module declares instance state that tracks spawned Gemini/Claude CLI processes. When the instance is disposed (server shutdown, project close), the cleanup function kills all agent processes for that project. No orphan processes.
131
+
132
+ **Scenario 3 — Test Isolation:**
133
+ Tests create instances with temporary directories as project roots. Each test gets pristine state. After the test, `Instance.dispose(tempDir)` runs cleanup. Tests run in parallel without interference.
134
+
135
+ **Scenario 4 — Config Hot Reload:**
136
+ When a project's `.mia-code.json` changes, the config module disposes and re-initializes its instance state. The new config is picked up on the next `configState()` access. Other modules' state (sessions, agents) is unaffected.
@@ -0,0 +1,151 @@
1
+ # RISE-004: Namespace Module Pattern
2
+
3
+ > RISE Framework Specification — Borrowed from OpenCode for mia-code
4
+ > Document: rispecs/borrowed_from_opencode/004-namespace-module-pattern.rispec.md
5
+
6
+ ## Creative Intent
7
+
8
+ mia-code enables clean, discoverable module APIs through TypeScript namespaces. Each domain concept — Session, Tool, Config, Permission — is a namespace that co-locates its functions, types, events, and constants. A developer types `Session.` and immediately sees everything the session domain offers: `Session.create()`, `Session.Info`, `Session.Event.Created`. No barrel files, no scattered imports, no guessing where things live.
9
+
10
+ ## Structural Tension Analysis
11
+
12
+ **Current Reality:**
13
+ - mia-code modules export loose functions and types from individual files (`sessionStore.ts` exports `rememberSession`, `findSession`, etc.)
14
+ - Types are defined in a separate `types.ts` file, divorced from the modules that use them
15
+ - There is no single entry point for a domain concept — understanding "sessions" requires reading `sessionStore.ts`, parts of `commands.ts`, parts of `types.ts`, and parts of `cli.ts`
16
+ - Adding a new domain concept (e.g., permissions, tools) means creating multiple files and wiring imports across the codebase
17
+ - IDE autocomplete shows a flat list of imported functions with no grouping by domain
18
+
19
+ **Desired State:**
20
+ - Each domain concept is a TypeScript namespace exported from a single file
21
+ - The namespace contains all public API: functions, types (as Zod schemas with inferred types), events, and constants
22
+ - Internal implementation details are private to the file — not exported from the namespace
23
+ - Consumers import one namespace and access everything through it
24
+ - Adding a new domain means creating one file with one namespace
25
+
26
+ ## Desired Outcome Definition
27
+
28
+ A convention where each major module exports a TypeScript `namespace` containing its complete public API, organized by kind (functions, types, events, constants).
29
+
30
+ ## Natural Language Functional Description
31
+
32
+ ### Namespace Structure
33
+
34
+ Each domain module follows this pattern:
35
+
36
+ ```typescript
37
+ // src/session.ts
38
+ import { z } from "zod";
39
+ import { Bus, BusEvent } from "./bus";
40
+
41
+ // Private implementation
42
+ async function loadFromDisk(path: string) { /* ... */ }
43
+ function generateId(): string { /* ... */ }
44
+
45
+ // Public namespace
46
+ export namespace Session {
47
+ // --- Types (Zod schemas + inferred types) ---
48
+ export const Info = z.object({
49
+ id: z.string(),
50
+ projectRoot: z.string(),
51
+ engine: z.enum(["gemini", "claude"]),
52
+ createdAt: z.number(),
53
+ lastActiveAt: z.number(),
54
+ });
55
+ export type Info = z.infer<typeof Info>;
56
+
57
+ export const CreateInput = z.object({
58
+ projectRoot: z.string(),
59
+ engine: z.enum(["gemini", "claude"]).default("gemini"),
60
+ });
61
+ export type CreateInput = z.infer<typeof CreateInput>;
62
+
63
+ // --- Events ---
64
+ export const Event = {
65
+ Created: BusEvent.define("session.created", Info),
66
+ Resumed: BusEvent.define("session.resumed", Info),
67
+ Ended: BusEvent.define("session.ended", z.object({ id: z.string() })),
68
+ } as const;
69
+
70
+ // --- Functions ---
71
+ export async function create(input: CreateInput): Promise<Info> {
72
+ const validated = CreateInput.parse(input);
73
+ const id = generateId();
74
+ const session: Info = {
75
+ id,
76
+ projectRoot: validated.projectRoot,
77
+ engine: validated.engine,
78
+ createdAt: Date.now(),
79
+ lastActiveAt: Date.now(),
80
+ };
81
+ await loadFromDisk(validated.projectRoot); // private fn
82
+ Bus.publish(Event.Created, session);
83
+ return session;
84
+ }
85
+
86
+ export async function resume(id: string): Promise<Info> { /* ... */ }
87
+ export async function list(): Promise<Info[]> { /* ... */ }
88
+ export async function end(id: string): Promise<void> { /* ... */ }
89
+
90
+ // --- Constants ---
91
+ export const MAX_IDLE_TIME_MS = 30 * 60 * 1000;
92
+ }
93
+ ```
94
+
95
+ ### Consumption Pattern
96
+
97
+ Consumers import the namespace and access everything through it:
98
+
99
+ ```typescript
100
+ import { Session } from "./session";
101
+
102
+ const session = await Session.create({
103
+ projectRoot: "/home/dev/myproject",
104
+ engine: "gemini",
105
+ });
106
+
107
+ // Type usage
108
+ function displaySession(info: Session.Info) {
109
+ console.log(info.id, info.projectRoot);
110
+ }
111
+
112
+ // Event subscription
113
+ Bus.subscribe(Session.Event.Created, (payload) => {
114
+ log.info("new session", { id: payload.id });
115
+ });
116
+
117
+ // Schema validation
118
+ const parsed = Session.Info.parse(untrustedData);
119
+ ```
120
+
121
+ ### Naming Conventions
122
+
123
+ - **Namespace name**: PascalCase singular noun (`Session`, `Tool`, `Config`, `Permission`)
124
+ - **Functions**: camelCase verbs (`create`, `resume`, `list`, `validate`)
125
+ - **Type schemas**: PascalCase nouns (`Info`, `CreateInput`, `ListOutput`)
126
+ - **Event objects**: nested under `Event` constant (`Event.Created`, `Event.Failed`)
127
+ - **Constants**: UPPER_SNAKE_CASE (`MAX_IDLE_TIME_MS`, `DEFAULT_ENGINE`)
128
+
129
+ ### What Lives Outside the Namespace
130
+
131
+ Private implementation functions and third-party imports live outside the namespace at module scope. They are not exported. The namespace is the only export. Exception: cross-cutting utility modules (like `formatting.ts`) may export plain functions. Each namespace lives in one file named after the domain concept (`session.ts`, `tool.ts`, `config.ts`). No barrel files needed.
132
+
133
+ ## Supporting Structures
134
+
135
+ - **Zod Schema Validation (RISE-005)** provides the schema objects that live inside namespaces as types
136
+ - **Event Bus (RISE-002)** provides the event definitions that live inside namespaces under `Event`
137
+ - **Named Error System (RISE-006)** provides error types that can be co-located in namespaces
138
+
139
+ ## Creative Advancement Scenarios
140
+
141
+ **Scenario 1 — IDE Discovery:**
142
+ A new contributor types `Session.` in their editor. Autocomplete shows: `create`, `resume`, `list`, `end`, `Info`, `CreateInput`, `Event`, `MAX_IDLE_TIME_MS`. They understand the entire session API without reading documentation.
143
+
144
+ **Scenario 2 — Adding a New Domain:**
145
+ To add a "Permission" domain, a developer creates `src/permission.ts`, defines `export namespace Permission { ... }` with types, events, and functions. No barrel file updates, no scattered type definitions, no import rewiring. The domain is self-contained.
146
+
147
+ **Scenario 3 — Refactoring Without Breaking:**
148
+ Renaming an internal helper function inside `session.ts` (outside the namespace) requires zero changes to consumers. The namespace boundary protects the public API from implementation changes.
149
+
150
+ **Scenario 4 — Type and Validator Colocation:**
151
+ When adding a new field to `Session.Info`, the developer updates the Zod schema in one place. The TypeScript type updates automatically via `z.infer`. Runtime validation updates automatically because the schema IS the validator. One change, three effects.
@@ -0,0 +1,139 @@
1
+ # RISE-005: Zod Schema Validation
2
+
3
+ > RISE Framework Specification — Borrowed from OpenCode for mia-code
4
+ > Document: rispecs/borrowed_from_opencode/005-zod-schema-validation.rispec.md
5
+
6
+ ## Creative Intent
7
+
8
+ mia-code enables a single source of truth for every data shape in the system. A Zod schema defines a session object once — TypeScript infers the static type, runtime validation catches malformed data at boundaries, and API documentation generates automatically. No more drift between what the type says, what the validator checks, and what the docs describe. The schema is the contract.
9
+
10
+ ## Structural Tension Analysis
11
+
12
+ **Current Reality:**
13
+ - Data shapes in mia-code are defined as TypeScript interfaces in `types.ts` — they exist only at compile time and vanish at runtime
14
+ - The `~/.mia-code-sessions.json` file is read with `JSON.parse()` and cast to a type — if the file is corrupted or has unexpected fields, the error surfaces far from the parse site
15
+ - Configuration from `~/.mia-code.json` is loaded with no validation — missing fields cause undefined access errors deep in business logic
16
+ - Agent CLI output is parsed with ad-hoc string matching — there is no schema for what a valid agent event looks like
17
+ - API inputs (when RISE-001 adds the HTTP server) have no validation layer — any JSON is accepted and trusted
18
+
19
+ **Desired State:**
20
+ - Every data structure has a Zod schema that serves as type definition, runtime validator, and documentation source
21
+ - Data is validated at system boundaries: file I/O, user input, API requests, agent output parsing
22
+ - Invalid data is caught early with clear, actionable error messages
23
+ - TypeScript types are derived from schemas — never manually duplicated
24
+ - Schemas compose naturally — a `Session.Info` schema reuses `Config.Engine` schema
25
+ - Adding a field to a schema automatically updates the type, the validator, and the API docs
26
+
27
+ ## Desired Outcome Definition
28
+
29
+ All data models, configuration structures, API inputs/outputs, event payloads, and tool parameters are defined as Zod schemas. Types are inferred. Validation happens at every boundary.
30
+
31
+ ## Natural Language Functional Description
32
+
33
+ ### Schema Definition Pattern
34
+
35
+ Every data structure is defined schema-first:
36
+
37
+ ```typescript
38
+ import { z } from "zod";
39
+
40
+ export const SessionInfo = z.object({
41
+ id: z.string().uuid(),
42
+ projectRoot: z.string().min(1),
43
+ engine: z.enum(["gemini", "claude"]),
44
+ createdAt: z.number().int().positive(),
45
+ lastActiveAt: z.number().int().positive(),
46
+ messageCount: z.number().int().nonneg().default(0),
47
+ });
48
+
49
+ export type SessionInfo = z.infer<typeof SessionInfo>;
50
+ ```
51
+
52
+ The `z.infer<typeof SessionInfo>` extracts the TypeScript type automatically. The schema and the type share the same name — TypeScript's declaration merging allows a value and a type with the same name to coexist.
53
+
54
+ ### Boundary Validation
55
+
56
+ Validation occurs at every point where data enters or leaves the system:
57
+
58
+ **File I/O boundary:**
59
+ ```typescript
60
+ async function loadSessions(path: string): Promise<SessionIndex> {
61
+ const raw = JSON.parse(await readFile(path, "utf-8"));
62
+ return SessionIndex.parse(raw); // throws ZodError if invalid
63
+ }
64
+ ```
65
+
66
+ **API request boundary:**
67
+ ```typescript
68
+ app.post("/sessions", (req, res) => {
69
+ const input = Session.CreateInput.safeParse(req.body);
70
+ if (!input.success) {
71
+ return res.status(400).json({ error: input.error.format() });
72
+ }
73
+ // input.data is fully typed and validated
74
+ });
75
+ ```
76
+
77
+ **Configuration boundary:**
78
+ ```typescript
79
+ const ConfigSchema = z.object({
80
+ defaultEngine: z.enum(["gemini", "claude"]).default("gemini"),
81
+ unifierEnabled: z.boolean().default(true),
82
+ maxSessionAge: z.number().positive().default(86400),
83
+ geminiModel: z.string().default("gemini-2.5-pro"),
84
+ claudeModel: z.string().default("claude-sonnet-4-20250514"),
85
+ });
86
+
87
+ function loadConfig(path: string): Config {
88
+ const raw = existsSync(path) ? JSON.parse(readFileSync(path, "utf-8")) : {};
89
+ return ConfigSchema.parse(raw); // defaults fill in missing fields
90
+ }
91
+ ```
92
+
93
+ **Agent output boundary:**
94
+ ```typescript
95
+ const AgentEvent = z.discriminatedUnion("type", [
96
+ z.object({ type: z.literal("text"), content: z.string() }),
97
+ z.object({ type: z.literal("tool_use"), name: z.string(), input: z.record(z.unknown()) }),
98
+ z.object({ type: z.literal("error"), message: z.string() }),
99
+ ]);
100
+ ```
101
+
102
+ ### Schema Composition
103
+
104
+ Schemas compose by reference — define `const Engine = z.enum(["gemini", "claude"])` once, reuse in `SessionInfo`, `ConfigSchema`, and anywhere else. Changes propagate automatically.
105
+
106
+ ### Custom Error Messages
107
+
108
+ User-facing schemas include helpful error messages: `.min(1, "Prompt cannot be empty")`, `.uuid("Invalid session ID format")`. These surface directly in API error responses and CLI output.
109
+ ```
110
+
111
+ ### Safe vs. Strict Parsing
112
+
113
+ - `Schema.parse(data)` — throws `ZodError` on failure. Use at internal boundaries where invalid data is a bug.
114
+ - `Schema.safeParse(data)` — returns `{ success, data, error }`. Use at external boundaries (API, file I/O) where invalid data is expected and must be handled gracefully.
115
+
116
+ ### Schema as Documentation
117
+
118
+ Schemas generate JSON Schema via `zodToJsonSchema(SessionInfo)` for OpenAPI/Swagger docs. The event bus (RISE-002) uses Zod schemas to validate every event payload at publish time.
119
+
120
+ ## Supporting Structures
121
+
122
+ - **Event Bus (RISE-002)** validates event payloads using Zod schemas
123
+ - **Namespace Module Pattern (RISE-004)** co-locates schemas inside domain namespaces
124
+ - **Named Error System (RISE-006)** wraps ZodErrors into NamedErrors for consistent error handling
125
+ - **Client-Server Architecture (RISE-001)** uses schemas for API request/response validation
126
+
127
+ ## Creative Advancement Scenarios
128
+
129
+ **Scenario 1 — Corrupted Session File:**
130
+ A user manually edits `~/.mia-code-sessions.json` and introduces a typo in a session ID field. On next load, `SessionIndex.parse()` throws a clear error: `"sessions.0.id: Expected string matching UUID format, received '123'"`. The user knows exactly what to fix.
131
+
132
+ **Scenario 2 — Config Migration:**
133
+ A new version of mia-code adds a `maxSessionAge` config field with a default. Existing users' config files lack this field. `ConfigSchema.parse()` fills in the default automatically — no migration script needed.
134
+
135
+ **Scenario 3 — API Input Validation:**
136
+ A client sends `POST /sessions` with `{ "engine": "gpt4" }`. The schema rejects it: `"engine: Expected 'gemini' | 'claude', received 'gpt4'"`. The API returns a 400 with a structured error. No unvalidated data reaches business logic.
137
+
138
+ **Scenario 4 — Agent Output Parsing:**
139
+ The Gemini CLI emits a JSON event with an unexpected structure. The `AgentEvent` discriminated union rejects it cleanly. The agent module logs the raw event for debugging and skips it, rather than crashing on an undefined property access.