@runcore-sh/runcore 0.3.1 → 0.4.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 (523) hide show
  1. package/README.md +19 -19
  2. package/brain-template/agents/README.md +20 -0
  3. package/brain-template/identity/README.md +20 -0
  4. package/brain-template/identity/brand.md +25 -0
  5. package/brain-template/identity/principles.md +21 -0
  6. package/brain-template/identity/tone-of-voice.md +23 -0
  7. package/brain-template/knowledge/notes/tier-gated-ui-spec.md +1 -1
  8. package/brain-template/metrics/README.md +13 -0
  9. package/brain-template/operations/goals.yaml +12 -0
  10. package/brain-template/operations/todos.md +17 -0
  11. package/brain-template/ops/README.md +13 -0
  12. package/brain-template/scheduling/README.md +2 -2
  13. package/brain-template/skills/README.md +23 -0
  14. package/brain-template/templates/README.md +9 -0
  15. package/brain-template/training/README.md +20 -0
  16. package/dictionary.json +2 -2
  17. package/dist/activity/log.d.ts +3 -0
  18. package/dist/activity/log.d.ts.map +1 -1
  19. package/dist/activity/log.js +12 -0
  20. package/dist/activity/log.js.map +1 -1
  21. package/dist/agents/autonomous.js +1 -0
  22. package/dist/agents/autonomous.js.map +1 -1
  23. package/dist/agents/commit.d.ts.map +1 -1
  24. package/dist/agents/commit.js +3 -10
  25. package/dist/agents/commit.js.map +1 -1
  26. package/dist/agents/dedup-guard.d.ts.map +1 -1
  27. package/dist/agents/dedup-guard.js +26 -23
  28. package/dist/agents/dedup-guard.js.map +1 -1
  29. package/dist/agents/feed.d.ts +69 -0
  30. package/dist/agents/feed.d.ts.map +1 -0
  31. package/dist/agents/feed.js +176 -0
  32. package/dist/agents/feed.js.map +1 -0
  33. package/dist/agents/governance.d.ts +14 -0
  34. package/dist/agents/governance.d.ts.map +1 -1
  35. package/dist/agents/governance.js +73 -1
  36. package/dist/agents/governance.js.map +1 -1
  37. package/dist/agents/governed-spawn.d.ts +12 -0
  38. package/dist/agents/governed-spawn.d.ts.map +1 -1
  39. package/dist/agents/governed-spawn.js +8 -2
  40. package/dist/agents/governed-spawn.js.map +1 -1
  41. package/dist/agents/index.d.ts +2 -0
  42. package/dist/agents/index.d.ts.map +1 -1
  43. package/dist/agents/index.js +1 -0
  44. package/dist/agents/index.js.map +1 -1
  45. package/dist/agents/issue-reporter.d.ts +15 -0
  46. package/dist/agents/issue-reporter.d.ts.map +1 -0
  47. package/dist/agents/issue-reporter.js +123 -0
  48. package/dist/agents/issue-reporter.js.map +1 -0
  49. package/dist/agents/issues.d.ts +33 -0
  50. package/dist/agents/issues.d.ts.map +1 -0
  51. package/dist/agents/issues.js +141 -0
  52. package/dist/agents/issues.js.map +1 -0
  53. package/dist/agents/reflection.js +3 -3
  54. package/dist/agents/reflection.js.map +1 -1
  55. package/dist/agents/runtime/driver.d.ts.map +1 -1
  56. package/dist/agents/runtime/driver.js +1 -2
  57. package/dist/agents/runtime/driver.js.map +1 -1
  58. package/dist/agents/runtime/manager.d.ts.map +1 -1
  59. package/dist/agents/runtime/manager.js +1 -0
  60. package/dist/agents/runtime/manager.js.map +1 -1
  61. package/dist/agents/runtime/types.d.ts +2 -0
  62. package/dist/agents/runtime/types.d.ts.map +1 -1
  63. package/dist/agents/spawn.d.ts.map +1 -1
  64. package/dist/agents/spawn.js +20 -26
  65. package/dist/agents/spawn.js.map +1 -1
  66. package/dist/agents/store.d.ts.map +1 -1
  67. package/dist/agents/store.js +34 -1
  68. package/dist/agents/store.js.map +1 -1
  69. package/dist/agents/types.d.ts +27 -0
  70. package/dist/agents/types.d.ts.map +1 -1
  71. package/dist/auth/identity.d.ts +3 -0
  72. package/dist/auth/identity.d.ts.map +1 -1
  73. package/dist/auth/identity.js +9 -1
  74. package/dist/auth/identity.js.map +1 -1
  75. package/dist/auth/middleware.d.ts.map +1 -1
  76. package/dist/auth/middleware.js +4 -0
  77. package/dist/auth/middleware.js.map +1 -1
  78. package/dist/calibration/conversation.d.ts +46 -0
  79. package/dist/calibration/conversation.d.ts.map +1 -0
  80. package/dist/calibration/conversation.js +295 -0
  81. package/dist/calibration/conversation.js.map +1 -0
  82. package/dist/calibration/index.d.ts +5 -0
  83. package/dist/calibration/index.d.ts.map +1 -0
  84. package/dist/calibration/index.js +5 -0
  85. package/dist/calibration/index.js.map +1 -0
  86. package/dist/calibration/runner.d.ts +127 -0
  87. package/dist/calibration/runner.d.ts.map +1 -0
  88. package/dist/calibration/runner.js +307 -0
  89. package/dist/calibration/runner.js.map +1 -0
  90. package/dist/calibration/store.d.ts +49 -0
  91. package/dist/calibration/store.d.ts.map +1 -0
  92. package/dist/calibration/store.js +140 -0
  93. package/dist/calibration/store.js.map +1 -0
  94. package/dist/calibration/types.d.ts +93 -0
  95. package/dist/calibration/types.d.ts.map +1 -0
  96. package/dist/calibration/types.js +53 -0
  97. package/dist/calibration/types.js.map +1 -0
  98. package/dist/cli.d.ts +1 -1
  99. package/dist/cli.js +17 -2
  100. package/dist/cli.js.map +1 -1
  101. package/dist/config/index.d.ts +5 -0
  102. package/dist/config/index.d.ts.map +1 -0
  103. package/dist/config/index.js +3 -0
  104. package/dist/config/index.js.map +1 -0
  105. package/dist/config/loader.d.ts +28 -0
  106. package/dist/config/loader.d.ts.map +1 -0
  107. package/dist/config/loader.js +181 -0
  108. package/dist/config/loader.js.map +1 -0
  109. package/dist/config/schema.d.ts +76 -0
  110. package/dist/config/schema.d.ts.map +1 -0
  111. package/dist/config/schema.js +93 -0
  112. package/dist/config/schema.js.map +1 -0
  113. package/dist/dictionary/challenge.d.ts +66 -0
  114. package/dist/dictionary/challenge.d.ts.map +1 -0
  115. package/dist/dictionary/challenge.js +145 -0
  116. package/dist/dictionary/challenge.js.map +1 -0
  117. package/dist/dictionary/client.d.ts +32 -0
  118. package/dist/dictionary/client.d.ts.map +1 -0
  119. package/dist/dictionary/client.js +139 -0
  120. package/dist/dictionary/client.js.map +1 -0
  121. package/dist/dictionary/compatibility.d.ts +8 -0
  122. package/dist/dictionary/compatibility.d.ts.map +1 -0
  123. package/dist/dictionary/compatibility.js +56 -0
  124. package/dist/dictionary/compatibility.js.map +1 -0
  125. package/dist/dictionary/index.d.ts +22 -0
  126. package/dist/dictionary/index.d.ts.map +1 -0
  127. package/dist/dictionary/index.js +15 -0
  128. package/dist/dictionary/index.js.map +1 -0
  129. package/dist/dictionary/matcher.d.ts +18 -0
  130. package/dist/dictionary/matcher.d.ts.map +1 -0
  131. package/dist/dictionary/matcher.js +98 -0
  132. package/dist/dictionary/matcher.js.map +1 -0
  133. package/dist/dictionary/publisher.d.ts +17 -0
  134. package/dist/dictionary/publisher.d.ts.map +1 -0
  135. package/dist/dictionary/publisher.js +156 -0
  136. package/dist/dictionary/publisher.js.map +1 -0
  137. package/dist/dictionary/sync.d.ts +28 -0
  138. package/dist/dictionary/sync.d.ts.map +1 -0
  139. package/dist/dictionary/sync.js +268 -0
  140. package/dist/dictionary/sync.js.map +1 -0
  141. package/dist/dictionary/types.d.ts +75 -0
  142. package/dist/dictionary/types.d.ts.map +1 -0
  143. package/dist/dictionary/types.js +8 -0
  144. package/dist/dictionary/types.js.map +1 -0
  145. package/dist/dictionary/updater.d.ts +23 -0
  146. package/dist/dictionary/updater.d.ts.map +1 -0
  147. package/dist/dictionary/updater.js +84 -0
  148. package/dist/dictionary/updater.js.map +1 -0
  149. package/dist/dictionary/versioning.d.ts +15 -0
  150. package/dist/dictionary/versioning.d.ts.map +1 -0
  151. package/dist/dictionary/versioning.js +52 -0
  152. package/dist/dictionary/versioning.js.map +1 -0
  153. package/dist/errors.d.ts +36 -0
  154. package/dist/errors.d.ts.map +1 -0
  155. package/dist/errors.js +66 -0
  156. package/dist/errors.js.map +1 -0
  157. package/dist/events/event-bus.d.ts +37 -0
  158. package/dist/events/event-bus.d.ts.map +1 -0
  159. package/dist/events/event-bus.js +261 -0
  160. package/dist/events/event-bus.js.map +1 -0
  161. package/dist/events/index.d.ts +3 -0
  162. package/dist/events/index.d.ts.map +1 -0
  163. package/dist/events/index.js +2 -0
  164. package/dist/events/index.js.map +1 -0
  165. package/dist/events/types.d.ts +71 -0
  166. package/dist/events/types.d.ts.map +1 -0
  167. package/dist/events/types.js +7 -0
  168. package/dist/events/types.js.map +1 -0
  169. package/dist/feed/client.d.ts +34 -0
  170. package/dist/feed/client.d.ts.map +1 -0
  171. package/dist/feed/client.js +206 -0
  172. package/dist/feed/client.js.map +1 -0
  173. package/dist/feed/index.d.ts +61 -0
  174. package/dist/feed/index.d.ts.map +1 -0
  175. package/dist/feed/index.js +115 -0
  176. package/dist/feed/index.js.map +1 -0
  177. package/dist/feed/metrics.d.ts +51 -0
  178. package/dist/feed/metrics.d.ts.map +1 -0
  179. package/dist/feed/metrics.js +84 -0
  180. package/dist/feed/metrics.js.map +1 -0
  181. package/dist/feed/mixer.d.ts +89 -0
  182. package/dist/feed/mixer.d.ts.map +1 -0
  183. package/dist/feed/mixer.js +230 -0
  184. package/dist/feed/mixer.js.map +1 -0
  185. package/dist/feed/tiers.d.ts +15 -0
  186. package/dist/feed/tiers.d.ts.map +1 -0
  187. package/dist/feed/tiers.js +75 -0
  188. package/dist/feed/tiers.js.map +1 -0
  189. package/dist/feed/types.d.ts +76 -0
  190. package/dist/feed/types.d.ts.map +1 -0
  191. package/dist/feed/types.js +6 -0
  192. package/dist/feed/types.js.map +1 -0
  193. package/dist/files/registry.d.ts +77 -0
  194. package/dist/files/registry.d.ts.map +1 -0
  195. package/dist/files/registry.js +222 -0
  196. package/dist/files/registry.js.map +1 -0
  197. package/dist/google/plugin.d.ts +17 -0
  198. package/dist/google/plugin.d.ts.map +1 -0
  199. package/dist/google/plugin.js +169 -0
  200. package/dist/google/plugin.js.map +1 -0
  201. package/dist/health/checker.d.ts.map +1 -1
  202. package/dist/health/checker.js +14 -4
  203. package/dist/health/checker.js.map +1 -1
  204. package/dist/health/checks/openrouter.js +1 -1
  205. package/dist/health/checks/openrouter.js.map +1 -1
  206. package/dist/health/checks.d.ts +1 -1
  207. package/dist/health/checks.d.ts.map +1 -1
  208. package/dist/health/checks.js +9 -3
  209. package/dist/health/checks.js.map +1 -1
  210. package/dist/ledger/distance.d.ts +19 -0
  211. package/dist/ledger/distance.d.ts.map +1 -0
  212. package/dist/ledger/distance.js +70 -0
  213. package/dist/ledger/distance.js.map +1 -0
  214. package/dist/ledger/index.d.ts +8 -0
  215. package/dist/ledger/index.d.ts.map +1 -0
  216. package/dist/ledger/index.js +7 -0
  217. package/dist/ledger/index.js.map +1 -0
  218. package/dist/ledger/store.d.ts +27 -0
  219. package/dist/ledger/store.d.ts.map +1 -0
  220. package/dist/ledger/store.js +123 -0
  221. package/dist/ledger/store.js.map +1 -0
  222. package/dist/ledger/types.d.ts +109 -0
  223. package/dist/ledger/types.d.ts.map +1 -0
  224. package/dist/ledger/types.js +57 -0
  225. package/dist/ledger/types.js.map +1 -0
  226. package/dist/literacy.d.ts +50 -0
  227. package/dist/literacy.d.ts.map +1 -0
  228. package/dist/literacy.js +141 -0
  229. package/dist/literacy.js.map +1 -0
  230. package/dist/llm/complete.d.ts.map +1 -1
  231. package/dist/llm/complete.js +36 -3
  232. package/dist/llm/complete.js.map +1 -1
  233. package/dist/llm/fetch-guard.d.ts.map +1 -1
  234. package/dist/llm/fetch-guard.js +2 -0
  235. package/dist/llm/fetch-guard.js.map +1 -1
  236. package/dist/llm/membrane.d.ts +5 -0
  237. package/dist/llm/membrane.d.ts.map +1 -1
  238. package/dist/llm/membrane.js +48 -8
  239. package/dist/llm/membrane.js.map +1 -1
  240. package/dist/llm/nlp-detect.d.ts +17 -0
  241. package/dist/llm/nlp-detect.d.ts.map +1 -0
  242. package/dist/llm/nlp-detect.js +45 -0
  243. package/dist/llm/nlp-detect.js.map +1 -0
  244. package/dist/llm/ollama.d.ts +5 -0
  245. package/dist/llm/ollama.d.ts.map +1 -1
  246. package/dist/llm/ollama.js +39 -1
  247. package/dist/llm/ollama.js.map +1 -1
  248. package/dist/llm/openrouter.d.ts.map +1 -1
  249. package/dist/llm/openrouter.js +17 -1
  250. package/dist/llm/openrouter.js.map +1 -1
  251. package/dist/llm/providers/ollama.d.ts +7 -2
  252. package/dist/llm/providers/ollama.d.ts.map +1 -1
  253. package/dist/llm/providers/ollama.js +109 -17
  254. package/dist/llm/providers/ollama.js.map +1 -1
  255. package/dist/llm/providers/openrouter.js +1 -1
  256. package/dist/llm/providers/openrouter.js.map +1 -1
  257. package/dist/llm/sensitive-registry.d.ts +6 -0
  258. package/dist/llm/sensitive-registry.d.ts.map +1 -1
  259. package/dist/llm/sensitive-registry.js +60 -1
  260. package/dist/llm/sensitive-registry.js.map +1 -1
  261. package/dist/mcp-server.js +25 -18
  262. package/dist/mcp-server.js.map +1 -1
  263. package/dist/metrics/collector.d.ts +6 -0
  264. package/dist/metrics/collector.d.ts.map +1 -1
  265. package/dist/metrics/collector.js +150 -0
  266. package/dist/metrics/collector.js.map +1 -1
  267. package/dist/metrics/types.d.ts +1 -1
  268. package/dist/metrics/types.d.ts.map +1 -1
  269. package/dist/middleware/error-handler.d.ts +13 -0
  270. package/dist/middleware/error-handler.d.ts.map +1 -0
  271. package/dist/middleware/error-handler.js +71 -0
  272. package/dist/middleware/error-handler.js.map +1 -0
  273. package/dist/notifications/channels/adapter.d.ts +28 -0
  274. package/dist/notifications/channels/adapter.d.ts.map +1 -0
  275. package/dist/notifications/channels/adapter.js +55 -0
  276. package/dist/notifications/channels/adapter.js.map +1 -0
  277. package/dist/notifications/channels/index.d.ts +6 -0
  278. package/dist/notifications/channels/index.d.ts.map +1 -0
  279. package/dist/notifications/channels/index.js +6 -0
  280. package/dist/notifications/channels/index.js.map +1 -0
  281. package/dist/notifications/channels/log.d.ts +15 -0
  282. package/dist/notifications/channels/log.d.ts.map +1 -0
  283. package/dist/notifications/channels/log.js +29 -0
  284. package/dist/notifications/channels/log.js.map +1 -0
  285. package/dist/notifications/engine.d.ts +37 -0
  286. package/dist/notifications/engine.d.ts.map +1 -0
  287. package/dist/notifications/engine.js +198 -0
  288. package/dist/notifications/engine.js.map +1 -0
  289. package/dist/notifications/index.d.ts +12 -3
  290. package/dist/notifications/index.d.ts.map +1 -1
  291. package/dist/notifications/index.js +15 -3
  292. package/dist/notifications/index.js.map +1 -1
  293. package/dist/notifications/types.d.ts +97 -0
  294. package/dist/notifications/types.d.ts.map +1 -0
  295. package/dist/notifications/types.js +14 -0
  296. package/dist/notifications/types.js.map +1 -0
  297. package/dist/onboarding/bootstrap.d.ts +51 -0
  298. package/dist/onboarding/bootstrap.d.ts.map +1 -0
  299. package/dist/onboarding/bootstrap.js +92 -0
  300. package/dist/onboarding/bootstrap.js.map +1 -0
  301. package/dist/onboarding/conversation.d.ts +131 -0
  302. package/dist/onboarding/conversation.d.ts.map +1 -0
  303. package/dist/onboarding/conversation.js +259 -0
  304. package/dist/onboarding/conversation.js.map +1 -0
  305. package/dist/onboarding/flow.d.ts +63 -0
  306. package/dist/onboarding/flow.d.ts.map +1 -0
  307. package/dist/onboarding/flow.js +287 -0
  308. package/dist/onboarding/flow.js.map +1 -0
  309. package/dist/onboarding/index.d.ts +17 -0
  310. package/dist/onboarding/index.d.ts.map +1 -0
  311. package/dist/onboarding/index.js +23 -0
  312. package/dist/onboarding/index.js.map +1 -0
  313. package/dist/onboarding/name-extraction.d.ts +42 -0
  314. package/dist/onboarding/name-extraction.d.ts.map +1 -0
  315. package/dist/onboarding/name-extraction.js +164 -0
  316. package/dist/onboarding/name-extraction.js.map +1 -0
  317. package/dist/onboarding/nerve-link.d.ts +23 -0
  318. package/dist/onboarding/nerve-link.d.ts.map +1 -0
  319. package/dist/onboarding/nerve-link.js +24 -0
  320. package/dist/onboarding/nerve-link.js.map +1 -0
  321. package/dist/onboarding/phases.d.ts +66 -0
  322. package/dist/onboarding/phases.d.ts.map +1 -0
  323. package/dist/onboarding/phases.js +167 -0
  324. package/dist/onboarding/phases.js.map +1 -0
  325. package/dist/onboarding/safe-word.d.ts +39 -0
  326. package/dist/onboarding/safe-word.d.ts.map +1 -0
  327. package/dist/onboarding/safe-word.js +90 -0
  328. package/dist/onboarding/safe-word.js.map +1 -0
  329. package/dist/onboarding/types.d.ts +124 -0
  330. package/dist/onboarding/types.d.ts.map +1 -0
  331. package/dist/onboarding/types.js +46 -0
  332. package/dist/onboarding/types.js.map +1 -0
  333. package/dist/openloop/resolution-scanner.d.ts +1 -1
  334. package/dist/openloop/resolution-scanner.d.ts.map +1 -1
  335. package/dist/openloop/resolution-scanner.js +4 -14
  336. package/dist/openloop/resolution-scanner.js.map +1 -1
  337. package/dist/plugins/index.d.ts +24 -0
  338. package/dist/plugins/index.d.ts.map +1 -0
  339. package/dist/plugins/index.js +91 -0
  340. package/dist/plugins/index.js.map +1 -0
  341. package/dist/plugins/status.d.ts +10 -0
  342. package/dist/plugins/status.d.ts.map +1 -0
  343. package/dist/plugins/status.js +12 -0
  344. package/dist/plugins/status.js.map +1 -0
  345. package/dist/posture/index.d.ts +2 -2
  346. package/dist/posture/index.d.ts.map +1 -1
  347. package/dist/posture/index.js +1 -1
  348. package/dist/posture/index.js.map +1 -1
  349. package/dist/posture/types.d.ts +34 -0
  350. package/dist/posture/types.d.ts.map +1 -1
  351. package/dist/posture/types.js +28 -0
  352. package/dist/posture/types.js.map +1 -1
  353. package/dist/pulse/activation-event.d.ts +5 -4
  354. package/dist/pulse/activation-event.d.ts.map +1 -1
  355. package/dist/pulse/activation-event.js +31 -8
  356. package/dist/pulse/activation-event.js.map +1 -1
  357. package/dist/pulse/activation-log.d.ts.map +1 -1
  358. package/dist/pulse/activation-log.js.map +1 -1
  359. package/dist/pulse/index.d.ts +3 -0
  360. package/dist/pulse/index.d.ts.map +1 -1
  361. package/dist/pulse/index.js +4 -0
  362. package/dist/pulse/index.js.map +1 -1
  363. package/dist/pulse/tier.d.ts +67 -0
  364. package/dist/pulse/tier.d.ts.map +1 -0
  365. package/dist/pulse/tier.js +104 -0
  366. package/dist/pulse/tier.js.map +1 -0
  367. package/dist/pulse/work.d.ts +66 -0
  368. package/dist/pulse/work.d.ts.map +1 -0
  369. package/dist/pulse/work.js +117 -0
  370. package/dist/pulse/work.js.map +1 -0
  371. package/dist/runtime-lock.d.ts +51 -0
  372. package/dist/runtime-lock.d.ts.map +1 -0
  373. package/dist/runtime-lock.js +147 -0
  374. package/dist/runtime-lock.js.map +1 -0
  375. package/dist/server.d.ts.map +1 -1
  376. package/dist/server.js +1244 -188
  377. package/dist/server.js.map +1 -1
  378. package/dist/services/whatsapp.js +1 -1
  379. package/dist/services/whatsapp.js.map +1 -1
  380. package/dist/settings.d.ts +15 -0
  381. package/dist/settings.d.ts.map +1 -1
  382. package/dist/settings.js +48 -1
  383. package/dist/settings.js.map +1 -1
  384. package/dist/skills/index.d.ts +2 -2
  385. package/dist/skills/index.d.ts.map +1 -1
  386. package/dist/skills/index.js +2 -2
  387. package/dist/skills/index.js.map +1 -1
  388. package/dist/skills/registry.d.ts +53 -142
  389. package/dist/skills/registry.d.ts.map +1 -1
  390. package/dist/skills/registry.js +249 -611
  391. package/dist/skills/registry.js.map +1 -1
  392. package/dist/stream/emitter.d.ts +36 -0
  393. package/dist/stream/emitter.d.ts.map +1 -0
  394. package/dist/stream/emitter.js +177 -0
  395. package/dist/stream/emitter.js.map +1 -0
  396. package/dist/stream/index.d.ts +4 -0
  397. package/dist/stream/index.d.ts.map +1 -0
  398. package/dist/stream/index.js +3 -0
  399. package/dist/stream/index.js.map +1 -0
  400. package/dist/stream/types.d.ts +100 -0
  401. package/dist/stream/types.d.ts.map +1 -0
  402. package/dist/stream/types.js +19 -0
  403. package/dist/stream/types.js.map +1 -0
  404. package/dist/threads/index.d.ts +3 -0
  405. package/dist/threads/index.d.ts.map +1 -0
  406. package/dist/threads/index.js +2 -0
  407. package/dist/threads/index.js.map +1 -0
  408. package/dist/threads/store.d.ts +36 -0
  409. package/dist/threads/store.d.ts.map +1 -0
  410. package/dist/threads/store.js +171 -0
  411. package/dist/threads/store.js.map +1 -0
  412. package/dist/threads/types.d.ts +16 -0
  413. package/dist/threads/types.d.ts.map +1 -0
  414. package/dist/threads/types.js +6 -0
  415. package/dist/threads/types.js.map +1 -0
  416. package/dist/tick/index.d.ts +10 -0
  417. package/dist/tick/index.d.ts.map +1 -0
  418. package/dist/tick/index.js +8 -0
  419. package/dist/tick/index.js.map +1 -0
  420. package/dist/tick/runner.d.ts +56 -0
  421. package/dist/tick/runner.d.ts.map +1 -0
  422. package/dist/tick/runner.js +235 -0
  423. package/dist/tick/runner.js.map +1 -0
  424. package/dist/tick/types.d.ts +73 -0
  425. package/dist/tick/types.d.ts.map +1 -0
  426. package/dist/tick/types.js +8 -0
  427. package/dist/tick/types.js.map +1 -0
  428. package/dist/tier/types.js +3 -3
  429. package/dist/tier/types.js.map +1 -1
  430. package/dist/ui-sync.d.ts +34 -0
  431. package/dist/ui-sync.d.ts.map +1 -0
  432. package/dist/ui-sync.js +108 -0
  433. package/dist/ui-sync.js.map +1 -0
  434. package/dist/utils/git.d.ts +12 -0
  435. package/dist/utils/git.d.ts.map +1 -0
  436. package/dist/utils/git.js +44 -0
  437. package/dist/utils/git.js.map +1 -0
  438. package/dist/volumes/index.d.ts +3 -0
  439. package/dist/volumes/index.d.ts.map +1 -0
  440. package/dist/volumes/index.js +2 -0
  441. package/dist/volumes/index.js.map +1 -0
  442. package/dist/volumes/manager.d.ts +83 -0
  443. package/dist/volumes/manager.d.ts.map +1 -0
  444. package/dist/volumes/manager.js +462 -0
  445. package/dist/volumes/manager.js.map +1 -0
  446. package/dist/volumes/types.d.ts +66 -0
  447. package/dist/volumes/types.d.ts.map +1 -0
  448. package/dist/volumes/types.js +8 -0
  449. package/dist/volumes/types.js.map +1 -0
  450. package/package.json +8 -5
  451. package/public/avatar/Hey-Dash_en_windows_v4_0_0.zip +0 -0
  452. package/public/avatar/README.md +43 -0
  453. package/public/avatar/cache/06fa55aececcc478.mp4 +0 -0
  454. package/public/avatar/cache/07a65738ba170827.mp4 +0 -0
  455. package/public/avatar/cache/08b6f4880f59a385.mp4 +0 -0
  456. package/public/avatar/cache/0ef9e0e78d715af4.mp4 +0 -0
  457. package/public/avatar/cache/0fa85e9e8f444a8b.mp4 +0 -0
  458. package/public/avatar/cache/1185fd491f413406.mp4 +0 -0
  459. package/public/avatar/cache/1b374d5390258fea.mp4 +0 -0
  460. package/public/avatar/cache/1e2367029b92f8aa.mp4 +0 -0
  461. package/public/avatar/cache/272c004a41087de5.mp4 +0 -0
  462. package/public/avatar/cache/2a0f3ff34d92521a.mp4 +0 -0
  463. package/public/avatar/cache/307a6f70859aeab8.mp4 +0 -0
  464. package/public/avatar/cache/332384e088ca214b.mp4 +0 -0
  465. package/public/avatar/cache/39fc4e81574d14ed.mp4 +0 -0
  466. package/public/avatar/cache/4a5c6051c1ef6a71.mp4 +0 -0
  467. package/public/avatar/cache/51f4aa76398c8c29.mp4 +0 -0
  468. package/public/avatar/cache/5d9a960bbf71732c.mp4 +0 -0
  469. package/public/avatar/cache/5e0954401e15af89.mp4 +0 -0
  470. package/public/avatar/cache/884ae6717fcacdd5.mp4 +0 -0
  471. package/public/avatar/cache/8ea0b7220d139615.mp4 +0 -0
  472. package/public/avatar/cache/9b9c4f7b8508eecc.mp4 +0 -0
  473. package/public/avatar/cache/9be1030ec2aa2b01.mp4 +0 -0
  474. package/public/avatar/cache/b35f7a3d558f22cb.mp4 +0 -0
  475. package/public/avatar/cache/be89f49970672374.mp4 +0 -0
  476. package/public/avatar/cache/c11fdc99479492b6.mp4 +0 -0
  477. package/public/avatar/cache/c900811e3382ac6d.mp4 +0 -0
  478. package/public/avatar/cache/d42a73667acf5716.mp4 +0 -0
  479. package/public/avatar/cache/e539f247a8908603.mp4 +0 -0
  480. package/public/avatar/cache/e78fceae2373b7c1.mp4 +0 -0
  481. package/public/avatar/cache/ec95af57d33b3f07.mp4 +0 -0
  482. package/public/avatar/cache/eeb8d775f40dbe2c.mp4 +0 -0
  483. package/public/avatar/dash_headhshot_v1.png +0 -0
  484. package/public/avatar/idle.mp4 +0 -0
  485. package/public/avatar/photo.png +0 -0
  486. package/public/board.html +6 -0
  487. package/public/browser.html +6 -2
  488. package/public/demo-data/Family Photos/2024/christmas-dinner.txt +13 -0
  489. package/public/demo-data/Family Photos/2025/summer-cookout.txt +13 -0
  490. package/public/demo-data/Financial/Insurance/auto-policy.txt +26 -0
  491. package/public/demo-data/Financial/Insurance/homeowners-policy.txt +20 -0
  492. package/public/demo-data/Financial/Taxes/property-tax-2025.txt +18 -0
  493. package/public/demo-data/Financial/Taxes/w2-2025.txt +18 -0
  494. package/public/demo-data/Health Records/lab-results-2026.txt +26 -0
  495. package/public/demo-data/Health Records/prescription-list.txt +24 -0
  496. package/public/demo-data/Health Records/vaccination-record.csv +8 -0
  497. package/public/demo-data/Legal/Estate/beneficiary-contacts.csv +4 -0
  498. package/public/demo-data/Legal/Estate/will-summary.txt +22 -0
  499. package/public/demo-data/Recipes/christmas-cookies.md +25 -0
  500. package/public/demo-data/Recipes/grandmas-chili.md +30 -0
  501. package/public/demo-data/Work/Contracts/lawn-service-2026.txt +23 -0
  502. package/public/demo-data/Work/Projects/project-status.md +19 -0
  503. package/public/demo-data/passwords.txt +13 -0
  504. package/public/demo-ingest.html +388 -0
  505. package/public/help.html +4 -1
  506. package/public/icon-192.png +0 -0
  507. package/public/icon-512.png +0 -0
  508. package/public/index.html +2641 -574
  509. package/public/library.html +51 -29
  510. package/public/manifest.json +21 -0
  511. package/public/nerve/icon-192.svg +6 -0
  512. package/public/nerve/icon-512.svg +6 -0
  513. package/public/nerve/index.html +698 -0
  514. package/public/nerve/manifest.json +24 -0
  515. package/public/nerve/sw.js +84 -0
  516. package/public/observatory.html +5 -1
  517. package/public/ops.html +33 -3
  518. package/public/pulse.html +3 -0
  519. package/public/registry.html +6 -2
  520. package/public/roadmap.html +7 -2
  521. package/public/sw.js +65 -0
  522. package/brain-template/registry.md +0 -566
  523. package/brain-template/rest_api-integration.md +0 -522
@@ -1,566 +0,0 @@
1
- # Template & Skill Sharing Registry — Design Document
2
-
3
- This document specifies the design for a registry system that enables sharing, discovery, and installation of skills, templates, and brain module extensions between Core instances. It integrates with the existing skills system (`skills/`), brain module structure (`brain/`), and follows established Core patterns: file-backed storage, append-only JSONL, provider abstraction, and progressive disclosure.
4
-
5
- ---
6
-
7
- ## 1. Problem statement
8
-
9
- Today, skills and templates are local to a single Core instance. There is no way to:
10
-
11
- - Publish a skill or template so others can use it.
12
- - Discover community-contributed skills for new task types.
13
- - Install a third-party skill and have it integrate with the existing routing table.
14
- - Version or update skills after installation.
15
- - Validate that a skill is safe and compatible before loading it into context.
16
-
17
- The registry solves these problems while preserving Core's principles: files are the database, context is progressively disclosed, and nothing requires an external API to function locally.
18
-
19
- ---
20
-
21
- ## 2. Concepts
22
-
23
- ### 2.1 Package
24
-
25
- A **package** is the unit of sharing. It wraps one or more related files into a distributable unit.
26
-
27
- ```yaml
28
- # package.yaml — lives at the root of every package
29
- name: "write-blog"
30
- version: "1.2.0"
31
- type: "skill" # skill | template | module-extension
32
- description: "Full workflow to write a long-form blog post."
33
- author: "dash-core"
34
- license: "MIT"
35
- core-compat: ">=0.1.0" # minimum Core version
36
-
37
- # What this package provides
38
- provides:
39
- - kind: skill
40
- path: write-blog.md
41
- slot: task # task | reference
42
- - kind: template
43
- path: templates/blog.md
44
- slot: content
45
-
46
- # What this package requires from the host brain
47
- requires:
48
- modules: ["identity", "content"]
49
- files:
50
- - brain/identity/tone-of-voice.md
51
- - brain/content/CONTENT.md
52
-
53
- # Optional: rules for auto-loading (see §5)
54
- rules:
55
- - trigger: { intent: "write *" }
56
- action: load
57
- priority: 50
58
- ```
59
-
60
- ### 2.2 Registry
61
-
62
- A **registry** is a source of packages. Three tiers, from local to remote:
63
-
64
- | Tier | Name | Location | Requires network |
65
- |------|------|----------|-----------------|
66
- | 0 | Local | `brain/registry/installed/` | No |
67
- | 1 | Workspace | Shared filesystem or Git repo | LAN only |
68
- | 2 | Remote | HTTPS index (static JSON or API) | Yes |
69
-
70
- The runtime queries tiers in order (local first). Offline operation always works because Tier 0 is self-contained.
71
-
72
- ### 2.3 Manifest
73
-
74
- The **registry manifest** is the local index of all known packages (installed and available). Stored as append-only JSONL at `brain/registry/manifest.jsonl`.
75
-
76
- ```jsonl
77
- {"_schema":"registry-manifest","version":"1.0","description":"Append-only index of registry packages."}
78
- {"id":"pkg_write-blog_1.2.0","name":"write-blog","version":"1.2.0","type":"skill","source":"local","state":"installed","installedAt":"2026-02-27T10:00:00Z","checksum":"sha256:abc123...","status":"active"}
79
- {"id":"pkg_log-okr_0.1.0","name":"log-okr","version":"0.1.0","type":"skill","source":"remote:dash-community","state":"available","discoveredAt":"2026-02-27T12:00:00Z","status":"active"}
80
- ```
81
-
82
- Entry states: `available` → `installing` → `installed` → `updating` → `installed` | `uninstalled` (archived).
83
-
84
- State transitions follow the same validation pattern as the agent runtime (`VALID_TRANSITIONS` + `isValidTransition()`).
85
-
86
- ---
87
-
88
- ## 3. File layout
89
-
90
- ```
91
- brain/registry/
92
- ├── manifest.jsonl # Append-only package index
93
- ├── sources.yaml # Configured registry sources (Tier 1 & 2)
94
- └── installed/
95
- ├── write-blog/
96
- │ ├── package.yaml # Package metadata
97
- │ ├── write-blog.md # The skill file
98
- │ └── templates/
99
- │ └── blog.md # Bundled template
100
- └── log-okr/
101
- ├── package.yaml
102
- └── log-okr.md
103
- ```
104
-
105
- `sources.yaml` defines non-local registries:
106
-
107
- ```yaml
108
- sources:
109
- - name: dash-community
110
- type: git
111
- url: https://github.com/dash-brain/community-skills.git
112
- branch: main
113
- path: packages/
114
- - name: team-internal
115
- type: filesystem
116
- path: /mnt/shared/dash-skills/
117
- ```
118
-
119
- ---
120
-
121
- ## 4. Integration with the existing skills system
122
-
123
- The current skills system (`skills/README.md`) is the **primary skill location**. The registry is an additional source, not a replacement. The loader checks both locations.
124
-
125
- ### 4.1 Skill resolution order
126
-
127
- When the agent routes a task (via AGENT.md decision table), the skill loader resolves in this order:
128
-
129
- 1. `skills/` directory (local, hand-authored — always wins)
130
- 2. `brain/registry/installed/` (registry-installed packages)
131
-
132
- If the same `name` exists in both locations, the local `skills/` version takes precedence. This ensures the user can always override a registry skill by placing a file in `skills/`.
133
-
134
- ### 4.2 Routing table extension
135
-
136
- Installed packages can add rows to the decision table. The registry does **not** modify `AGENT.md` directly. Instead, it maintains a supplemental routing file:
137
-
138
- ```
139
- brain/registry/routes.yaml
140
- ```
141
-
142
- ```yaml
143
- # Auto-generated from installed packages. Do not edit manually.
144
- routes:
145
- - intent: "log an OKR"
146
- skill: log-okr
147
- source: registry
148
- steps:
149
- - "Load brain/operations/OPERATIONS.md + goals"
150
- - "Append to brain/operations/okrs.jsonl"
151
- - "Confirm with user"
152
- ```
153
-
154
- The agent reads `AGENT.md` first, then `brain/registry/routes.yaml` for supplemental routes. AGENT.md routes always take priority.
155
-
156
- ### 4.3 Skill format compatibility
157
-
158
- Registry skills use the same format as local skills — YAML frontmatter + Markdown body. No new format is introduced. A registry skill can be "ejected" into `skills/` by copying the `.md` file, with no conversion needed.
159
-
160
- ---
161
-
162
- ## 5. Rules engine synergies
163
-
164
- Core doesn't have a formal rules engine today, but conditional logic is embedded in the goal loop, sync rules, and memory extraction heuristics. The registry introduces a lightweight **rule evaluation layer** that can later generalize into a standalone rules engine.
165
-
166
- ### 5.1 Package rules
167
-
168
- Each package can declare rules in `package.yaml` (see §2.1). Rules follow a `trigger → condition → action` model:
169
-
170
- ```yaml
171
- rules:
172
- - trigger: { intent: "write *" } # Glob match on user intent
173
- condition: { module_loaded: "content" } # Optional guard
174
- action: load # load | suggest | block
175
- priority: 50 # Lower = higher priority
176
- ```
177
-
178
- **Trigger types:**
179
-
180
- | Trigger | Matches on | Example |
181
- |---------|-----------|---------|
182
- | `intent` | User intent string (glob) | `"write *"`, `"log * decision"` |
183
- | `task_type` | Skill slot type | `"writing"`, `"operations"` |
184
- | `file_changed` | Brain file path (glob) | `"brain/operations/goals.yaml"` |
185
- | `schedule` | Cron expression | `"0 9 * * MON"` (Monday 9am) |
186
- | `event` | Runtime event name | `"agent:completed"`, `"sync:done"` |
187
-
188
- **Actions:**
189
-
190
- | Action | Effect |
191
- |--------|--------|
192
- | `load` | Auto-load the skill/template into context |
193
- | `suggest` | Surface a suggestion to the user ("You might want to use X") |
194
- | `block` | Prevent execution if a condition is unmet (e.g., missing dependency) |
195
-
196
- ### 5.2 Rule evaluation
197
-
198
- Rules are evaluated in two phases:
199
-
200
- 1. **Static phase** (at routing time): Check `intent` and `task_type` triggers. This extends the existing "route first" logic in AGENT.md without changing its file.
201
- 2. **Dynamic phase** (at runtime): Check `file_changed`, `schedule`, and `event` triggers. These integrate with the existing goal loop and sync timer infrastructure.
202
-
203
- Rules from all installed packages are merged, sorted by priority, and deduplicated. Conflicts (two rules with the same trigger and different actions) are resolved by:
204
-
205
- 1. Local `skills/` rules always win over registry rules.
206
- 2. Lower `priority` number wins.
207
- 3. If still tied, `block` > `load` > `suggest`.
208
-
209
- ### 5.3 Path to a standalone rules engine
210
-
211
- The rule evaluation logic lives in a single module (`src/registry/rules.ts`). This module is designed so it can later be extracted into a general-purpose `src/rules/engine.ts` that the goal loop, sync system, and memory extractor can also use. The key interface:
212
-
213
- ```typescript
214
- interface Rule {
215
- id: string;
216
- trigger: RuleTrigger;
217
- condition?: RuleCondition;
218
- action: RuleAction;
219
- priority: number;
220
- source: string; // "local" | package name
221
- }
222
-
223
- interface RuleEngine {
224
- evaluate(context: RuleContext): RuleResult[];
225
- register(rules: Rule[]): void;
226
- unregister(source: string): void;
227
- }
228
- ```
229
-
230
- This is intentionally minimal — no RETE algorithm, no forward chaining. Just sorted filter + match, which is sufficient for Core's scale (tens of rules, not thousands).
231
-
232
- ---
233
-
234
- ## 6. TypeScript runtime integration
235
-
236
- ### 6.1 New types (`src/registry/types.ts`)
237
-
238
- ```typescript
239
- export interface PackageMeta {
240
- id: string; // "pkg_{name}_{version}"
241
- name: string;
242
- version: string;
243
- type: "skill" | "template" | "module-extension";
244
- description: string;
245
- author: string;
246
- license: string;
247
- coreCompat: string;
248
- provides: PackageProvide[];
249
- requires: PackageRequires;
250
- rules: PackageRule[];
251
- checksum: string;
252
- }
253
-
254
- export type PackageState =
255
- | "available"
256
- | "installing"
257
- | "installed"
258
- | "updating"
259
- | "uninstalled";
260
-
261
- export interface ManifestEntry {
262
- id: string;
263
- name: string;
264
- version: string;
265
- type: string;
266
- source: string;
267
- state: PackageState;
268
- installedAt?: string;
269
- discoveredAt?: string;
270
- checksum?: string;
271
- status: "active" | "archived";
272
- }
273
-
274
- export interface PackageProvide {
275
- kind: "skill" | "template" | "module-extension";
276
- path: string;
277
- slot: string;
278
- }
279
-
280
- export interface PackageRequires {
281
- modules: string[];
282
- files: string[];
283
- }
284
-
285
- export interface PackageRule {
286
- trigger: Record<string, string>;
287
- condition?: Record<string, string>;
288
- action: "load" | "suggest" | "block";
289
- priority: number;
290
- }
291
- ```
292
-
293
- ### 6.2 RegistryProvider interface (`src/registry/provider.ts`)
294
-
295
- Follows the same abstraction pattern as `BoardProvider`:
296
-
297
- ```typescript
298
- export interface RegistryProvider {
299
- readonly name: string;
300
-
301
- /** Check if this source is reachable. */
302
- isAvailable(): Promise<boolean>;
303
-
304
- /** Search packages by query. */
305
- search(query: string, opts?: {
306
- type?: string;
307
- limit?: number;
308
- }): Promise<PackageMeta[]>;
309
-
310
- /** Fetch full package metadata by name and version. */
311
- getPackage(name: string, version?: string): Promise<PackageMeta | null>;
312
-
313
- /** Download package files to a temp directory. Returns the path. */
314
- download(name: string, version: string): Promise<string | null>;
315
-
316
- /** List all available packages (paginated). */
317
- list(opts?: {
318
- offset?: number;
319
- limit?: number;
320
- type?: string;
321
- }): Promise<PackageMeta[]>;
322
- }
323
- ```
324
-
325
- **Implementations:**
326
-
327
- | Provider | Source | Notes |
328
- |----------|--------|-------|
329
- | `LocalRegistryProvider` | `brain/registry/installed/` | Always available, reads package.yaml files |
330
- | `GitRegistryProvider` | Git repo URL | Clones/pulls on demand, caches locally |
331
- | `HttpRegistryProvider` | HTTPS endpoint | Fetches a static `index.json` or queries an API |
332
-
333
- ### 6.3 RegistryManager (`src/registry/manager.ts`)
334
-
335
- Central orchestrator, analogous to the agent `RuntimeManager`:
336
-
337
- ```typescript
338
- export class RegistryManager {
339
- constructor(
340
- private brainDir: string,
341
- private providers: RegistryProvider[],
342
- ) {}
343
-
344
- /** Initialize manifest, load installed packages. */
345
- async init(): Promise<void>;
346
-
347
- /** Search across all providers. */
348
- async search(query: string): Promise<PackageMeta[]>;
349
-
350
- /** Install a package: download → validate → copy → update manifest. */
351
- async install(name: string, version?: string): Promise<InstallResult>;
352
-
353
- /** Uninstall: archive manifest entry, remove files. */
354
- async uninstall(name: string): Promise<boolean>;
355
-
356
- /** Update a package to a new version. */
357
- async update(name: string): Promise<InstallResult>;
358
-
359
- /** List installed packages. */
360
- listInstalled(): ManifestEntry[];
361
-
362
- /** Get merged rules from all installed packages. */
363
- getRules(): PackageRule[];
364
-
365
- /** Resolve a skill name: check skills/ first, then registry. */
366
- resolveSkill(name: string): string | null; // Returns file path
367
- }
368
- ```
369
-
370
- ### 6.4 Integration points
371
-
372
- | Existing component | Integration |
373
- |-------------------|-------------|
374
- | `Brain.getContextForTurn()` | After standard skill loading, check `RegistryManager.getRules()` for additional auto-load triggers |
375
- | `src/server.ts` | Add `/api/registry/*` routes: search, install, uninstall, list |
376
- | Goal loop (`src/goals/loop.ts`) | Evaluate `schedule` and `event` rule triggers during loop tick |
377
- | Agent runtime | Emit events that rules can trigger on (`agent:completed`, etc.) |
378
- | Context assembler | Registry-loaded skills feed into `instructions` or `supportingContent` sections |
379
-
380
- ---
381
-
382
- ## 7. Installation flow
383
-
384
- ```
385
- User: "install the okr-tracker skill"
386
-
387
- 1. RegistryManager.search("okr-tracker")
388
- → queries providers in tier order (local → workspace → remote)
389
-
390
- 2. User confirms package: okr-tracker v1.0.0 by dash-community
391
- → display: name, description, requires, provides, rules
392
-
393
- 3. RegistryManager.install("okr-tracker", "1.0.0")
394
- a. Download package files to temp dir
395
- b. Validate:
396
- - package.yaml schema check
397
- - checksum verification
398
- - dependency check (required modules exist in brain/)
399
- - no file path collisions with existing skills/
400
- - skill file format valid (YAML frontmatter + Markdown)
401
- c. Copy to brain/registry/installed/okr-tracker/
402
- d. Append to manifest.jsonl (state: "installed")
403
- e. Regenerate brain/registry/routes.yaml from all installed package rules
404
- f. Return InstallResult { ok: true, path, warnings }
405
-
406
- 4. Skill is now available via routing table
407
- → next time user says "log an OKR", it resolves
408
- ```
409
-
410
- ### 7.1 Validation rules
411
-
412
- | Check | Blocks install? | Rationale |
413
- |-------|----------------|-----------|
414
- | Valid `package.yaml` schema | Yes | Prevents corrupt packages |
415
- | Checksum mismatch | Yes | Integrity |
416
- | Missing required brain modules | Yes | Skill would fail at runtime |
417
- | Name collision with `skills/` | No (warn) | Local always takes precedence |
418
- | `core-compat` version mismatch | No (warn) | May still work |
419
- | Skill references non-existent files | No (warn) | User may create them later |
420
-
421
- ---
422
-
423
- ## 8. Security model
424
-
425
- The registry handles untrusted content (community packages). Security is layered:
426
-
427
- ### 8.1 Package integrity
428
-
429
- - Every package has a `checksum` (SHA-256 of the package directory contents).
430
- - Remote registries serve checksums alongside metadata; the installer verifies after download.
431
-
432
- ### 8.2 Sandboxed content
433
-
434
- Skills and templates are **passive Markdown files**. They contain instructions for the agent, not executable code. This is a fundamental security advantage — a malicious skill can only attempt prompt injection, not execute arbitrary code.
435
-
436
- Mitigations for prompt injection:
437
-
438
- - Installed skills are clearly tagged in context as `[registry: package-name]` so the agent (and user) can distinguish them from trusted local skills.
439
- - Skills cannot modify `AGENT.md`, `CLAUDE.md`, or core brain module instruction files.
440
- - Skills cannot write to `brain/memory/` directly — they can only instruct the agent to do so, and the agent follows the existing append-only rules.
441
-
442
- ### 8.3 Permission model
443
-
444
- | Action | Requires |
445
- |--------|----------|
446
- | Install from local/workspace | No confirmation |
447
- | Install from remote | User confirmation (display package metadata first) |
448
- | Install a package with `module-extension` type | Explicit user approval + display of what it modifies |
449
- | Auto-load via rule trigger | Allowed for `installed` packages only |
450
- | `block` action in rules | Only from local `skills/` or explicitly approved packages |
451
-
452
- ### 8.4 Trust levels
453
-
454
- ```yaml
455
- trust:
456
- local: full # skills/ directory — user-authored
457
- installed: standard # brain/registry/installed/ — validated
458
- available: none # not yet installed — display-only
459
- ```
460
-
461
- ---
462
-
463
- ## 9. Publishing flow
464
-
465
- A user publishes a skill by creating a package directory and pushing it to a registry source.
466
-
467
- ### 9.1 Local authoring
468
-
469
- ```
470
- # 1. Author the skill in skills/ as usual
471
- skills/my-new-skill.md
472
-
473
- # 2. Package it
474
- brain/registry/staging/my-new-skill/
475
- ├── package.yaml # Fill in metadata
476
- └── my-new-skill.md # Copy or symlink
477
-
478
- # 3. Validate locally
479
- dash registry validate brain/registry/staging/my-new-skill/
480
-
481
- # 4. Publish to a Git registry
482
- dash registry publish my-new-skill --to dash-community
483
- ```
484
-
485
- ### 9.2 Package validation (pre-publish)
486
-
487
- - `package.yaml` has all required fields.
488
- - All `provides[].path` files exist.
489
- - All `requires.files` are valid brain paths (not absolute or escaping `brain/`).
490
- - No files outside the package directory are referenced by relative path.
491
- - Skill files have valid YAML frontmatter.
492
-
493
- ---
494
-
495
- ## 10. CLI and chat commands
496
-
497
- | Command | Effect |
498
- |---------|--------|
499
- | `dash registry search <query>` | Search all configured sources |
500
- | `dash registry install <name>` | Install a package |
501
- | `dash registry uninstall <name>` | Archive and remove |
502
- | `dash registry update <name>` | Update to latest compatible version |
503
- | `dash registry list` | List installed packages |
504
- | `dash registry validate <path>` | Validate a package directory |
505
- | `dash registry publish <name> --to <source>` | Publish to a registry source |
506
-
507
- These can also be invoked via natural language in chat:
508
-
509
- - "install the okr-tracker skill" → `registry install okr-tracker`
510
- - "what skills are available?" → `registry search *`
511
- - "update all my skills" → `registry update --all`
512
-
513
- ---
514
-
515
- ## 11. AGENT.md decision table addition
516
-
517
- Once the registry is implemented, add this row to AGENT.md:
518
-
519
- | User says / intent | Step 1 | Step 2 | Step 3 |
520
- |-------------------|--------|--------|--------|
521
- | Install / find a skill | Load `brain/registry/manifest.jsonl` | Search configured sources | Install + confirm + regenerate routes |
522
-
523
- ---
524
-
525
- ## 12. Migration path
526
-
527
- ### Phase 1 — Local registry (no network)
528
-
529
- - Create `brain/registry/` directory structure.
530
- - Implement `LocalRegistryProvider` and `RegistryManager`.
531
- - Package the three existing skills (`voice-guide`, `write-blog`, `log-decision`) as registry packages in `brain/registry/installed/`.
532
- - Keep `skills/` as the primary location; registry is additive.
533
- - Add `/api/registry/list` and `/api/registry/installed` routes.
534
-
535
- ### Phase 2 — Git-based sharing
536
-
537
- - Implement `GitRegistryProvider`.
538
- - Add `sources.yaml` configuration.
539
- - Implement `install`, `uninstall`, and `search` commands.
540
- - Add `brain/registry/routes.yaml` generation.
541
- - Manifest JSONL tracking.
542
-
543
- ### Phase 3 — Rules engine extraction
544
-
545
- - Factor out rule evaluation from `src/registry/rules.ts` into `src/rules/engine.ts`.
546
- - Wire the goal loop, sync system, and memory extractor to use the shared rule engine.
547
- - Support `schedule` and `event` triggers.
548
-
549
- ### Phase 4 — Remote registry
550
-
551
- - Implement `HttpRegistryProvider`.
552
- - Add checksum verification, trust levels.
553
- - Publishing flow and validation.
554
- - Community index (static `index.json` hosted on GitHub Pages or similar).
555
-
556
- ---
557
-
558
- ## 13. Design principles
559
-
560
- 1. **Files are the database.** No SQLite, no Redis. Packages are directories, the manifest is JSONL, configuration is YAML.
561
- 2. **Offline first.** Tier 0 (local) always works. Network is optional and additive.
562
- 3. **Skills stay passive.** Registry packages are Markdown instructions, not executable code. The security surface is prompt injection, not code execution.
563
- 4. **Override by proximity.** `skills/` > `brain/registry/installed/` > remote. The user's local files always win.
564
- 5. **Append-only audit trail.** The manifest records every install, update, and removal. History is never lost.
565
- 6. **Progressive disclosure.** The agent loads package metadata first, then package files only when a rule triggers or the user invokes the skill.
566
- 7. **Same format, no lock-in.** Registry skills use the same YAML frontmatter + Markdown format. "Ejecting" a skill from the registry to `skills/` is a file copy.