@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,232 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>forge.create — single entry point for project scaffolding. Composes forge.scaffold + forge.init + package-manager post-processing into one command.</purpose>
4
+ <non-goals>
5
+ <item>Do not change forge.init or forge.scaffold contracts — forge.create delegates to them.</item>
6
+ <item>Do not add interactive prompts — all configuration is via flags and positional args.</item>
7
+ <item>Do not import from @warpgogol/* — this module is portable.</item>
8
+ </non-goals>
9
+ </MODULE_CONTRACT>
10
+ <CHANGE_SUMMARY>
11
+ <item>RFC-0544: initial forge.create handler composing scaffold + init.</item>
12
+ <item>RFC-0544 fix: replace double cast on runInit return with proper InitResult typing.</item>
13
+ <item>RFC-0548: auto-run forge.agents.generate after init, update nextSteps to remove manual AGENTS.md step.</item>
14
+ <item>RFC-0550: write NEXT_STEPS.md into project root with creator-facing guidance (greenfield vs transplant via LLM).</item>
15
+ </CHANGE_SUMMARY>
16
+ */
17
+ import fs from "node:fs";
18
+ import path from "node:path";
19
+ import { stringify as stringifyYaml } from "yaml";
20
+ import { runScaffoldProject } from "./scaffold-project.js";
21
+ import { runInit } from "./init.js";
22
+ import { runAgentsGenerate } from "./agents-generate.js";
23
+ import { loadForgeConfig, resolveForgeRoot, resolvePackageManager, applyCliBindingDefaults, } from "../config/forge-config.js";
24
+ export async function runCreate(input, context) {
25
+ const { logger, outputFormat } = context;
26
+ const name = input.args[0];
27
+ const profile = input.flags["profile"] ?? "forge-shell";
28
+ const packageManager = input.flags["package-manager"] ?? "pnpm";
29
+ const errors = [];
30
+ const passNextSteps = [
31
+ { action: "Open the project in Windsurf", kind: "required" },
32
+ { action: "Run /forge-bootstrap to configure the project interactively", kind: "optional" },
33
+ ];
34
+ const failNextSteps = [
35
+ { action: "Fix the errors above and re-run forge.create", kind: "required" },
36
+ ];
37
+ // 1. Validate name
38
+ if (!name) {
39
+ errors.push("Missing required positional argument: <name>");
40
+ if (outputFormat === "pretty") {
41
+ logger.error("Missing required positional argument: <name>");
42
+ }
43
+ return {
44
+ data: { command: "forge.create", status: "fail", projectDir: "", profile, filesCreated: [], errors },
45
+ nextSteps: failNextSteps,
46
+ exitCode: 1,
47
+ summary: "forge.create: failed — missing <name> argument",
48
+ };
49
+ }
50
+ if (!/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(name)) {
51
+ const msg = `Project name "${name}" is not kebab-case (expected ^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$)`;
52
+ errors.push(msg);
53
+ if (outputFormat === "pretty") {
54
+ logger.error(msg);
55
+ }
56
+ return {
57
+ data: { command: "forge.create", status: "fail", projectDir: "", profile, filesCreated: [], errors },
58
+ nextSteps: failNextSteps,
59
+ exitCode: 1,
60
+ summary: `forge.create: failed — ${msg}`,
61
+ };
62
+ }
63
+ // 2. Resolve target directory
64
+ const targetDir = path.resolve(context.workspaceRoot, name);
65
+ // 3. Refuse if target exists and is non-empty
66
+ if (fs.existsSync(targetDir)) {
67
+ const entries = fs.readdirSync(targetDir);
68
+ if (entries.length > 0) {
69
+ const msg = `Directory "${name}" already exists and is not empty (contains: ${entries.slice(0, 5).join(", ")}${entries.length > 5 ? "…" : ""})`;
70
+ errors.push(msg);
71
+ if (outputFormat === "pretty") {
72
+ logger.error(msg);
73
+ }
74
+ return {
75
+ data: { command: "forge.create", status: "fail", projectDir: targetDir, profile, filesCreated: [], errors },
76
+ nextSteps: failNextSteps,
77
+ exitCode: 1,
78
+ summary: `forge.create: failed — ${msg}`,
79
+ };
80
+ }
81
+ }
82
+ // 4. Create target directory
83
+ fs.mkdirSync(targetDir, { recursive: true });
84
+ // 4b. Resolve forge root from parent context (the new dir won't have forge installed)
85
+ let forgeRoot;
86
+ if (context.forgeRoot) {
87
+ forgeRoot = context.forgeRoot;
88
+ }
89
+ else {
90
+ try {
91
+ forgeRoot = resolveForgeRoot(context.workspaceRoot);
92
+ }
93
+ catch {
94
+ forgeRoot = context.workspaceRoot;
95
+ }
96
+ }
97
+ // 5. Build child context with workspaceRoot = targetDir and forgeRoot override
98
+ const childContext = {
99
+ ...context,
100
+ workspaceRoot: targetDir,
101
+ forgeRoot,
102
+ };
103
+ // 6. Run forge.scaffold inside target dir
104
+ const scaffoldInput = {
105
+ argv: [],
106
+ args: [],
107
+ flags: { profile, name },
108
+ };
109
+ const scaffoldResult = await runScaffoldProject(scaffoldInput, childContext);
110
+ if (scaffoldResult.exitCode !== 0) {
111
+ const scaffoldErrors = scaffoldResult.data?.errors ?? ["scaffold failed"];
112
+ return {
113
+ data: {
114
+ command: "forge.create",
115
+ status: "fail",
116
+ projectDir: targetDir,
117
+ profile,
118
+ filesCreated: scaffoldResult.data?.created ?? [],
119
+ errors: scaffoldErrors,
120
+ },
121
+ nextSteps: failNextSteps,
122
+ exitCode: 1,
123
+ summary: `forge.create: failed — scaffold step failed`,
124
+ };
125
+ }
126
+ // 7. Run forge.init inside target dir
127
+ const initInput = {
128
+ argv: [],
129
+ args: [],
130
+ flags: {},
131
+ };
132
+ const initResult = runInit(initInput, childContext);
133
+ if (initResult.status !== "pass") {
134
+ return {
135
+ data: {
136
+ command: "forge.create",
137
+ status: "fail",
138
+ projectDir: targetDir,
139
+ profile,
140
+ filesCreated: [...(scaffoldResult.data?.created ?? []), ...(initResult.created ?? [])],
141
+ errors: initResult.errors ?? ["init failed"],
142
+ },
143
+ nextSteps: failNextSteps,
144
+ exitCode: 1,
145
+ summary: `forge.create: failed — init step failed`,
146
+ };
147
+ }
148
+ // 8. Post-process forge.yaml if --package-manager differs from default
149
+ if (packageManager !== "pnpm") {
150
+ const forgeYamlPath = path.join(targetDir, "forge.yaml");
151
+ if (fs.existsSync(forgeYamlPath)) {
152
+ try {
153
+ const config = loadForgeConfig(targetDir);
154
+ const pm = resolvePackageManager(packageManager);
155
+ config.project.packageManager = pm;
156
+ if (config.bindings) {
157
+ config.bindings.commands = applyCliBindingDefaults(pm);
158
+ }
159
+ fs.writeFileSync(forgeYamlPath, stringifyYaml(config), "utf8");
160
+ }
161
+ catch {
162
+ // Post-processing is best-effort — init already wrote a valid config
163
+ }
164
+ }
165
+ }
166
+ // 9. Auto-run forge.agents.generate (RFC-0548)
167
+ try {
168
+ const agentsInput = {
169
+ argv: [],
170
+ args: [],
171
+ flags: {},
172
+ };
173
+ const agentsResult = await runAgentsGenerate(agentsInput, childContext);
174
+ if (agentsResult.exitCode !== 0 && outputFormat === "pretty") {
175
+ logger.warn("forge.agents.generate failed — AGENTS.md not generated. Run 'forge agents generate' manually after fixing the issue.");
176
+ }
177
+ }
178
+ catch {
179
+ if (outputFormat === "pretty") {
180
+ logger.warn("forge.agents.generate failed — AGENTS.md not generated. Run 'forge agents generate' manually after fixing the issue.");
181
+ }
182
+ }
183
+ // 10. Write NEXT_STEPS.md (RFC-0550)
184
+ const nextStepsPath = path.join(targetDir, "NEXT_STEPS.md");
185
+ const nextStepsContent = `# Next Steps
186
+
187
+ Your Forge project is ready. You have two options — just tell the AI agent what you want, and it will handle the rest.
188
+
189
+ ## Option A: Start creating
190
+
191
+ Tell the AI agent what you want to build. Describe your idea in your own words — a website, a game, a blog, a tool — and the system will set everything up and start creating with you.
192
+
193
+ ## Option B: Bring your existing project
194
+
195
+ If you already have a project elsewhere and want to move it into Forge, tell the AI agent:
196
+
197
+ > I want to bring my existing project into Forge.
198
+
199
+ The system will guide you through the process — it detects your project type, migrates the code, and preserves your Git history.
200
+
201
+ ---
202
+
203
+ Whichever path you choose, you don't need to run any commands. Just describe what you want in natural language, and the AI agent takes care of it.
204
+ `;
205
+ fs.writeFileSync(nextStepsPath, nextStepsContent, "utf8");
206
+ // 11. Collect filesCreated
207
+ const filesCreated = [
208
+ ...(scaffoldResult.data?.created ?? []),
209
+ ...(initResult.created ?? []),
210
+ "NEXT_STEPS.md",
211
+ ];
212
+ if (outputFormat === "pretty") {
213
+ logger.success(`Created project "${name}" in ${targetDir}`);
214
+ for (const f of filesCreated) {
215
+ logger.info(` created: ${f}`);
216
+ }
217
+ }
218
+ return {
219
+ data: {
220
+ command: "forge.create",
221
+ status: "pass",
222
+ projectDir: targetDir,
223
+ profile,
224
+ filesCreated,
225
+ errors: [],
226
+ },
227
+ nextSteps: passNextSteps,
228
+ exitCode: 0,
229
+ summary: `forge.create: OK — created ${name} with ${filesCreated.length} files`,
230
+ };
231
+ }
232
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/onboarding/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { ForgeCommandInput, ForgeCommandResult, ForgeRuntimeContext } from "../types.ts";
2
+ interface DoctorCheck {
3
+ name: string;
4
+ status: "pass" | "fail" | "warn";
5
+ message: string;
6
+ }
7
+ interface ForbiddenImport {
8
+ file: string;
9
+ specifier: string;
10
+ }
11
+ interface BindingValidation {
12
+ resolved: string[];
13
+ absent: string[];
14
+ invalid: string[];
15
+ notices: BindingNotice[];
16
+ }
17
+ interface BindingNotice {
18
+ key: string;
19
+ rule: string;
20
+ suggestion: string;
21
+ }
22
+ export declare function runDoctor(_input: ForgeCommandInput, context: ForgeRuntimeContext): Promise<ForgeCommandResult<{
23
+ command: string;
24
+ checks: DoctorCheck[];
25
+ allPass: boolean;
26
+ forbiddenImports: ForbiddenImport[];
27
+ bindings: BindingValidation;
28
+ }>>;
29
+ export {};
30
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/onboarding/doctor.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAIrB,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AA4RD,wBAAsB,SAAS,CAC7B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,gBAAgB,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAAC,CA8H7J"}
@@ -0,0 +1,380 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>forge.doctor — diagnoses forge state in an existing project.
4
+ Checks for forge.yaml, AGENTS.md, PREFERENCES.md, .agents/skills/, docs/rfcs/,
5
+ @warpgogol/* import autonomy guard, and bindings contract (RFC-0393).</purpose>
6
+ <non-goals>
7
+ <item>Do not modify files — doctor is read-only diagnostics.</item>
8
+ </non-goals>
9
+ </MODULE_CONTRACT>
10
+ <CHANGE_SUMMARY>
11
+ <item>Initial forge.doctor handler for autonomy refactor.</item>
12
+ <item>RFC-0391: added @warpgogol/* forbidden-imports autonomy guard.</item>
13
+ <item>RFC-0393: added bindings validation — resolved/absent/invalid reporting.</item>
14
+ <item>RFC-0524: added stale knowledge file detection — compares source and .agents/ copies.</item>
15
+ <item>RFC-0539: extended knowledge file check to iterate pack skills via discoverPackSkills. Added pack-skills check for stale/missing copies and skillPacks config validation.</item>
16
+ <item>RFC-0540: added defaultable-binding-null notices for forge-CLI-backed bindings.</item>
17
+ </CHANGE_SUMMARY>
18
+ */
19
+ import { readFile, readdir, stat } from "node:fs/promises";
20
+ import { join, relative, dirname } from "node:path";
21
+ import { resolveForgeRoot, loadForgeConfig, resolveBinding, FORGE_CLI_BINDING_DEFAULTS, resolvePmRunner } from "../config/forge-config.js";
22
+ import { FORGE_SKILLS, discoverPackSkills } from "../registry.js";
23
+ async function pathExists(target) {
24
+ try {
25
+ await stat(target);
26
+ return true;
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ }
32
+ const FORBIDDEN_IMPORT_PATTERN = /(?:^|\n)\s*(?:import\s+[^;]+?\s+from\s+|require\s*\(\s*)["'`](@warpgogol\/[^"'`]+)["'`]/g;
33
+ async function scanForForbiddenImports(dir, workspaceRoot) {
34
+ const violations = [];
35
+ const entries = await readdir(dir, { withFileTypes: true }).catch(() => []);
36
+ for (const entry of entries) {
37
+ const fullPath = join(dir, entry.name);
38
+ if (entry.isDirectory()) {
39
+ if (entry.name === "node_modules" || entry.name === "tests")
40
+ continue;
41
+ const sub = await scanForForbiddenImports(fullPath, workspaceRoot);
42
+ violations.push(...sub);
43
+ }
44
+ else if (entry.name.endsWith(".ts")) {
45
+ const content = await readFile(fullPath, "utf8").catch(() => "");
46
+ let match;
47
+ const pattern = new RegExp(FORBIDDEN_IMPORT_PATTERN.source, "g");
48
+ while ((match = pattern.exec(content)) !== null) {
49
+ violations.push({
50
+ file: relative(workspaceRoot, fullPath),
51
+ specifier: match[1],
52
+ });
53
+ }
54
+ }
55
+ }
56
+ return violations;
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Bindings validation (RFC-0393)
60
+ // ---------------------------------------------------------------------------
61
+ const BINDING_PATH_KEYS = [
62
+ "paths.invariantsFile",
63
+ "paths.reviewsDir",
64
+ "paths.handoffsDir",
65
+ "paths.sessionsDir",
66
+ ];
67
+ const BINDING_COMMAND_KEYS = [
68
+ "commands.validateRfc",
69
+ "commands.validateAdr",
70
+ "commands.implementStamp",
71
+ "commands.typecheck",
72
+ "commands.test",
73
+ "commands.scopedBuild",
74
+ "commands.specValidate",
75
+ ];
76
+ async function validateBindings(workspaceRoot) {
77
+ const result = { resolved: [], absent: [], invalid: [], notices: [] };
78
+ let config;
79
+ try {
80
+ config = loadForgeConfig(workspaceRoot);
81
+ }
82
+ catch {
83
+ return result;
84
+ }
85
+ if (!config.bindings) {
86
+ return result;
87
+ }
88
+ for (const key of BINDING_PATH_KEYS) {
89
+ const value = resolveBinding(config, key);
90
+ if (value === null) {
91
+ result.absent.push(key);
92
+ }
93
+ else if (typeof value === "string") {
94
+ const exists = await pathExists(join(workspaceRoot, value));
95
+ if (exists) {
96
+ result.resolved.push(key);
97
+ }
98
+ else {
99
+ result.invalid.push(`${key} (path not found: ${value})`);
100
+ }
101
+ }
102
+ }
103
+ const compassDocs = resolveBinding(config, "paths.compassDocs");
104
+ if (Array.isArray(compassDocs) && compassDocs.length > 0) {
105
+ for (const docPath of compassDocs) {
106
+ const exists = await pathExists(join(workspaceRoot, docPath));
107
+ if (exists) {
108
+ result.resolved.push(`paths.compassDocs[${docPath}]`);
109
+ }
110
+ else {
111
+ result.invalid.push(`paths.compassDocs[${docPath}] (path not found)`);
112
+ }
113
+ }
114
+ }
115
+ else {
116
+ result.absent.push("paths.compassDocs");
117
+ }
118
+ for (const key of BINDING_COMMAND_KEYS) {
119
+ const value = resolveBinding(config, key);
120
+ if (value === null) {
121
+ result.absent.push(key);
122
+ }
123
+ else if (typeof value === "string") {
124
+ result.resolved.push(key);
125
+ }
126
+ }
127
+ // RFC-0540: Emit defaultable-binding-null notices for forge-CLI-backed bindings
128
+ const pm = config.project.packageManager;
129
+ const runner = resolvePmRunner(pm);
130
+ for (const entry of FORGE_CLI_BINDING_DEFAULTS) {
131
+ const value = resolveBinding(config, entry.key);
132
+ if (value === null) {
133
+ result.notices.push({
134
+ key: entry.key,
135
+ rule: "defaultable-binding-null",
136
+ suggestion: `${runner} ${entry.template}`,
137
+ });
138
+ }
139
+ }
140
+ return result;
141
+ }
142
+ // ---------------------------------------------------------------------------
143
+ // Stale knowledge file detection (RFC-0524)
144
+ // ---------------------------------------------------------------------------
145
+ async function checkStaleKnowledgeFiles(workspaceRoot, forgeRoot) {
146
+ const stale = [];
147
+ let config;
148
+ try {
149
+ config = loadForgeConfig(workspaceRoot);
150
+ }
151
+ catch {
152
+ return { name: "knowledge-files", status: "pass", message: "No forge.yaml — knowledge file check skipped" };
153
+ }
154
+ const agentsSkillsDir = join(workspaceRoot, config.paths.skillsDir);
155
+ for (const skill of FORGE_SKILLS) {
156
+ if (!skill.knowledge || skill.knowledge.length === 0)
157
+ continue;
158
+ const skillSrcDir = dirname(join(forgeRoot, skill.path));
159
+ for (const kf of skill.knowledge) {
160
+ const srcPath = join(skillSrcDir, kf);
161
+ const destPath = join(agentsSkillsDir, skill.name, kf);
162
+ const srcExists = await pathExists(srcPath);
163
+ const destExists = await pathExists(destPath);
164
+ if (srcExists && destExists) {
165
+ const srcContent = await readFile(srcPath, "utf8").catch(() => "");
166
+ const destContent = await readFile(destPath, "utf8").catch(() => "");
167
+ if (srcContent !== destContent) {
168
+ stale.push(`${skill.name}/${kf}`);
169
+ }
170
+ }
171
+ // If source exists but dest doesn't, skip — expected on first install
172
+ // If source doesn't exist, SKILL-13 in forge.skill.validate catches it
173
+ }
174
+ }
175
+ // RFC-0539: Check pack skill knowledge files
176
+ const packSkills = discoverPackSkills(workspaceRoot, config);
177
+ for (const skill of packSkills) {
178
+ if (!skill.knowledge || skill.knowledge.length === 0)
179
+ continue;
180
+ const skillSrcDir = dirname(join(workspaceRoot, skill.dir, skill.path));
181
+ for (const kf of skill.knowledge) {
182
+ const srcPath = join(skillSrcDir, kf);
183
+ const destPath = join(agentsSkillsDir, skill.name, kf);
184
+ const srcExists = await pathExists(srcPath);
185
+ const destExists = await pathExists(destPath);
186
+ if (srcExists && destExists) {
187
+ const srcContent = await readFile(srcPath, "utf8").catch(() => "");
188
+ const destContent = await readFile(destPath, "utf8").catch(() => "");
189
+ if (srcContent !== destContent) {
190
+ stale.push(`${skill.name}/${kf}`);
191
+ }
192
+ }
193
+ }
194
+ }
195
+ return {
196
+ name: "knowledge-files",
197
+ status: stale.length === 0 ? "pass" : "warn",
198
+ message: stale.length === 0
199
+ ? "All knowledge files in sync"
200
+ : `${stale.length} stale knowledge file(s): ${stale.join(", ")} — run 'forge create' to sync`,
201
+ };
202
+ }
203
+ // ---------------------------------------------------------------------------
204
+ // Pack skill diagnostics (RFC-0539)
205
+ // ---------------------------------------------------------------------------
206
+ async function checkPackSkills(workspaceRoot) {
207
+ let config;
208
+ try {
209
+ config = loadForgeConfig(workspaceRoot);
210
+ }
211
+ catch {
212
+ return { name: "pack-skills", status: "pass", message: "No forge.yaml — pack skill check skipped" };
213
+ }
214
+ if (!config.skillPacks || config.skillPacks.length === 0) {
215
+ return { name: "pack-skills", status: "pass", message: "No skill packs declared" };
216
+ }
217
+ const issues = [];
218
+ // Validate skillPacks config: unique prefixes, unique dirs, no 'fo' prefix, dir exists
219
+ const prefixes = new Set();
220
+ const dirs = new Set();
221
+ for (const pack of config.skillPacks) {
222
+ if (prefixes.has(pack.prefix)) {
223
+ issues.push(`duplicate prefix '${pack.prefix}'`);
224
+ }
225
+ prefixes.add(pack.prefix);
226
+ if (pack.prefix === "fo") {
227
+ issues.push(`prefix 'fo' is reserved for forge`);
228
+ }
229
+ if (dirs.has(pack.dir)) {
230
+ issues.push(`duplicate dir '${pack.dir}'`);
231
+ }
232
+ dirs.add(pack.dir);
233
+ const packDirExists = await pathExists(join(workspaceRoot, pack.dir));
234
+ if (!packDirExists) {
235
+ issues.push(`pack dir '${pack.dir}' does not exist`);
236
+ }
237
+ }
238
+ // Check for stale/missing pack skill copies
239
+ const packSkills = discoverPackSkills(workspaceRoot, config);
240
+ const agentsSkillsDir = join(workspaceRoot, config.paths.skillsDir);
241
+ for (const skill of packSkills) {
242
+ const srcPath = join(workspaceRoot, skill.dir, skill.path);
243
+ const destPath = join(agentsSkillsDir, skill.name, "SKILL.md");
244
+ const srcExists = await pathExists(srcPath);
245
+ const destExists = await pathExists(destPath);
246
+ if (srcExists && destExists) {
247
+ const srcContent = await readFile(srcPath, "utf8").catch(() => "");
248
+ const destContent = await readFile(destPath, "utf8").catch(() => "");
249
+ if (srcContent !== destContent) {
250
+ issues.push(`stale copy of '${skill.name}'`);
251
+ }
252
+ }
253
+ else if (srcExists && !destExists) {
254
+ issues.push(`missing copy of '${skill.name}'`);
255
+ }
256
+ }
257
+ return {
258
+ name: "pack-skills",
259
+ status: issues.length === 0 ? "pass" : "warn",
260
+ message: issues.length === 0
261
+ ? `${packSkills.length} pack skill(s) in sync`
262
+ : `${issues.length} issue(s): ${issues.join(", ")} — run 'forge create' to sync`,
263
+ };
264
+ }
265
+ export async function runDoctor(_input, context) {
266
+ const { workspaceRoot, logger, outputFormat } = context;
267
+ const checks = [];
268
+ // Check forge.yaml
269
+ const forgeYamlExists = await pathExists(join(workspaceRoot, "forge.yaml"));
270
+ checks.push({
271
+ name: "forge.yaml",
272
+ status: forgeYamlExists ? "pass" : "warn",
273
+ message: forgeYamlExists
274
+ ? "forge.yaml found"
275
+ : "forge.yaml not found — run 'forge create' to create project configuration",
276
+ });
277
+ // Check AGENTS.md
278
+ const agentsMdExists = await pathExists(join(workspaceRoot, "AGENTS.md"));
279
+ checks.push({
280
+ name: "AGENTS.md",
281
+ status: agentsMdExists ? "pass" : "warn",
282
+ message: agentsMdExists
283
+ ? "AGENTS.md found"
284
+ : "AGENTS.md not found — run 'forge create' to deploy agent instructions",
285
+ });
286
+ // Check PREFERENCES.md
287
+ const preferencesExists = await pathExists(join(workspaceRoot, "PREFERENCES.md"));
288
+ checks.push({
289
+ name: "PREFERENCES.md",
290
+ status: preferencesExists ? "pass" : "warn",
291
+ message: preferencesExists
292
+ ? "PREFERENCES.md found"
293
+ : "PREFERENCES.md not found — run 'forge create' to create preferences file",
294
+ });
295
+ // Check .agents/skills/
296
+ const skillsDirExists = await pathExists(join(workspaceRoot, ".agents", "skills"));
297
+ checks.push({
298
+ name: ".agents/skills/",
299
+ status: skillsDirExists ? "pass" : "fail",
300
+ message: skillsDirExists
301
+ ? ".agents/skills/ directory found"
302
+ : ".agents/skills/ directory not found — run 'forge create' to deploy skills",
303
+ });
304
+ // Check docs/rfcs/
305
+ const rfcsDirExists = await pathExists(join(workspaceRoot, "docs", "rfcs"));
306
+ checks.push({
307
+ name: "docs/rfcs/",
308
+ status: rfcsDirExists ? "pass" : "warn",
309
+ message: rfcsDirExists
310
+ ? "docs/rfcs/ directory found"
311
+ : "docs/rfcs/ directory not found — run 'forge create' to create RFC directory",
312
+ });
313
+ // Check docs/adrs/
314
+ const adrsDirExists = await pathExists(join(workspaceRoot, "docs", "adrs"));
315
+ checks.push({
316
+ name: "docs/adrs/",
317
+ status: adrsDirExists ? "pass" : "warn",
318
+ message: adrsDirExists
319
+ ? "docs/adrs/ directory found"
320
+ : "docs/adrs/ directory not found — run 'forge create' to create ADR directory",
321
+ });
322
+ // Check @warpgogol/* forbidden imports (autonomy guard)
323
+ let forgeRoot;
324
+ try {
325
+ forgeRoot = resolveForgeRoot(workspaceRoot);
326
+ }
327
+ catch {
328
+ forgeRoot = join(workspaceRoot, "packages", "forge");
329
+ }
330
+ const forbiddenImports = await scanForForbiddenImports(forgeRoot, workspaceRoot);
331
+ checks.push({
332
+ name: "autonomy-guard",
333
+ status: forbiddenImports.length === 0 ? "pass" : "fail",
334
+ message: forbiddenImports.length === 0
335
+ ? "No @warpgogol/* imports in forge source"
336
+ : `${forbiddenImports.length} @warpgogol/* import(s) found in forge source — remove them`,
337
+ });
338
+ // Check bindings contract (RFC-0393)
339
+ const bindingsResult = await validateBindings(workspaceRoot);
340
+ checks.push({
341
+ name: "bindings",
342
+ status: bindingsResult.invalid.length === 0 ? "pass" : "fail",
343
+ message: bindingsResult.invalid.length === 0
344
+ ? `Bindings: ${bindingsResult.resolved.length} resolved, ${bindingsResult.absent.length} absent`
345
+ : `Bindings: ${bindingsResult.invalid.length} invalid — ${bindingsResult.invalid.join(", ")}`,
346
+ });
347
+ // Check stale knowledge files (RFC-0524, RFC-0539)
348
+ const staleCheck = await checkStaleKnowledgeFiles(workspaceRoot, forgeRoot);
349
+ checks.push(staleCheck);
350
+ // RFC-0539: Check pack skills — stale/missing copies and config validation
351
+ const packCheck = await checkPackSkills(workspaceRoot);
352
+ checks.push(packCheck);
353
+ const allPass = checks.every((c) => c.status === "pass");
354
+ const hasFails = checks.some((c) => c.status === "fail");
355
+ if (outputFormat === "pretty") {
356
+ logger.section(`Forge Doctor — ${workspaceRoot}`);
357
+ for (const check of checks) {
358
+ const icon = check.status === "pass" ? "✓" : check.status === "warn" ? "⚠" : "✖";
359
+ const fn = check.status === "pass" ? logger.success : check.status === "warn" ? logger.warn : logger.error;
360
+ fn(`${icon} ${check.name}: ${check.message}`);
361
+ }
362
+ if (allPass) {
363
+ logger.success("All checks passed — forge is properly configured.");
364
+ }
365
+ else if (hasFails) {
366
+ logger.error("Some checks failed — run 'forge create' to fix.");
367
+ }
368
+ else {
369
+ logger.warn("Some checks warn — review above.");
370
+ }
371
+ }
372
+ return {
373
+ data: { command: "forge.doctor", checks, allPass, forbiddenImports, bindings: bindingsResult },
374
+ exitCode: hasFails ? 1 : 0,
375
+ summary: allPass
376
+ ? "forge.doctor: all checks passed"
377
+ : `forge.doctor: ${checks.filter((c) => c.status === "fail").length} fail(s), ${checks.filter((c) => c.status === "warn").length} warn(s)`,
378
+ };
379
+ }
380
+ //# sourceMappingURL=doctor.js.map