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
@@ -0,0 +1,42 @@
1
+ // POSIX paths without node:path, so the core runs wherever a Host can be written.
2
+ // Every path the core keeps is absolute and uses "/".
3
+ export function join(...parts) {
4
+ return normalize(parts.filter(Boolean).join("/"));
5
+ }
6
+ export function normalize(path) {
7
+ const absolute = path.startsWith("/");
8
+ const out = [];
9
+ for (const part of path.split("/")) {
10
+ if (!part || part === ".")
11
+ continue;
12
+ if (part === "..") {
13
+ if (out.length && out[out.length - 1] !== "..")
14
+ out.pop();
15
+ else if (!absolute)
16
+ out.push("..");
17
+ continue;
18
+ }
19
+ out.push(part);
20
+ }
21
+ const body = out.join("/");
22
+ return absolute ? `/${body}` : body || ".";
23
+ }
24
+ export function basename(path) {
25
+ return normalize(path).split("/").pop() ?? "";
26
+ }
27
+ export function dirname(path) {
28
+ const parts = normalize(path).split("/");
29
+ parts.pop();
30
+ const parent = parts.join("/");
31
+ return parent || "/";
32
+ }
33
+ // "a/b" when target = root/a/b; "" when equal; null when target is outside root
34
+ export function inside(root, target) {
35
+ const base = normalize(root);
36
+ const path = normalize(target);
37
+ if (path === base)
38
+ return "";
39
+ const prefix = base === "/" ? "/" : `${base}/`;
40
+ return path.startsWith(prefix) ? path.slice(prefix.length) : null;
41
+ }
42
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,sDAAsD;AAEtD,MAAM,UAAU,IAAI,CAAC,GAAG,KAAe;IACrC,OAAO,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG;YAAE,SAAS;QACpC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI;gBAAE,GAAG,CAAC,GAAG,EAAE,CAAC;iBACrD,IAAI,CAAC,QAAQ;gBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,KAAK,CAAC,GAAG,EAAE,CAAC;IACZ,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,MAAM,IAAI,GAAG,CAAC;AACvB,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,MAAc;IACjD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;IAC/C,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACpE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Context } from "./context.ts";
2
+ export type Step<C extends Context> = {
3
+ name: string;
4
+ run: (context: C) => void | Promise<void>;
5
+ };
6
+ export declare class Procedure<C extends Context = Context> {
7
+ readonly name: string;
8
+ readonly steps: Step<C>[];
9
+ constructor(name: string, steps: Step<C>[]);
10
+ run(context: C): Promise<C>;
11
+ }
@@ -0,0 +1,24 @@
1
+ export class Procedure {
2
+ name;
3
+ steps;
4
+ constructor(name, steps) {
5
+ this.name = name;
6
+ this.steps = steps;
7
+ }
8
+ async run(context) {
9
+ for (const step of this.steps) {
10
+ const started = context.host.now();
11
+ try {
12
+ await step.run(context);
13
+ context.trace.push({ procedure: this.name, step: step.name, ok: true, ms: context.host.now() - started });
14
+ }
15
+ catch (error) {
16
+ const message = error instanceof Error ? error.message : String(error);
17
+ context.trace.push({ procedure: this.name, step: step.name, ok: false, error: message });
18
+ throw new Error(`${this.name} › ${step.name}: ${message}`, { cause: error });
19
+ }
20
+ }
21
+ return context;
22
+ }
23
+ }
24
+ //# sourceMappingURL=procedure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"procedure.js","sourceRoot":"","sources":["../../src/core/procedure.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,SAAS;IACX,IAAI,CAAS;IACb,KAAK,CAAY;IAE1B,YAAY,IAAY,EAAE,KAAgB;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAU;QAClB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACxB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;YAC5G,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;gBACzF,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,33 @@
1
+ import type { BOS } from "../main.ts";
2
+ export type Arg = {
3
+ name: string;
4
+ type: "string" | "boolean";
5
+ info: string;
6
+ positional?: boolean;
7
+ required?: boolean;
8
+ };
9
+ export type Input = Record<string, string | boolean | undefined>;
10
+ export type IO = {
11
+ print: (line: string) => void;
12
+ signal: AbortSignal;
13
+ };
14
+ export type Tool = {
15
+ model: string;
16
+ name: string;
17
+ info: string;
18
+ readOnly: boolean;
19
+ args: Arg[];
20
+ run: (bos: BOS, input: Input, io: IO) => unknown | Promise<unknown>;
21
+ render?: (result: never, input: Input) => string;
22
+ };
23
+ export declare function tool<R>(definition: Omit<Tool, "run" | "render" | "args" | "readOnly"> & {
24
+ args?: Arg[];
25
+ readOnly?: boolean;
26
+ run: (bos: BOS, input: Input, io: IO) => R | Promise<R>;
27
+ render?: (result: Awaited<R>, input: Input) => string;
28
+ }): Tool;
29
+ export declare function parseArgs(argv: string[]): {
30
+ operands: string[];
31
+ flags: Record<string, string | boolean>;
32
+ };
33
+ export declare function inputFor(entry: Tool, operands: string[], flags: Record<string, string | boolean>): Input;
@@ -0,0 +1,44 @@
1
+ export function tool(definition) {
2
+ return { args: [], readOnly: true, ...definition };
3
+ }
4
+ // "--dry-run --workshop=/x a b" → flags { dryRun: true, workshop: "/x" }, operands [a, b]
5
+ export function parseArgs(argv) {
6
+ const flags = {};
7
+ const operands = [];
8
+ for (const arg of argv) {
9
+ if (!arg.startsWith("--")) {
10
+ operands.push(arg);
11
+ continue;
12
+ }
13
+ const [key = "", value] = arg.slice(2).split(/=(.*)/s);
14
+ flags[key.replace(/-(\w)/g, (_, c) => c.toUpperCase())] = value ?? true;
15
+ }
16
+ return { operands, flags };
17
+ }
18
+ // operands and flags → the tool's input, checked against its args
19
+ export function inputFor(entry, operands, flags) {
20
+ const input = {};
21
+ const positional = entry.args.filter((arg) => arg.positional);
22
+ positional.forEach((arg, index) => {
23
+ if (operands[index] !== undefined)
24
+ input[arg.name] = operands[index];
25
+ });
26
+ if (operands.length > positional.length)
27
+ throw new Error(`too many operands for ${entry.model} ${entry.name}: ${operands.slice(positional.length).join(" ")}`);
28
+ for (const arg of entry.args) {
29
+ const value = flags[arg.name];
30
+ if (value === undefined)
31
+ continue;
32
+ if (arg.type === "boolean")
33
+ input[arg.name] = value === true || value === "true";
34
+ else if (value === true)
35
+ throw new Error(`--${arg.name} needs a value: --${arg.name}=<${arg.name}>`);
36
+ else
37
+ input[arg.name] = value;
38
+ }
39
+ const missing = entry.args.filter((arg) => arg.required && input[arg.name] === undefined).map((arg) => arg.name);
40
+ if (missing.length)
41
+ throw new Error(`${entry.model} ${entry.name} needs: ${missing.join(", ")}`);
42
+ return input;
43
+ }
44
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/core/tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const EVENTS: readonly ["step", "phase", "milestone", "flip"];
2
+ export type LoopEvent = (typeof EVENTS)[number];
3
+ export declare function isLoopEvent(value: string): value is LoopEvent;
4
+ export declare function bumpSemver(version: string, event: LoopEvent): string;
5
+ export declare function bumpGrih(version: string, event: LoopEvent): string;
6
+ export declare const GRIH_START = "0.0.0.0";
@@ -0,0 +1,37 @@
1
+ // The two version schemes of BOS (docs/devlog/ROADMAP.md):
2
+ // a project: semver vX.Y.Z
3
+ // a scope: GRIH vG.R.I.H
4
+ // and the four events of the craft loop that bump them.
5
+ //
6
+ // | event | semver | GRIH |
7
+ // | step | Z | H |
8
+ // | phase | Y | I |
9
+ // | milestone | X | R |
10
+ // | flip | X | G | the script flips: pre-alpha → alpha, a key concept changes
11
+ export const EVENTS = ["step", "phase", "milestone", "flip"];
12
+ export function isLoopEvent(value) {
13
+ return EVENTS.includes(value);
14
+ }
15
+ function parse(version, count, scheme) {
16
+ const parts = version.replace(/^v/, "").split(".");
17
+ const numbers = parts.map(Number);
18
+ if (parts.length !== count || numbers.some((n) => !Number.isInteger(n) || n < 0))
19
+ throw new Error(`"${version}" is not a ${scheme} version (${count} whole numbers joined by dots)`);
20
+ return numbers;
21
+ }
22
+ // raise the digit at index, zero every digit after it
23
+ function raise(numbers, index) {
24
+ return numbers.map((n, i) => (i < index ? n : i === index ? n + 1 : 0)).join(".");
25
+ }
26
+ const SEMVER_DIGIT = { flip: 0, milestone: 0, phase: 1, step: 2 };
27
+ const GRIH_DIGIT = { flip: 0, milestone: 1, phase: 2, step: 3 };
28
+ // "0.6.1" + phase → "0.7.0"; pre-release or build suffixes are not part of the core's scheme
29
+ export function bumpSemver(version, event) {
30
+ return raise(parse(version, 3, "semver"), SEMVER_DIGIT[event]);
31
+ }
32
+ // "0.1.2.3" + milestone → "0.2.0.0"
33
+ export function bumpGrih(version, event) {
34
+ return raise(parse(version, 4, "GRIH"), GRIH_DIGIT[event]);
35
+ }
36
+ export const GRIH_START = "0.0.0.0";
37
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/core/version.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,8BAA8B;AAC9B,gCAAgC;AAChC,wDAAwD;AACxD,EAAE;AACF,gCAAgC;AAChC,gCAAgC;AAChC,gCAAgC;AAChC,gCAAgC;AAChC,6FAA6F;AAE7F,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAU,CAAC;AAGtE,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAQ,MAA4B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,KAAK,CAAC,OAAe,EAAE,KAAa,EAAE,MAAc;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9E,MAAM,IAAI,KAAK,CAAC,IAAI,OAAO,cAAc,MAAM,aAAa,KAAK,gCAAgC,CAAC,CAAC;IACrG,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,sDAAsD;AACtD,SAAS,KAAK,CAAC,OAAiB,EAAE,KAAa;IAC7C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,YAAY,GAA8B,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC7F,MAAM,UAAU,GAA8B,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAE3F,6FAA6F;AAC7F,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,KAAgB;IAC1D,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,KAAgB;IACxD,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { Change, Entry, Host, RunResult } from "../core/host.ts";
2
+ export { WATCH_LIMIT } from "./watch-tree.ts";
3
+ export declare class NodeHost implements Host {
4
+ exists(path: string): boolean;
5
+ isDirectory(path: string): boolean;
6
+ list(path: string): Entry[];
7
+ readText(path: string): string | null;
8
+ writeText(path: string, text: string): void;
9
+ appendText(path: string, text: string): void;
10
+ mkdir(path: string): void;
11
+ watch(root: string, onChange: (change: Change) => void, onError: (error: Error) => void, skip?: (relative: string) => boolean): () => void;
12
+ run(command: string, args: string[], options?: {
13
+ cwd?: string;
14
+ }): RunResult;
15
+ env(name: string): string | undefined;
16
+ home(): string;
17
+ cwd(): string;
18
+ hostname(): string;
19
+ user(): string;
20
+ now(): number;
21
+ }
@@ -0,0 +1,76 @@
1
+ // Host for Node.js: the real file system, clock and environment.
2
+ import { spawnSync } from "node:child_process";
3
+ import { appendFileSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
4
+ import { homedir, hostname, userInfo } from "node:os";
5
+ import { resolve } from "node:path";
6
+ import { watchTree } from "./watch-tree.js";
7
+ export { WATCH_LIMIT } from "./watch-tree.js";
8
+ export class NodeHost {
9
+ exists(path) {
10
+ return existsSync(path);
11
+ }
12
+ isDirectory(path) {
13
+ try {
14
+ return statSync(path).isDirectory();
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ list(path) {
21
+ try {
22
+ return readdirSync(path, { withFileTypes: true }).map((entry) => ({
23
+ name: entry.name,
24
+ directory: entry.isDirectory(),
25
+ }));
26
+ }
27
+ catch {
28
+ return [];
29
+ }
30
+ }
31
+ readText(path) {
32
+ try {
33
+ return readFileSync(path, "utf8");
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ writeText(path, text) {
40
+ writeFileSync(path, text);
41
+ }
42
+ appendText(path, text) {
43
+ appendFileSync(path, text);
44
+ }
45
+ mkdir(path) {
46
+ mkdirSync(path, { recursive: true });
47
+ }
48
+ watch(root, onChange, onError, skip = () => false) {
49
+ return watchTree(root, { onChange, onError, skip });
50
+ }
51
+ run(command, args, options = {}) {
52
+ const result = spawnSync(command, args, { cwd: options.cwd, encoding: "utf8", maxBuffer: 64 * 1024 * 1024 });
53
+ if (result.error)
54
+ return { status: 127, stdout: "", stderr: `${command}: ${result.error.message}` };
55
+ return { status: result.status ?? 1, stdout: result.stdout, stderr: result.stderr };
56
+ }
57
+ env(name) {
58
+ return process.env[name];
59
+ }
60
+ home() {
61
+ return homedir();
62
+ }
63
+ cwd() {
64
+ return resolve(process.cwd());
65
+ }
66
+ hostname() {
67
+ return hostname();
68
+ }
69
+ user() {
70
+ return userInfo().username;
71
+ }
72
+ now() {
73
+ return Date.now();
74
+ }
75
+ }
76
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/hosts/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Change } from "../core/host.ts";
2
+ export declare const WATCH_LIMIT = "no file watches left on this system (fs.inotify.max_user_watches); close other watchers (editors) or raise the limit";
3
+ export type TreeHandlers = {
4
+ onChange: (change: Change) => void;
5
+ onError: (error: Error) => void;
6
+ skip: (relative: string) => boolean;
7
+ };
8
+ export declare function watchTree(root: string, { onChange, onError, skip }: TreeHandlers): () => void;
@@ -0,0 +1,86 @@
1
+ // A recursive watch built from one watcher per directory. Node's own recursive watch
2
+ // on Linux watches every file and, when inotify runs out, stops reporting without an
3
+ // error. Here a skipped directory (.git, node_modules…) costs no watch at all, a new
4
+ // directory is watched as soon as it appears, and running out of watches is an error.
5
+ import { readdirSync, statSync, watch } from "node:fs";
6
+ // Linux gives every user a fixed number of inotify watches; editors watching big trees can take them all
7
+ export const WATCH_LIMIT = "no file watches left on this system (fs.inotify.max_user_watches); close other watchers (editors) or raise the limit";
8
+ function asError(error) {
9
+ const code = error?.code;
10
+ if (code === "ENOSPC")
11
+ return new Error(WATCH_LIMIT);
12
+ return error instanceof Error ? error : new Error(String(error));
13
+ }
14
+ function isDirectory(path) {
15
+ try {
16
+ return statSync(path).isDirectory();
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ export function watchTree(root, { onChange, onError, skip }) {
23
+ const watchers = new Map();
24
+ let failed = false;
25
+ const fail = (error) => {
26
+ if (failed)
27
+ return;
28
+ failed = true;
29
+ stop();
30
+ onError(asError(error));
31
+ };
32
+ // relative: "" for the root, else "a/b"
33
+ const add = (relative) => {
34
+ if (failed || watchers.has(relative) || (relative && skip(relative)))
35
+ return;
36
+ const path = relative ? `${root}/${relative}` : root;
37
+ let watcher;
38
+ try {
39
+ watcher = watch(path, (kind, filename) => {
40
+ if (!filename)
41
+ return;
42
+ const changed = relative ? `${relative}/${filename}` : String(filename);
43
+ if (kind === "rename" && isDirectory(`${root}/${changed}`))
44
+ add(changed);
45
+ if (kind === "rename" && !watchers.has(changed))
46
+ drop(changed);
47
+ onChange({ path: changed, kind: kind === "rename" ? "rename" : "change" });
48
+ });
49
+ }
50
+ catch (error) {
51
+ // the directory vanished between listing and watching: nothing to watch
52
+ if (error.code === "ENOENT")
53
+ return;
54
+ return fail(error);
55
+ }
56
+ watcher.on("error", fail);
57
+ watchers.set(relative, watcher);
58
+ let entries = [];
59
+ try {
60
+ entries = readdirSync(path, { withFileTypes: true })
61
+ .filter((entry) => entry.isDirectory())
62
+ .map((entry) => entry.name);
63
+ }
64
+ catch { }
65
+ for (const name of entries)
66
+ add(relative ? `${relative}/${name}` : name);
67
+ };
68
+ // a removed directory: close its watcher and those below it
69
+ const drop = (relative) => {
70
+ if (isDirectory(`${root}/${relative}`))
71
+ return;
72
+ for (const [key, watcher] of watchers)
73
+ if (key === relative || key.startsWith(`${relative}/`)) {
74
+ watcher.close();
75
+ watchers.delete(key);
76
+ }
77
+ };
78
+ const stop = () => {
79
+ for (const watcher of watchers.values())
80
+ watcher.close();
81
+ watchers.clear();
82
+ };
83
+ add("");
84
+ return stop;
85
+ }
86
+ //# sourceMappingURL=watch-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-tree.js","sourceRoot":"","sources":["../../src/hosts/watch-tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export { Git } from "./bridges/git.ts";
2
+ export { type Comparison, GitHub, type PullRequest } from "./bridges/github.ts";
3
+ export { type Context, createContext, createIfMissing, type TraceEntry } from "./core/context.ts";
4
+ export { Element, type ElementClass, type ElementNode } from "./core/element.ts";
5
+ export type { Change, Entry, Host, RunResult } from "./core/host.ts";
6
+ export * as paths from "./core/paths.ts";
7
+ export { Procedure, type Step } from "./core/procedure.ts";
8
+ export { type Arg, type Input, type IO, inputFor, parseArgs, type Tool, tool } from "./core/tool.ts";
9
+ export { bumpGrih, bumpSemver, EVENTS, GRIH_START, isLoopEvent, type LoopEvent } from "./core/version.ts";
10
+ export { NodeHost, WATCH_LIMIT } from "./hosts/node.ts";
11
+ export { BOS, type BOSOptions, type WatchOptions } from "./main.ts";
12
+ export * from "./models/_index.ts";
13
+ export * from "./procedures/_index.ts";
14
+ export { findTool, TOOLS } from "./tools/_index.ts";
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ // Library entry.
2
+ // import { BOS, NodeHost } from "blacksmith-organization-system";
3
+ // const bos = new BOS(new NodeHost());
4
+ // await bos.bootstrap(); const report = await bos.inspect();
5
+ export { Git } from "./bridges/git.js";
6
+ export { GitHub } from "./bridges/github.js";
7
+ export { createContext, createIfMissing } from "./core/context.js";
8
+ export { Element } from "./core/element.js";
9
+ export * as paths from "./core/paths.js";
10
+ export { Procedure } from "./core/procedure.js";
11
+ export { inputFor, parseArgs, tool } from "./core/tool.js";
12
+ export { bumpGrih, bumpSemver, EVENTS, GRIH_START, isLoopEvent } from "./core/version.js";
13
+ export { NodeHost, WATCH_LIMIT } from "./hosts/node.js";
14
+ export { BOS } from "./main.js";
15
+ export * from "./models/_index.js";
16
+ export * from "./procedures/_index.js";
17
+ export { findTool, TOOLS } from "./tools/_index.js";
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iBAAiB;AACjB,oEAAoE;AACpE,yCAAyC;AACzC,gEAAgE;AAEhE,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAmB,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAgB,aAAa,EAAE,eAAe,EAAmB,MAAM,mBAAmB,CAAC;AAClG,OAAO,EAAE,OAAO,EAAuC,MAAM,mBAAmB,CAAC;AAEjF,OAAO,KAAK,KAAK,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAa,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAiC,QAAQ,EAAE,SAAS,EAAa,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACrG,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAC1G,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,GAAG,EAAsC,MAAM,WAAW,CAAC;AACpE,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/main.d.ts ADDED
@@ -0,0 +1,51 @@
1
+ import type { Host } from "./core/host.ts";
2
+ import type { LoopEvent } from "./core/version.ts";
3
+ import { type Loop, type Project, type Settings, type VersioningData, Workshop } from "./models/_index.ts";
4
+ import { type BootstrapContext, type BumpOutcome, type FlowOutcome, type VersionContext, type WorkshopEvent, type WorkshopReport } from "./procedures/_index.ts";
5
+ export type BOSOptions = {
6
+ workshop?: string;
7
+ };
8
+ export type WatchOptions = {
9
+ signal: AbortSignal;
10
+ onEvent: (event: WorkshopEvent) => void;
11
+ record?: boolean;
12
+ quietMs?: number;
13
+ };
14
+ export declare class BOS {
15
+ #private;
16
+ readonly host: Host;
17
+ readonly options: BOSOptions;
18
+ constructor(host: Host, options?: BOSOptions);
19
+ get workshop(): Workshop;
20
+ bootstrap({ dryRun }?: {
21
+ dryRun?: boolean | undefined;
22
+ }): Promise<BootstrapContext>;
23
+ inspect(): Promise<WorkshopReport>;
24
+ watch({ signal, onEvent, record, quietMs }: WatchOptions): Promise<void>;
25
+ bumpScope(name: string, event: LoopEvent, { dryRun }?: {
26
+ dryRun?: boolean | undefined;
27
+ }): Promise<VersionContext>;
28
+ settings(dir?: string): {
29
+ project: Project;
30
+ settings: Settings;
31
+ loop: Loop;
32
+ versioning: VersioningData;
33
+ };
34
+ loop(dir?: string): {
35
+ project: Project;
36
+ loop: Loop;
37
+ };
38
+ bump(station: string, { dir, dryRun }?: {
39
+ dir?: string;
40
+ dryRun?: boolean;
41
+ }): Promise<BumpOutcome>;
42
+ propose(branch: string, { dir, dryRun }?: {
43
+ dir?: string;
44
+ dryRun?: boolean;
45
+ }): Promise<FlowOutcome>;
46
+ automerge(number: number, { dir, dryRun }?: {
47
+ dir?: string;
48
+ dryRun?: boolean;
49
+ }): Promise<FlowOutcome>;
50
+ toString(): string;
51
+ }
package/dist/main.js ADDED
@@ -0,0 +1,85 @@
1
+ // The spine of BOS: one object that holds the host, finds the workshop and runs
2
+ // the procedures on it. Every face of BOS (CLI, library, later MCP and HTTP) goes
3
+ // through these methods.
4
+ // const bos = new BOS(new NodeHost()); const report = await bos.inspect();
5
+ import { Git } from "./bridges/git.js";
6
+ import { GitHub } from "./bridges/github.js";
7
+ import { createContext } from "./core/context.js";
8
+ import { loopOfSettings, projectAround, settingsOf, versioningOf, Workshop, } from "./models/_index.js";
9
+ import { automerging, bootstrapping, bumping, emptyReport, inspecting, proposing, unbumped, undecided, versioning, watching, } from "./procedures/_index.js";
10
+ export class BOS {
11
+ host;
12
+ options;
13
+ #workshop = null;
14
+ constructor(host, options = {}) {
15
+ this.host = host;
16
+ this.options = options;
17
+ }
18
+ // the active workshop: --workshop, $BOS_WORKSHOP, $WORKSHOP_ROOT/__WORKSHOP, an ancestor __WORKSHOP,
19
+ // or ~/__WORKSHOP ($WORKSHOP_RENAME changes the name)
20
+ get workshop() {
21
+ this.#workshop ??= Workshop.locate(this.host, this.options.workshop);
22
+ return this.#workshop;
23
+ }
24
+ // build the base of the environment: create what is missing, never overwrite
25
+ async bootstrap({ dryRun = false } = {}) {
26
+ return bootstrapping.run({ ...createContext(this.host, { dryRun }), workshop: this.workshop });
27
+ }
28
+ // the whole workshop as one coherent environment, with findings; reads only
29
+ async inspect() {
30
+ const context = { ...createContext(this.host), workshop: this.workshop, report: emptyReport(this.workshop) };
31
+ return (await inspecting.run(context)).report;
32
+ }
33
+ // listen to every change in the workshop until options.signal aborts
34
+ async watch({ signal, onEvent, record = false, quietMs = 250 }) {
35
+ await watching.run({ ...createContext(this.host), workshop: this.workshop, signal, onEvent, record, quietMs });
36
+ }
37
+ // raise a scope's GRIH version for one loop event
38
+ async bumpScope(name, event, { dryRun = false } = {}) {
39
+ const scope = this.workshop.forge.scope(name);
40
+ return versioning.run({ ...createContext(this.host, { dryRun }), workshop: this.workshop, scope, event });
41
+ }
42
+ // the settings of the project around dir (default: the current directory): .github/bos.json
43
+ settings(dir) {
44
+ const project = projectAround(this.host, dir);
45
+ const settings = settingsOf(this.host, project.path);
46
+ return { project, settings, loop: loopOfSettings(settings), versioning: versioningOf(settings) };
47
+ }
48
+ // the craft loop of the project around dir
49
+ loop(dir) {
50
+ const { project, loop } = this.settings(dir);
51
+ return { project, loop };
52
+ }
53
+ // bump the project's version for work landing on a station (only a released version moves)
54
+ async bump(station, { dir, dryRun = false } = {}) {
55
+ const { project, versioning } = this.settings(dir);
56
+ const git = new Git(this.host, project.path);
57
+ const context = {
58
+ ...createContext(this.host, { dryRun }),
59
+ projectPath: project.path,
60
+ station,
61
+ versioning,
62
+ git,
63
+ outcome: unbumped(),
64
+ };
65
+ return (await bumping.run(context)).outcome;
66
+ }
67
+ // open the pull request of a branch's forward step on GitHub
68
+ async propose(branch, { dir, dryRun = false } = {}) {
69
+ const { project, loop } = this.loop(dir);
70
+ const github = new GitHub(this.host, project.path);
71
+ const context = { ...createContext(this.host, { dryRun }), loop, github, branch, outcome: undecided() };
72
+ return (await proposing.run(context)).outcome;
73
+ }
74
+ // merge a loop pull request when the loop allows it
75
+ async automerge(number, { dir, dryRun = false } = {}) {
76
+ const { project, loop } = this.loop(dir);
77
+ const github = new GitHub(this.host, project.path);
78
+ const context = { ...createContext(this.host, { dryRun }), loop, github, number, outcome: undecided() };
79
+ return (await automerging.run(context)).outcome;
80
+ }
81
+ toString() {
82
+ return `[<Blacksmith_Organization_System::${this.workshop.path}>]`;
83
+ }
84
+ }
85
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export { Archive } from "./archive/class.ts";
2
+ export { Craftbook, Scrapnotes } from "./craftbook/class.ts";
3
+ export { Devarmory } from "./devarmory/class.ts";
4
+ export { DEVLOG_FILES, Devlog, type Phase } from "./devlog/class.ts";
5
+ export { Forge } from "./forge/class.ts";
6
+ export { Loop, type LoopStep } from "./loop/class.ts";
7
+ export { DEFAULT_LOOP, type LoopData } from "./loop/data.ts";
8
+ export { loopOf, loopOfSettings } from "./loop/load.ts";
9
+ export { projectAround } from "./project/around.ts";
10
+ export { Project, type ProjectReport } from "./project/class.ts";
11
+ export { SCOPE_FILE, Scope } from "./scope/class.ts";
12
+ export { BUMPS, type Bump, DEFAULT_VERSIONING, type SettingsData, type VersioningData } from "./settings/data.ts";
13
+ export { type Settings, settingsFile, settingsOf, versioningOf } from "./settings/load.ts";
14
+ export { System } from "./system/class.ts";
15
+ export { Data, Nests, Setup } from "./system/parts.ts";
16
+ export { Logs, Manifests, Storylines, Ttystories } from "./system/storylines.ts";
17
+ export { ROOT_FILES, Workshop } from "./workshop/class.ts";
18
+ export { findAncestorWorkshop, type Located, locateWorkshop, type Place, placeOf, WORKSHOP_DIRNAME, workshopName, } from "./workshop/locate.ts";