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,18 +0,0 @@
1
- import GitClient from "../../bridge/git-client/_index.mjs";
2
-
3
- // every project in the forge, its branch, and work not yet committed
4
- export const inventoryForge = async (context) => {
5
- const git = new GitClient();
6
- context.inventory ??= {};
7
- context.inventory.projects = [];
8
- for (const scope of context.workshop.forge.scopes()) {
9
- for (const project of scope.projects()) {
10
- context.inventory.projects.push({
11
- scope: scope.name,
12
- project: project.name,
13
- branch: await git.branch(project.path).catch(() => null),
14
- uncommitted: (await git.changes(project.path).catch(() => [])).length,
15
- });
16
- }
17
- }
18
- };
@@ -1,7 +0,0 @@
1
- import { existsSync, readdirSync } from "node:fs";
2
-
3
- // ttystories show which tools and programs the workstation really used
4
- export const inventoryTools = (context) => {
5
- const dir = context.workshop.storylines.ttystories.path;
6
- context.inventory.ttystories = existsSync(dir) ? readdirSync(dir) : [];
7
- };
@@ -1,11 +0,0 @@
1
- # Skilling Protocol
2
-
3
- Every model of the workshop can grow its own agent skill. This protocol drafts
4
- `skills/bos-<type>/SKILL.md` for each standalone model that has no skill yet.
5
- The draft takes its title, "What it is" and "Where" from
6
- `docs/glossary/<type>.md`, and its submodules from the model class. It then
7
- registers the skill in `.claude-plugin/marketplace.json`.
8
-
9
- Existing skills are never overwritten: a draft is only a starting point, and it
10
- grows by hand. Submodules get no skill of their own; they belong to their
11
- owner's skill. Re-run it after adding a model.
@@ -1,15 +0,0 @@
1
- import { BOS } from "../../main.ts";
2
- import { collectModels } from "./collect-models.mjs";
3
- import { composeSkills } from "./compose-skill.mjs";
4
- import { registerSkills } from "./register-skills.mjs";
5
- import { writeSkills } from "./write-skills.mjs";
6
-
7
- export const skilling = new BOS.Procedure("skilling", [], {
8
- description: "draft an agent skill for every model that has none",
9
- })
10
- .step("collect models", collectModels)
11
- .step("compose skills", composeSkills)
12
- .step("write missing skills", writeSkills)
13
- .step("register in marketplace", registerSkills);
14
-
15
- export default skilling;
@@ -1,15 +0,0 @@
1
- import { join } from "node:path";
2
-
3
- import { REPO_ROOT } from "../../core/self.mjs";
4
- import models from "../../models/_index.mjs";
5
- import { readPage } from "./glossary.mjs";
6
-
7
- // every standalone model, with its glossary page; submodules get no skill of their own
8
- export const collectModels = (context) => {
9
- context.root = context.options.root ?? REPO_ROOT;
10
- context.models = Object.values(models).map((Model) => ({
11
- Model,
12
- type: Model.type,
13
- page: readPage(join(context.root, "docs", "glossary", `${Model.type}.md`)),
14
- }));
15
- };
@@ -1,49 +0,0 @@
1
- // A draft SKILL.md for each model, from its glossary page and its class.
2
- import { firstSentence, section, title } from "./glossary.mjs";
3
-
4
- const quote = (text) => `"${text.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
5
-
6
- export function composeSkill({ Model, type, page }) {
7
- const what = section(page, "What it is") || "[`TODO`] no glossary page yet";
8
- const where = section(page, "Where") || "[`TODO`]";
9
- const hangs = Object.entries(Model.submodules).map(([name, Sub]) => `- \`${name}\` → \`${Sub.dirname}/\``);
10
- const description = `${firstSentence(what)} Use when creating, finding or handling a BOS ${type}, or when the user mentions a ${type}.`;
11
- return [
12
- "---",
13
- `name: bos-${type}`,
14
- `description: ${quote(description)}`,
15
- "---",
16
- "",
17
- `# ${title(page) ?? type} (BOS)`,
18
- "",
19
- `> Draft generated by \`bos skills\` from \`docs/glossary/${type}.md\` and \`src/models/${type}/\`.`,
20
- "> Grow it by hand: it is never overwritten.",
21
- "",
22
- "## What it is",
23
- "",
24
- what,
25
- "",
26
- "## Where",
27
- "",
28
- where,
29
- ...(hangs.length ? ["", "## Submodules", "", ...hangs] : []),
30
- "",
31
- "## Handling",
32
- "",
33
- `[\`TODO\`] procedures and commands for a ${type}.`,
34
- "",
35
- "## References",
36
- "",
37
- `- [glossary](../../docs/glossary/${type}.md)`,
38
- `- [model](../../src/models/${type}/class.mjs)`,
39
- "",
40
- ].join("\n");
41
- }
42
-
43
- export const composeSkills = (context) => {
44
- context.skills = context.models.map((model) => ({
45
- type: model.type,
46
- name: `bos-${model.type}`,
47
- text: composeSkill(model),
48
- }));
49
- };
@@ -1,23 +0,0 @@
1
- // Reading glossary pages: the title and the text of one "## " section.
2
- import { existsSync, readFileSync } from "node:fs";
3
-
4
- export function readPage(path) {
5
- return existsSync(path) ? readFileSync(path, "utf8") : "";
6
- }
7
-
8
- export const title = (page) => page.match(/^#\s+(.+)$/m)?.[1].trim() ?? null;
9
-
10
- export function section(page, name) {
11
- const match = page.match(new RegExp(`^##\\s+${name}\\s*$([\\s\\S]*?)(?=^##\\s|(?![\\s\\S]))`, "m"));
12
- return match ? match[1].replace(/^>.*$/gm, "").trim() : "";
13
- }
14
-
15
- // first sentence of the first paragraph, plain text, on one line
16
- export function firstSentence(text) {
17
- const paragraph = text
18
- .split(/\n\s*\n/)[0]
19
- .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1")
20
- .replace(/\s+/g, " ")
21
- .trim();
22
- return (paragraph.match(/^.+?[.!?](?=\s|$)/)?.[0] ?? paragraph).replace(/:$/, ".");
23
- }
@@ -1,21 +0,0 @@
1
- import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
- import { join } from "node:path";
3
-
4
- // add every skill to the plugin in .claude-plugin/marketplace.json (additive only)
5
- export const registerSkills = (context) => {
6
- context.registered = [];
7
- // a plugin manifest makes Claude Code scan skills/ itself: nothing to register
8
- if (existsSync(join(context.root, ".claude-plugin", "plugin.json"))) return;
9
- const path = join(context.root, ".claude-plugin", "marketplace.json");
10
- if (!existsSync(path)) return;
11
- const marketplace = JSON.parse(readFileSync(path, "utf8"));
12
- const plugin = marketplace.plugins[0];
13
- const missing = context.skills
14
- .map((skill) => `./skills/${skill.name}`)
15
- .filter((entry) => !plugin.skills.includes(entry));
16
- context.registered = missing;
17
- if (!missing.length) return;
18
- plugin.skills.push(...missing);
19
- if (!context.dryRun) writeFileSync(path, `${JSON.stringify(marketplace, null, 2)}\n`);
20
- context.changes.push(`${path} (+${missing.length} skills)`);
21
- };
@@ -1,19 +0,0 @@
1
- import { mkdirSync, writeFileSync } from "node:fs";
2
- import { dirname, join } from "node:path";
3
-
4
- import { createIfMissing } from "../../core/basic-element.mjs";
5
-
6
- // skills/bos-<type>/SKILL.md, only where none exists yet
7
- export const writeSkills = (context) => {
8
- for (const skill of context.skills) {
9
- const target = join(context.root, "skills", skill.name, "SKILL.md");
10
- skill.created = createIfMissing(
11
- target,
12
- () => {
13
- mkdirSync(dirname(target), { recursive: true });
14
- writeFileSync(target, skill.text);
15
- },
16
- context,
17
- );
18
- }
19
- };
@@ -1,23 +0,0 @@
1
- // Every view: how BOS presents itself. Each renders text for people or json for machines.
2
- import HelpView from "./help/_index.mjs";
3
- import HouseView from "./house/_index.mjs";
4
- import InventoryView from "./inventory/_index.mjs";
5
- import ModeView from "./mode/_index.mjs";
6
- import { chooseDigit } from "./mode/chooser.mjs";
7
- import PromotionView from "./promotion/_index.mjs";
8
- import { startRepl } from "./repl/_index.mjs";
9
- import SkillsView from "./skills/_index.mjs";
10
- import StatusView from "./status/_index.mjs";
11
-
12
- export { paint } from "./terminal/paint.mjs";
13
- export default {
14
- StatusView,
15
- HelpView,
16
- HouseView,
17
- PromotionView,
18
- InventoryView,
19
- SkillsView,
20
- ModeView,
21
- chooseDigit,
22
- startRepl,
23
- };
@@ -1,2 +0,0 @@
1
- export { recordAgentCommand, recordAgentEvent } from "../../procedures/agent-recording/_index.mjs";
2
- export { brief } from "./brief.mjs";
@@ -1,34 +0,0 @@
1
- // What an agent learns at the start of a session: the workshop, its role and mode, where it
2
- // works, the House's boundaries, and the tools BOS gives it. Short: it becomes context.
3
- import House from "../../models/house/class.mjs";
4
- import { MODES } from "../../models/workshop/modes.mjs";
5
- import { situate } from "../../procedures/agent-recording/situate.mjs";
6
-
7
- export async function brief(input) {
8
- const context = await situate(input);
9
- if (!context) return null;
10
- const { config, defaulted = [], self } = context;
11
- const mark = (key) => (defaulted.includes(key) ? " (default)" : "");
12
- const place = context.workshop.placeOf(input.cwd ?? process.cwd());
13
- const where = !place
14
- ? "outside this workshop"
15
- : place.area
16
- ? [place.area, place.scope, place.project].filter(Boolean).join(" / ")
17
- : "workshop root";
18
- const house = new House();
19
- const resting = [...house.children(), ...house.orders()]
20
- .filter((g) => g.state !== "active")
21
- .map((g) => g.title ?? g.name);
22
- return [
23
- "# BOS: Blacksmith Organization System",
24
- `workshop ${context.workshopRoot} · role ${config.role}${mark("role")} · mode ${MODES[config.mode]?.title ?? config.mode}${mark("mode")} · BOS v${self.version}`,
25
- `you are in: ${where}`,
26
- `House of Anubis: ${house.children().length} adopted children, orders: ${house
27
- .orders()
28
- .map((o) => o.title ?? o.name)
29
- .join(", ")}.${resting.length ? ` Resting, never call or prompt: ${resting.join(", ")}.` : ""}`,
30
- "tools: `bos` CLI on PATH (bos help), MCP tools bos_* (bos_glossary explains any element)",
31
- "rules: ask the House before calling any ollama model · conventional commits · look before changing the owner's files · the owner works in parallel: re-check git state",
32
- "",
33
- ].join("\n");
34
- }
@@ -1,41 +0,0 @@
1
- // Help: the list of commands, or one command's help file with light markdown styling.
2
- import { BOS } from "../../main.ts";
3
- import { MODES } from "../../models/workshop/modes.mjs";
4
- import { header, pad, paint } from "../terminal/paint.mjs";
5
-
6
- const markdown = (text) =>
7
- text
8
- .replace(/^#+\s*(.+)$/gm, (_, title) => paint.bold(paint.yellow(title)))
9
- .replace(/`([^`]+)`/g, (_, code) => paint.cyan(code))
10
- .replace(/\*\*([^*]+)\*\*/g, (_, strong) => paint.bold(strong));
11
-
12
- export class HelpView extends BOS.View {
13
- text({ commands, command, help }) {
14
- if (command) return markdown(help?.text ?? commands[command]?.info ?? `no help for ${command}`);
15
- const size = Math.max(...Object.keys(commands).map((name) => name.length)) + 2;
16
- const line = ([name, c]) => ` ${paint.cyan(pad(name, size))}${c.info ?? ""}${c.repl ? paint.dim(" (repl)") : ""}`;
17
- const group = (title, entries, always = false) =>
18
- entries.length || always
19
- ? ["", paint.bold(title), ...(entries.length ? entries.map(line) : [paint.dim(" nothing yet")])]
20
- : [];
21
- const all = Object.entries(commands);
22
- return [
23
- header("bos <command> [options]"),
24
- ...group(
25
- "general",
26
- all.filter(([, c]) => !c.mode),
27
- ),
28
- ...Object.entries(MODES).flatMap(([name, mode]) =>
29
- group(
30
- `${mode.digit} ${mode.title}`,
31
- all.filter(([, c]) => c.mode === name),
32
- true,
33
- ),
34
- ),
35
- "",
36
- paint.dim("options: --json --dry-run --workshop=PATH · bos help <command> · bos mode"),
37
- ].join("\n");
38
- }
39
- }
40
-
41
- export default HelpView;
@@ -1,56 +0,0 @@
1
- // The House of Anubis: children (adopted by name), orders (duties), bloodlines (releasers).
2
- import { BOS } from "../../main.ts";
3
- import { header, pad, paint } from "../terminal/paint.mjs";
4
-
5
- const STATE = { active: paint.green, resting: paint.magenta, frozen: paint.blue };
6
-
7
- const presence = (member) => {
8
- if (member.state && member.state !== "active") return (STATE[member.state] ?? paint.dim)(`◌ ${member.state}`);
9
- if (member.present === null) return paint.dim("remote");
10
- return member.present ? paint.green("● served") : paint.dim("○ absent");
11
- };
12
-
13
- function group(group) {
14
- const lines = [
15
- `${paint.bold(group.title ?? group.name)} ${(STATE[group.state] ?? paint.dim)(group.state)} ${paint.dim(group.description ?? "")}`,
16
- ];
17
- if (group.state === "resting") lines.push(` ${paint.magenta("rests by its own decision; not called")}`);
18
- for (const member of group.members) {
19
- const label =
20
- member.name && member.model ? `${member.name} ${paint.dim(`(${member.model})`)}` : (member.name ?? member.model);
21
- const line = member.bloodline ? paint.dim(`${member.bloodline.releaser} ← ${member.bloodline.root}`) : "";
22
- const about = member.duty ? paint.cyan(member.duty) : paint.dim(member.note ?? "");
23
- lines.push(` ${pad(label, 46)} ${pad(presence(member), 10)} ${pad(line, 36)} ${about}`);
24
- }
25
- return lines.join("\n");
26
- }
27
-
28
- export class HouseView extends BOS.View {
29
- data({ children, orders, bloodlines, catalog }) {
30
- return { reachable: catalog !== null, children, orders, bloodlines };
31
- }
32
-
33
- text({ children = [], orders = [], bloodlines = [], catalog, options = {} }) {
34
- const lines = [header("House of Anubis"), ""];
35
- if (catalog === null) lines.push(paint.yellow("ollama unreachable: presence and bloodlines unknown"), "");
36
- lines.push(paint.yellow("Children of Anubis") + paint.dim(" adopted by name"), "");
37
- for (const child of children) lines.push(group(child), "");
38
- lines.push(paint.yellow("Orders") + paint.dim(" duties"), "");
39
- for (const order of orders) lines.push(group(order), "");
40
- if (bloodlines.length) {
41
- lines.push(
42
- paint.yellow("Bloodlines") + paint.dim(" every served model by releaser, through its parent_model"),
43
- "",
44
- );
45
- for (const { releaser, models } of bloodlines) {
46
- lines.push(
47
- ` ${pad(releaser, 30)} ${paint.bold(models.length)}${options.all ? ` ${paint.dim(models.join(", "))}` : ""}`,
48
- );
49
- }
50
- if (!options.all) lines.push(paint.dim(" bos house --all lists every model"));
51
- }
52
- return lines.join("\n");
53
- }
54
- }
55
-
56
- export default HouseView;
@@ -1,27 +0,0 @@
1
- // What sinking would have to rescue: projects with their state, and ttystories.
2
- import { BOS } from "../../main.ts";
3
- import { header, pad, paint } from "../terminal/paint.mjs";
4
-
5
- export class InventoryView extends BOS.View {
6
- data({ inventory }) {
7
- return inventory;
8
- }
9
-
10
- text({ inventory }) {
11
- const rows = inventory.projects.map(
12
- ({ scope, project, branch, uncommitted }) =>
13
- ` ${pad(`${scope}/${project}`, 48)} ${paint.cyan(pad(branch ?? "?", 14))} ${uncommitted ? paint.red(`${uncommitted} uncommitted`) : paint.green("clean")}`,
14
- );
15
- return [
16
- header("sinking inventory"),
17
- "",
18
- paint.bold(`projects (${rows.length})`),
19
- ...(rows.length ? rows : [paint.dim(" none in forge")]),
20
- "",
21
- paint.bold(`ttystories (${inventory.ttystories.length})`),
22
- ...inventory.ttystories.map((name) => ` ${name}`),
23
- ].join("\n");
24
- }
25
- }
26
-
27
- export default InventoryView;
@@ -1,31 +0,0 @@
1
- // BOS over the Model Context Protocol (stdio): every TOOLS entry becomes an MCP tool.
2
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
-
5
- import { VERSION } from "../../core/self.mjs";
6
- import { READ_ONLY, TOOLS } from "./tools.mjs";
7
-
8
- export function createMcpServer(bos) {
9
- const server = new McpServer({ name: "bos", version: VERSION });
10
- for (const tool of TOOLS) {
11
- server.registerTool(
12
- tool.name,
13
- { description: tool.description, inputSchema: tool.input, annotations: READ_ONLY },
14
- async (args = {}) => {
15
- try {
16
- const output = await tool.run(bos, args);
17
- return {
18
- content: [{ type: "text", text: typeof output === "string" ? output : JSON.stringify(output, null, 2) }],
19
- };
20
- } catch (error) {
21
- return { isError: true, content: [{ type: "text", text: `${tool.name}: ${error.message}` }] };
22
- }
23
- },
24
- );
25
- }
26
- return server;
27
- }
28
-
29
- export async function startMcpServer(bos) {
30
- await createMcpServer(bos).connect(new StdioServerTransport());
31
- }
@@ -1,87 +0,0 @@
1
- // BOS as MCP tools: what an AI agent may ask the workshop. All read-only: agents look and
2
- // plan through MCP; changing the workshop stays a conscious act on the command line.
3
- import { existsSync, readdirSync, readFileSync } from "node:fs";
4
- import { join } from "node:path";
5
-
6
- import { z } from "zod";
7
-
8
- import { REPO_ROOT } from "../../core/self.mjs";
9
-
10
- const GLOSSARY = join(REPO_ROOT, "docs", "glossary");
11
- const readOnly = { readOnlyHint: true, destructiveHint: false, openWorldHint: false };
12
-
13
- export const TOOLS = [
14
- {
15
- name: "bos_locate",
16
- description:
17
- "Active BOS workshop (~/__WORKSHOP or /media/**/__WORKSHOP), the rule that found it, and where BOS itself sits.",
18
- input: {},
19
- run: async (bos) => bos.command("locate"),
20
- },
21
- {
22
- name: "bos_status",
23
- description:
24
- "Workshop tree (.BOS, devarmory, forge, craftbook, archive): what exists and what is missing; role and mode of work.",
25
- input: {},
26
- run: async (bos) => bos.command("status"),
27
- },
28
- {
29
- name: "bos_house",
30
- description:
31
- "The House of Anubis: adopted children, orders (RavensArmy…), bloodlines of every served model, and each resident's state. Resting residents must never be called.",
32
- input: { all: z.boolean().optional().describe("also list every model per bloodline") },
33
- run: async (bos, { all }) => bos.command("house", [], { all: Boolean(all) }),
34
- },
35
- {
36
- name: "bos_glossary",
37
- description:
38
- "Definition of a BOS element (workshop, forge, scope, sheme, sarcophag, mode, house, raven…) from docs/glossary; without a term, the list of pages.",
39
- input: { term: z.string().optional().describe("element name, e.g. forge") },
40
- run: async (_bos, { term }) => {
41
- if (!term)
42
- return readdirSync(GLOSSARY)
43
- .filter((f) => f.endsWith(".md"))
44
- .map((f) => f.slice(0, -3))
45
- .join("\n");
46
- const page = join(GLOSSARY, `${term.toLowerCase().replace(/[^a-z0-9-]/g, "")}.md`);
47
- return existsSync(page) ? readFileSync(page, "utf8") : `no glossary page for "${term}"`;
48
- },
49
- },
50
- {
51
- name: "bos_describe",
52
- description:
53
- "Conventional-commit draft for what is staged in a git repository (deterministic; Skryba the scribe raven only when asked, it may take up to 90 s).",
54
- input: {
55
- cwd: z.string().describe("path inside the repository"),
56
- skryba: z.boolean().optional().describe("let Skryba refine the draft through ollama"),
57
- },
58
- run: async (bos, { cwd, skryba }) =>
59
- (await bos.workshop.describe({ cwd, skryba: Boolean(skryba) })).message ?? "nothing staged",
60
- },
61
- {
62
- name: "bos_promote_plan",
63
- description:
64
- "Plan (never apply) moving a repository's current branch one station along the flow master → developement → revision → testing → releasing → master.",
65
- input: { cwd: z.string().describe("path inside the repository"), reject: z.boolean().optional() },
66
- run: async (bos, { cwd, reject }) => {
67
- const context = await bos.workshop.run("promoting", { cwd, reject: Boolean(reject), dryRun: true });
68
- return new bos.views.PromotionView().text(context);
69
- },
70
- },
71
- {
72
- name: "bos_sink_inventory",
73
- description:
74
- "Read-only inventory for the sinking protocol: every forge project with branch and uncommitted changes, and the ttystories.",
75
- input: {},
76
- run: async (bos) => bos.command("sink"),
77
- },
78
- {
79
- name: "bos_help",
80
- description:
81
- "BOS commands grouped by mode of work (ALMANAC, CONFORM, SMELTRY, COMMANDORATE, PROVISION), or the help of one command.",
82
- input: { command: z.string().optional() },
83
- run: async (bos, { command }) => bos.command("help", command ? [command] : []),
84
- },
85
- ];
86
-
87
- export const READ_ONLY = readOnly;
@@ -1,34 +0,0 @@
1
- // The modes of work as a menu, and the result of a switch.
2
- import { BOS } from "../../main.ts";
3
- import { MODES } from "../../models/workshop/modes.mjs";
4
- import { header, pad, paint } from "../terminal/paint.mjs";
5
-
6
- export const modeLabel = (mode) =>
7
- mode ? `${paint.magenta(MODES[mode].title)} ${paint.dim(MODES[mode].covers)}` : paint.dim("not chosen: bos mode");
8
-
9
- export class ModeView extends BOS.View {
10
- data({ config, previousMode, event }) {
11
- return { mode: config?.mode ?? null, previousMode: previousMode ?? null, event: event ?? null };
12
- }
13
-
14
- // the chooser's menu, current mode marked
15
- menu(current) {
16
- return [
17
- header("mode of work"),
18
- "",
19
- ...Object.entries(MODES).map(([name, mode]) => {
20
- const mark = name === current ? paint.green("●") : " ";
21
- return ` ${mark} ${paint.yellow(mode.digit)} ${pad(paint.bold(mode.title), 14)} ${paint.dim(mode.covers)}`;
22
- }),
23
- ` ${paint.yellow(0)} ${paint.dim("leave")}`,
24
- "",
25
- ].join("\n");
26
- }
27
-
28
- text({ config, previousMode }) {
29
- if (previousMode === config.mode) return `mode stays ${modeLabel(config.mode)}`;
30
- return `mode ${paint.dim(previousMode ?? "none")} ${paint.yellow("→")} ${modeLabel(config.mode)}`;
31
- }
32
- }
33
-
34
- export default ModeView;
@@ -1,37 +0,0 @@
1
- // One digit, no Enter: 0…max on a terminal. From a pipe: the first digit of the first line.
2
- // Anything else, Ctrl+C or end of input counts as 0 (leave).
3
- import readline from "node:readline";
4
-
5
- export function chooseDigit(prompt, max, { input = process.stdin, output = process.stdout } = {}) {
6
- output.write(prompt);
7
- return new Promise((resolve) => {
8
- const done = (digit) => {
9
- output.write(`${digit}\n`);
10
- resolve(digit);
11
- };
12
- if (input.isTTY) {
13
- readline.emitKeypressEvents(input);
14
- input.setRawMode(true);
15
- input.resume();
16
- const onKey = (text, key = {}) => {
17
- const digit = key.ctrl && key.name === "c" ? 0 : /^\d$/.test(text ?? "") ? Number(text) : null;
18
- if (digit === null || digit > max) return;
19
- input.off("keypress", onKey);
20
- input.setRawMode(false);
21
- input.pause();
22
- done(digit);
23
- };
24
- input.on("keypress", onKey);
25
- } else {
26
- const lines = readline.createInterface({ input });
27
- let answered = false;
28
- lines.once("line", (line) => {
29
- answered = true;
30
- const digit = Number(line.trim()[0]);
31
- lines.close();
32
- done(Number.isInteger(digit) && digit <= max ? digit : 0);
33
- });
34
- lines.once("close", () => answered || done(0));
35
- }
36
- });
37
- }
@@ -1,20 +0,0 @@
1
- // One station along the branch flow: from → to, and the plan.
2
- import { BOS } from "../../main.ts";
3
- import { BRANCHES } from "../../procedures/promoting/branch-flow.mjs";
4
- import { paint } from "../terminal/paint.mjs";
5
-
6
- export class PromotionView extends BOS.View {
7
- data({ from, to, plan, dryRun, pullRequest }) {
8
- return { from, to, plan, dryRun, pullRequest };
9
- }
10
-
11
- text({ from, to, plan, dryRun }) {
12
- return [
13
- `${paint.cyan(from)} ${paint.yellow("→")} ${paint.cyan(to)} ${paint.dim(BRANCHES[to])}`,
14
- ...plan.map((step) => ` ${paint.dim("•")} ${step}`),
15
- dryRun ? paint.dim("dry run: add --apply to execute") : paint.green("applied"),
16
- ].join("\n");
17
- }
18
- }
19
-
20
- export default PromotionView;
@@ -1,30 +0,0 @@
1
- // Interactive BOS: every command at a prompt. A command with its own repl.mjs
2
- // gets the prompt to ask questions; others print their inline output.
3
- import readline from "node:readline/promises";
4
-
5
- import { header, paint } from "../terminal/paint.mjs";
6
-
7
- export async function startRepl(bos) {
8
- const io = readline.createInterface({ input: process.stdin, output: process.stdout });
9
- console.log(header("BOS repl"), paint.dim("· help · exit"));
10
- io.setPrompt(paint.yellow("⚒ bos › "));
11
- io.prompt();
12
- for await (const line of io) {
13
- const [name, ...operands] = line.trim().split(/\s+/).filter(Boolean);
14
- if (name === "exit" || name === "quit") break;
15
- if (name) {
16
- try {
17
- const command = bos.commands[name];
18
- if (!command) throw new Error(`unknown command "${name}"`);
19
- const output = command.repl
20
- ? await command.repl({ bos, operands, flags: bos.options, io })
21
- : await command.inline({ bos, operands, flags: bos.options });
22
- if (output) console.log(typeof output === "string" ? output : JSON.stringify(output, null, 2));
23
- } catch (error) {
24
- console.log(paint.red(error.message));
25
- }
26
- }
27
- io.prompt();
28
- }
29
- io.close();
30
- }
@@ -1,24 +0,0 @@
1
- // Which model has a skill, which got a fresh draft.
2
- import { BOS } from "../../main.ts";
3
- import { header, pad, paint } from "../terminal/paint.mjs";
4
-
5
- export class SkillsView extends BOS.View {
6
- data({ skills, registered, dryRun }) {
7
- return { skills: skills.map(({ name, created }) => ({ name, created })), registered, dryRun };
8
- }
9
-
10
- text({ skills, registered = [], dryRun }) {
11
- const state = (created) => (created ? paint.green(dryRun ? "+ would draft" : "+ drafted") : paint.dim("● exists"));
12
- return [
13
- header("skills"),
14
- "",
15
- ...skills.map(({ name, created }) => ` ${pad(paint.cyan(name), 24)} ${state(created)}`),
16
- "",
17
- registered.length
18
- ? `${dryRun ? "would register" : "registered"} ${registered.length} in marketplace.json`
19
- : paint.dim("marketplace up to date"),
20
- ].join("\n");
21
- }
22
- }
23
-
24
- export default SkillsView;