blacksmith-organization-system 1.0.0-dev.3 → 1.2.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 (491) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +77 -70
  3. package/dist/bridges/git.d.ts +9 -0
  4. package/dist/bridges/git.js +30 -0
  5. package/dist/bridges/git.js.map +1 -0
  6. package/dist/bridges/github.d.ts +28 -0
  7. package/dist/bridges/github.js +71 -0
  8. package/dist/bridges/github.js.map +1 -0
  9. package/dist/cli.d.ts +2 -0
  10. package/dist/cli.js +53 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/core/context.d.ts +18 -0
  13. package/dist/core/context.js +14 -0
  14. package/dist/core/context.js.map +1 -0
  15. package/dist/core/element.d.ts +49 -0
  16. package/dist/core/element.js +97 -0
  17. package/dist/core/element.js.map +1 -0
  18. package/dist/core/host.d.ts +32 -0
  19. package/dist/core/host.js +5 -0
  20. package/dist/core/host.js.map +1 -0
  21. package/dist/core/paths.d.ts +5 -0
  22. package/dist/core/paths.js +42 -0
  23. package/dist/core/paths.js.map +1 -0
  24. package/dist/core/procedure.d.ts +11 -0
  25. package/dist/core/procedure.js +24 -0
  26. package/dist/core/procedure.js.map +1 -0
  27. package/dist/core/tool.d.ts +33 -0
  28. package/dist/core/tool.js +44 -0
  29. package/dist/core/tool.js.map +1 -0
  30. package/dist/core/version.d.ts +6 -0
  31. package/dist/core/version.js +37 -0
  32. package/dist/core/version.js.map +1 -0
  33. package/dist/hosts/node.d.ts +21 -0
  34. package/dist/hosts/node.js +76 -0
  35. package/dist/hosts/node.js.map +1 -0
  36. package/dist/hosts/watch-tree.d.ts +8 -0
  37. package/dist/hosts/watch-tree.js +86 -0
  38. package/dist/hosts/watch-tree.js.map +1 -0
  39. package/dist/index.d.ts +14 -0
  40. package/dist/index.js +18 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/main.d.ts +55 -0
  43. package/dist/main.js +99 -0
  44. package/dist/main.js.map +1 -0
  45. package/dist/models/_index.d.ts +20 -0
  46. package/dist/models/_index.js +22 -0
  47. package/dist/models/_index.js.map +1 -0
  48. package/dist/models/archive/class.d.ts +5 -0
  49. package/dist/models/archive/class.js +7 -0
  50. package/dist/models/archive/class.js.map +1 -0
  51. package/dist/models/authors/entry.d.ts +20 -0
  52. package/dist/models/authors/entry.js +73 -0
  53. package/dist/models/authors/entry.js.map +1 -0
  54. package/dist/models/authors/file.d.ts +9 -0
  55. package/dist/models/authors/file.js +19 -0
  56. package/dist/models/authors/file.js.map +1 -0
  57. package/dist/models/craftbook/class.d.ts +10 -0
  58. package/dist/models/craftbook/class.js +13 -0
  59. package/dist/models/craftbook/class.js.map +1 -0
  60. package/dist/models/devarmory/class.d.ts +11 -0
  61. package/dist/models/devarmory/class.js +8 -0
  62. package/dist/models/devarmory/class.js.map +1 -0
  63. package/dist/models/devlog/class.d.ts +19 -0
  64. package/dist/models/devlog/class.js +61 -0
  65. package/dist/models/devlog/class.js.map +1 -0
  66. package/dist/models/forge/class.d.ts +9 -0
  67. package/dist/models/forge/class.js +24 -0
  68. package/dist/models/forge/class.js.map +1 -0
  69. package/dist/models/loop/class.d.ts +16 -0
  70. package/dist/models/loop/class.js +56 -0
  71. package/dist/models/loop/class.js.map +1 -0
  72. package/dist/models/loop/data.d.ts +12 -0
  73. package/dist/models/loop/data.js +20 -0
  74. package/dist/models/loop/data.js.map +1 -0
  75. package/dist/models/loop/load.d.ts +5 -0
  76. package/dist/models/loop/load.js +14 -0
  77. package/dist/models/loop/load.js.map +1 -0
  78. package/dist/models/project/anatomy.d.ts +2 -0
  79. package/dist/models/project/anatomy.js +15 -0
  80. package/dist/models/project/anatomy.js.map +1 -0
  81. package/dist/models/project/around.d.ts +3 -0
  82. package/dist/models/project/around.js +13 -0
  83. package/dist/models/project/around.js.map +1 -0
  84. package/dist/models/project/class.d.ts +21 -0
  85. package/dist/models/project/class.js +23 -0
  86. package/dist/models/project/class.js.map +1 -0
  87. package/dist/models/project/git.d.ts +8 -0
  88. package/dist/models/project/git.js +26 -0
  89. package/dist/models/project/git.js.map +1 -0
  90. package/dist/models/project/version.d.ts +6 -0
  91. package/dist/models/project/version.js +23 -0
  92. package/dist/models/project/version.js.map +1 -0
  93. package/dist/models/scope/class.d.ts +21 -0
  94. package/dist/models/scope/class.js +49 -0
  95. package/dist/models/scope/class.js.map +1 -0
  96. package/dist/models/settings/data.d.ts +12 -0
  97. package/dist/models/settings/data.js +9 -0
  98. package/dist/models/settings/data.js.map +1 -0
  99. package/dist/models/settings/load.d.ts +9 -0
  100. package/dist/models/settings/load.js +32 -0
  101. package/dist/models/settings/load.js.map +1 -0
  102. package/dist/models/system/class.d.ts +16 -0
  103. package/dist/models/system/class.js +21 -0
  104. package/dist/models/system/class.js.map +1 -0
  105. package/dist/models/system/parts.d.ts +21 -0
  106. package/dist/models/system/parts.js +22 -0
  107. package/dist/models/system/parts.js.map +1 -0
  108. package/dist/models/system/storylines.d.ts +39 -0
  109. package/dist/models/system/storylines.js +42 -0
  110. package/dist/models/system/storylines.js.map +1 -0
  111. package/dist/models/workshop/class.d.ts +20 -0
  112. package/dist/models/workshop/class.js +43 -0
  113. package/dist/models/workshop/class.js.map +1 -0
  114. package/dist/models/workshop/locate.d.ts +16 -0
  115. package/dist/models/workshop/locate.js +54 -0
  116. package/dist/models/workshop/locate.js.map +1 -0
  117. package/dist/procedures/_index.d.ts +8 -0
  118. package/dist/procedures/_index.js +11 -0
  119. package/dist/procedures/_index.js.map +1 -0
  120. package/dist/procedures/automerging/_index.d.ts +4 -0
  121. package/dist/procedures/automerging/_index.js +8 -0
  122. package/dist/procedures/automerging/_index.js.map +1 -0
  123. package/dist/procedures/automerging/context.d.ts +11 -0
  124. package/dist/procedures/automerging/context.js +2 -0
  125. package/dist/procedures/automerging/context.js.map +1 -0
  126. package/dist/procedures/automerging/steps.d.ts +4 -0
  127. package/dist/procedures/automerging/steps.js +34 -0
  128. package/dist/procedures/automerging/steps.js.map +1 -0
  129. package/dist/procedures/bootstrapping/_index.d.ts +4 -0
  130. package/dist/procedures/bootstrapping/_index.js +8 -0
  131. package/dist/procedures/bootstrapping/_index.js.map +1 -0
  132. package/dist/procedures/bootstrapping/context.d.ts +5 -0
  133. package/dist/procedures/bootstrapping/context.js +2 -0
  134. package/dist/procedures/bootstrapping/context.js.map +1 -0
  135. package/dist/procedures/bootstrapping/ensure-tree.d.ts +2 -0
  136. package/dist/procedures/bootstrapping/ensure-tree.js +5 -0
  137. package/dist/procedures/bootstrapping/ensure-tree.js.map +1 -0
  138. package/dist/procedures/bootstrapping/record.d.ts +2 -0
  139. package/dist/procedures/bootstrapping/record.js +12 -0
  140. package/dist/procedures/bootstrapping/record.js.map +1 -0
  141. package/dist/procedures/bumping/_index.d.ts +4 -0
  142. package/dist/procedures/bumping/_index.js +9 -0
  143. package/dist/procedures/bumping/_index.js.map +1 -0
  144. package/dist/procedures/bumping/context.d.ts +18 -0
  145. package/dist/procedures/bumping/context.js +4 -0
  146. package/dist/procedures/bumping/context.js.map +1 -0
  147. package/dist/procedures/bumping/steps.d.ts +4 -0
  148. package/dist/procedures/bumping/steps.js +50 -0
  149. package/dist/procedures/bumping/steps.js.map +1 -0
  150. package/dist/procedures/crediting/_index.d.ts +4 -0
  151. package/dist/procedures/crediting/_index.js +9 -0
  152. package/dist/procedures/crediting/_index.js.map +1 -0
  153. package/dist/procedures/crediting/context.d.ts +17 -0
  154. package/dist/procedures/crediting/context.js +4 -0
  155. package/dist/procedures/crediting/context.js.map +1 -0
  156. package/dist/procedures/crediting/steps.d.ts +4 -0
  157. package/dist/procedures/crediting/steps.js +51 -0
  158. package/dist/procedures/crediting/steps.js.map +1 -0
  159. package/dist/procedures/inspecting/_index.d.ts +4 -0
  160. package/dist/procedures/inspecting/_index.js +11 -0
  161. package/dist/procedures/inspecting/_index.js.map +1 -0
  162. package/dist/procedures/inspecting/judge.d.ts +2 -0
  163. package/dist/procedures/inspecting/judge.js +6 -0
  164. package/dist/procedures/inspecting/judge.js.map +1 -0
  165. package/dist/procedures/inspecting/read-areas.d.ts +2 -0
  166. package/dist/procedures/inspecting/read-areas.js +5 -0
  167. package/dist/procedures/inspecting/read-areas.js.map +1 -0
  168. package/dist/procedures/inspecting/read-forge.d.ts +2 -0
  169. package/dist/procedures/inspecting/read-forge.js +14 -0
  170. package/dist/procedures/inspecting/read-forge.js.map +1 -0
  171. package/dist/procedures/inspecting/report.d.ts +32 -0
  172. package/dist/procedures/inspecting/report.js +11 -0
  173. package/dist/procedures/inspecting/report.js.map +1 -0
  174. package/dist/procedures/inspecting/rules.d.ts +12 -0
  175. package/dist/procedures/inspecting/rules.js +75 -0
  176. package/dist/procedures/inspecting/rules.js.map +1 -0
  177. package/dist/procedures/proposing/_index.d.ts +4 -0
  178. package/dist/procedures/proposing/_index.js +9 -0
  179. package/dist/procedures/proposing/_index.js.map +1 -0
  180. package/dist/procedures/proposing/context.d.ts +16 -0
  181. package/dist/procedures/proposing/context.js +4 -0
  182. package/dist/procedures/proposing/context.js.map +1 -0
  183. package/dist/procedures/proposing/steps.d.ts +4 -0
  184. package/dist/procedures/proposing/steps.js +46 -0
  185. package/dist/procedures/proposing/steps.js.map +1 -0
  186. package/dist/procedures/versioning/_index.d.ts +16 -0
  187. package/dist/procedures/versioning/_index.js +22 -0
  188. package/dist/procedures/versioning/_index.js.map +1 -0
  189. package/dist/procedures/watching/_index.d.ts +5 -0
  190. package/dist/procedures/watching/_index.js +9 -0
  191. package/dist/procedures/watching/_index.js.map +1 -0
  192. package/dist/procedures/watching/classify.d.ts +5 -0
  193. package/dist/procedures/watching/classify.js +30 -0
  194. package/dist/procedures/watching/classify.js.map +1 -0
  195. package/dist/procedures/watching/context.d.ts +21 -0
  196. package/dist/procedures/watching/context.js +2 -0
  197. package/dist/procedures/watching/context.js.map +1 -0
  198. package/dist/procedures/watching/start.d.ts +2 -0
  199. package/dist/procedures/watching/start.js +24 -0
  200. package/dist/procedures/watching/start.js.map +1 -0
  201. package/dist/procedures/watching/wait.d.ts +2 -0
  202. package/dist/procedures/watching/wait.js +12 -0
  203. package/dist/procedures/watching/wait.js.map +1 -0
  204. package/dist/tools/_index.d.ts +3 -0
  205. package/dist/tools/_index.js +25 -0
  206. package/dist/tools/_index.js.map +1 -0
  207. package/dist/tools/devlog.d.ts +1 -0
  208. package/dist/tools/devlog.js +43 -0
  209. package/dist/tools/devlog.js.map +1 -0
  210. package/dist/tools/flow.d.ts +1 -0
  211. package/dist/tools/flow.js +81 -0
  212. package/dist/tools/flow.js.map +1 -0
  213. package/dist/tools/project.d.ts +1 -0
  214. package/dist/tools/project.js +18 -0
  215. package/dist/tools/project.js.map +1 -0
  216. package/dist/tools/scope.d.ts +1 -0
  217. package/dist/tools/scope.js +51 -0
  218. package/dist/tools/scope.js.map +1 -0
  219. package/dist/tools/version.d.ts +1 -0
  220. package/dist/tools/version.js +23 -0
  221. package/dist/tools/version.js.map +1 -0
  222. package/dist/tools/workshop.d.ts +1 -0
  223. package/dist/tools/workshop.js +56 -0
  224. package/dist/tools/workshop.js.map +1 -0
  225. package/dist/views/devlog.d.ts +15 -0
  226. package/dist/views/devlog.js +31 -0
  227. package/dist/views/devlog.js.map +1 -0
  228. package/dist/views/event.d.ts +2 -0
  229. package/dist/views/event.js +6 -0
  230. package/dist/views/event.js.map +1 -0
  231. package/dist/views/flow.d.ts +12 -0
  232. package/dist/views/flow.js +26 -0
  233. package/dist/views/flow.js.map +1 -0
  234. package/dist/views/help.d.ts +2 -0
  235. package/dist/views/help.js +22 -0
  236. package/dist/views/help.js.map +1 -0
  237. package/dist/views/project.d.ts +2 -0
  238. package/dist/views/project.js +11 -0
  239. package/dist/views/project.js.map +1 -0
  240. package/dist/views/status.d.ts +5 -0
  241. package/dist/views/status.js +50 -0
  242. package/dist/views/status.js.map +1 -0
  243. package/package.json +31 -54
  244. package/resources/cli-art/big-logo-title.txt +24 -0
  245. package/resources/cli-art/big-shortcut-logo-title.txt +10 -0
  246. package/resources/cli-art/medium-logo-title.txt +13 -0
  247. package/resources/cli-art/minimenu-header.ptxml +13 -0
  248. package/resources/cli-art/minimenu-header.txt +11 -0
  249. package/resources/cli-art/small-logo-title.txt +10 -0
  250. package/resources/cli-art/wellcome.txt +10 -0
  251. package/resources/docs-templates/Home.md +7 -0
  252. package/resources/docs-templates/README.md +14 -0
  253. package/resources/docs-templates/_Footer.md +1 -0
  254. package/resources/docs-templates/_Sidebar.md +7 -0
  255. package/.claude-plugin/marketplace.json +0 -17
  256. package/.claude-plugin/mcp.json +0 -8
  257. package/.claude-plugin/plugin.json +0 -16
  258. package/AGENTS.md +0 -114
  259. package/CLAUDE.md +0 -1
  260. package/bin/bos +0 -3
  261. package/hooks/hooks.json +0 -40
  262. package/resources/house/HOUSE.md +0 -22
  263. package/resources/house/bloodlines.json +0 -35
  264. package/resources/house/children/deepseeks-of-anubis.json +0 -4
  265. package/resources/house/children/eon.json +0 -7
  266. package/resources/house/children/hermetic-officer.json +0 -1
  267. package/resources/house/children/ifrit.json +0 -1
  268. package/resources/house/children/license-keepers.json +0 -4
  269. package/resources/house/children/sebas.json +0 -10
  270. package/resources/house/children/shakespeare.json +0 -10
  271. package/resources/house/orders/ravensarmy.json +0 -6
  272. package/resources/house/orders/seiaic-ucdi.json +0 -5
  273. package/resources/ravens/skryba.md +0 -19
  274. package/resources/workshop-root/AGENTS.md +0 -92
  275. package/resources/workshop-root/CLAUDE.md +0 -1
  276. package/resources/workshop.default.json +0 -6
  277. package/skills/bos-archive/SKILL.md +0 -28
  278. package/skills/bos-craftbook/SKILL.md +0 -32
  279. package/skills/bos-craftset/SKILL.md +0 -36
  280. package/skills/bos-devarmory/SKILL.md +0 -34
  281. package/skills/bos-exhibit/SKILL.md +0 -28
  282. package/skills/bos-forge/SKILL.md +0 -28
  283. package/skills/bos-house/SKILL.md +0 -52
  284. package/skills/bos-project/SKILL.md +0 -27
  285. package/skills/bos-sarcophag/SKILL.md +0 -26
  286. package/skills/bos-scope/SKILL.md +0 -33
  287. package/skills/bos-sheme/SKILL.md +0 -38
  288. package/skills/bos-throwbox/SKILL.md +0 -27
  289. package/skills/bos-workshop/SKILL.md +0 -65
  290. package/skills/bos-workshop/assets/.gitkeep +0 -0
  291. package/skills/bos-workshop/references/bos-codebase.md +0 -116
  292. package/skills/bos-workshop/references/bos-concept.md +0 -121
  293. package/skills/bos-workshop/scripts/find-workshop.sh +0 -30
  294. package/src/agent-hook.mjs +0 -28
  295. package/src/bridge/_index.mjs +0 -24
  296. package/src/bridge/bos-instances-link/_index.mjs +0 -18
  297. package/src/bridge/docker-host/_index.mjs +0 -43
  298. package/src/bridge/docker-host/container.mjs +0 -32
  299. package/src/bridge/docker-host/image.mjs +0 -23
  300. package/src/bridge/docker-host/volume.mjs +0 -12
  301. package/src/bridge/docker-publish/_index.mjs +0 -24
  302. package/src/bridge/git-client/_index.mjs +0 -121
  303. package/src/bridge/git-client/author.mjs +0 -26
  304. package/src/bridge/gitea-api/_index.mjs +0 -62
  305. package/src/bridge/github-api/_index.mjs +0 -45
  306. package/src/bridge/npm-publish/_index.mjs +0 -19
  307. package/src/bridge/ollama-link/_index.mjs +0 -93
  308. package/src/bridge/ollama-link/ravens.mjs +0 -29
  309. package/src/bridge/ssh-link/_index.mjs +0 -33
  310. package/src/bridge/subprocess-runner/_index.mjs +0 -33
  311. package/src/cli.mjs +0 -29
  312. package/src/commands/_index.mjs +0 -51
  313. package/src/commands/bootstrap/exec.mjs +0 -7
  314. package/src/commands/bootstrap/help.md +0 -5
  315. package/src/commands/bootstrap/index.json +0 -7
  316. package/src/commands/close/exec.mjs +0 -4
  317. package/src/commands/close/help.md +0 -5
  318. package/src/commands/close/index.json +0 -7
  319. package/src/commands/describe/exec.mjs +0 -11
  320. package/src/commands/describe/help.md +0 -5
  321. package/src/commands/describe/index.json +0 -7
  322. package/src/commands/help/exec.mjs +0 -6
  323. package/src/commands/help/help.md +0 -3
  324. package/src/commands/help/index.json +0 -6
  325. package/src/commands/hook/exec.mjs +0 -3
  326. package/src/commands/hook/help.md +0 -4
  327. package/src/commands/hook/index.json +0 -7
  328. package/src/commands/hooks/exec.mjs +0 -5
  329. package/src/commands/hooks/help.md +0 -4
  330. package/src/commands/hooks/index.json +0 -7
  331. package/src/commands/house/exec.mjs +0 -8
  332. package/src/commands/house/help.md +0 -8
  333. package/src/commands/house/index.json +0 -7
  334. package/src/commands/locate/exec.mjs +0 -2
  335. package/src/commands/locate/help.md +0 -6
  336. package/src/commands/locate/index.json +0 -6
  337. package/src/commands/mode/exec.mjs +0 -17
  338. package/src/commands/mode/help.md +0 -14
  339. package/src/commands/mode/index.json +0 -8
  340. package/src/commands/mode/repl.mjs +0 -18
  341. package/src/commands/open/exec.mjs +0 -5
  342. package/src/commands/open/help.md +0 -4
  343. package/src/commands/open/index.json +0 -7
  344. package/src/commands/promote/exec.mjs +0 -5
  345. package/src/commands/promote/help.md +0 -6
  346. package/src/commands/promote/index.json +0 -7
  347. package/src/commands/repl/exec.mjs +0 -3
  348. package/src/commands/repl/help.md +0 -4
  349. package/src/commands/repl/index.json +0 -6
  350. package/src/commands/seal/exec.mjs +0 -8
  351. package/src/commands/seal/help.md +0 -4
  352. package/src/commands/seal/index.json +0 -7
  353. package/src/commands/sink/exec.mjs +0 -2
  354. package/src/commands/sink/help.md +0 -6
  355. package/src/commands/sink/index.json +0 -7
  356. package/src/commands/skills/exec.mjs +0 -5
  357. package/src/commands/skills/help.md +0 -5
  358. package/src/commands/skills/index.json +0 -7
  359. package/src/commands/status/exec.mjs +0 -2
  360. package/src/commands/status/help.md +0 -6
  361. package/src/commands/status/index.json +0 -7
  362. package/src/commands/status/repl.mjs +0 -14
  363. package/src/commands/verify/exec.mjs +0 -9
  364. package/src/commands/verify/help.md +0 -4
  365. package/src/commands/verify/index.json +0 -7
  366. package/src/controllers/_index.mjs +0 -5
  367. package/src/controllers/skills-controll.mjs +0 -13
  368. package/src/controllers/workshop-controll.mjs +0 -48
  369. package/src/core/basic-bridge.mjs +0 -29
  370. package/src/core/basic-controll.mjs +0 -26
  371. package/src/core/basic-element.mjs +0 -149
  372. package/src/core/basic-model.mjs +0 -7
  373. package/src/core/basic-procedure.mjs +0 -37
  374. package/src/core/basic-submodule.mjs +0 -21
  375. package/src/core/basic-view.mjs +0 -21
  376. package/src/core/self.mjs +0 -10
  377. package/src/index.mjs +0 -24
  378. package/src/main.ts +0 -82
  379. package/src/mcp.mjs +0 -8
  380. package/src/models/_index.mjs +0 -43
  381. package/src/models/archive/class.mjs +0 -9
  382. package/src/models/craftbook/class.mjs +0 -11
  383. package/src/models/craftbook/hang.scrapnotes.mjs +0 -10
  384. package/src/models/craftset/class.mjs +0 -14
  385. package/src/models/devarmory/class.mjs +0 -10
  386. package/src/models/exhibit/class.mjs +0 -8
  387. package/src/models/forge/class.mjs +0 -19
  388. package/src/models/house/bloodlines.mjs +0 -27
  389. package/src/models/house/class.mjs +0 -53
  390. package/src/models/house/groups.mjs +0 -38
  391. package/src/models/project/anatomy.mjs +0 -11
  392. package/src/models/project/class.mjs +0 -20
  393. package/src/models/sarcophag/class.mjs +0 -8
  394. package/src/models/scope/class.mjs +0 -19
  395. package/src/models/sheme/class.mjs +0 -8
  396. package/src/models/throwbox/class.mjs +0 -9
  397. package/src/models/workshop/class.mjs +0 -30
  398. package/src/models/workshop/hang.data.mjs +0 -10
  399. package/src/models/workshop/hang.nests.mjs +0 -14
  400. package/src/models/workshop/hang.setup.mjs +0 -10
  401. package/src/models/workshop/hang.storylines.logs.mjs +0 -10
  402. package/src/models/workshop/hang.storylines.manifests.mjs +0 -10
  403. package/src/models/workshop/hang.storylines.mjs +0 -39
  404. package/src/models/workshop/hang.storylines.ttystories.mjs +0 -10
  405. package/src/models/workshop/hang.system.mjs +0 -25
  406. package/src/models/workshop/host-roles.mjs +0 -9
  407. package/src/models/workshop/locate.mjs +0 -60
  408. package/src/models/workshop/modes.mjs +0 -31
  409. package/src/models/workshop/taskfile.mjs +0 -21
  410. package/src/procedures/_index.mjs +0 -32
  411. package/src/procedures/agent-recording/_index.mjs +0 -34
  412. package/src/procedures/agent-recording/situate.mjs +0 -11
  413. package/src/procedures/bootstrapping/DESCRIPTION.md +0 -6
  414. package/src/procedures/bootstrapping/_index.mjs +0 -13
  415. package/src/procedures/bootstrapping/deploy-guides.mjs +0 -15
  416. package/src/procedures/bootstrapping/ensure-tree.mjs +0 -4
  417. package/src/procedures/closing/DESCRIPTION.md +0 -6
  418. package/src/procedures/closing/_index.mjs +0 -11
  419. package/src/procedures/closing/capture-ttystory.mjs +0 -14
  420. package/src/procedures/closing/record-closing.mjs +0 -6
  421. package/src/procedures/describing/DESCRIPTION.md +0 -23
  422. package/src/procedures/describing/_index.mjs +0 -15
  423. package/src/procedures/describing/ask-skryba.mjs +0 -82
  424. package/src/procedures/describing/compose-message.mjs +0 -25
  425. package/src/procedures/describing/read-staged.mjs +0 -7
  426. package/src/procedures/describing/scopes.mjs +0 -38
  427. package/src/procedures/describing/staged-diff.mjs +0 -25
  428. package/src/procedures/describing/write-message.mjs +0 -15
  429. package/src/procedures/gathering/DESCRIPTION.md +0 -13
  430. package/src/procedures/gathering/_index.mjs +0 -13
  431. package/src/procedures/gathering/list-served.mjs +0 -9
  432. package/src/procedures/gathering/merge-residents.mjs +0 -31
  433. package/src/procedures/gathering/read-registry.mjs +0 -7
  434. package/src/procedures/hooking/DESCRIPTION.md +0 -6
  435. package/src/procedures/hooking/_index.mjs +0 -12
  436. package/src/procedures/hooking/hooks.mjs +0 -10
  437. package/src/procedures/hooking/install-hooks.mjs +0 -34
  438. package/src/procedures/hooking/record-hook.mjs +0 -13
  439. package/src/procedures/inspecting/DESCRIPTION.md +0 -3
  440. package/src/procedures/inspecting/_index.mjs +0 -9
  441. package/src/procedures/loading/DESCRIPTION.md +0 -4
  442. package/src/procedures/loading/_index.mjs +0 -15
  443. package/src/procedures/loading/load-config.mjs +0 -16
  444. package/src/procedures/loading/validate-mode.mjs +0 -8
  445. package/src/procedures/loading/validate-role.mjs +0 -8
  446. package/src/procedures/locating/DESCRIPTION.md +0 -6
  447. package/src/procedures/locating/_index.mjs +0 -13
  448. package/src/procedures/locating/locate-self.mjs +0 -7
  449. package/src/procedures/locating/locate-workshop.mjs +0 -16
  450. package/src/procedures/locating/read-environment.mjs +0 -12
  451. package/src/procedures/mode-switching/DESCRIPTION.md +0 -7
  452. package/src/procedures/mode-switching/_index.mjs +0 -10
  453. package/src/procedures/mode-switching/record-mode.mjs +0 -8
  454. package/src/procedures/mode-switching/switch-mode.mjs +0 -16
  455. package/src/procedures/opening/DESCRIPTION.md +0 -6
  456. package/src/procedures/opening/_index.mjs +0 -8
  457. package/src/procedures/opening/record-opening.mjs +0 -4
  458. package/src/procedures/promoting/DESCRIPTION.md +0 -8
  459. package/src/procedures/promoting/_index.mjs +0 -14
  460. package/src/procedures/promoting/apply.mjs +0 -28
  461. package/src/procedures/promoting/branch-flow.mjs +0 -23
  462. package/src/procedures/promoting/plan.mjs +0 -14
  463. package/src/procedures/promoting/read-position.mjs +0 -15
  464. package/src/procedures/sinking/DESCRIPTION.md +0 -8
  465. package/src/procedures/sinking/_index.mjs +0 -12
  466. package/src/procedures/sinking/inventory-forge.mjs +0 -18
  467. package/src/procedures/sinking/inventory-tools.mjs +0 -7
  468. package/src/procedures/skilling/DESCRIPTION.md +0 -11
  469. package/src/procedures/skilling/_index.mjs +0 -15
  470. package/src/procedures/skilling/collect-models.mjs +0 -15
  471. package/src/procedures/skilling/compose-skill.mjs +0 -49
  472. package/src/procedures/skilling/glossary.mjs +0 -23
  473. package/src/procedures/skilling/register-skills.mjs +0 -21
  474. package/src/procedures/skilling/write-skills.mjs +0 -19
  475. package/src/views/_index.mjs +0 -23
  476. package/src/views/agent/_index.mjs +0 -2
  477. package/src/views/agent/brief.mjs +0 -34
  478. package/src/views/help/_index.mjs +0 -41
  479. package/src/views/house/_index.mjs +0 -56
  480. package/src/views/inventory/_index.mjs +0 -27
  481. package/src/views/mcp/_index.mjs +0 -31
  482. package/src/views/mcp/tools.mjs +0 -87
  483. package/src/views/mode/_index.mjs +0 -34
  484. package/src/views/mode/chooser.mjs +0 -37
  485. package/src/views/promotion/_index.mjs +0 -20
  486. package/src/views/repl/_index.mjs +0 -30
  487. package/src/views/skills/_index.mjs +0 -24
  488. package/src/views/status/_index.mjs +0 -57
  489. package/src/views/status/tree.mjs +0 -19
  490. package/src/views/terminal/paint.mjs +0 -22
  491. package/template/SKILL.md +0 -16
@@ -1,32 +0,0 @@
1
- // Containers of a docker host (dockerode client in, plain data out).
2
-
3
- export const list = async (docker, { all = true } = {}) =>
4
- (await docker.listContainers({ all })).map((c) => ({
5
- id: c.Id.slice(0, 12),
6
- name: c.Names[0]?.replace(/^\//, ""),
7
- image: c.Image,
8
- state: c.State,
9
- status: c.Status,
10
- }));
11
-
12
- export async function run(docker, image, { name, cmd, env = {}, binds = [], labels = {} } = {}) {
13
- const container = await docker.createContainer({
14
- Image: image,
15
- name,
16
- Cmd: cmd,
17
- Env: Object.entries(env).map(([key, value]) => `${key}=${value}`),
18
- Labels: { "bos.managed": "true", ...labels },
19
- HostConfig: { Binds: binds },
20
- });
21
- await container.start();
22
- return container.id;
23
- }
24
-
25
- export const start = (docker, id) => docker.getContainer(id).start();
26
- export const stop = (docker, id) => docker.getContainer(id).stop();
27
- export const remove = (docker, id, { force = false } = {}) => docker.getContainer(id).remove({ force });
28
-
29
- export async function logs(docker, id, { tail = 100 } = {}) {
30
- const buffer = await docker.getContainer(id).logs({ stdout: true, stderr: true, tail });
31
- return buffer.toString("utf8");
32
- }
@@ -1,23 +0,0 @@
1
- // Images of a docker host.
2
-
3
- export const list = async (docker) =>
4
- (await docker.listImages()).map((i) => ({
5
- id: i.Id.replace(/^sha256:/, "").slice(0, 12),
6
- tags: i.RepoTags ?? [],
7
- size: i.Size,
8
- }));
9
-
10
- // resolve when every layer is pulled / pushed
11
- const follow = (docker, stream) =>
12
- new Promise((resolve, reject) =>
13
- docker.modem.followProgress(stream, (error, output) => (error ? reject(error) : resolve(output))),
14
- );
15
-
16
- export const pull = async (docker, name) => follow(docker, await docker.pull(name));
17
-
18
- export const tag = (docker, name, repo, tagName = "latest") => docker.getImage(name).tag({ repo, tag: tagName });
19
-
20
- export const push = async (docker, name, auth) =>
21
- follow(docker, await docker.getImage(name).push({ authconfig: auth }));
22
-
23
- export const remove = (docker, name, { force = false } = {}) => docker.getImage(name).remove({ force });
@@ -1,12 +0,0 @@
1
- // Volumes of a docker host. BOS nests (glossary: nestrelm) are volumes labeled bos.nest.
2
-
3
- export const list = async (docker, { nestsOnly = false } = {}) => {
4
- const { Volumes = [] } = await docker.listVolumes(nestsOnly ? { filters: { label: ["bos.nest"] } } : {});
5
- return Volumes.map((v) => ({ name: v.Name, driver: v.Driver, mountpoint: v.Mountpoint, labels: v.Labels ?? {} }));
6
- };
7
-
8
- export const create = (docker, name, { nest = true, labels = {} } = {}) =>
9
- docker.createVolume({ Name: name, Labels: { ...(nest ? { "bos.nest": name } : {}), ...labels } });
10
-
11
- export const inspect = (docker, name) => docker.getVolume(name).inspect();
12
- export const remove = (docker, name) => docker.getVolume(name).remove();
@@ -1,24 +0,0 @@
1
- // Publishing an image: tag it for a registry and push it, over the docker host.
2
- import { BOS } from "../../main.ts";
3
- import DockerHost from "../docker-host/_index.mjs";
4
-
5
- export class DockerPublish extends BOS.Bridge {
6
- static id = "docker-publish";
7
-
8
- get host() {
9
- this._host ??= new DockerHost(this.options.docker);
10
- return this._host;
11
- }
12
-
13
- available() {
14
- return this.host.available();
15
- }
16
-
17
- // publish("bos:local", "ghcr.io/sarverott/bos", "0.0.1")
18
- async publish(localImage, repo, tag = "latest", auth = this.options.auth) {
19
- await this.host.images.tag(localImage, repo, tag);
20
- return this.host.images.push(`${repo}:${tag}`, auth);
21
- }
22
- }
23
-
24
- export default DockerPublish;
@@ -1,121 +0,0 @@
1
- // Local repositories through isomorphic-git (no git binary needed); remotes over
2
- // http(s), e.g. the internal Gitea. Every method takes the repository dir first.
3
- import fs from "node:fs";
4
-
5
- import git from "isomorphic-git";
6
- import http from "isomorphic-git/http/node";
7
-
8
- import { BOS } from "../../main.ts";
9
- import { resolveAuthor } from "./author.mjs";
10
-
11
- export class GitClient extends BOS.Bridge {
12
- static id = "git-client";
13
-
14
- // credentials for remotes: options.token / $GITEA_TOKEN (username optional)
15
- get auth() {
16
- const password = this.options.token ?? process.env.GITEA_TOKEN;
17
- return password ? () => ({ username: this.options.username ?? "bos", password }) : undefined;
18
- }
19
-
20
- root(path) {
21
- return git.findRoot({ fs, filepath: path }).catch(() => null);
22
- }
23
- init(dir) {
24
- return git.init({ fs, dir, defaultBranch: "master" });
25
- }
26
- branch(dir) {
27
- return git.currentBranch({ fs, dir });
28
- }
29
- branches(dir) {
30
- return git.listBranches({ fs, dir });
31
- }
32
- hasBranch(dir, ref) {
33
- return this.branches(dir).then((all) => all.includes(ref));
34
- }
35
- createBranch(dir, ref, from) {
36
- return git.branch({ fs, dir, ref, object: from });
37
- }
38
- checkout(dir, ref) {
39
- return git.checkout({ fs, dir, ref });
40
- }
41
-
42
- async log(dir, depth = 10) {
43
- return (await git.log({ fs, dir, depth })).map(({ oid, commit }) => ({
44
- oid,
45
- message: commit.message.trim(),
46
- author: commit.author.name,
47
- at: commit.author.timestamp * 1000,
48
- }));
49
- }
50
-
51
- // changed files only: [path, "modified" | "added" | "deleted" | "untracked"]
52
- async changes(dir) {
53
- const names = {
54
- "0,2,0": "untracked",
55
- "0,2,2": "added",
56
- "1,2,1": "modified",
57
- "1,2,2": "modified",
58
- "1,0,1": "deleted",
59
- "1,0,0": "deleted",
60
- "1,1,0": "deleted",
61
- };
62
- return (await git.statusMatrix({ fs, dir }))
63
- .filter(([, head, work, stage]) => !(head === 1 && work === 1 && stage === 1))
64
- .map(([path, ...state]) => [path, names[state.join(",")] ?? state.join(",")]);
65
- }
66
-
67
- // what the next commit will contain: [path, "added" | "modified" | "deleted"]
68
- async staged(dir) {
69
- const status = (head, stage) =>
70
- head === 0 && stage > 0
71
- ? "added"
72
- : head === 1 && stage === 0
73
- ? "deleted"
74
- : head === 1 && stage > 1
75
- ? "modified"
76
- : null;
77
- return (await git.statusMatrix({ fs, dir }))
78
- .map(([path, head, , stage]) => [path, status(head, stage)])
79
- .filter(([, state]) => state);
80
- }
81
-
82
- hooksPath(dir) {
83
- return git.getConfig({ fs, dir, path: "core.hooksPath" });
84
- }
85
-
86
- async commit(dir, message, paths = ["."]) {
87
- for (const filepath of paths) await git.add({ fs, dir, filepath });
88
- return git.commit({ fs, dir, message, author: await resolveAuthor(git, fs, dir) });
89
- }
90
-
91
- // merge `from` into `to` as a merge commit, then leave `to` checked out
92
- async merge(dir, from, to, message = `${from} → ${to}`) {
93
- await this.checkout(dir, to);
94
- const result = await git.merge({
95
- fs,
96
- dir,
97
- ours: to,
98
- theirs: from,
99
- fastForward: false,
100
- message,
101
- author: await resolveAuthor(git, fs, dir),
102
- });
103
- await this.checkout(dir, to);
104
- return result;
105
- }
106
-
107
- addRemote(dir, remote, url) {
108
- return git.addRemote({ fs, dir, remote, url });
109
- }
110
- clone(url, dir, { ref, depth } = {}) {
111
- return git.clone({ fs, http, dir, url, ref, depth, singleBranch: Boolean(ref), onAuth: this.auth });
112
- }
113
- fetch(dir, remote = "origin") {
114
- return git.fetch({ fs, http, dir, remote, onAuth: this.auth });
115
- }
116
- push(dir, ref, remote = "origin") {
117
- return git.push({ fs, http, dir, remote, ref, onAuth: this.auth });
118
- }
119
- }
120
-
121
- export default GitClient;
@@ -1,26 +0,0 @@
1
- // Who signs commits: repository config, then ~/.gitconfig, then the system user.
2
- // (isomorphic-git reads only the repository's own config.)
3
- import { readFileSync } from "node:fs";
4
- import { homedir, userInfo } from "node:os";
5
- import { join } from "node:path";
6
-
7
- function globalConfig() {
8
- try {
9
- const text = readFileSync(join(homedir(), ".gitconfig"), "utf8");
10
- const user = text.split(/^\[/m).find((section) => section.startsWith("user]")) ?? "";
11
- const value = (key) => user.match(new RegExp(`^\\s*${key}\\s*=\\s*(.+)$`, "m"))?.[1].trim();
12
- return { name: value("name"), email: value("email") };
13
- } catch {
14
- return {};
15
- }
16
- }
17
-
18
- export async function resolveAuthor(git, fs, dir) {
19
- const local = {
20
- name: await git.getConfig({ fs, dir, path: "user.name" }),
21
- email: await git.getConfig({ fs, dir, path: "user.email" }),
22
- };
23
- const global = globalConfig();
24
- const name = local.name ?? global.name ?? userInfo().username;
25
- return { name, email: local.email ?? global.email ?? `${name}@localhost` };
26
- }
@@ -1,62 +0,0 @@
1
- // The self-hosted Gitea that carries private scope repositories and pre-public drafts.
2
- // Address: options.url or $GITEA_URL (e.g. http://gitea.lan:3000); token: options.token or $GITEA_TOKEN.
3
- import { BOS } from "../../main.ts";
4
-
5
- export class GiteaApi extends BOS.Bridge {
6
- static id = "gitea-api";
7
-
8
- get url() {
9
- const url = this.options.url ?? process.env.GITEA_URL;
10
- if (!url) throw new Error("Gitea address unknown: set $GITEA_URL");
11
- return url.replace(/\/+$/, "");
12
- }
13
-
14
- get token() {
15
- return this.options.token ?? process.env.GITEA_TOKEN;
16
- }
17
-
18
- async request(method, path, body) {
19
- const response = await fetch(`${this.url}/api/v1${path}`, {
20
- method,
21
- headers: {
22
- "content-type": "application/json",
23
- ...(this.token ? { authorization: `token ${this.token}` } : {}),
24
- },
25
- body: body && JSON.stringify(body),
26
- });
27
- if (!response.ok) throw new Error(`gitea ${method} ${path}: ${response.status} ${response.statusText}`);
28
- return response.status === 204 ? null : response.json();
29
- }
30
-
31
- async available() {
32
- try {
33
- await this.request("GET", "/version");
34
- return true;
35
- } catch {
36
- return false;
37
- }
38
- }
39
-
40
- async me() {
41
- return (await this.request("GET", "/user")).login;
42
- }
43
-
44
- async repos() {
45
- return (await this.request("GET", "/user/repos")).map((r) => ({
46
- name: r.full_name,
47
- private: r.private,
48
- url: r.clone_url,
49
- }));
50
- }
51
-
52
- // scopes are private by default
53
- createRepo(name, { private: isPrivate = true, description = "" } = {}) {
54
- return this.request("POST", "/user/repos", { name, private: isPrivate, description, default_branch: "master" });
55
- }
56
-
57
- cloneUrl(owner, repo) {
58
- return `${this.url}/${owner}/${repo}.git`;
59
- }
60
- }
61
-
62
- export default GiteaApi;
@@ -1,45 +0,0 @@
1
- // GitHub through octokit. Token: options.token, $GITHUB_TOKEN or $GH_TOKEN.
2
- import { Octokit } from "octokit";
3
-
4
- import { BOS } from "../../main.ts";
5
-
6
- export class GithubApi extends BOS.Bridge {
7
- static id = "github-api";
8
-
9
- connect() {
10
- return new Octokit({ auth: this.options.token ?? process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN });
11
- }
12
-
13
- async available() {
14
- try {
15
- await this.me();
16
- return true;
17
- } catch {
18
- return false;
19
- }
20
- }
21
-
22
- async me() {
23
- return (await this.client.rest.users.getAuthenticated()).data.login;
24
- }
25
-
26
- async repos() {
27
- const repos = await this.client.paginate(this.client.rest.repos.listForAuthenticatedUser, { per_page: 100 });
28
- return repos.map((r) => ({ name: r.full_name, private: r.private, url: r.clone_url, branch: r.default_branch }));
29
- }
30
-
31
- async repo(owner, repo) {
32
- return (await this.client.rest.repos.get({ owner, repo })).data;
33
- }
34
-
35
- async createRepo(name, { private: isPrivate = false, description = "" } = {}) {
36
- return (await this.client.rest.repos.createForAuthenticatedUser({ name, private: isPrivate, description })).data;
37
- }
38
-
39
- // releasing → master lands in canon through a pull request
40
- async pullRequest({ owner, repo, head, base = "master", title = `${head} → ${base}`, body = "" }) {
41
- return (await this.client.rest.pulls.create({ owner, repo, head, base, title, body })).data;
42
- }
43
- }
44
-
45
- export default GithubApi;
@@ -1,19 +0,0 @@
1
- // Publishing a package to npm. Dry run unless told otherwise.
2
- import { BOS } from "../../main.ts";
3
- import SubprocessRunner from "../subprocess-runner/_index.mjs";
4
-
5
- const npm = new SubprocessRunner({ command: "npm" });
6
-
7
- export class NpmPublish extends BOS.Bridge {
8
- static id = "npm-publish";
9
-
10
- available() {
11
- return npm.available();
12
- }
13
-
14
- publish(dir, { dryRun = true, tag = "latest" } = {}) {
15
- return npm.run("npm", ["publish", "--tag", tag, ...(dryRun ? ["--dry-run"] : [])], { cwd: dir, inherit: true });
16
- }
17
- }
18
-
19
- export default NpmPublish;
@@ -1,93 +0,0 @@
1
- // Local language models through the ollama client (host: options.host, $OLLAMA_HOST
2
- // or http://127.0.0.1:11434). Ravens (resources/ravens/) speak through it.
3
- // Before any call the House (resources/house/) is asked: only active residents are called.
4
- import { Ollama } from "ollama";
5
-
6
- import { BOS } from "../../main.ts";
7
- import House from "../../models/house/class.mjs";
8
- import { listRavens, readRaven } from "./ravens.mjs";
9
-
10
- export class OllamaLink extends BOS.Bridge {
11
- static id = "ollama-link";
12
-
13
- connect() {
14
- return new Ollama({ host: this.options.host ?? process.env.OLLAMA_HOST ?? "http://127.0.0.1:11434" });
15
- }
16
-
17
- // give up after `ms`, abort the request, and answer null instead of throwing
18
- async within(ms, work) {
19
- let timer;
20
- const timeout = new Promise((resolve) => {
21
- timer = setTimeout(() => {
22
- this.client.abort();
23
- resolve(null);
24
- }, ms);
25
- });
26
- try {
27
- return await Promise.race([work(), timeout]);
28
- } catch {
29
- return null;
30
- } finally {
31
- clearTimeout(timer);
32
- }
33
- }
34
-
35
- // names, architectures and parents of the served models: reading the list starts no model
36
- async catalog() {
37
- const listed = await this.within(2000, () => this.client.list());
38
- return (
39
- listed?.models.map((m) => ({
40
- name: m.name,
41
- family: m.details?.family ?? null,
42
- parent: m.details?.parent_model || null,
43
- })) ?? []
44
- );
45
- }
46
-
47
- async models() {
48
- return (await this.catalog()).map((entry) => entry.name);
49
- }
50
-
51
- get house() {
52
- this._house ??= new House();
53
- return this._house;
54
- }
55
-
56
- async available(model) {
57
- if (model && !this.house.mayCall(model)) return false;
58
- const models = await this.models();
59
- return model ? models.some((name) => name === model || name === `${model}:latest`) : models.length > 0;
60
- }
61
-
62
- raven(name) {
63
- return readRaven(name);
64
- }
65
- ravens() {
66
- return listRavens();
67
- }
68
-
69
- // one question to one raven; `format` is a JSON schema for structured answers
70
- // a cold model can take a minute to load; keep_alive keeps it warm for the next calls
71
- async ask(ravenName, prompt, { format, timeout = 90000, model, keepAlive = "30m" } = {}) {
72
- const raven = this.raven(ravenName);
73
- const chosen = model ?? process.env[`BOS_${ravenName.toUpperCase()}_MODEL`] ?? raven.model;
74
- const { state, reason } = this.house.stateOf(chosen);
75
- if (state !== "active") throw new Error(`${chosen} is ${state} and is not called.${reason ? ` ${reason}` : ""}`);
76
- const response = await this.within(timeout, () =>
77
- this.client.chat({
78
- model: chosen,
79
- messages: [
80
- { role: "system", content: raven.system },
81
- { role: "user", content: prompt },
82
- ],
83
- format,
84
- stream: false,
85
- keep_alive: keepAlive,
86
- options: { temperature: 0.2 },
87
- }),
88
- );
89
- return response?.message?.content ?? null;
90
- }
91
- }
92
-
93
- export default OllamaLink;
@@ -1,29 +0,0 @@
1
- // Ravens: AI helpers of the workshop, one markdown file each in resources/ravens/.
2
- // Frontmatter (model, duty) + the text below it as the raven's system prompt.
3
- import { existsSync, readdirSync, readFileSync } from "node:fs";
4
- import { join } from "node:path";
5
-
6
- import { RESOURCES } from "../../core/self.mjs";
7
-
8
- const DIR = join(RESOURCES, "ravens");
9
-
10
- export function readRaven(name) {
11
- const path = join(DIR, `${name}.md`);
12
- if (!existsSync(path)) throw new Error(`no raven "${name}" in resources/ravens/`);
13
- const [, head = "", system = ""] = readFileSync(path, "utf8").match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/) ?? [];
14
- const meta = Object.fromEntries(
15
- head
16
- .split("\n")
17
- .map((line) => line.match(/^(\w+):\s*(.*)$/))
18
- .filter(Boolean)
19
- .map(([, k, v]) => [k, v.trim()]),
20
- );
21
- return { name, ...meta, system: system.trim() };
22
- }
23
-
24
- export const listRavens = () =>
25
- existsSync(DIR)
26
- ? readdirSync(DIR)
27
- .filter((file) => file.endsWith(".md"))
28
- .map((file) => readRaven(file.slice(0, -3)))
29
- : [];
@@ -1,33 +0,0 @@
1
- // Other hosts over ssh; aliases come from ~/.ssh/config (glossary: setup).
2
- import { readFileSync } from "node:fs";
3
- import { homedir } from "node:os";
4
- import { join } from "node:path";
5
-
6
- import { BOS } from "../../main.ts";
7
- import SubprocessRunner from "../subprocess-runner/_index.mjs";
8
-
9
- const ssh = new SubprocessRunner({ command: "ssh" });
10
-
11
- export class SshLink extends BOS.Bridge {
12
- static id = "ssh-link";
13
-
14
- available() {
15
- return Promise.resolve(ssh.try("ssh", ["-V"]) !== null);
16
- }
17
-
18
- aliases(config = join(homedir(), ".ssh", "config")) {
19
- try {
20
- return [...readFileSync(config, "utf8").matchAll(/^\s*Host\s+(.+)$/gim)]
21
- .flatMap((match) => match[1].split(/\s+/))
22
- .filter((alias) => !alias.includes("*"));
23
- } catch {
24
- return [];
25
- }
26
- }
27
-
28
- run(host, command) {
29
- return ssh.run("ssh", ["-o", "BatchMode=yes", host, command]);
30
- }
31
- }
32
-
33
- export default SshLink;
@@ -1,33 +0,0 @@
1
- // Any command-line tool as a bridge: run it, or ask whether it is installed.
2
- import { execFileSync, spawnSync } from "node:child_process";
3
-
4
- import { BOS } from "../../main.ts";
5
-
6
- export class SubprocessRunner extends BOS.Bridge {
7
- static id = "subprocess-runner";
8
-
9
- async available(command = this.options.command) {
10
- if (!command) return false;
11
- return spawnSync(command, ["--version"], { stdio: "ignore" }).status === 0;
12
- }
13
-
14
- run(command, args = [], { cwd = process.cwd(), inherit = false } = {}) {
15
- const output = execFileSync(command, args, {
16
- cwd,
17
- encoding: "utf8",
18
- stdio: inherit ? "inherit" : ["ignore", "pipe", "pipe"],
19
- });
20
- return typeof output === "string" ? output.trim() : "";
21
- }
22
-
23
- // like run, but null instead of throwing
24
- try(command, args, options) {
25
- try {
26
- return this.run(command, args, options);
27
- } catch {
28
- return null;
29
- }
30
- }
31
- }
32
-
33
- export default SubprocessRunner;
package/src/cli.mjs DELETED
@@ -1,29 +0,0 @@
1
- #!/usr/bin/env node
2
- // bos <command> [operands] [--json] [--dry-run] [--workshop=PATH]
3
- import { VERSION } from "./core/self.mjs";
4
- import { BOS } from "./main.ts";
5
-
6
- const args = process.argv.slice(2);
7
- const flags = Object.fromEntries(
8
- args
9
- .filter((arg) => arg.startsWith("--"))
10
- .map((arg) => {
11
- const [key, value = true] = arg.slice(2).split("=");
12
- return [key.replace(/-(\w)/g, (_, c) => c.toUpperCase()), value];
13
- }),
14
- );
15
- const [name = "help", ...operands] = args.filter((arg) => !arg.startsWith("--"));
16
-
17
- if (flags.version) {
18
- console.log(VERSION);
19
- process.exit(0);
20
- }
21
-
22
- try {
23
- const bos = await new BOS({ workshop: flags.workshop }).load();
24
- const output = await bos.command(name, operands, flags);
25
- if (output !== undefined) console.log(typeof output === "string" ? output : JSON.stringify(output, null, 2));
26
- } catch (error) {
27
- console.error(`bos ${name}: ${error.message}${error.procedure ? `\n in ${error.procedure}` : ""}`);
28
- process.exitCode = 1;
29
- }
@@ -1,51 +0,0 @@
1
- /*
2
- based on index.json in dirs generate commands
3
- {
4
- "path": "/status", # url path for apis
5
- "info": "status information", # shortest explanation
6
- "help": ["./help.md", "MD"], # detailed usage with render filetype handling
7
- "inline": "./exec.mjs", # when called as oneline command with subcommand to return output to standard output, if it is streamable command then piping of input-output should be also handled there somewhere... it can be splitted to another file but have to be imported later
8
- "repl": "./repl.mjs" # interactive cli menu that allows standard input of choice or more advanced nice-looking terminal gui based on universal ascii base
9
- "mode": "conform" # mode of work the command serves (almanac, conform, smeltry, commandorate, provision); none: general
10
- }
11
- not all of these are required, most minimalistic now is "help" - only show universal help on general error or invoking help
12
- should list commands and what they does
13
- */
14
-
15
- import { existsSync, readdirSync, readFileSync } from "node:fs";
16
- import { dirname, join } from "node:path";
17
- import { fileURLToPath, pathToFileURL } from "node:url";
18
-
19
- const HERE = dirname(fileURLToPath(import.meta.url));
20
-
21
- // "./exec.mjs" → a function that imports the module on first call and runs its default export
22
- const lazy = (dir, file) => async (context) => (await import(pathToFileURL(join(dir, file)))).default(context);
23
-
24
- export function loadCommand(dir, name = dir.split("/").pop()) {
25
- const index = JSON.parse(readFileSync(join(dir, "index.json"), "utf8"));
26
- const [helpFile, helpType = "MD"] = [].concat(index.help ?? []);
27
- return {
28
- name,
29
- path: index.path ?? `/${name}`,
30
- info: index.info ?? "",
31
- mode: index.mode ?? null, // the mode of work this command serves; null: any mode
32
- help: () =>
33
- helpFile && existsSync(join(dir, helpFile))
34
- ? { text: readFileSync(join(dir, helpFile), "utf8"), type: helpType }
35
- : null,
36
- inline: index.inline
37
- ? lazy(dir, index.inline)
38
- : async () => {
39
- throw new Error(`${name} has no inline form; see: bos help ${name}`);
40
- },
41
- repl: index.repl ? lazy(dir, index.repl) : null,
42
- };
43
- }
44
-
45
- export async function loadCommands(root = HERE) {
46
- return Object.fromEntries(
47
- readdirSync(root, { withFileTypes: true })
48
- .filter((entry) => entry.isDirectory() && existsSync(join(root, entry.name, "index.json")))
49
- .map((entry) => [entry.name, loadCommand(join(root, entry.name), entry.name)]),
50
- );
51
- }
@@ -1,7 +0,0 @@
1
- export default async ({ bos, flags }) =>
2
- new bos.views.StatusView().render(
3
- await bos.workshop.bootstrap({
4
- dryRun: Boolean(flags.dryRun),
5
- }),
6
- flags.json ? "json" : "text",
7
- );
@@ -1,5 +0,0 @@
1
- # bootstrap
2
-
3
- `bos bootstrap [--dry-run]` creates every missing area and descriptor of the
4
- workshop, plus `AGENTS.md` and `CLAUDE.md` at its root. It never overwrites.
5
- `--dry-run` lists what would be created.
@@ -1,7 +0,0 @@
1
- {
2
- "path": "/bootstrap",
3
- "info": "create missing areas, descriptors and agent guides",
4
- "mode": "conform",
5
- "help": ["./help.md", "MD"],
6
- "inline": "./exec.mjs"
7
- }
@@ -1,4 +0,0 @@
1
- export default async ({ bos, flags }) => {
2
- const context = await bos.workshop.close();
3
- return flags.json ? context.event : `closed · ttystory: ${context.ttystory ?? "no shell history found"}`;
4
- };