blacksmith-organization-system 0.4.2 → 1.1.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 (342) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +70 -57
  3. package/dist/bridges/git.d.ts +8 -0
  4. package/dist/bridges/git.js +20 -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 +51 -0
  43. package/dist/main.js +85 -0
  44. package/dist/main.js.map +1 -0
  45. package/dist/models/_index.d.ts +18 -0
  46. package/dist/models/_index.js +20 -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/craftbook/class.d.ts +10 -0
  52. package/dist/models/craftbook/class.js +13 -0
  53. package/dist/models/craftbook/class.js.map +1 -0
  54. package/dist/models/devarmory/class.d.ts +11 -0
  55. package/dist/models/devarmory/class.js +8 -0
  56. package/dist/models/devarmory/class.js.map +1 -0
  57. package/dist/models/devlog/class.d.ts +19 -0
  58. package/dist/models/devlog/class.js +61 -0
  59. package/dist/models/devlog/class.js.map +1 -0
  60. package/dist/models/forge/class.d.ts +9 -0
  61. package/dist/models/forge/class.js +24 -0
  62. package/dist/models/forge/class.js.map +1 -0
  63. package/dist/models/loop/class.d.ts +16 -0
  64. package/dist/models/loop/class.js +56 -0
  65. package/dist/models/loop/class.js.map +1 -0
  66. package/dist/models/loop/data.d.ts +12 -0
  67. package/dist/models/loop/data.js +20 -0
  68. package/dist/models/loop/data.js.map +1 -0
  69. package/dist/models/loop/load.d.ts +5 -0
  70. package/dist/models/loop/load.js +14 -0
  71. package/dist/models/loop/load.js.map +1 -0
  72. package/dist/models/project/anatomy.d.ts +2 -0
  73. package/dist/models/project/anatomy.js +15 -0
  74. package/dist/models/project/anatomy.js.map +1 -0
  75. package/dist/models/project/around.d.ts +3 -0
  76. package/dist/models/project/around.js +13 -0
  77. package/dist/models/project/around.js.map +1 -0
  78. package/dist/models/project/class.d.ts +21 -0
  79. package/dist/models/project/class.js +23 -0
  80. package/dist/models/project/class.js.map +1 -0
  81. package/dist/models/project/git.d.ts +8 -0
  82. package/dist/models/project/git.js +26 -0
  83. package/dist/models/project/git.js.map +1 -0
  84. package/dist/models/project/version.d.ts +6 -0
  85. package/dist/models/project/version.js +23 -0
  86. package/dist/models/project/version.js.map +1 -0
  87. package/dist/models/scope/class.d.ts +21 -0
  88. package/dist/models/scope/class.js +49 -0
  89. package/dist/models/scope/class.js.map +1 -0
  90. package/dist/models/settings/data.d.ts +12 -0
  91. package/dist/models/settings/data.js +9 -0
  92. package/dist/models/settings/data.js.map +1 -0
  93. package/dist/models/settings/load.d.ts +9 -0
  94. package/dist/models/settings/load.js +32 -0
  95. package/dist/models/settings/load.js.map +1 -0
  96. package/dist/models/system/class.d.ts +16 -0
  97. package/dist/models/system/class.js +21 -0
  98. package/dist/models/system/class.js.map +1 -0
  99. package/dist/models/system/parts.d.ts +21 -0
  100. package/dist/models/system/parts.js +22 -0
  101. package/dist/models/system/parts.js.map +1 -0
  102. package/dist/models/system/storylines.d.ts +39 -0
  103. package/dist/models/system/storylines.js +42 -0
  104. package/dist/models/system/storylines.js.map +1 -0
  105. package/dist/models/workshop/class.d.ts +20 -0
  106. package/dist/models/workshop/class.js +43 -0
  107. package/dist/models/workshop/class.js.map +1 -0
  108. package/dist/models/workshop/locate.d.ts +16 -0
  109. package/dist/models/workshop/locate.js +54 -0
  110. package/dist/models/workshop/locate.js.map +1 -0
  111. package/dist/procedures/_index.d.ts +7 -0
  112. package/dist/procedures/_index.js +10 -0
  113. package/dist/procedures/_index.js.map +1 -0
  114. package/dist/procedures/automerging/_index.d.ts +4 -0
  115. package/dist/procedures/automerging/_index.js +8 -0
  116. package/dist/procedures/automerging/_index.js.map +1 -0
  117. package/dist/procedures/automerging/context.d.ts +11 -0
  118. package/dist/procedures/automerging/context.js +2 -0
  119. package/dist/procedures/automerging/context.js.map +1 -0
  120. package/dist/procedures/automerging/steps.d.ts +4 -0
  121. package/dist/procedures/automerging/steps.js +34 -0
  122. package/dist/procedures/automerging/steps.js.map +1 -0
  123. package/dist/procedures/bootstrapping/_index.d.ts +4 -0
  124. package/dist/procedures/bootstrapping/_index.js +8 -0
  125. package/dist/procedures/bootstrapping/_index.js.map +1 -0
  126. package/dist/procedures/bootstrapping/context.d.ts +5 -0
  127. package/dist/procedures/bootstrapping/context.js +2 -0
  128. package/dist/procedures/bootstrapping/context.js.map +1 -0
  129. package/dist/procedures/bootstrapping/ensure-tree.d.ts +2 -0
  130. package/dist/procedures/bootstrapping/ensure-tree.js +5 -0
  131. package/dist/procedures/bootstrapping/ensure-tree.js.map +1 -0
  132. package/dist/procedures/bootstrapping/record.d.ts +2 -0
  133. package/dist/procedures/bootstrapping/record.js +12 -0
  134. package/dist/procedures/bootstrapping/record.js.map +1 -0
  135. package/dist/procedures/bumping/_index.d.ts +4 -0
  136. package/dist/procedures/bumping/_index.js +9 -0
  137. package/dist/procedures/bumping/_index.js.map +1 -0
  138. package/dist/procedures/bumping/context.d.ts +18 -0
  139. package/dist/procedures/bumping/context.js +4 -0
  140. package/dist/procedures/bumping/context.js.map +1 -0
  141. package/dist/procedures/bumping/steps.d.ts +4 -0
  142. package/dist/procedures/bumping/steps.js +50 -0
  143. package/dist/procedures/bumping/steps.js.map +1 -0
  144. package/dist/procedures/inspecting/_index.d.ts +4 -0
  145. package/dist/procedures/inspecting/_index.js +11 -0
  146. package/dist/procedures/inspecting/_index.js.map +1 -0
  147. package/dist/procedures/inspecting/judge.d.ts +2 -0
  148. package/dist/procedures/inspecting/judge.js +6 -0
  149. package/dist/procedures/inspecting/judge.js.map +1 -0
  150. package/dist/procedures/inspecting/read-areas.d.ts +2 -0
  151. package/dist/procedures/inspecting/read-areas.js +5 -0
  152. package/dist/procedures/inspecting/read-areas.js.map +1 -0
  153. package/dist/procedures/inspecting/read-forge.d.ts +2 -0
  154. package/dist/procedures/inspecting/read-forge.js +14 -0
  155. package/dist/procedures/inspecting/read-forge.js.map +1 -0
  156. package/dist/procedures/inspecting/report.d.ts +32 -0
  157. package/dist/procedures/inspecting/report.js +11 -0
  158. package/dist/procedures/inspecting/report.js.map +1 -0
  159. package/dist/procedures/inspecting/rules.d.ts +12 -0
  160. package/dist/procedures/inspecting/rules.js +75 -0
  161. package/dist/procedures/inspecting/rules.js.map +1 -0
  162. package/dist/procedures/proposing/_index.d.ts +4 -0
  163. package/dist/procedures/proposing/_index.js +9 -0
  164. package/dist/procedures/proposing/_index.js.map +1 -0
  165. package/dist/procedures/proposing/context.d.ts +16 -0
  166. package/dist/procedures/proposing/context.js +4 -0
  167. package/dist/procedures/proposing/context.js.map +1 -0
  168. package/dist/procedures/proposing/steps.d.ts +4 -0
  169. package/dist/procedures/proposing/steps.js +46 -0
  170. package/dist/procedures/proposing/steps.js.map +1 -0
  171. package/dist/procedures/versioning/_index.d.ts +16 -0
  172. package/dist/procedures/versioning/_index.js +22 -0
  173. package/dist/procedures/versioning/_index.js.map +1 -0
  174. package/dist/procedures/watching/_index.d.ts +5 -0
  175. package/dist/procedures/watching/_index.js +9 -0
  176. package/dist/procedures/watching/_index.js.map +1 -0
  177. package/dist/procedures/watching/classify.d.ts +5 -0
  178. package/dist/procedures/watching/classify.js +30 -0
  179. package/dist/procedures/watching/classify.js.map +1 -0
  180. package/dist/procedures/watching/context.d.ts +21 -0
  181. package/dist/procedures/watching/context.js +2 -0
  182. package/dist/procedures/watching/context.js.map +1 -0
  183. package/dist/procedures/watching/start.d.ts +2 -0
  184. package/dist/procedures/watching/start.js +24 -0
  185. package/dist/procedures/watching/start.js.map +1 -0
  186. package/dist/procedures/watching/wait.d.ts +2 -0
  187. package/dist/procedures/watching/wait.js +12 -0
  188. package/dist/procedures/watching/wait.js.map +1 -0
  189. package/dist/tools/_index.d.ts +3 -0
  190. package/dist/tools/_index.js +17 -0
  191. package/dist/tools/_index.js.map +1 -0
  192. package/dist/tools/devlog.d.ts +1 -0
  193. package/dist/tools/devlog.js +43 -0
  194. package/dist/tools/devlog.js.map +1 -0
  195. package/dist/tools/flow.d.ts +1 -0
  196. package/dist/tools/flow.js +81 -0
  197. package/dist/tools/flow.js.map +1 -0
  198. package/dist/tools/scope.d.ts +1 -0
  199. package/dist/tools/scope.js +51 -0
  200. package/dist/tools/scope.js.map +1 -0
  201. package/dist/tools/version.d.ts +1 -0
  202. package/dist/tools/version.js +23 -0
  203. package/dist/tools/version.js.map +1 -0
  204. package/dist/tools/workshop.d.ts +1 -0
  205. package/dist/tools/workshop.js +56 -0
  206. package/dist/tools/workshop.js.map +1 -0
  207. package/dist/views/devlog.d.ts +15 -0
  208. package/dist/views/devlog.js +31 -0
  209. package/dist/views/devlog.js.map +1 -0
  210. package/dist/views/event.d.ts +2 -0
  211. package/dist/views/event.js +6 -0
  212. package/dist/views/event.js.map +1 -0
  213. package/dist/views/flow.d.ts +12 -0
  214. package/dist/views/flow.js +26 -0
  215. package/dist/views/flow.js.map +1 -0
  216. package/dist/views/help.d.ts +2 -0
  217. package/dist/views/help.js +22 -0
  218. package/dist/views/help.js.map +1 -0
  219. package/dist/views/status.d.ts +5 -0
  220. package/dist/views/status.js +50 -0
  221. package/dist/views/status.js.map +1 -0
  222. package/package.json +59 -22
  223. package/{system/resources/textarts → resources/cli-art}/big-logo-title.txt +0 -0
  224. package/{system/resources/textarts → resources/cli-art}/big-shortcut-logo-title.txt +0 -0
  225. package/{system/resources/textarts → resources/cli-art}/medium-logo-title.txt +0 -0
  226. package/{system/resources/textarts → resources/cli-art}/minimenu-header.ptxml +0 -0
  227. package/{system/resources/textarts → resources/cli-art}/minimenu-header.txt +0 -0
  228. package/{system/resources/textarts → resources/cli-art}/small-logo-title.txt +0 -0
  229. package/{system/resources/textarts → resources/cli-art}/wellcome.txt +0 -0
  230. package/resources/docs-templates/Home.md +7 -0
  231. package/resources/docs-templates/README.md +14 -0
  232. package/resources/docs-templates/_Footer.md +1 -0
  233. package/resources/docs-templates/_Sidebar.md +7 -0
  234. package/config/README.md +0 -0
  235. package/docs/README.md +0 -15
  236. package/docs/devlog.md +0 -20
  237. package/invoke-api.js +0 -0
  238. package/invoke-cli.js +0 -105
  239. package/invoke-desktop.js +0 -0
  240. package/invoke-exec.js +0 -0
  241. package/invoke-webapp.js +0 -0
  242. package/main.js +0 -33
  243. package/shell-procedures/deploy-new-workshop.sh +0 -15
  244. package/shell-procedures/new-project.sh +0 -0
  245. package/shell-procedures/new-sheme.sh +0 -0
  246. package/shell-procedures/new-superproject.sh +0 -6
  247. package/shell-procedures/open-project.sh +0 -0
  248. package/shell-procedures/pack-backup.sh +0 -22
  249. package/shell-procedures/project-to-sarcophag.sh +0 -0
  250. package/shell-procedures/publicate.sh +0 -0
  251. package/shell-procedures/pull-archive.sh +0 -0
  252. package/shell-procedures/purge-workshop.sh +0 -4
  253. package/shell-procedures/push-to-bos-server.sh +0 -0
  254. package/shell-procedures/start-cli-interface.sh +0 -1
  255. package/shell-procedures/sweep-into-throwbox.sh +0 -0
  256. package/shell-procedures/synchronize.sh +0 -7
  257. package/system/bridges/README.md +0 -4
  258. package/system/bridges/main.js +0 -41
  259. package/system/commands/README.md +0 -0
  260. package/system/commands/debug.js +0 -20
  261. package/system/commands/exit.js +0 -19
  262. package/system/core/README.md +0 -0
  263. package/system/core/basic-subject-model.js +0 -200
  264. package/system/core/config-controll.js +0 -51
  265. package/system/core/contain-controll.js +0 -28
  266. package/system/core/event-controll.js +0 -12
  267. package/system/core/extending-mod.js +0 -145
  268. package/system/core/main.js +0 -184
  269. package/system/core/raport-controll.js +0 -10
  270. package/system/core/static-extender.js +0 -19
  271. package/system/factors/README.md +0 -0
  272. package/system/factors/bridge-factory.js +0 -5
  273. package/system/factors/command-factory.js +0 -45
  274. package/system/factors/config-factory.js +0 -6
  275. package/system/factors/controller-factory.js +0 -5
  276. package/system/factors/interface-factory.js +0 -70
  277. package/system/factors/model-factory.js +0 -0
  278. package/system/interfaces/README.md +0 -28
  279. package/system/interfaces/cli/index.js +0 -96
  280. package/system/interfaces/cli/init.js +0 -47
  281. package/system/interfaces/cli/loop.js +0 -7
  282. package/system/interfaces/cli/on-close.js +0 -17
  283. package/system/interfaces/cli/on-line.js +0 -24
  284. package/system/interfaces/cli/on-resume.js +0 -15
  285. package/system/interfaces/cli/setup.js +0 -8
  286. package/system/models/README.md +0 -47
  287. package/system/models/archive/README.md +0 -0
  288. package/system/models/archive/actions/README.md +0 -0
  289. package/system/models/archive/class.js +0 -23
  290. package/system/models/archive/events/README.md +0 -0
  291. package/system/models/archive/index.json +0 -18
  292. package/system/models/archive/listeners/README.md +0 -0
  293. package/system/models/archive/methods/README.md +0 -0
  294. package/system/models/forge/README.md +0 -0
  295. package/system/models/forge/actions/README.md +0 -0
  296. package/system/models/forge/class.js +0 -23
  297. package/system/models/forge/events/README.md +0 -0
  298. package/system/models/forge/index.json +0 -18
  299. package/system/models/forge/listeners/README.md +0 -0
  300. package/system/models/forge/methods/README.md +0 -0
  301. package/system/models/project/README.md +0 -0
  302. package/system/models/project/actions/README.md +0 -0
  303. package/system/models/project/class.js +0 -23
  304. package/system/models/project/events/README.md +0 -0
  305. package/system/models/project/index.json +0 -18
  306. package/system/models/project/listeners/README.md +0 -0
  307. package/system/models/project/methods/README.md +0 -0
  308. package/system/models/sarcophag/README.md +0 -0
  309. package/system/models/sarcophag/actions/README.md +0 -0
  310. package/system/models/sarcophag/class.js +0 -22
  311. package/system/models/sarcophag/events/README.md +0 -0
  312. package/system/models/sarcophag/index.json +0 -18
  313. package/system/models/sarcophag/listeners/README.md +0 -0
  314. package/system/models/sarcophag/methods/README.md +0 -0
  315. package/system/models/sheme/README.md +0 -0
  316. package/system/models/sheme/actions/README.md +0 -0
  317. package/system/models/sheme/class.js +0 -23
  318. package/system/models/sheme/events/README.md +0 -0
  319. package/system/models/sheme/index.json +0 -18
  320. package/system/models/sheme/listeners/README.md +0 -0
  321. package/system/models/sheme/methods/README.md +0 -0
  322. package/system/models/superproject/README.md +0 -0
  323. package/system/models/superproject/actions/README.md +0 -0
  324. package/system/models/superproject/class.js +0 -23
  325. package/system/models/superproject/events/README.md +0 -0
  326. package/system/models/superproject/index.json +0 -18
  327. package/system/models/superproject/listeners/README.md +0 -0
  328. package/system/models/superproject/methods/README.md +0 -0
  329. package/system/models/throwbox/README.md +0 -0
  330. package/system/models/throwbox/actions/README.md +0 -0
  331. package/system/models/throwbox/class.js +0 -23
  332. package/system/models/throwbox/events/README.md +0 -0
  333. package/system/models/throwbox/index.json +0 -18
  334. package/system/models/throwbox/listeners/README.md +0 -0
  335. package/system/models/throwbox/methods/README.md +0 -0
  336. package/system/models/workshop/README.md +0 -0
  337. package/system/models/workshop/actions/README.md +0 -0
  338. package/system/models/workshop/class.js +0 -22
  339. package/system/models/workshop/events/README.md +0 -0
  340. package/system/models/workshop/index.json +0 -18
  341. package/system/models/workshop/listeners/README.md +0 -0
  342. package/system/models/workshop/methods/README.md +0 -0
package/LICENSE CHANGED
File without changes
package/README.md CHANGED
@@ -1,83 +1,96 @@
1
-
2
- # Blacksmith Organization System
3
-
4
1
  ```
5
- █▄▄ █░░ ▄▀█ █▀▀ █▄▀ █▀ █▀▄▀█ █ ▀█▀ █░█
6
- █▄█ █▄▄ █▀█ █▄▄ █░█ ▄█ █░▀░█ █ ░█░ █▀█
2
+ █▄▄ █░░ ▄▀█ █▀▀ █▄▀ █▀ █▀▄▀█ █ ▀█▀ █░█
3
+ █▄█ █▄▄ █▀█ █▄▄ █░█ ▄█ █░▀░█ █ ░█░ █▀█
7
4
 
8
- █▀█ █▀█ █▀▀ ▄▀█ █▄░█ █ ▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█
9
- █▄█ █▀▄ █▄█ █▀█ █░▀█ █ █▄ █▀█ ░█░ █ █▄█ █░▀█
5
+ █▀█ █▀█ █▀▀ ▄▀█ █▄░█ █ ▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█
6
+ █▄█ █▀▄ █▄█ █▀█ █░▀█ █ █▄ █▀█ ░█░ █ █▄█ █░▀█
10
7
 
11
- █▀ █▄█ █▀ ▀█▀ █▀▀ █▀▄▀█
12
- ▄█ ░█░ ▄█ ░█░ ██▄ █░▀░█
8
+ █▀ █▄█ █▀ ▀█▀ █▀▀ █▀▄▀█
9
+ ▄█ ░█░ ▄█ ░█░ ██▄ █░▀░█
13
10
  ```
14
-
15
- ### automation of management in personal forest of projects
16
- > ###### Sett Sarverott @ 2019-2024
17
- > Part of R tier project "ANUBIS",
18
-
11
+ > ###### [Sett Sarverott](https://github.com/Sarverott) @ 2019-2026
19
12
  ---
20
13
 
21
- ### about:
22
-
23
- - basic and effective metodology of catalogization of project types, gouping parts of project and families of related projects and maintenance working condition
24
-
25
- - strategy invented espesialy for mad science of wast and divesed chaos of technomantic workspaces, tested in action, with clearified concrete concept
26
-
27
- - software system, that proofs mechanically, that it can be easy automated to help automate many casual software tasks
28
-
29
- - perfect solution for long term maintain and archivisation of life work in multiple areas of artistical and informatical activity.
14
+ # The core of the Blacksmith Organization System
30
15
 
31
- ---
32
-
33
- ### results of usage:
16
+ A programmer's work gets scattered across machines, drives and servers, and
17
+ the copies drift apart: *variantogeddon*. BOS gives every host the same fixed
18
+ shape, a **workshop**, and keeps that shape by code:
34
19
 
35
- - enjoy passion
36
- - skip mindless routines
37
- - keep productivity and quality of production
38
- - protect your work from version collisions and data losts
39
- - organize your life like ultimate boss of all cyberpunk blacksmiths
40
- - take controll of your forge.
41
- ---
20
+ - **builds the base** of the environment: `__WORKSHOP` with its areas
21
+ `.BOS`, `devarmory`, `forge`, `craftbook`, `archive`, creating only what is
22
+ missing and never overwriting;
23
+ - **listens** to every change in it and says where it happened: area › scope
24
+ › project;
25
+ - **inspects** it as one coherent environment: every scope and project in the
26
+ forge (branch, version, anatomy) and what is out of order;
27
+ - runs the **craft loop** every BOS project follows: branches, steps, phases,
28
+ milestones and their versions (semver `vX.Y.Z` for projects, GRIH
29
+ `vG.R.I.H` for scopes).
42
30
 
43
- ###### Source problems that makes me able to think it's more than possible
31
+ This is the core: a TypeScript module and the `bos` command.
44
32
 
45
- The basic idea was to automate repository controll and make order in project folders for better workspaces' view and controll with easier projects and publication management. Basic idea was work well and just methods of workshop dirtree was big success in local workspace area. Problem appears when new workspaces joins area of my operations and variantogeddon from desynchronization of version grows to uncontrollable sizes. Next issues become visible, after attempts to maintain speed of commiting and supporting publications boundles in thesame time, using conventional methods. But this was only beginning...
33
+ ## Install
46
34
 
47
- ---
35
+ Node ≥ 22.18.
48
36
 
49
- ### Details of project:
37
+ ```sh
38
+ npm install --global blacksmith-organization-system # gives the command `bos`
39
+ npx blacksmith-organization-system help # or without installing
40
+ ```
50
41
 
51
- - [About Models](./system/models/README.md) - workspace tree elements
42
+ ## Use
52
43
 
53
- - [About Interfaces](./system/interfaces/README.md) - for standard interactions
44
+ ```sh
45
+ bos workshop status # the whole workshop: areas, scopes, projects, findings
46
+ bos workshop bootstrap --dryRun # what is missing; without --dryRun, create it
47
+ bos workshop watch --record # one line per change until Ctrl+C, kept in .BOS/storylines
48
+ bos scope bump <scope> phase # raise a scope's GRIH version: step, phase, milestone, flip
49
+ bos devlog state # where a project stands, from its docs/devlog/
50
+ bos help # every tool; --json gives machines the data
51
+ ```
54
52
 
55
- - [About Bridges](./system/bridges/README.md) - integration with other systems
53
+ Which workshop: `--workshop=<path>`, else `$BOS_WORKSHOP`, else
54
+ `$WORKSHOP_ROOT/__WORKSHOP`, else the nearest parent `__WORKSHOP`, else
55
+ `~/__WORKSHOP`. `$WORKSHOP_RENAME` changes the name `__WORKSHOP`.
56
+ `bos workshop locate` says which one and why. Only `bootstrap` and `bump`
57
+ write, and they create only what is missing.
56
58
 
57
- - [About BOS Core](./system/core/README.md) - heart of cyberpunk blacksmith work
59
+ As a library:
58
60
 
59
- - [About Factories](./system/factors/README.md) - templates for elements of BOS
61
+ ```ts
62
+ import { BOS, NodeHost } from "blacksmith-organization-system";
60
63
 
61
- - [About Commands](./system/commands/README.md) - common set of commands
64
+ const bos = new BOS(new NodeHost());
65
+ await bos.bootstrap();
66
+ const report = await bos.inspect();
67
+ console.log(report.forge.scopes.length, report.findings.length);
68
+ ```
62
69
 
63
- - [About resources](./system/resources/README.md) - non-executable files
70
+ ## Documentation
64
71
 
65
- - ~[Documentation](./docs/README.md) - main documentation~
72
+ https://blacksmith-organization-system.readthedocs.io/: the
73
+ [glossary](https://blacksmith-organization-system.readthedocs.io/en/latest/glossary/)
74
+ (every element of a workshop), the architecture of the core, the devlog and
75
+ the changelog. To work on BOS itself:
76
+ [CONTRIBUTING](https://github.com/Sarverott/blacksmith-organization-system/blob/development/.github/CONTRIBUTING.md).
66
77
 
67
- - [DEV-LOG](./docs/devlog.md) - some scrap notes
78
+ The agents' skills and the Claude Code plugin are
79
+ [bos-skillset](https://github.com/Sarverott/bos-skillset), which builds on
80
+ this core.
68
81
 
69
- ---
82
+ ## Where the idea came from
70
83
 
71
- ### References:
84
+ The basic idea was to automate repository control and make order in project
85
+ folders for better workspaces' view and control, with easier projects and
86
+ publication management. The workshop dirtree worked well in one local
87
+ workspace. Problems appeared when new workspaces joined, and variantogeddon
88
+ from desynchronized versions grew out of control; then more, when keeping up
89
+ the speed of commits and publication bundles at the same time with
90
+ conventional methods. But this was only the beginning…
72
91
 
73
- - ~npm REPO: https://www.npmjs.com/package/blacksmith-organization-system~
74
- - GitHub REPO: https://github.com/Sarverott/blacksmith-organization-system
75
- - also good to see about:
76
- - uses [carnival-toolbox](https://github.com/Sarverott/carnival-toolbox): npm library with many usefull tools
77
- - part of [project anubis](https://github.com/Sarverott/anubis-helpmate): ultimate acolyte assisting programm
78
- - ~[article about BOS metodology](https://sarverott.com/)~
92
+ The legacy CommonJS core (v0.6.1) is kept as the git tag `legacy/v0.6.1`.
79
93
 
80
- ---
94
+ ## License
81
95
 
82
- ### LICENSE:
83
- > Copyright (c) 2019 Sett Sarverott, released on terms of MIT license
96
+ Copyright (c) 2019-2026 Sett Sarverott, released on terms of the [MIT license](LICENSE).
@@ -0,0 +1,8 @@
1
+ import type { Host } from "../core/host.ts";
2
+ export declare class Git {
3
+ readonly host: Host;
4
+ readonly cwd: string;
5
+ constructor(host: Host, cwd: string);
6
+ git(args: string[]): string;
7
+ tagExists(tag: string): boolean;
8
+ }
@@ -0,0 +1,20 @@
1
+ export class Git {
2
+ host;
3
+ // the directory of the repository
4
+ cwd;
5
+ constructor(host, cwd) {
6
+ this.host = host;
7
+ this.cwd = cwd;
8
+ }
9
+ git(args) {
10
+ const { status, stdout, stderr } = this.host.run("git", args, { cwd: this.cwd });
11
+ if (status !== 0)
12
+ throw new Error(`git ${args.slice(0, 2).join(" ")}: ${(stderr || stdout).trim()}`);
13
+ return stdout.trim();
14
+ }
15
+ // is the tag in this clone (in CI: checked out with its tags)
16
+ tagExists(tag) {
17
+ return this.git(["tag", "--list", tag]) === tag;
18
+ }
19
+ }
20
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/bridges/git.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,GAAG;IACL,IAAI,CAAO;IACpB,kCAAkC;IACzB,GAAG,CAAS;IAErB,YAAY,IAAU,EAAE,GAAW;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,GAAG,CAAC,IAAc;QAChB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACjF,IAAI,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrG,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAED,8DAA8D;IAC9D,SAAS,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;IAClD,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ import type { Host } from "../core/host.ts";
2
+ export type Comparison = {
3
+ aheadBy: number;
4
+ commits: {
5
+ parents: number;
6
+ message: string;
7
+ }[];
8
+ };
9
+ export type PullRequest = {
10
+ number: number;
11
+ state: string;
12
+ base: string;
13
+ head: string;
14
+ crossRepository: boolean;
15
+ };
16
+ export declare class GitHub {
17
+ readonly host: Host;
18
+ readonly cwd: string;
19
+ constructor(host: Host, cwd: string);
20
+ gh(args: string[]): string;
21
+ json<T>(args: string[]): T;
22
+ repository(): string;
23
+ compare(base: string, head: string): Comparison;
24
+ openPullRequest(head: string, base: string): number | null;
25
+ createPullRequest(head: string, base: string, title: string, body: string): number;
26
+ pullRequest(number: number): PullRequest;
27
+ merge(number: number): void;
28
+ }
@@ -0,0 +1,71 @@
1
+ export class GitHub {
2
+ host;
3
+ // the directory of the repository; gh finds the repository from its remote
4
+ cwd;
5
+ constructor(host, cwd) {
6
+ this.host = host;
7
+ this.cwd = cwd;
8
+ }
9
+ gh(args) {
10
+ const { status, stdout, stderr } = this.host.run("gh", args, { cwd: this.cwd });
11
+ if (status !== 0)
12
+ throw new Error(`gh ${args.slice(0, 2).join(" ")}: ${(stderr || stdout).trim()}`);
13
+ return stdout.trim();
14
+ }
15
+ json(args) {
16
+ return JSON.parse(this.gh(args));
17
+ }
18
+ // owner/name: $GITHUB_REPOSITORY inside Actions, else asked from gh
19
+ repository() {
20
+ return (this.host.env("GITHUB_REPOSITORY") ||
21
+ this.gh(["repo", "view", "--json", "nameWithOwner", "--jq", ".nameWithOwner"]));
22
+ }
23
+ // what head has that base has not
24
+ compare(base, head) {
25
+ const raw = this.json([
26
+ "api",
27
+ `repos/${this.repository()}/compare/${base}...${head}`,
28
+ ]);
29
+ return {
30
+ aheadBy: raw.ahead_by,
31
+ commits: raw.commits.map((c) => ({ parents: c.parents.length, message: c.commit.message })),
32
+ };
33
+ }
34
+ // the open pull request from head into base, if any
35
+ openPullRequest(head, base) {
36
+ const found = this.json([
37
+ "pr",
38
+ "list",
39
+ "--head",
40
+ head,
41
+ "--base",
42
+ base,
43
+ "--state",
44
+ "open",
45
+ "--json",
46
+ "number",
47
+ ]);
48
+ return found[0]?.number ?? null;
49
+ }
50
+ createPullRequest(head, base, title, body) {
51
+ const url = this.gh(["pr", "create", "--head", head, "--base", base, "--title", title, "--body", body]);
52
+ const number = Number(url.replace(/\/+$/, "").split("/").pop());
53
+ if (!Number.isInteger(number))
54
+ throw new Error(`gh pr create: no pull request number in "${url}"`);
55
+ return number;
56
+ }
57
+ pullRequest(number) {
58
+ const raw = this.json(["pr", "view", String(number), "--json", "number,state,baseRefName,headRefName,isCrossRepository"]);
59
+ return {
60
+ number: raw.number,
61
+ state: raw.state,
62
+ base: raw.baseRefName,
63
+ head: raw.headRefName,
64
+ crossRepository: raw.isCrossRepository,
65
+ };
66
+ }
67
+ merge(number) {
68
+ this.gh(["pr", "merge", String(number), "--merge"]);
69
+ }
70
+ }
71
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/bridges/github.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env node
2
+ // bos <model> <tool> [operands] [--flags] · bos help · bos --version
3
+ import { existsSync, readFileSync } from "node:fs";
4
+ import { inputFor, parseArgs } from "./core/tool.js";
5
+ import { NodeHost } from "./hosts/node.js";
6
+ import { BOS } from "./main.js";
7
+ import { findTool, TOOLS } from "./tools/_index.js";
8
+ import { helpText } from "./views/help.js";
9
+ const VERSION = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8")).version;
10
+ // A checkout of the core may carry its own .env (see .env.example): the workshop it is developed
11
+ // against, e.g. WORKSHOP_ROOT on a test partition, so the home workshop stays out of sight.
12
+ // An installed package has none; variables already set in the shell win.
13
+ const CHECKOUT_ENV = new URL("../.env", import.meta.url);
14
+ if (existsSync(CHECKOUT_ENV))
15
+ process.loadEnvFile(CHECKOUT_ENV);
16
+ async function main(argv) {
17
+ const { operands, flags } = parseArgs(argv);
18
+ const { workshop, json, ...toolFlags } = flags;
19
+ if (flags.version) {
20
+ console.log(VERSION);
21
+ return 0;
22
+ }
23
+ const [model, name, ...rest] = operands;
24
+ if (!model || model === "help") {
25
+ console.log(helpText(TOOLS, VERSION));
26
+ return 0;
27
+ }
28
+ const entry = findTool(model, name);
29
+ if (json && entry.args.some((arg) => arg.name === "json"))
30
+ toolFlags.json = json;
31
+ const input = inputFor(entry, rest, toolFlags);
32
+ const bos = new BOS(new NodeHost(), { workshop: typeof workshop === "string" ? workshop : undefined });
33
+ const stop = new AbortController();
34
+ process.once("SIGINT", () => stop.abort());
35
+ const result = await entry.run(bos, input, { print: (line) => console.log(line), signal: stop.signal });
36
+ // a streaming tool prints its lines itself; its closing summary goes to stderr, so stdout holds only data
37
+ const streams = entry.args.some((arg) => arg.name === "json");
38
+ const text = entry.render ? entry.render(result, input) : JSON.stringify(result ?? null, null, 2);
39
+ if (streams)
40
+ console.error(text);
41
+ else if (json)
42
+ console.log(JSON.stringify(result ?? null, null, 2));
43
+ else
44
+ console.log(text);
45
+ return 0;
46
+ }
47
+ main(process.argv.slice(2)).then((code) => {
48
+ process.exitCode = code;
49
+ }, (error) => {
50
+ console.error(`bos: ${error instanceof Error ? error.message : String(error)}`);
51
+ process.exitCode = 1;
52
+ });
53
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Host } from "./host.ts";
2
+ export type TraceEntry = {
3
+ procedure: string;
4
+ step: string;
5
+ ok: boolean;
6
+ ms?: number;
7
+ error?: string;
8
+ };
9
+ export type Context = {
10
+ host: Host;
11
+ dryRun: boolean;
12
+ changes: string[];
13
+ trace: TraceEntry[];
14
+ };
15
+ export declare function createContext(host: Host, { dryRun }?: {
16
+ dryRun?: boolean | undefined;
17
+ }): Context;
18
+ export declare function createIfMissing(context: Context, target: string, create: () => void): boolean;
@@ -0,0 +1,14 @@
1
+ export function createContext(host, { dryRun = false } = {}) {
2
+ return { host, dryRun, changes: [], trace: [] };
3
+ }
4
+ // create target with create() only when it is missing; never overwrite.
5
+ // In a dry run nothing is written, but the plan is still recorded in changes.
6
+ export function createIfMissing(context, target, create) {
7
+ if (context.host.exists(target))
8
+ return false;
9
+ if (!context.dryRun)
10
+ create();
11
+ context.changes.push(target);
12
+ return true;
13
+ }
14
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,aAAa,CAAC,IAAU,EAAE,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,EAAE;IAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAClD,CAAC;AAED,wEAAwE;AACxE,8EAA8E;AAC9E,MAAM,UAAU,eAAe,CAAC,OAAgB,EAAE,MAAc,EAAE,MAAkB;IAClF,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,MAAM,EAAE,CAAC;IAC9B,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { type Context } from "./context.ts";
2
+ import type { Host } from "./host.ts";
3
+ export type Descriptor = (element: Element, context: Context) => string | object;
4
+ export type ElementClass = {
5
+ new (host: Host, path: string, parent?: Element | null): Element;
6
+ type: string;
7
+ dirname: string | null;
8
+ mandatory: boolean;
9
+ children: ElementClass[];
10
+ descriptors: Record<string, Descriptor>;
11
+ };
12
+ export type ElementNode = {
13
+ type: string;
14
+ path: string;
15
+ exists: boolean;
16
+ mandatory: boolean;
17
+ descriptors: {
18
+ name: string;
19
+ exists: boolean;
20
+ }[];
21
+ children: ElementNode[];
22
+ };
23
+ export declare class Element {
24
+ static type: string;
25
+ static dirname: string | null;
26
+ static mandatory: boolean;
27
+ static children: ElementClass[];
28
+ static descriptors: Record<string, Descriptor>;
29
+ readonly host: Host;
30
+ readonly path: string;
31
+ readonly parent: Element | null;
32
+ constructor(host: Host, path: string, parent?: Element | null);
33
+ get kind(): ElementClass;
34
+ get type(): string;
35
+ get name(): string;
36
+ file(...names: string[]): string;
37
+ exists(): boolean;
38
+ child<T extends Element>(Kind: {
39
+ new (host: Host, path: string, parent?: Element | null): T;
40
+ dirname: string | null;
41
+ }): T;
42
+ childElements(): Element[];
43
+ ensure(context: Context): this;
44
+ inspect(parentMandatory?: boolean): ElementNode;
45
+ readJSON<T>(name: string, fallback: T): T;
46
+ writeJSON(name: string, value: object, context: Context): void;
47
+ toString(): string;
48
+ }
49
+ export declare function serialize(content: string | object): string;
@@ -0,0 +1,97 @@
1
+ // Element anatomy (glossary: element-anatomy): a directory plus descriptor files.
2
+ // Every model of the workshop is an Element. Its fixed parts are declared once,
3
+ // statically, and the same declaration drives creating (ensure) and reading (inspect).
4
+ // class Forge extends Element { static type = "forge"; static dirname = "forge"; }
5
+ import { createIfMissing } from "./context.js";
6
+ import { basename, join } from "./paths.js";
7
+ export class Element {
8
+ static type = "element";
9
+ // fixed directory name, relative to the parent; null for freely named elements (a scope, a project)
10
+ static dirname = null;
11
+ // created together with its parent when missing
12
+ static mandatory = true;
13
+ // fixed child elements (areas, organs), in the order they are shown
14
+ static children = [];
15
+ // { filename: default content } written when missing, never overwritten
16
+ static descriptors = {};
17
+ host;
18
+ path;
19
+ parent;
20
+ constructor(host, path, parent = null) {
21
+ this.host = host;
22
+ this.path = path;
23
+ this.parent = parent;
24
+ }
25
+ get kind() {
26
+ return this.constructor;
27
+ }
28
+ get type() {
29
+ return this.kind.type;
30
+ }
31
+ get name() {
32
+ return basename(this.path);
33
+ }
34
+ file(...names) {
35
+ return join(this.path, ...names);
36
+ }
37
+ exists() {
38
+ return this.host.isDirectory(this.path);
39
+ }
40
+ child(Kind) {
41
+ return new Kind(this.host, this.file(Kind.dirname ?? ""), this);
42
+ }
43
+ childElements() {
44
+ return this.kind.children.map((Kind) => this.child(Kind));
45
+ }
46
+ // create the directory, missing descriptors and mandatory children; never overwrite
47
+ ensure(context) {
48
+ createIfMissing(context, this.path, () => this.host.mkdir(this.path));
49
+ for (const [name, content] of Object.entries(this.kind.descriptors)) {
50
+ const target = this.file(name);
51
+ createIfMissing(context, target, () => this.host.writeText(target, serialize(content(this, context))));
52
+ }
53
+ for (const child of this.childElements()) {
54
+ if (child.kind.mandatory)
55
+ child.ensure(context);
56
+ }
57
+ return this;
58
+ }
59
+ // what exists of this element and its fixed parts; reads only
60
+ inspect(parentMandatory = true) {
61
+ const mandatory = parentMandatory && this.kind.mandatory;
62
+ return {
63
+ type: this.type,
64
+ path: this.path,
65
+ exists: this.exists(),
66
+ mandatory,
67
+ descriptors: Object.keys(this.kind.descriptors).map((name) => ({
68
+ name,
69
+ exists: this.host.exists(this.file(name)),
70
+ })),
71
+ children: this.childElements().map((child) => child.inspect(mandatory)),
72
+ };
73
+ }
74
+ readJSON(name, fallback) {
75
+ const text = this.host.readText(this.file(name));
76
+ if (text === null)
77
+ return fallback;
78
+ try {
79
+ return JSON.parse(text);
80
+ }
81
+ catch {
82
+ return fallback;
83
+ }
84
+ }
85
+ writeJSON(name, value, context) {
86
+ if (!context.dryRun)
87
+ this.host.writeText(this.file(name), serialize(value));
88
+ context.changes.push(this.file(name));
89
+ }
90
+ toString() {
91
+ return `[<BOS.${this.type}::${this.path}>]`;
92
+ }
93
+ }
94
+ export function serialize(content) {
95
+ return typeof content === "string" ? content : `${JSON.stringify(content, null, 2)}\n`;
96
+ }
97
+ //# sourceMappingURL=element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element.js","sourceRoot":"","sources":["../../src/core/element.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export type Entry = {
2
+ name: string;
3
+ directory: boolean;
4
+ };
5
+ export type Change = {
6
+ path: string;
7
+ kind: "change" | "rename";
8
+ };
9
+ export type RunResult = {
10
+ status: number;
11
+ stdout: string;
12
+ stderr: string;
13
+ };
14
+ export interface Host {
15
+ exists(path: string): boolean;
16
+ isDirectory(path: string): boolean;
17
+ list(path: string): Entry[];
18
+ readText(path: string): string | null;
19
+ writeText(path: string, text: string): void;
20
+ appendText(path: string, text: string): void;
21
+ mkdir(path: string): void;
22
+ watch(root: string, onChange: (change: Change) => void, onError: (error: Error) => void, skip?: (relative: string) => boolean): () => void;
23
+ run(command: string, args: string[], options?: {
24
+ cwd?: string;
25
+ }): RunResult;
26
+ env(name: string): string | undefined;
27
+ home(): string;
28
+ cwd(): string;
29
+ hostname(): string;
30
+ user(): string;
31
+ now(): number;
32
+ }
@@ -0,0 +1,5 @@
1
+ // The one door between the core and the machine it runs on. Models and procedures
2
+ // touch files, clocks and the environment only through a Host, so the same core can
3
+ // run on Node (hosts/node.ts) today and on other runtimes later.
4
+ export {};
5
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/core/host.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,oFAAoF;AACpF,iEAAiE"}
@@ -0,0 +1,5 @@
1
+ export declare function join(...parts: string[]): string;
2
+ export declare function normalize(path: string): string;
3
+ export declare function basename(path: string): string;
4
+ export declare function dirname(path: string): string;
5
+ export declare function inside(root: string, target: string): string | null;