@warpgogol/forge 0.3.1

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 (516) hide show
  1. package/AGENTS.md +149 -0
  2. package/README.md +164 -0
  3. package/bin/cli.js +16 -0
  4. package/dist/bin/cli.d.ts +3 -0
  5. package/dist/bin/cli.d.ts.map +1 -0
  6. package/dist/bin/cli.js +265 -0
  7. package/dist/bin/cli.js.map +1 -0
  8. package/dist/os/adr/adr.module.d.ts +3 -0
  9. package/dist/os/adr/adr.module.d.ts.map +1 -0
  10. package/dist/os/adr/adr.module.js +112 -0
  11. package/dist/os/adr/adr.module.js.map +1 -0
  12. package/dist/os/adr/frontmatter-io.d.ts +11 -0
  13. package/dist/os/adr/frontmatter-io.d.ts.map +1 -0
  14. package/dist/os/adr/frontmatter-io.js +64 -0
  15. package/dist/os/adr/frontmatter-io.js.map +1 -0
  16. package/dist/os/adr/handlers/archive.d.ts +24 -0
  17. package/dist/os/adr/handlers/archive.d.ts.map +1 -0
  18. package/dist/os/adr/handlers/archive.js +162 -0
  19. package/dist/os/adr/handlers/archive.js.map +1 -0
  20. package/dist/os/adr/handlers/list-create.d.ts +5 -0
  21. package/dist/os/adr/handlers/list-create.d.ts.map +1 -0
  22. package/dist/os/adr/handlers/list-create.js +165 -0
  23. package/dist/os/adr/handlers/list-create.js.map +1 -0
  24. package/dist/os/adr/handlers/validate.d.ts +4 -0
  25. package/dist/os/adr/handlers/validate.d.ts.map +1 -0
  26. package/dist/os/adr/handlers/validate.js +219 -0
  27. package/dist/os/adr/handlers/validate.js.map +1 -0
  28. package/dist/os/adr/index.d.ts +8 -0
  29. package/dist/os/adr/index.d.ts.map +1 -0
  30. package/dist/os/adr/index.js +18 -0
  31. package/dist/os/adr/index.js.map +1 -0
  32. package/dist/os/adr/types.d.ts +59 -0
  33. package/dist/os/adr/types.d.ts.map +1 -0
  34. package/dist/os/adr/types.js +54 -0
  35. package/dist/os/adr/types.js.map +1 -0
  36. package/dist/os/audit/audit.module.d.ts +3 -0
  37. package/dist/os/audit/audit.module.d.ts.map +1 -0
  38. package/dist/os/audit/audit.module.js +44 -0
  39. package/dist/os/audit/audit.module.js.map +1 -0
  40. package/dist/os/audit/frontmatter-io.d.ts +12 -0
  41. package/dist/os/audit/frontmatter-io.d.ts.map +1 -0
  42. package/dist/os/audit/frontmatter-io.js +73 -0
  43. package/dist/os/audit/frontmatter-io.js.map +1 -0
  44. package/dist/os/audit/handlers/archive.d.ts +4 -0
  45. package/dist/os/audit/handlers/archive.d.ts.map +1 -0
  46. package/dist/os/audit/handlers/archive.js +167 -0
  47. package/dist/os/audit/handlers/archive.js.map +1 -0
  48. package/dist/os/audit/index.d.ts +6 -0
  49. package/dist/os/audit/index.d.ts.map +1 -0
  50. package/dist/os/audit/index.js +16 -0
  51. package/dist/os/audit/index.js.map +1 -0
  52. package/dist/os/audit/types.d.ts +12 -0
  53. package/dist/os/audit/types.d.ts.map +1 -0
  54. package/dist/os/audit/types.js +17 -0
  55. package/dist/os/audit/types.js.map +1 -0
  56. package/dist/os/compass/compass.module.d.ts +3 -0
  57. package/dist/os/compass/compass.module.d.ts.map +1 -0
  58. package/dist/os/compass/compass.module.js +162 -0
  59. package/dist/os/compass/compass.module.js.map +1 -0
  60. package/dist/os/compass/handlers/compass-audit-handler.d.ts +36 -0
  61. package/dist/os/compass/handlers/compass-audit-handler.d.ts.map +1 -0
  62. package/dist/os/compass/handlers/compass-audit-handler.js +238 -0
  63. package/dist/os/compass/handlers/compass-audit-handler.js.map +1 -0
  64. package/dist/os/compass/handlers/compass-change-summary-handler.d.ts +19 -0
  65. package/dist/os/compass/handlers/compass-change-summary-handler.d.ts.map +1 -0
  66. package/dist/os/compass/handlers/compass-change-summary-handler.js +205 -0
  67. package/dist/os/compass/handlers/compass-change-summary-handler.js.map +1 -0
  68. package/dist/os/compass/handlers/compass-inventory-handler.d.ts +28 -0
  69. package/dist/os/compass/handlers/compass-inventory-handler.d.ts.map +1 -0
  70. package/dist/os/compass/handlers/compass-inventory-handler.js +213 -0
  71. package/dist/os/compass/handlers/compass-inventory-handler.js.map +1 -0
  72. package/dist/os/compass/handlers/compass-inventory.d.ts +30 -0
  73. package/dist/os/compass/handlers/compass-inventory.d.ts.map +1 -0
  74. package/dist/os/compass/handlers/compass-inventory.js +418 -0
  75. package/dist/os/compass/handlers/compass-inventory.js.map +1 -0
  76. package/dist/os/compass/handlers/git-revision.d.ts +8 -0
  77. package/dist/os/compass/handlers/git-revision.d.ts.map +1 -0
  78. package/dist/os/compass/handlers/git-revision.js +99 -0
  79. package/dist/os/compass/handlers/git-revision.js.map +1 -0
  80. package/dist/os/compass/handlers/resolve-scan-root.d.ts +3 -0
  81. package/dist/os/compass/handlers/resolve-scan-root.d.ts.map +1 -0
  82. package/dist/os/compass/handlers/resolve-scan-root.js +41 -0
  83. package/dist/os/compass/handlers/resolve-scan-root.js.map +1 -0
  84. package/dist/os/compass/index.d.ts +8 -0
  85. package/dist/os/compass/index.d.ts.map +1 -0
  86. package/dist/os/compass/index.js +19 -0
  87. package/dist/os/compass/index.js.map +1 -0
  88. package/dist/os/core/core.module.d.ts +3 -0
  89. package/dist/os/core/core.module.d.ts.map +1 -0
  90. package/dist/os/core/core.module.js +318 -0
  91. package/dist/os/core/core.module.js.map +1 -0
  92. package/dist/os/core/index.d.ts +2 -0
  93. package/dist/os/core/index.d.ts.map +1 -0
  94. package/dist/os/core/index.js +13 -0
  95. package/dist/os/core/index.js.map +1 -0
  96. package/dist/os/mission/handlers/archive.d.ts +4 -0
  97. package/dist/os/mission/handlers/archive.d.ts.map +1 -0
  98. package/dist/os/mission/handlers/archive.js +209 -0
  99. package/dist/os/mission/handlers/archive.js.map +1 -0
  100. package/dist/os/mission/index.d.ts +2 -0
  101. package/dist/os/mission/index.d.ts.map +1 -0
  102. package/dist/os/mission/index.js +2 -0
  103. package/dist/os/mission/index.js.map +1 -0
  104. package/dist/os/mission/mission.module.d.ts +3 -0
  105. package/dist/os/mission/mission.module.d.ts.map +1 -0
  106. package/dist/os/mission/mission.module.js +44 -0
  107. package/dist/os/mission/mission.module.js.map +1 -0
  108. package/dist/os/mission/types.d.ts +23 -0
  109. package/dist/os/mission/types.d.ts.map +1 -0
  110. package/dist/os/mission/types.js +18 -0
  111. package/dist/os/mission/types.js.map +1 -0
  112. package/dist/os/naming/index.d.ts +3 -0
  113. package/dist/os/naming/index.d.ts.map +1 -0
  114. package/dist/os/naming/index.js +14 -0
  115. package/dist/os/naming/index.js.map +1 -0
  116. package/dist/os/naming/naming-convention.d.ts +25 -0
  117. package/dist/os/naming/naming-convention.d.ts.map +1 -0
  118. package/dist/os/naming/naming-convention.js +324 -0
  119. package/dist/os/naming/naming-convention.js.map +1 -0
  120. package/dist/os/naming/naming.module.d.ts +3 -0
  121. package/dist/os/naming/naming.module.d.ts.map +1 -0
  122. package/dist/os/naming/naming.module.js +33 -0
  123. package/dist/os/naming/naming.module.js.map +1 -0
  124. package/dist/os/plan/frontmatter-io.d.ts +12 -0
  125. package/dist/os/plan/frontmatter-io.d.ts.map +1 -0
  126. package/dist/os/plan/frontmatter-io.js +71 -0
  127. package/dist/os/plan/frontmatter-io.js.map +1 -0
  128. package/dist/os/plan/handlers/archive.d.ts +4 -0
  129. package/dist/os/plan/handlers/archive.d.ts.map +1 -0
  130. package/dist/os/plan/handlers/archive.js +166 -0
  131. package/dist/os/plan/handlers/archive.js.map +1 -0
  132. package/dist/os/plan/index.d.ts +6 -0
  133. package/dist/os/plan/index.d.ts.map +1 -0
  134. package/dist/os/plan/index.js +16 -0
  135. package/dist/os/plan/index.js.map +1 -0
  136. package/dist/os/plan/plan.module.d.ts +3 -0
  137. package/dist/os/plan/plan.module.d.ts.map +1 -0
  138. package/dist/os/plan/plan.module.js +44 -0
  139. package/dist/os/plan/plan.module.js.map +1 -0
  140. package/dist/os/plan/types.d.ts +12 -0
  141. package/dist/os/plan/types.d.ts.map +1 -0
  142. package/dist/os/plan/types.js +17 -0
  143. package/dist/os/plan/types.js.map +1 -0
  144. package/dist/os/rfc/acceptance.d.ts +15 -0
  145. package/dist/os/rfc/acceptance.d.ts.map +1 -0
  146. package/dist/os/rfc/acceptance.js +290 -0
  147. package/dist/os/rfc/acceptance.js.map +1 -0
  148. package/dist/os/rfc/decision-log.d.ts +6 -0
  149. package/dist/os/rfc/decision-log.d.ts.map +1 -0
  150. package/dist/os/rfc/decision-log.js +269 -0
  151. package/dist/os/rfc/decision-log.js.map +1 -0
  152. package/dist/os/rfc/dna-trace.d.ts +27 -0
  153. package/dist/os/rfc/dna-trace.d.ts.map +1 -0
  154. package/dist/os/rfc/dna-trace.js +214 -0
  155. package/dist/os/rfc/dna-trace.js.map +1 -0
  156. package/dist/os/rfc/frontmatter-io.d.ts +14 -0
  157. package/dist/os/rfc/frontmatter-io.d.ts.map +1 -0
  158. package/dist/os/rfc/frontmatter-io.js +98 -0
  159. package/dist/os/rfc/frontmatter-io.js.map +1 -0
  160. package/dist/os/rfc/handlers/archive.d.ts +24 -0
  161. package/dist/os/rfc/handlers/archive.d.ts.map +1 -0
  162. package/dist/os/rfc/handlers/archive.js +161 -0
  163. package/dist/os/rfc/handlers/archive.js.map +1 -0
  164. package/dist/os/rfc/handlers/check.d.ts +4 -0
  165. package/dist/os/rfc/handlers/check.d.ts.map +1 -0
  166. package/dist/os/rfc/handlers/check.js +195 -0
  167. package/dist/os/rfc/handlers/check.js.map +1 -0
  168. package/dist/os/rfc/handlers/implement-stamp.d.ts +4 -0
  169. package/dist/os/rfc/handlers/implement-stamp.d.ts.map +1 -0
  170. package/dist/os/rfc/handlers/implement-stamp.js +334 -0
  171. package/dist/os/rfc/handlers/implement-stamp.js.map +1 -0
  172. package/dist/os/rfc/handlers/index-graph.d.ts +13 -0
  173. package/dist/os/rfc/handlers/index-graph.d.ts.map +1 -0
  174. package/dist/os/rfc/handlers/index-graph.js +189 -0
  175. package/dist/os/rfc/handlers/index-graph.js.map +1 -0
  176. package/dist/os/rfc/handlers/lifecycle.d.ts +13 -0
  177. package/dist/os/rfc/handlers/lifecycle.d.ts.map +1 -0
  178. package/dist/os/rfc/handlers/lifecycle.js +150 -0
  179. package/dist/os/rfc/handlers/lifecycle.js.map +1 -0
  180. package/dist/os/rfc/handlers/list-create.d.ts +6 -0
  181. package/dist/os/rfc/handlers/list-create.d.ts.map +1 -0
  182. package/dist/os/rfc/handlers/list-create.js +235 -0
  183. package/dist/os/rfc/handlers/list-create.js.map +1 -0
  184. package/dist/os/rfc/handlers/pipeline-status.d.ts +26 -0
  185. package/dist/os/rfc/handlers/pipeline-status.d.ts.map +1 -0
  186. package/dist/os/rfc/handlers/pipeline-status.js +124 -0
  187. package/dist/os/rfc/handlers/pipeline-status.js.map +1 -0
  188. package/dist/os/rfc/handlers/shared.d.ts +22 -0
  189. package/dist/os/rfc/handlers/shared.d.ts.map +1 -0
  190. package/dist/os/rfc/handlers/shared.js +99 -0
  191. package/dist/os/rfc/handlers/shared.js.map +1 -0
  192. package/dist/os/rfc/handlers/supersede-propose.d.ts +4 -0
  193. package/dist/os/rfc/handlers/supersede-propose.d.ts.map +1 -0
  194. package/dist/os/rfc/handlers/supersede-propose.js +200 -0
  195. package/dist/os/rfc/handlers/supersede-propose.js.map +1 -0
  196. package/dist/os/rfc/handlers/validate-rules.d.ts +29 -0
  197. package/dist/os/rfc/handlers/validate-rules.d.ts.map +1 -0
  198. package/dist/os/rfc/handlers/validate-rules.js +461 -0
  199. package/dist/os/rfc/handlers/validate-rules.js.map +1 -0
  200. package/dist/os/rfc/handlers/validate.d.ts +4 -0
  201. package/dist/os/rfc/handlers/validate.d.ts.map +1 -0
  202. package/dist/os/rfc/handlers/validate.js +101 -0
  203. package/dist/os/rfc/handlers/validate.js.map +1 -0
  204. package/dist/os/rfc/handlers.d.ts +7 -0
  205. package/dist/os/rfc/handlers.d.ts.map +1 -0
  206. package/dist/os/rfc/handlers.js +19 -0
  207. package/dist/os/rfc/handlers.js.map +1 -0
  208. package/dist/os/rfc/index.d.ts +18 -0
  209. package/dist/os/rfc/index.d.ts.map +1 -0
  210. package/dist/os/rfc/index.js +24 -0
  211. package/dist/os/rfc/index.js.map +1 -0
  212. package/dist/os/rfc/rfc.module.d.ts +3 -0
  213. package/dist/os/rfc/rfc.module.d.ts.map +1 -0
  214. package/dist/os/rfc/rfc.module.js +355 -0
  215. package/dist/os/rfc/rfc.module.js.map +1 -0
  216. package/dist/os/rfc/types.d.ts +448 -0
  217. package/dist/os/rfc/types.d.ts.map +1 -0
  218. package/dist/os/rfc/types.js +95 -0
  219. package/dist/os/rfc/types.js.map +1 -0
  220. package/dist/os/rfc/verification-evidence.d.ts +8 -0
  221. package/dist/os/rfc/verification-evidence.d.ts.map +1 -0
  222. package/dist/os/rfc/verification-evidence.js +182 -0
  223. package/dist/os/rfc/verification-evidence.js.map +1 -0
  224. package/dist/os/session/atif-parser.d.ts +29 -0
  225. package/dist/os/session/atif-parser.d.ts.map +1 -0
  226. package/dist/os/session/atif-parser.js +138 -0
  227. package/dist/os/session/atif-parser.js.map +1 -0
  228. package/dist/os/session/frontmatter-io.d.ts +31 -0
  229. package/dist/os/session/frontmatter-io.d.ts.map +1 -0
  230. package/dist/os/session/frontmatter-io.js +146 -0
  231. package/dist/os/session/frontmatter-io.js.map +1 -0
  232. package/dist/os/session/handlers/archive.d.ts +4 -0
  233. package/dist/os/session/handlers/archive.d.ts.map +1 -0
  234. package/dist/os/session/handlers/archive.js +209 -0
  235. package/dist/os/session/handlers/archive.js.map +1 -0
  236. package/dist/os/session/handlers/list.d.ts +4 -0
  237. package/dist/os/session/handlers/list.d.ts.map +1 -0
  238. package/dist/os/session/handlers/list.js +147 -0
  239. package/dist/os/session/handlers/list.js.map +1 -0
  240. package/dist/os/session/handlers/save.d.ts +6 -0
  241. package/dist/os/session/handlers/save.d.ts.map +1 -0
  242. package/dist/os/session/handlers/save.js +285 -0
  243. package/dist/os/session/handlers/save.js.map +1 -0
  244. package/dist/os/session/handlers/validate.d.ts +4 -0
  245. package/dist/os/session/handlers/validate.d.ts.map +1 -0
  246. package/dist/os/session/handlers/validate.js +188 -0
  247. package/dist/os/session/handlers/validate.js.map +1 -0
  248. package/dist/os/session/index.d.ts +9 -0
  249. package/dist/os/session/index.d.ts.map +1 -0
  250. package/dist/os/session/index.js +20 -0
  251. package/dist/os/session/index.js.map +1 -0
  252. package/dist/os/session/session.module.d.ts +3 -0
  253. package/dist/os/session/session.module.d.ts.map +1 -0
  254. package/dist/os/session/session.module.js +113 -0
  255. package/dist/os/session/session.module.js.map +1 -0
  256. package/dist/os/session/types.d.ts +101 -0
  257. package/dist/os/session/types.d.ts.map +1 -0
  258. package/dist/os/session/types.js +52 -0
  259. package/dist/os/session/types.js.map +1 -0
  260. package/dist/os/spec/spec-materialize.d.ts +21 -0
  261. package/dist/os/spec/spec-materialize.d.ts.map +1 -0
  262. package/dist/os/spec/spec-materialize.js +342 -0
  263. package/dist/os/spec/spec-materialize.js.map +1 -0
  264. package/dist/os/spec/spec-schema.d.ts +132 -0
  265. package/dist/os/spec/spec-schema.d.ts.map +1 -0
  266. package/dist/os/spec/spec-schema.js +118 -0
  267. package/dist/os/spec/spec-schema.js.map +1 -0
  268. package/dist/os/spec/spec-status.d.ts +33 -0
  269. package/dist/os/spec/spec-status.d.ts.map +1 -0
  270. package/dist/os/spec/spec-status.js +222 -0
  271. package/dist/os/spec/spec-status.js.map +1 -0
  272. package/dist/os/spec/spec-validate.d.ts +4 -0
  273. package/dist/os/spec/spec-validate.d.ts.map +1 -0
  274. package/dist/os/spec/spec-validate.js +435 -0
  275. package/dist/os/spec/spec-validate.js.map +1 -0
  276. package/dist/os/spec/spec.module.d.ts +3 -0
  277. package/dist/os/spec/spec.module.d.ts.map +1 -0
  278. package/dist/os/spec/spec.module.js +67 -0
  279. package/dist/os/spec/spec.module.js.map +1 -0
  280. package/dist/os/werkstatt/handlers/lock.d.ts +10 -0
  281. package/dist/os/werkstatt/handlers/lock.d.ts.map +1 -0
  282. package/dist/os/werkstatt/handlers/lock.js +127 -0
  283. package/dist/os/werkstatt/handlers/lock.js.map +1 -0
  284. package/dist/os/werkstatt/handlers/schema.d.ts +32 -0
  285. package/dist/os/werkstatt/handlers/schema.d.ts.map +1 -0
  286. package/dist/os/werkstatt/handlers/schema.js +41 -0
  287. package/dist/os/werkstatt/handlers/schema.js.map +1 -0
  288. package/dist/os/werkstatt/handlers/werkstatt-lock-recover.d.ts +15 -0
  289. package/dist/os/werkstatt/handlers/werkstatt-lock-recover.d.ts.map +1 -0
  290. package/dist/os/werkstatt/handlers/werkstatt-lock-recover.js +142 -0
  291. package/dist/os/werkstatt/handlers/werkstatt-lock-recover.js.map +1 -0
  292. package/dist/os/werkstatt/handlers/werkstatt-lock-status.d.ts +18 -0
  293. package/dist/os/werkstatt/handlers/werkstatt-lock-status.d.ts.map +1 -0
  294. package/dist/os/werkstatt/handlers/werkstatt-lock-status.js +43 -0
  295. package/dist/os/werkstatt/handlers/werkstatt-lock-status.js.map +1 -0
  296. package/dist/os/werkstatt/handlers/werkstatt-operation-validate.d.ts +11 -0
  297. package/dist/os/werkstatt/handlers/werkstatt-operation-validate.d.ts.map +1 -0
  298. package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js +79 -0
  299. package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js.map +1 -0
  300. package/dist/os/werkstatt/index.d.ts +7 -0
  301. package/dist/os/werkstatt/index.d.ts.map +1 -0
  302. package/dist/os/werkstatt/index.js +18 -0
  303. package/dist/os/werkstatt/index.js.map +1 -0
  304. package/dist/os/werkstatt/werkstatt.module.d.ts +3 -0
  305. package/dist/os/werkstatt/werkstatt.module.d.ts.map +1 -0
  306. package/dist/os/werkstatt/werkstatt.module.js +58 -0
  307. package/dist/os/werkstatt/werkstatt.module.js.map +1 -0
  308. package/dist/os/workflow/handlers.d.ts +12 -0
  309. package/dist/os/workflow/handlers.d.ts.map +1 -0
  310. package/dist/os/workflow/handlers.js +254 -0
  311. package/dist/os/workflow/handlers.js.map +1 -0
  312. package/dist/os/workflow/index.d.ts +4 -0
  313. package/dist/os/workflow/index.d.ts.map +1 -0
  314. package/dist/os/workflow/index.js +18 -0
  315. package/dist/os/workflow/index.js.map +1 -0
  316. package/dist/os/workflow/types.d.ts +69 -0
  317. package/dist/os/workflow/types.d.ts.map +1 -0
  318. package/dist/os/workflow/types.js +23 -0
  319. package/dist/os/workflow/types.js.map +1 -0
  320. package/dist/os/workflow/workflow.module.d.ts +3 -0
  321. package/dist/os/workflow/workflow.module.d.ts.map +1 -0
  322. package/dist/os/workflow/workflow.module.js +48 -0
  323. package/dist/os/workflow/workflow.module.js.map +1 -0
  324. package/dist/src/cli-output.d.ts +5 -0
  325. package/dist/src/cli-output.d.ts.map +1 -0
  326. package/dist/src/cli-output.js +52 -0
  327. package/dist/src/cli-output.js.map +1 -0
  328. package/dist/src/config/forge-config.d.ts +170 -0
  329. package/dist/src/config/forge-config.d.ts.map +1 -0
  330. package/dist/src/config/forge-config.js +259 -0
  331. package/dist/src/config/forge-config.js.map +1 -0
  332. package/dist/src/forge-module.d.ts +16 -0
  333. package/dist/src/forge-module.d.ts.map +1 -0
  334. package/dist/src/forge-module.js +15 -0
  335. package/dist/src/forge-module.js.map +1 -0
  336. package/dist/src/index.d.ts +30 -0
  337. package/dist/src/index.d.ts.map +1 -0
  338. package/dist/src/index.js +48 -0
  339. package/dist/src/index.js.map +1 -0
  340. package/dist/src/migration-adapters/git-utils.d.ts +3 -0
  341. package/dist/src/migration-adapters/git-utils.d.ts.map +1 -0
  342. package/dist/src/migration-adapters/git-utils.js +46 -0
  343. package/dist/src/migration-adapters/git-utils.js.map +1 -0
  344. package/dist/src/migration-adapters/ignored-files.d.ts +12 -0
  345. package/dist/src/migration-adapters/ignored-files.d.ts.map +1 -0
  346. package/dist/src/migration-adapters/ignored-files.js +190 -0
  347. package/dist/src/migration-adapters/ignored-files.js.map +1 -0
  348. package/dist/src/migration-adapters/index.d.ts +8 -0
  349. package/dist/src/migration-adapters/index.d.ts.map +1 -0
  350. package/dist/src/migration-adapters/index.js +17 -0
  351. package/dist/src/migration-adapters/index.js.map +1 -0
  352. package/dist/src/migration-adapters/node-typescript-pnpm/index.d.ts +3 -0
  353. package/dist/src/migration-adapters/node-typescript-pnpm/index.d.ts.map +1 -0
  354. package/dist/src/migration-adapters/node-typescript-pnpm/index.js +141 -0
  355. package/dist/src/migration-adapters/node-typescript-pnpm/index.js.map +1 -0
  356. package/dist/src/migration-adapters/phaser-pnpm/index.d.ts +3 -0
  357. package/dist/src/migration-adapters/phaser-pnpm/index.d.ts.map +1 -0
  358. package/dist/src/migration-adapters/phaser-pnpm/index.js +142 -0
  359. package/dist/src/migration-adapters/phaser-pnpm/index.js.map +1 -0
  360. package/dist/src/migration-adapters/registry.d.ts +6 -0
  361. package/dist/src/migration-adapters/registry.d.ts.map +1 -0
  362. package/dist/src/migration-adapters/registry.js +58 -0
  363. package/dist/src/migration-adapters/registry.js.map +1 -0
  364. package/dist/src/migration-adapters/types.d.ts +35 -0
  365. package/dist/src/migration-adapters/types.d.ts.map +1 -0
  366. package/dist/src/migration-adapters/types.js +31 -0
  367. package/dist/src/migration-adapters/types.js.map +1 -0
  368. package/dist/src/onboarding/agents-generate.d.ts +11 -0
  369. package/dist/src/onboarding/agents-generate.d.ts.map +1 -0
  370. package/dist/src/onboarding/agents-generate.js +415 -0
  371. package/dist/src/onboarding/agents-generate.js.map +1 -0
  372. package/dist/src/onboarding/create.d.ts +12 -0
  373. package/dist/src/onboarding/create.d.ts.map +1 -0
  374. package/dist/src/onboarding/create.js +232 -0
  375. package/dist/src/onboarding/create.js.map +1 -0
  376. package/dist/src/onboarding/doctor.d.ts +30 -0
  377. package/dist/src/onboarding/doctor.d.ts.map +1 -0
  378. package/dist/src/onboarding/doctor.js +380 -0
  379. package/dist/src/onboarding/doctor.js.map +1 -0
  380. package/dist/src/onboarding/extended-behavioral-layer.d.ts +10 -0
  381. package/dist/src/onboarding/extended-behavioral-layer.d.ts.map +1 -0
  382. package/dist/src/onboarding/extended-behavioral-layer.js +82 -0
  383. package/dist/src/onboarding/extended-behavioral-layer.js.map +1 -0
  384. package/dist/src/onboarding/init.d.ts +25 -0
  385. package/dist/src/onboarding/init.d.ts.map +1 -0
  386. package/dist/src/onboarding/init.js +260 -0
  387. package/dist/src/onboarding/init.js.map +1 -0
  388. package/dist/src/onboarding/scaffold-project.d.ts +12 -0
  389. package/dist/src/onboarding/scaffold-project.d.ts.map +1 -0
  390. package/dist/src/onboarding/scaffold-project.js +167 -0
  391. package/dist/src/onboarding/scaffold-project.js.map +1 -0
  392. package/dist/src/onboarding/scaffold.d.ts +15 -0
  393. package/dist/src/onboarding/scaffold.d.ts.map +1 -0
  394. package/dist/src/onboarding/scaffold.js +120 -0
  395. package/dist/src/onboarding/scaffold.js.map +1 -0
  396. package/dist/src/onboarding/upgrade.d.ts +17 -0
  397. package/dist/src/onboarding/upgrade.d.ts.map +1 -0
  398. package/dist/src/onboarding/upgrade.js +293 -0
  399. package/dist/src/onboarding/upgrade.js.map +1 -0
  400. package/dist/src/profiles/stack-profile.d.ts +51 -0
  401. package/dist/src/profiles/stack-profile.d.ts.map +1 -0
  402. package/dist/src/profiles/stack-profile.js +119 -0
  403. package/dist/src/profiles/stack-profile.js.map +1 -0
  404. package/dist/src/registry.d.ts +38 -0
  405. package/dist/src/registry.d.ts.map +1 -0
  406. package/dist/src/registry.js +135 -0
  407. package/dist/src/registry.js.map +1 -0
  408. package/dist/src/skill-schema.d.ts +30 -0
  409. package/dist/src/skill-schema.d.ts.map +1 -0
  410. package/dist/src/skill-schema.js +34 -0
  411. package/dist/src/skill-schema.js.map +1 -0
  412. package/dist/src/types.d.ts +153 -0
  413. package/dist/src/types.d.ts.map +1 -0
  414. package/dist/src/types.js +17 -0
  415. package/dist/src/types.js.map +1 -0
  416. package/dist/src/utils/fs-atomic.d.ts +7 -0
  417. package/dist/src/utils/fs-atomic.d.ts.map +1 -0
  418. package/dist/src/utils/fs-atomic.js +81 -0
  419. package/dist/src/utils/fs-atomic.js.map +1 -0
  420. package/dist/src/utils/fs-idempotent.d.ts +2 -0
  421. package/dist/src/utils/fs-idempotent.d.ts.map +1 -0
  422. package/dist/src/utils/fs-idempotent.js +30 -0
  423. package/dist/src/utils/fs-idempotent.js.map +1 -0
  424. package/dist/src/utils/fs.d.ts +8 -0
  425. package/dist/src/utils/fs.d.ts.map +1 -0
  426. package/dist/src/utils/fs.js +60 -0
  427. package/dist/src/utils/fs.js.map +1 -0
  428. package/dist/src/utils/generated-marker.d.ts +21 -0
  429. package/dist/src/utils/generated-marker.d.ts.map +1 -0
  430. package/dist/src/utils/generated-marker.js +128 -0
  431. package/dist/src/utils/generated-marker.js.map +1 -0
  432. package/dist/src/utils/hash.d.ts +2 -0
  433. package/dist/src/utils/hash.d.ts.map +1 -0
  434. package/dist/src/utils/hash.js +18 -0
  435. package/dist/src/utils/hash.js.map +1 -0
  436. package/dist/src/utils/index.d.ts +7 -0
  437. package/dist/src/utils/index.d.ts.map +1 -0
  438. package/dist/src/utils/index.js +19 -0
  439. package/dist/src/utils/index.js.map +1 -0
  440. package/dist/src/utils/string-utils.d.ts +2 -0
  441. package/dist/src/utils/string-utils.d.ts.map +1 -0
  442. package/dist/src/utils/string-utils.js +19 -0
  443. package/dist/src/utils/string-utils.js.map +1 -0
  444. package/dist/src/validators/port-validate.d.ts +12 -0
  445. package/dist/src/validators/port-validate.d.ts.map +1 -0
  446. package/dist/src/validators/port-validate.js +73 -0
  447. package/dist/src/validators/port-validate.js.map +1 -0
  448. package/dist/src/validators/skill-validate.d.ts +14 -0
  449. package/dist/src/validators/skill-validate.d.ts.map +1 -0
  450. package/dist/src/validators/skill-validate.js +487 -0
  451. package/dist/src/validators/skill-validate.js.map +1 -0
  452. package/os/rfc/rfc-0000-template.md +222 -0
  453. package/package.json +262 -0
  454. package/profiles/astro-typescript-turborepo.yaml +144 -0
  455. package/profiles/forge-shell.yaml +77 -0
  456. package/profiles/phaser-turborepo.yaml +144 -0
  457. package/skills/_shared/fo-pipeline-conventions.md +119 -0
  458. package/skills/_shared/fo-session-summary.md +95 -0
  459. package/skills/fo/fo-add-tests/SKILL.md +166 -0
  460. package/skills/fo/fo-add-tests/mocking.md +60 -0
  461. package/skills/fo/fo-add-tests/pbt-guide.md +193 -0
  462. package/skills/fo/fo-add-tests/tests-reference.md +92 -0
  463. package/skills/fo/fo-architecture/SKILL.md +83 -0
  464. package/skills/fo/fo-architecture/architecture-vocabulary.md +104 -0
  465. package/skills/fo/fo-architecture/deepening.md +37 -0
  466. package/skills/fo/fo-architecture/design-it-twice.md +44 -0
  467. package/skills/fo/fo-architecture/html-report.md +104 -0
  468. package/skills/fo/fo-compass-annotate/SKILL.md +128 -0
  469. package/skills/fo/fo-compass-annotate/reference/comment-styles.md +25 -0
  470. package/skills/fo/fo-compass-annotate/reference/learned-principles.md +12 -0
  471. package/skills/fo/fo-compass-annotate/reference/risk-patterns.md +23 -0
  472. package/skills/fo/fo-compass-annotate/templates/audit-prompt.md +36 -0
  473. package/skills/fo/fo-compass-annotate/templates/header-format.md +57 -0
  474. package/skills/fo/fo-compass-annotate/templates/header-prompt.md +35 -0
  475. package/skills/fo/fo-doc-audit/SKILL.md +264 -0
  476. package/skills/fo/fo-extract-dna/SKILL.md +248 -0
  477. package/skills/fo/fo-fix/SKILL.md +152 -0
  478. package/skills/fo/fo-fix/bug-diagnosis.md +128 -0
  479. package/skills/fo/fo-handoff/SKILL.md +58 -0
  480. package/skills/fo/fo-harvest/SKILL.md +80 -0
  481. package/skills/fo/fo-idea/SKILL.md +242 -0
  482. package/skills/fo/fo-idea-audit/SKILL.md +248 -0
  483. package/skills/fo/fo-idea-create-adr/SKILL.md +130 -0
  484. package/skills/fo/fo-idea-create-rfc/SKILL.md +130 -0
  485. package/skills/fo/fo-idea-enhance/SKILL.md +218 -0
  486. package/skills/fo/fo-idea-i-just-want-to-see-the-plan/SKILL.md +36 -0
  487. package/skills/fo/fo-idea-i-just-want-to-see-the-result/SKILL.md +167 -0
  488. package/skills/fo/fo-idea-implement/SKILL.md +463 -0
  489. package/skills/fo/fo-idea-plan/SKILL.md +230 -0
  490. package/skills/fo/fo-idea-status/SKILL.md +103 -0
  491. package/skills/fo/fo-memory-sync/SKILL.md +204 -0
  492. package/skills/fo/fo-memory-sync/fix-patterns.md +24 -0
  493. package/skills/fo/fo-memory-sync/learned-principles.md +6 -0
  494. package/skills/fo/fo-memory-sync/qa-log.md +5 -0
  495. package/skills/fo/fo-qa/SKILL.md +142 -0
  496. package/skills/fo/fo-review/SKILL.md +273 -0
  497. package/skills/fo/fo-session-retro/SKILL.md +276 -0
  498. package/skills/fo/fo-session-save/SKILL.md +71 -0
  499. package/skills/fo/fo-session-save/fix-patterns.md +33 -0
  500. package/skills/fo/fo-session-save/learned-principles.md +19 -0
  501. package/skills/fo/fo-session-save/qa-log.md +11 -0
  502. package/skills/fo/fo-spec-ingest/SKILL.md +127 -0
  503. package/skills/fo/fo-triage/SKILL.md +97 -0
  504. package/skills/meta/forge-bootstrap/SKILL.md +335 -0
  505. package/skills/meta/forge-bootstrap/forge-about.md +35 -0
  506. package/skills/meta/forge-bootstrap/milestone-gallery/.gitkeep +0 -0
  507. package/skills/meta/forge-bootstrap/operator-profile-template.md +53 -0
  508. package/skills/meta/forge-bootstrap/project-narrative-template.md +31 -0
  509. package/skills/meta/port-to-forge/SKILL.md +65 -0
  510. package/skills/meta/skill-create/SKILL.md +73 -0
  511. package/skills/shared/grilling/SKILL.md +28 -0
  512. package/skills/shared/grilling/learned-principles.md +12 -0
  513. package/skills/shared/grilling/qa-log.md +10 -0
  514. package/skills/shared/my-preferences/SKILL.md +77 -0
  515. package/skills/shared/windows-ai-tooling/SKILL.md +200 -0
  516. package/skills/shared/writing-great-skills/SKILL.md +132 -0
@@ -0,0 +1,113 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>Register the session documentation domain commands with the forge kernel registry.</purpose>
4
+ <non-goals>
5
+ <item>Do not implement handler logic here — delegate to handlers/*.ts.</item>
6
+ </non-goals>
7
+ </MODULE_CONTRACT>
8
+ <CHANGE_SUMMARY>
9
+ <item>RFC-0537: initial forgeSessionModule registering session.save, session.archive, session.validate, session.list commands.</item>
10
+ </CHANGE_SUMMARY>
11
+ */
12
+ export const forgeSessionModule = {
13
+ name: "forge-session",
14
+ version: "0.1.0",
15
+ async register(registry) {
16
+ const { runSessionSave } = await import("./handlers/save.js");
17
+ const { runSessionArchive } = await import("./handlers/archive.js");
18
+ const { runSessionValidate } = await import("./handlers/validate.js");
19
+ const { runSessionList } = await import("./handlers/list.js");
20
+ registry.registerCommand({
21
+ name: "session.save",
22
+ description: "Convert raw ATIF files from docs/sessions/.raw/ to structured markdown " +
23
+ "in docs/sessions/ with auto-extracted metadata. Idempotent — same raw " +
24
+ "file always produces the same output filename. Deletes raw file after " +
25
+ "conversion unless --keep-raw. Use --raw-file to process a specific file.",
26
+ scope: "workspace",
27
+ mutatesState: true,
28
+ writes: ["docs/sessions/*.md"],
29
+ reads: ["docs/sessions/.raw/*"],
30
+ cacheable: false,
31
+ flags: {
32
+ "raw-file": {
33
+ kind: "string",
34
+ description: "Process a specific raw file instead of scanning .raw/.",
35
+ },
36
+ "keep-raw": {
37
+ kind: "boolean",
38
+ description: "Do not delete raw file after conversion.",
39
+ },
40
+ "dry-run": {
41
+ kind: "boolean",
42
+ description: "Preview without writing files.",
43
+ },
44
+ },
45
+ execute: runSessionSave,
46
+ });
47
+ registry.registerCommand({
48
+ name: "session.archive",
49
+ description: "Move session files older than --max-age-days (default 7) from " +
50
+ "docs/sessions/ to docs/sessions/archive/. Bidirectional: files in " +
51
+ "archive/ younger than threshold are moved back to docs/sessions/. " +
52
+ "Use --dry-run to preview. Age is computed from frontmatter date, " +
53
+ "not filesystem mtime. Prefer the docs.archive umbrella command " +
54
+ "unless you need to archive only sessions.",
55
+ scope: "workspace",
56
+ mutatesState: true,
57
+ writes: ["docs/sessions/*.md", "docs/sessions/archive/**"],
58
+ reads: ["docs/sessions/**/*.md"],
59
+ cacheable: false,
60
+ flags: {
61
+ "max-age-days": {
62
+ kind: "string",
63
+ description: "Age threshold in days (default 7).",
64
+ },
65
+ "dry-run": {
66
+ kind: "boolean",
67
+ description: "Preview what would be moved without touching the filesystem.",
68
+ },
69
+ },
70
+ execute: runSessionArchive,
71
+ });
72
+ registry.registerCommand({
73
+ name: "session.validate",
74
+ description: "Validate session frontmatter schema (SES-01), id-filename match (SES-02), " +
75
+ "RFC-id existence (SES-03), raw file hygiene (SES-04), and non-markdown " +
76
+ "file detection (SES-05). Pass a session id to validate a single file, " +
77
+ "or run without arguments for all. On-demand only — not integrated into " +
78
+ "build.check.",
79
+ scope: "workspace",
80
+ flags: {},
81
+ reads: ["docs/sessions/**/*.md", "docs/rfcs/**/*.md"],
82
+ execute: runSessionValidate,
83
+ });
84
+ registry.registerCommand({
85
+ name: "session.list",
86
+ description: "List all sessions. Filter with --date-from, --date-to, --rfc, --type flags. " +
87
+ "Use --json for machine-readable output. Parses frontmatter on the fly. " +
88
+ "Includes archived sessions (marked with archived: true).",
89
+ scope: "workspace",
90
+ flags: {
91
+ "date-from": {
92
+ kind: "string",
93
+ description: "Filter sessions from this date (YYYY-MM-DD, inclusive).",
94
+ },
95
+ "date-to": {
96
+ kind: "string",
97
+ description: "Filter sessions up to this date (YYYY-MM-DD, inclusive).",
98
+ },
99
+ rfc: {
100
+ kind: "string",
101
+ description: "Filter by related RFC id (e.g. RFC-0537).",
102
+ },
103
+ type: {
104
+ kind: "string",
105
+ description: "Filter by session type (mission, grilling, implementation, review, fix, freeform).",
106
+ },
107
+ },
108
+ reads: ["docs/sessions/**/*.md"],
109
+ execute: runSessionList,
110
+ });
111
+ },
112
+ };
113
+ //# sourceMappingURL=session.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.module.js","sourceRoot":"","sources":["../../../os/session/session.module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ export declare const SESSION_DIR = "docs/sessions";
2
+ export declare const SESSION_RAW_SUBDIR = ".raw";
3
+ export declare const SESSION_ARCHIVE_SUBDIR = "archive";
4
+ export declare const SESSION_ID_PATTERN: RegExp;
5
+ export declare const SESSION_FILE_PATTERN: RegExp;
6
+ export declare const SESSION_TYPES: readonly ["mission", "grilling", "implementation", "review", "fix", "freeform"];
7
+ export type SessionType = (typeof SESSION_TYPES)[number];
8
+ export declare const SESSION_KNOWN_KEYS: readonly ["id", "date", "duration", "types", "summary", "relatedRfcs", "relatedArtifacts", "decisions", "commits", "files", "commands"];
9
+ export declare const SESSION_REQUIRED_KEYS: readonly ["id", "date", "types"];
10
+ export declare const SESSION_REQUIRED_SECTIONS: readonly ["## Transcript"];
11
+ export declare const SES_RULES: {
12
+ readonly SES_01: "SES-01";
13
+ readonly SES_02: "SES-02";
14
+ readonly SES_03: "SES-03";
15
+ readonly SES_04: "SES-04";
16
+ readonly SES_05: "SES-05";
17
+ };
18
+ export type SesRule = (typeof SES_RULES)[keyof typeof SES_RULES];
19
+ export interface SessionFrontmatter {
20
+ id: string;
21
+ date: string;
22
+ duration: string | null;
23
+ types: SessionType[];
24
+ summary: string;
25
+ relatedRfcs: string[];
26
+ relatedArtifacts: string[];
27
+ decisions: string[];
28
+ commits: string[];
29
+ files: string[];
30
+ commands: string[];
31
+ }
32
+ export interface SessionSaveResult {
33
+ command: "session.save";
34
+ status: "ok";
35
+ file: string;
36
+ rawFile: string;
37
+ rawDeleted: boolean;
38
+ id: string;
39
+ types: SessionType[];
40
+ extractedMetadata: {
41
+ relatedRfcs: string[];
42
+ relatedArtifacts: string[];
43
+ commits: string[];
44
+ files: string[];
45
+ commands: string[];
46
+ };
47
+ dryRun: boolean;
48
+ }
49
+ export interface SessionSaveSkip {
50
+ rawFile: string;
51
+ reason: string;
52
+ }
53
+ export interface SessionArchiveMove {
54
+ id: string;
55
+ file: string;
56
+ from: string;
57
+ to: string;
58
+ ageDays: number;
59
+ direction: "into-archive" | "out-of-archive";
60
+ }
61
+ export interface SessionArchiveSkip {
62
+ id: string;
63
+ file: string;
64
+ reason: string;
65
+ }
66
+ export interface SessionArchiveResult {
67
+ command: "session.archive";
68
+ status: "ok";
69
+ moved: SessionArchiveMove[];
70
+ skipped: SessionArchiveSkip[];
71
+ maxAgeDays: number;
72
+ dryRun: boolean;
73
+ }
74
+ export interface SessionValidationViolation {
75
+ rule: SesRule;
76
+ file: string;
77
+ message: string;
78
+ severity: "error" | "warning";
79
+ }
80
+ export interface SessionValidationResult {
81
+ command: "session.validate";
82
+ status: "pass" | "fail";
83
+ violations: SessionValidationViolation[];
84
+ checked: number;
85
+ }
86
+ export interface SessionListEntry {
87
+ id: string;
88
+ date: string;
89
+ types: SessionType[];
90
+ summary: string;
91
+ relatedRfcs: string[];
92
+ file: string;
93
+ archived: boolean;
94
+ }
95
+ export interface SessionListResult {
96
+ command: "session.list";
97
+ status: "ok";
98
+ sessions: SessionListEntry[];
99
+ count: number;
100
+ }
101
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../os/session/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>
4
+ Type definitions and constants for the session documentation domain —
5
+ session frontmatter, list/archive/validate/save result shapes, and SES
6
+ validation rule identifiers.
7
+ </purpose>
8
+ <non-goals>
9
+ <item>Do not define handler logic here — that lives in handlers/*.ts.</item>
10
+ </non-goals>
11
+ </MODULE_CONTRACT>
12
+ <CHANGE_SUMMARY>
13
+ <item>RFC-0537: initial session domain types, constants, and SES rule identifiers.</item>
14
+ </CHANGE_SUMMARY>
15
+ */
16
+ export const SESSION_DIR = "docs/sessions";
17
+ export const SESSION_RAW_SUBDIR = ".raw";
18
+ export const SESSION_ARCHIVE_SUBDIR = "archive";
19
+ export const SESSION_ID_PATTERN = /^\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}-[0-9a-f]{6}$/;
20
+ export const SESSION_FILE_PATTERN = /^\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}-[0-9a-f]{6}\.md$/;
21
+ export const SESSION_TYPES = [
22
+ "mission",
23
+ "grilling",
24
+ "implementation",
25
+ "review",
26
+ "fix",
27
+ "freeform",
28
+ ];
29
+ export const SESSION_KNOWN_KEYS = [
30
+ "id",
31
+ "date",
32
+ "duration",
33
+ "types",
34
+ "summary",
35
+ "relatedRfcs",
36
+ "relatedArtifacts",
37
+ "decisions",
38
+ "commits",
39
+ "files",
40
+ "commands",
41
+ ];
42
+ export const SESSION_REQUIRED_KEYS = ["id", "date", "types"];
43
+ export const SESSION_REQUIRED_SECTIONS = ["## Transcript"];
44
+ // SES validation rules
45
+ export const SES_RULES = {
46
+ SES_01: "SES-01",
47
+ SES_02: "SES-02",
48
+ SES_03: "SES-03",
49
+ SES_04: "SES-04",
50
+ SES_05: "SES-05",
51
+ };
52
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../os/session/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;EAcE;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;AAC3C,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AACzC,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAC;AAChD,MAAM,CAAC,MAAM,kBAAkB,GAAG,mDAAmD,CAAC;AACtF,MAAM,CAAC,MAAM,oBAAoB,GAAG,uDAAuD,CAAC;AAE5F,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS;IACT,UAAU;IACV,gBAAgB;IAChB,QAAQ;IACR,KAAK;IACL,UAAU;CACF,CAAC;AAIX,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI;IACJ,MAAM;IACN,UAAU;IACV,OAAO;IACP,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,WAAW;IACX,SAAS;IACT,OAAO;IACP,UAAU;CACF,CAAC;AAEX,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAEtE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,eAAe,CAAU,CAAC;AAEpE,uBAAuB;AACvB,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;CACR,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { ForgeCommandInput, ForgeCommandResult, ForgeRuntimeContext } from "../../src/types.ts";
2
+ interface MaterializedNode {
3
+ node: string;
4
+ rfc: string;
5
+ file: string;
6
+ }
7
+ interface SkippedNode {
8
+ node: string;
9
+ reason: string;
10
+ }
11
+ interface SpecMaterializeResult {
12
+ command: "spec.materialize";
13
+ status: "pass" | "fail";
14
+ spec: string;
15
+ created: MaterializedNode[];
16
+ skipped: SkippedNode[];
17
+ front: string[];
18
+ }
19
+ export declare function runSpecMaterialize(input: ForgeCommandInput, context: ForgeRuntimeContext): Promise<ForgeCommandResult<SpecMaterializeResult>>;
20
+ export {};
21
+ //# sourceMappingURL=spec-materialize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-materialize.d.ts","sourceRoot":"","sources":["../../../os/spec/spec-materialize.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAe5B,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,qBAAqB;IAC7B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAuBD,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC,CAwTpD"}
@@ -0,0 +1,342 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>spec.materialize handler — scaffolds RFC files for front nodes of a spec roadmap (RFC-0396).</purpose>
4
+ <non-goals>
5
+ <item>Do not fill RFC content — the agent fills sections during the fo pipeline.</item>
6
+ <item>Do not bulk-materialize past the front or above the --next cap.</item>
7
+ </non-goals>
8
+ </MODULE_CONTRACT>
9
+ <CHANGE_SUMMARY>
10
+ <item>RFC-0396: initial spec.materialize handler — front computation, scaffold via rfc.create, materializedAs write-back.</item>
11
+ </CHANGE_SUMMARY>
12
+ */
13
+ import fs from "node:fs/promises";
14
+ import { existsSync } from "node:fs";
15
+ import path from "node:path";
16
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
17
+ import { toKebabCase } from "../../src/utils/string-utils.js";
18
+ import { loadForgeConfig, resolveForgeRoot } from "../../src/config/forge-config.js";
19
+ import { forgeSpecSchema, specAmendmentSchema, resolveAmendedNode, } from "./spec-schema.js";
20
+ import { listRfcFiles } from "../rfc/frontmatter-io.js";
21
+ // ---------------------------------------------------------------------------
22
+ // Helpers
23
+ // ---------------------------------------------------------------------------
24
+ async function readYaml(filePath) {
25
+ try {
26
+ const content = await fs.readFile(filePath, "utf8");
27
+ return parseYaml(content);
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ function toIsoDate(d) {
34
+ return d.toISOString().slice(0, 10);
35
+ }
36
+ // ---------------------------------------------------------------------------
37
+ // Main handler
38
+ // ---------------------------------------------------------------------------
39
+ export async function runSpecMaterialize(input, context) {
40
+ const { workspaceRoot, logger, outputFormat } = context;
41
+ const specId = input.flags["spec"];
42
+ if (!specId) {
43
+ return {
44
+ data: {
45
+ command: "spec.materialize",
46
+ status: "fail",
47
+ spec: "",
48
+ created: [],
49
+ skipped: [],
50
+ front: [],
51
+ },
52
+ exitCode: 1,
53
+ summary: "spec.materialize: --spec=<id> is required",
54
+ };
55
+ }
56
+ let specsDir = "docs/specs";
57
+ try {
58
+ const config = loadForgeConfig(workspaceRoot);
59
+ specsDir = config.paths.specsDir;
60
+ }
61
+ catch {
62
+ // Use default
63
+ }
64
+ const specDir = path.join(workspaceRoot, specsDir, specId);
65
+ const forgeSpecPath = path.join(specDir, "forge-spec.yaml");
66
+ const rawSpec = await readYaml(forgeSpecPath);
67
+ if (!rawSpec) {
68
+ return {
69
+ data: {
70
+ command: "spec.materialize",
71
+ status: "fail",
72
+ spec: specId,
73
+ created: [],
74
+ skipped: [],
75
+ front: [],
76
+ },
77
+ exitCode: 1,
78
+ summary: `spec.materialize: forge-spec.yaml not found for spec '${specId}'`,
79
+ };
80
+ }
81
+ const parsed = forgeSpecSchema.safeParse(rawSpec);
82
+ if (!parsed.success) {
83
+ return {
84
+ data: {
85
+ command: "spec.materialize",
86
+ status: "fail",
87
+ spec: specId,
88
+ created: [],
89
+ skipped: [],
90
+ front: [],
91
+ },
92
+ exitCode: 1,
93
+ summary: `spec.materialize: forge-spec.yaml schema violation for spec '${specId}'`,
94
+ };
95
+ }
96
+ const spec = parsed.data;
97
+ if (spec.status !== "accepted") {
98
+ return {
99
+ data: {
100
+ command: "spec.materialize",
101
+ status: "fail",
102
+ spec: specId,
103
+ created: [],
104
+ skipped: [],
105
+ front: [],
106
+ },
107
+ exitCode: 1,
108
+ summary: `spec.materialize: spec '${specId}' is not accepted (status: ${spec.status}). Run /fo-spec-ingest to complete acceptance.`,
109
+ };
110
+ }
111
+ // Load amendments (RFC-0397)
112
+ const amendmentsDir = path.join(specDir, "amendments");
113
+ const amendments = [];
114
+ if (existsSync(amendmentsDir)) {
115
+ const amdEntries = await fs.readdir(amendmentsDir);
116
+ for (const entry of amdEntries) {
117
+ if (!entry.endsWith(".md"))
118
+ continue;
119
+ try {
120
+ const content = await fs.readFile(path.join(amendmentsDir, entry), "utf8");
121
+ const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
122
+ if (!fmMatch)
123
+ continue;
124
+ const raw = parseYaml(fmMatch[1]);
125
+ const amdParsed = specAmendmentSchema.safeParse(raw);
126
+ if (amdParsed.success) {
127
+ amendments.push(amdParsed.data);
128
+ }
129
+ }
130
+ catch {
131
+ // skip
132
+ }
133
+ }
134
+ }
135
+ const proposedAmendmentNodes = new Set();
136
+ for (const amendment of amendments) {
137
+ if (amendment.status === "proposed") {
138
+ for (const target of amendment.targets) {
139
+ if (target.kind === "node")
140
+ proposedAmendmentNodes.add(target.id);
141
+ }
142
+ }
143
+ }
144
+ const rfcDir = path.join(workspaceRoot, "docs", "rfcs");
145
+ const rfcFiles = await listRfcFiles(rfcDir);
146
+ // Load RFC statuses
147
+ const rfcStatuses = new Map();
148
+ for (const file of rfcFiles) {
149
+ try {
150
+ const content = await fs.readFile(path.join(rfcDir, file), "utf8");
151
+ const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
152
+ if (!fmMatch)
153
+ continue;
154
+ const fm = parseYaml(fmMatch[1]);
155
+ const id = String(fm["id"] ?? "");
156
+ const status = String(fm["status"] ?? "");
157
+ if (id && status)
158
+ rfcStatuses.set(id, status);
159
+ }
160
+ catch {
161
+ // skip
162
+ }
163
+ }
164
+ // Compute node states
165
+ const nodeState = new Map();
166
+ for (const node of spec.rfcs) {
167
+ if (node.materializedAs) {
168
+ const status = rfcStatuses.get(node.materializedAs);
169
+ nodeState.set(node.id, status === "implemented" ? "implemented" : "unmaterialized");
170
+ }
171
+ else {
172
+ nodeState.set(node.id, "unmaterialized");
173
+ }
174
+ }
175
+ // Compute front: unmaterialized nodes whose deps are all implemented
176
+ function isFront(node) {
177
+ if (node.materializedAs)
178
+ return false;
179
+ return node.dependsOn.every((dep) => nodeState.get(dep) === "implemented");
180
+ }
181
+ const frontNodes = spec.rfcs.filter(isFront);
182
+ // Determine which nodes to materialize
183
+ const explicitNodes = input.flags["nodes"];
184
+ let toMaterialize;
185
+ if (explicitNodes) {
186
+ const requested = explicitNodes.split(",").map((s) => s.trim()).filter(Boolean);
187
+ toMaterialize = [];
188
+ const skipped = [];
189
+ for (const nodeId of requested) {
190
+ const node = spec.rfcs.find((n) => n.id === nodeId);
191
+ if (!node) {
192
+ skipped.push({ node: nodeId, reason: "node not found in spec" });
193
+ }
194
+ else if (!isFront(node)) {
195
+ const blockers = node.dependsOn.filter((d) => nodeState.get(d) !== "implemented");
196
+ skipped.push({ node: nodeId, reason: `blocked by ${blockers.join(", ")}` });
197
+ }
198
+ else {
199
+ toMaterialize.push(node);
200
+ }
201
+ }
202
+ if (skipped.length > 0 && toMaterialize.length === 0) {
203
+ return {
204
+ data: {
205
+ command: "spec.materialize",
206
+ status: "fail",
207
+ spec: specId,
208
+ created: [],
209
+ skipped,
210
+ front: frontNodes.map((n) => n.id),
211
+ },
212
+ exitCode: 1,
213
+ summary: `spec.materialize: all requested nodes blocked or not found`,
214
+ };
215
+ }
216
+ }
217
+ else {
218
+ const nextStr = input.flags["next"];
219
+ let next = nextStr ? parseInt(nextStr, 10) : 8;
220
+ if (isNaN(next) || next < 1)
221
+ next = 8;
222
+ if (next > 12)
223
+ next = 12;
224
+ toMaterialize = frontNodes.slice(0, next);
225
+ }
226
+ // Find max RFC number
227
+ let maxId = 0;
228
+ for (const file of rfcFiles) {
229
+ const match = path.basename(file).match(/^rfc-(\d{4})/);
230
+ if (match) {
231
+ const num = parseInt(match[1], 10);
232
+ if (num > maxId)
233
+ maxId = num;
234
+ }
235
+ }
236
+ // Load template from forge root (ships inside the package at os/rfc/)
237
+ let templatePath;
238
+ try {
239
+ const forgeRoot = resolveForgeRoot(workspaceRoot);
240
+ templatePath = path.join(forgeRoot, "os", "rfc", "rfc-0000-template.md");
241
+ }
242
+ catch {
243
+ templatePath = path.join(workspaceRoot, "os", "rfc", "rfc-0000-template.md");
244
+ }
245
+ let templateContent;
246
+ try {
247
+ templateContent = await fs.readFile(templatePath, "utf-8");
248
+ }
249
+ catch {
250
+ return {
251
+ data: {
252
+ command: "spec.materialize",
253
+ status: "fail",
254
+ spec: specId,
255
+ created: [],
256
+ skipped: [],
257
+ front: frontNodes.map((n) => n.id),
258
+ },
259
+ exitCode: 1,
260
+ summary: `spec.materialize: RFC template not found at ${templatePath}`,
261
+ };
262
+ }
263
+ const today = toIsoDate(new Date());
264
+ const created = [];
265
+ const skipped = [];
266
+ for (const node of toMaterialize) {
267
+ // Use amended node if amendments exist (RFC-0397)
268
+ const effectiveNode = resolveAmendedNode(spec, node.id, amendments);
269
+ const nextNum = maxId + 1;
270
+ const paddedNum = String(nextNum).padStart(4, "0");
271
+ const nextRfcId = `RFC-${paddedNum}`;
272
+ const kebabTitle = toKebabCase(effectiveNode.title);
273
+ const fileName = `rfc-${paddedNum}-${kebabTitle}.md`;
274
+ // Warn if node has a proposed amendment (RFC-0397)
275
+ if (proposedAmendmentNodes.has(node.id)) {
276
+ logger.warn(`Warning: node ${node.id} has a proposed amendment — node knowledge may be about to change`);
277
+ }
278
+ let content = templateContent;
279
+ content = content.replace(/^id: RFC-0000$/m, `id: ${nextRfcId}`);
280
+ content = content.replace(/^title: ".*"$/m, `title: "${effectiveNode.title}"`);
281
+ content = content.replace(/^status: draft$/m, `status: draft`);
282
+ content = content.replace(/^kind: \w+$/m, `kind: contract`);
283
+ content = content.replace(/^createdAt: YYYY-MM-DD$/m, `createdAt: ${today}`);
284
+ content = content.replace(/^updatedAt: YYYY-MM-DD$/m, `updatedAt: ${today}`);
285
+ content = content.replace(/^# specRef:$/m, `specRef: "${specId}/${node.id}"`);
286
+ content = content.replace(/^# RFC-0000: .+$/m, `# ${nextRfcId}: ${effectiveNode.title}`);
287
+ // Add normative source references in the body
288
+ const sourceRefs = effectiveNode.sources.length > 0
289
+ ? effectiveNode.sources.map((s) => `- ${s}`).join("\n")
290
+ : "(none)";
291
+ const designSection = `\n## Design\n\n**Normative source references:**\n${sourceRefs}\n\n_Fill in the implementation design for this repository. Reference vendored snapshot sections — do not copy model content._\n`;
292
+ content = content.replace(/^---\n\n# /m, `---\n${designSection}\n# `);
293
+ const targetPath = path.join(rfcDir, fileName);
294
+ await fs.writeFile(targetPath, content, "utf-8");
295
+ maxId = nextNum;
296
+ created.push({
297
+ node: node.id,
298
+ rfc: nextRfcId,
299
+ file: path.join("docs", "rfcs", fileName),
300
+ });
301
+ }
302
+ // Write back materializedAs into forge-spec.yaml
303
+ if (created.length > 0) {
304
+ const updatedSpec = {
305
+ ...spec,
306
+ rfcs: spec.rfcs.map((node) => {
307
+ const created_entry = created.find((c) => c.node === node.id);
308
+ return created_entry ? { ...node, materializedAs: created_entry.rfc } : node;
309
+ }),
310
+ };
311
+ const yamlContent = stringifyYaml(updatedSpec);
312
+ await fs.writeFile(forgeSpecPath, yamlContent, "utf-8");
313
+ }
314
+ // Report skipped front nodes (beyond the materialized batch)
315
+ const remainingFront = frontNodes
316
+ .filter((n) => !created.some((c) => c.node === n.id))
317
+ .map((n) => n.id);
318
+ if (outputFormat === "pretty") {
319
+ for (const c of created) {
320
+ logger.success(`Materialized ${c.node} → ${c.rfc} (${c.file})`);
321
+ }
322
+ for (const s of skipped) {
323
+ logger.warn(`Skipped ${s.node}: ${s.reason}`);
324
+ }
325
+ if (remainingFront.length > 0) {
326
+ logger.info(`Remaining front: ${remainingFront.join(", ")}`);
327
+ }
328
+ }
329
+ return {
330
+ data: {
331
+ command: "spec.materialize",
332
+ status: "pass",
333
+ spec: specId,
334
+ created,
335
+ skipped,
336
+ front: remainingFront,
337
+ },
338
+ exitCode: 0,
339
+ summary: `spec.materialize: created ${created.length} RFC(s) from spec '${specId}'`,
340
+ };
341
+ }
342
+ //# sourceMappingURL=spec-materialize.js.map