@ngocsangairvds/vsaf 5.1.5 → 5.1.7

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 (280) hide show
  1. package/package.json +1 -1
  2. package/packages/cli/dist/adapters/antigravity.d.ts.map +1 -1
  3. package/packages/cli/dist/adapters/antigravity.js +14 -30
  4. package/packages/cli/dist/adapters/antigravity.js.map +1 -1
  5. package/packages/cli/dist/adapters/claude.d.ts.map +1 -1
  6. package/packages/cli/dist/adapters/claude.js +8 -10
  7. package/packages/cli/dist/adapters/claude.js.map +1 -1
  8. package/packages/cli/dist/adapters/codex.d.ts.map +1 -1
  9. package/packages/cli/dist/adapters/codex.js +6 -9
  10. package/packages/cli/dist/adapters/codex.js.map +1 -1
  11. package/packages/cli/dist/adapters/cursor.d.ts.map +1 -1
  12. package/packages/cli/dist/adapters/cursor.js +22 -24
  13. package/packages/cli/dist/adapters/cursor.js.map +1 -1
  14. package/packages/cli/dist/commands/init.d.ts.map +1 -1
  15. package/packages/cli/dist/commands/init.js +7 -19
  16. package/packages/cli/dist/commands/init.js.map +1 -1
  17. package/packages/cli/dist/commands/install.d.ts +3 -6
  18. package/packages/cli/dist/commands/install.d.ts.map +1 -1
  19. package/packages/cli/dist/commands/install.js +27 -10
  20. package/packages/cli/dist/commands/install.js.map +1 -1
  21. package/packages/cli/dist/commands/skill.d.ts.map +1 -1
  22. package/packages/cli/dist/commands/skill.js +40 -16
  23. package/packages/cli/dist/commands/skill.js.map +1 -1
  24. package/packages/cli/dist/index.js +2 -2
  25. package/packages/cli/dist/index.js.map +1 -1
  26. package/packages/cli/dist/install/orchestrator.d.ts +0 -8
  27. package/packages/cli/dist/install/orchestrator.d.ts.map +1 -1
  28. package/packages/cli/dist/install/orchestrator.js +3 -54
  29. package/packages/cli/dist/install/orchestrator.js.map +1 -1
  30. package/packages/cli/dist/server/routes/runs.d.ts.map +1 -1
  31. package/packages/cli/dist/server/routes/runs.js +81 -3
  32. package/packages/cli/dist/server/routes/runs.js.map +1 -1
  33. package/packages/cli/dist/server/routes/workflows.d.ts.map +1 -1
  34. package/packages/cli/dist/server/routes/workflows.js +76 -17
  35. package/packages/cli/dist/server/routes/workflows.js.map +1 -1
  36. package/packages/cli/dist/server/services/execution-manager.d.ts +11 -1
  37. package/packages/cli/dist/server/services/execution-manager.d.ts.map +1 -1
  38. package/packages/cli/dist/server/services/execution-manager.js +88 -17
  39. package/packages/cli/dist/server/services/execution-manager.js.map +1 -1
  40. package/packages/cli/dist/server/static.d.ts.map +1 -1
  41. package/packages/cli/dist/server/static.js +4 -1
  42. package/packages/cli/dist/server/static.js.map +1 -1
  43. package/packages/cli/dist/server/workflow-path.d.ts +3 -0
  44. package/packages/cli/dist/server/workflow-path.d.ts.map +1 -0
  45. package/packages/cli/dist/server/workflow-path.js +25 -0
  46. package/packages/cli/dist/server/workflow-path.js.map +1 -0
  47. package/packages/core/dist/store/recovery.d.ts.map +1 -1
  48. package/packages/core/dist/store/recovery.js +12 -1
  49. package/packages/core/dist/store/recovery.js.map +1 -1
  50. package/packages/core/dist/store/run-store.d.ts +3 -0
  51. package/packages/core/dist/store/run-store.d.ts.map +1 -1
  52. package/packages/core/dist/store/run-store.js +33 -0
  53. package/packages/core/dist/store/run-store.js.map +1 -1
  54. package/packages/core/dist/store/types.d.ts +2 -2
  55. package/packages/core/dist/store/types.d.ts.map +1 -1
  56. package/packages/core/dist/store/types.js.map +1 -1
  57. package/packages/core/dist/store/wal.js +1 -1
  58. package/packages/core/dist/store/wal.js.map +1 -1
  59. package/packages/web/dist/web/3rdpartylicenses.txt +26 -26
  60. package/packages/web/dist/web/browser/chunk-4YPNNQ2T.js +4 -0
  61. package/packages/web/dist/web/browser/chunk-E227ZHPJ.js +1 -0
  62. package/packages/web/dist/web/browser/chunk-JFBK3MNW.js +1 -0
  63. package/packages/web/dist/web/browser/chunk-L2VOQBBI.js +1 -0
  64. package/packages/web/dist/web/browser/chunk-OJJM5VOH.js +1 -0
  65. package/packages/web/dist/web/browser/chunk-U2H3QYAG.js +5 -0
  66. package/packages/web/dist/web/browser/chunk-VA7KFQOR.js +1 -0
  67. package/packages/web/dist/web/browser/chunk-WV3C6DNH.js +1 -0
  68. package/packages/web/dist/web/browser/index.html +2 -2
  69. package/packages/web/dist/web/browser/main-THGFWXYL.js +1 -0
  70. package/packages/web/dist/web/browser/{styles-JBPZVY54.css → styles-PWTTI45T.css} +1 -1
  71. package/skills/sdlc/architecture/current-state/SKILL.md +10 -0
  72. package/skills/sdlc/architecture/current-state/step.md +13 -0
  73. package/skills/sdlc/architecture/decision/SKILL.md +10 -0
  74. package/skills/sdlc/architecture/decision/step.md +21 -0
  75. package/skills/sdlc/architecture/epics/SKILL.md +10 -0
  76. package/skills/sdlc/architecture/epics/step.md +34 -0
  77. package/skills/sdlc/architecture/grill/SKILL.md +10 -0
  78. package/skills/sdlc/architecture/grill/step.md +26 -0
  79. package/skills/sdlc/architecture/prereq/SKILL.md +10 -0
  80. package/skills/sdlc/architecture/prereq/step.md +16 -0
  81. package/skills/sdlc/architecture/readiness/SKILL.md +10 -0
  82. package/skills/sdlc/architecture/readiness/step.md +76 -0
  83. package/skills/sdlc/complete/context/SKILL.md +10 -0
  84. package/skills/sdlc/complete/context/step.md +14 -0
  85. package/skills/sdlc/complete/knowledge/SKILL.md +10 -0
  86. package/skills/sdlc/complete/knowledge/step.md +22 -0
  87. package/skills/sdlc/complete/prereq/SKILL.md +10 -0
  88. package/skills/sdlc/complete/prereq/step.md +16 -0
  89. package/skills/sdlc/complete/reindex/SKILL.md +10 -0
  90. package/skills/sdlc/complete/reindex/step.md +24 -0
  91. package/skills/sdlc/complete/status/SKILL.md +10 -0
  92. package/skills/sdlc/complete/status/step.md +52 -0
  93. package/skills/sdlc/discovery/brainstorm/SKILL.md +10 -0
  94. package/skills/sdlc/discovery/brainstorm/step.md +27 -0
  95. package/skills/sdlc/discovery/domain/SKILL.md +10 -0
  96. package/skills/sdlc/discovery/domain/step.md +13 -0
  97. package/skills/sdlc/discovery/grill/SKILL.md +10 -0
  98. package/skills/sdlc/discovery/grill/step.md +22 -0
  99. package/skills/sdlc/discovery/prereq/SKILL.md +10 -0
  100. package/skills/sdlc/discovery/prereq/step.md +16 -0
  101. package/skills/sdlc/discovery/prfaq/SKILL.md +10 -0
  102. package/skills/sdlc/discovery/prfaq/step.md +68 -0
  103. package/skills/sdlc/discovery/system/SKILL.md +10 -0
  104. package/skills/sdlc/discovery/system/step.md +19 -0
  105. package/skills/sdlc/hotfix/analyze/entry/SKILL.md +10 -0
  106. package/skills/sdlc/hotfix/analyze/entry/step.md +15 -0
  107. package/skills/sdlc/hotfix/analyze/exit/SKILL.md +10 -0
  108. package/skills/sdlc/hotfix/analyze/exit/step.md +19 -0
  109. package/skills/sdlc/hotfix/analyze/fix-strategy/SKILL.md +10 -0
  110. package/skills/sdlc/hotfix/analyze/fix-strategy/step.md +15 -0
  111. package/skills/sdlc/hotfix/analyze/gitnexus/SKILL.md +10 -0
  112. package/skills/sdlc/hotfix/analyze/gitnexus/step.md +17 -0
  113. package/skills/sdlc/hotfix/analyze/grill/SKILL.md +10 -0
  114. package/skills/sdlc/hotfix/analyze/grill/step.md +23 -0
  115. package/skills/sdlc/hotfix/analyze/reasoning/SKILL.md +10 -0
  116. package/skills/sdlc/hotfix/analyze/reasoning/step.md +29 -0
  117. package/skills/sdlc/hotfix/analyze/write/SKILL.md +10 -0
  118. package/skills/sdlc/hotfix/analyze/write/step.md +45 -0
  119. package/skills/sdlc/hotfix/implement/branch/SKILL.md +10 -0
  120. package/skills/sdlc/hotfix/implement/branch/step.md +15 -0
  121. package/skills/sdlc/hotfix/implement/entry/SKILL.md +10 -0
  122. package/skills/sdlc/hotfix/implement/entry/step.md +20 -0
  123. package/skills/sdlc/hotfix/implement/gate/SKILL.md +10 -0
  124. package/skills/sdlc/hotfix/implement/gate/step.md +104 -0
  125. package/skills/sdlc/hotfix/implement/impact/SKILL.md +10 -0
  126. package/skills/sdlc/hotfix/implement/impact/step.md +15 -0
  127. package/skills/sdlc/hotfix/implement/sonar/SKILL.md +10 -0
  128. package/skills/sdlc/hotfix/implement/sonar/step.md +27 -0
  129. package/skills/sdlc/hotfix/implement/tdd/SKILL.md +10 -0
  130. package/skills/sdlc/hotfix/implement/tdd/step.md +33 -0
  131. package/skills/sdlc/hotfix/implement/verify/SKILL.md +10 -0
  132. package/skills/sdlc/hotfix/implement/verify/step.md +27 -0
  133. package/skills/sdlc/hotfix/prd/entry/SKILL.md +10 -0
  134. package/skills/sdlc/hotfix/prd/entry/step.md +20 -0
  135. package/skills/sdlc/hotfix/prd/gate/SKILL.md +10 -0
  136. package/skills/sdlc/hotfix/prd/gate/step.md +32 -0
  137. package/skills/sdlc/hotfix/prd/requirements/SKILL.md +10 -0
  138. package/skills/sdlc/hotfix/prd/requirements/step.md +19 -0
  139. package/skills/sdlc/hotfix/prd/validate/SKILL.md +10 -0
  140. package/skills/sdlc/hotfix/prd/validate/step.md +19 -0
  141. package/skills/sdlc/hotfix/prd/write/SKILL.md +10 -0
  142. package/skills/sdlc/hotfix/prd/write/step.md +38 -0
  143. package/skills/sdlc/hotfix/review/entry/SKILL.md +10 -0
  144. package/skills/sdlc/hotfix/review/entry/step.md +13 -0
  145. package/skills/sdlc/hotfix/review/gate/SKILL.md +10 -0
  146. package/skills/sdlc/hotfix/review/gate/step.md +51 -0
  147. package/skills/sdlc/hotfix/review/impact/SKILL.md +10 -0
  148. package/skills/sdlc/hotfix/review/impact/step.md +22 -0
  149. package/skills/sdlc/hotfix/review/minimality/SKILL.md +10 -0
  150. package/skills/sdlc/hotfix/review/minimality/step.md +18 -0
  151. package/skills/sdlc/hotfix/review/test-quality/SKILL.md +10 -0
  152. package/skills/sdlc/hotfix/review/test-quality/step.md +16 -0
  153. package/skills/sdlc/hotfix/ship/commit-pr/SKILL.md +10 -0
  154. package/skills/sdlc/hotfix/ship/commit-pr/step.md +58 -0
  155. package/skills/sdlc/hotfix/ship/entry/SKILL.md +10 -0
  156. package/skills/sdlc/hotfix/ship/entry/step.md +20 -0
  157. package/skills/sdlc/hotfix/ship/exit/SKILL.md +10 -0
  158. package/skills/sdlc/hotfix/ship/exit/step.md +31 -0
  159. package/skills/sdlc/hotfix/ship/gitignore/SKILL.md +10 -0
  160. package/skills/sdlc/hotfix/ship/gitignore/step.md +22 -0
  161. package/skills/sdlc/hotfix/ship/report/SKILL.md +10 -0
  162. package/skills/sdlc/hotfix/ship/report/step.md +47 -0
  163. package/skills/sdlc/hotfix/ship/test-gate/SKILL.md +10 -0
  164. package/skills/sdlc/hotfix/ship/test-gate/step.md +17 -0
  165. package/skills/sdlc/implement/build-run/SKILL.md +10 -0
  166. package/skills/sdlc/implement/build-run/step.md +85 -0
  167. package/skills/sdlc/implement/checkpoint/SKILL.md +10 -0
  168. package/skills/sdlc/implement/checkpoint/step.md +20 -0
  169. package/skills/sdlc/implement/debug/SKILL.md +10 -0
  170. package/skills/sdlc/implement/debug/step.md +25 -0
  171. package/skills/sdlc/implement/impact/SKILL.md +10 -0
  172. package/skills/sdlc/implement/impact/step.md +12 -0
  173. package/skills/sdlc/implement/plan/SKILL.md +10 -0
  174. package/skills/sdlc/implement/plan/step.md +13 -0
  175. package/skills/sdlc/implement/prereq/SKILL.md +10 -0
  176. package/skills/sdlc/implement/prereq/step.md +21 -0
  177. package/skills/sdlc/implement/subagents/SKILL.md +10 -0
  178. package/skills/sdlc/implement/subagents/step.md +38 -0
  179. package/skills/sdlc/implement/tdd/SKILL.md +10 -0
  180. package/skills/sdlc/implement/tdd/step.md +24 -0
  181. package/skills/sdlc/init/SKILL.md +7 -0
  182. package/skills/sdlc/onboard-code/SKILL.md +7 -0
  183. package/skills/sdlc/onboard-docs/SKILL.md +7 -0
  184. package/skills/sdlc/pack.yaml +83 -16
  185. package/skills/sdlc/prd/blast-radius/SKILL.md +10 -0
  186. package/skills/sdlc/prd/blast-radius/step.md +76 -0
  187. package/skills/sdlc/prd/create/SKILL.md +10 -0
  188. package/skills/sdlc/prd/create/step.md +21 -0
  189. package/skills/sdlc/prd/elicitation/SKILL.md +10 -0
  190. package/skills/sdlc/prd/elicitation/step.md +12 -0
  191. package/skills/sdlc/prd/prereq/SKILL.md +10 -0
  192. package/skills/sdlc/prd/prereq/step.md +16 -0
  193. package/skills/sdlc/prd/validate/SKILL.md +10 -0
  194. package/skills/sdlc/prd/validate/step.md +24 -0
  195. package/skills/sdlc/review/code/SKILL.md +10 -0
  196. package/skills/sdlc/review/code/step.md +45 -0
  197. package/skills/sdlc/review/debate/SKILL.md +10 -0
  198. package/skills/sdlc/review/debate/step.md +84 -0
  199. package/skills/sdlc/review/impact/SKILL.md +10 -0
  200. package/skills/sdlc/review/impact/step.md +14 -0
  201. package/skills/sdlc/review/prereq/SKILL.md +10 -0
  202. package/skills/sdlc/review/prereq/step.md +18 -0
  203. package/skills/sdlc/review/verification/SKILL.md +10 -0
  204. package/skills/sdlc/review/verification/step.md +16 -0
  205. package/skills/sdlc/ship/commit/SKILL.md +10 -0
  206. package/skills/sdlc/ship/commit/step.md +23 -0
  207. package/skills/sdlc/ship/gitignore/SKILL.md +10 -0
  208. package/skills/sdlc/ship/gitignore/step.md +22 -0
  209. package/skills/sdlc/ship/pr/SKILL.md +10 -0
  210. package/skills/sdlc/ship/pr/step.md +34 -0
  211. package/skills/sdlc/ship/prereq/SKILL.md +10 -0
  212. package/skills/sdlc/ship/prereq/step.md +16 -0
  213. package/skills/sdlc/ship/report/SKILL.md +10 -0
  214. package/skills/sdlc/ship/report/step.md +74 -0
  215. package/skills/sdlc/srs/interface/SKILL.md +10 -0
  216. package/skills/sdlc/srs/interface/step.md +44 -0
  217. package/skills/sdlc/srs/prereq/SKILL.md +10 -0
  218. package/skills/sdlc/srs/prereq/step.md +19 -0
  219. package/skills/sdlc/srs/validate/SKILL.md +10 -0
  220. package/skills/sdlc/srs/validate/step.md +23 -0
  221. package/skills/sdlc/srs/write/SKILL.md +10 -0
  222. package/skills/sdlc/srs/write/step.md +19 -0
  223. package/skills/sdlc/test-design/boundary/SKILL.md +10 -0
  224. package/skills/sdlc/test-design/boundary/step.md +12 -0
  225. package/skills/sdlc/test-design/cases/SKILL.md +10 -0
  226. package/skills/sdlc/test-design/cases/step.md +22 -0
  227. package/skills/sdlc/test-design/coverage/SKILL.md +10 -0
  228. package/skills/sdlc/test-design/coverage/step.md +63 -0
  229. package/skills/sdlc/test-design/prereq/SKILL.md +10 -0
  230. package/skills/sdlc/test-design/prereq/step.md +15 -0
  231. package/{skills/sdlc/workflows → workflows/sdlc}/hotfix-tdd.yaml +2 -1
  232. package/{skills/sdlc/workflows → workflows/sdlc}/hotfix.yaml +8 -4
  233. package/workflows/sdlc/master-sdlc.yaml +64 -0
  234. package/workflows/sdlc/sdlc-architecture.yaml +43 -0
  235. package/workflows/sdlc/sdlc-build.yaml +51 -0
  236. package/workflows/sdlc/sdlc-design.yaml +61 -0
  237. package/workflows/sdlc/sdlc-discovery.yaml +43 -0
  238. package/workflows/sdlc/sdlc-feature-complete.yaml +36 -0
  239. package/workflows/sdlc/sdlc-hotfix-analyze.yaml +43 -0
  240. package/workflows/sdlc/sdlc-hotfix-implement.yaml +43 -0
  241. package/workflows/sdlc/sdlc-hotfix-prd.yaml +31 -0
  242. package/workflows/sdlc/sdlc-hotfix-review.yaml +31 -0
  243. package/workflows/sdlc/sdlc-hotfix-ship.yaml +37 -0
  244. package/workflows/sdlc/sdlc-implement.yaml +60 -0
  245. package/workflows/sdlc/sdlc-prd.yaml +36 -0
  246. package/workflows/sdlc/sdlc-qa.yaml +91 -0
  247. package/workflows/sdlc/sdlc-review.yaml +36 -0
  248. package/workflows/sdlc/sdlc-ship.yaml +36 -0
  249. package/workflows/sdlc/sdlc-srs.yaml +29 -0
  250. package/workflows/sdlc/sdlc-test-design.yaml +29 -0
  251. package/workflows/sdlc/sdlc-testcase.yaml +25 -0
  252. package/workflows/sdlc/sdlc-thinking.yaml +67 -0
  253. package/packages/web/dist/web/browser/chunk-IPMFXW6N.js +0 -1
  254. package/packages/web/dist/web/browser/chunk-IX2QWMX2.js +0 -1
  255. package/packages/web/dist/web/browser/chunk-QMAH5NZC.js +0 -1
  256. package/packages/web/dist/web/browser/chunk-RGFLNLPM.js +0 -1
  257. package/packages/web/dist/web/browser/chunk-RKWDHBN3.js +0 -5
  258. package/packages/web/dist/web/browser/chunk-XGYEZIV4.js +0 -1
  259. package/packages/web/dist/web/browser/main-IIUZVPMI.js +0 -1
  260. package/skills/sdlc/architecture/SKILL.md +0 -218
  261. package/skills/sdlc/discovery/SKILL.md +0 -197
  262. package/skills/sdlc/feature-complete/SKILL.md +0 -159
  263. package/skills/sdlc/hotfix-analyze/SKILL.md +0 -198
  264. package/skills/sdlc/hotfix-implement/SKILL.md +0 -272
  265. package/skills/sdlc/hotfix-prd/SKILL.md +0 -161
  266. package/skills/sdlc/hotfix-review/SKILL.md +0 -153
  267. package/skills/sdlc/hotfix-ship/SKILL.md +0 -221
  268. package/skills/sdlc/implement/SKILL.md +0 -264
  269. package/skills/sdlc/prd/SKILL.md +0 -182
  270. package/skills/sdlc/review/SKILL.md +0 -210
  271. package/skills/sdlc/ship/SKILL.md +0 -194
  272. package/skills/sdlc/srs/SKILL.md +0 -148
  273. package/skills/sdlc/test-design/SKILL.md +0 -132
  274. package/skills/sdlc/workflows/master-sdlc.yaml +0 -35
  275. package/skills/sdlc/workflows/sdlc-build.yaml +0 -18
  276. package/skills/sdlc/workflows/sdlc-design.yaml +0 -14
  277. package/skills/sdlc/workflows/sdlc-qa.yaml +0 -20
  278. package/skills/sdlc/workflows/sdlc-testcase.yaml +0 -8
  279. package/skills/sdlc/workflows/sdlc-thinking.yaml +0 -12
  280. /package/{skills/sdlc/workflows → workflows/sdlc}/onboarding.yaml +0 -0
@@ -1 +0,0 @@
1
- import{$ as x,A as b,B as se,C as ae,D as le,H as u,I as y,K as ue,L as d,M as h,N as de,O as A,Q as ce,T as he,U as fe,V as ge,W,_ as f,a,b as l,ba as pe,ca as me,d as Q,da as $,e as ee,f as te,g as ne,h as T,j as G,k as p,m,n as _,o as c,q as I,r as ie,s as re,t as B,u as U,v as H,w as s,x as oe,y as L,z as v}from"./chunk-RKWDHBN3.js";var Ae=(()=>{class n{_renderer;_elementRef;onChange=t=>{};onTouched=()=>{};constructor(t,i){this._renderer=t,this._elementRef=i}setProperty(t,i){this._renderer.setProperty(this._elementRef.nativeElement,t,i)}registerOnTouched(t){this.onTouched=t}registerOnChange(t){this.onChange=t}setDisabledState(t){this.setProperty("disabled",t)}static \u0275fac=function(i){return new(i||n)(s(H),s(B))};static \u0275dir=v({type:n})}return n})(),Be=(()=>{class n extends Ae{static \u0275fac=(()=>{let t;return function(r){return(t||(t=re(n)))(r||n)}})();static \u0275dir=v({type:n,features:[b]})}return n})(),Me=new p("");var Ue={provide:Me,useExisting:T(()=>R),multi:!0};function He(){let n=$()?$().getUserAgent():"";return/android (\d+)/.test(n.toLowerCase())}var Le=new p(""),R=(()=>{class n extends Ae{_compositionMode;_composing=!1;constructor(t,i,r){super(t,i),this._compositionMode=r,this._compositionMode==null&&(this._compositionMode=!He())}writeValue(t){let i=t??"";this.setProperty("value",i)}_handleInput(t){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(t)}_compositionStart(){this._composing=!0}_compositionEnd(t){this._composing=!1,this._compositionMode&&this.onChange(t)}static \u0275fac=function(i){return new(i||n)(s(H),s(B),s(Le,8))};static \u0275dir=v({type:n,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(i,r){i&1&&d("input",function(D){return r._handleInput(D.target.value)})("blur",function(){return r.onTouched()})("compositionstart",function(){return r._compositionStart()})("compositionend",function(D){return r._compositionEnd(D.target.value)})},standalone:!1,features:[W([Ue]),b]})}return n})();var We=new p(""),$e=new p("");function we(n){return n!=null}function Ee(n){return se(n)?ee(n):n}function Fe(n){let e={};return n.forEach(t=>{e=t!=null?a(a({},e),t):e}),Object.keys(e).length===0?null:e}function Se(n,e){return e.map(t=>t(n))}function qe(n){return!n.validate}function Ie(n){return n.map(e=>qe(e)?e:t=>e.validate(t))}function ze(n){if(!n)return null;let e=n.filter(we);return e.length==0?null:function(t){return Fe(Se(t,e))}}function xe(n){return n!=null?ze(Ie(n)):null}function Ze(n){if(!n)return null;let e=n.filter(we);return e.length==0?null:function(t){let i=Se(t,e).map(Ee);return ne(i).pipe(te(Fe))}}function Ne(n){return n!=null?Ze(Ie(n)):null}function _e(n,e){return n===null?[e]:Array.isArray(n)?[...n,e]:[n,e]}function Xe(n){return n._rawValidators}function Ye(n){return n._rawAsyncValidators}function q(n){return n?Array.isArray(n)?n:[n]:[]}function O(n,e){return Array.isArray(n)?n.includes(e):n===e}function ve(n,e){let t=q(e);return q(n).forEach(r=>{O(t,r)||t.push(r)}),t}function ye(n,e){return q(e).filter(t=>!O(n,t))}var k=class{get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators=[];_rawAsyncValidators=[];_setValidators(e){this._rawValidators=e||[],this._composedValidatorFn=xe(this._rawValidators)}_setAsyncValidators(e){this._rawAsyncValidators=e||[],this._composedAsyncValidatorFn=Ne(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_onDestroyCallbacks=[];_registerOnDestroy(e){this._onDestroyCallbacks.push(e)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(e=>e()),this._onDestroyCallbacks=[]}reset(e=void 0){this.control?.reset(e)}hasError(e,t){return this.control?this.control.hasError(e,t):!1}getError(e,t){return this.control?this.control.getError(e,t):null}},z=class extends k{name;get formDirective(){return null}get path(){return null}},S=class extends k{_parent=null;name=null;valueAccessor=null},Z=class{_cd;constructor(e){this._cd=e}get isTouched(){return this._cd?.control?._touched?.(),!!this._cd?.control?.touched}get isUntouched(){return!!this._cd?.control?.untouched}get isPristine(){return this._cd?.control?._pristine?.(),!!this._cd?.control?.pristine}get isDirty(){return!!this._cd?.control?.dirty}get isValid(){return this._cd?.control?._status?.(),!!this._cd?.control?.valid}get isInvalid(){return!!this._cd?.control?.invalid}get isPending(){return!!this._cd?.control?.pending}get isSubmitted(){return this._cd?._submitted?.(),!!this._cd?.submitted}};var Oe=(()=>{class n extends Z{constructor(t){super(t)}static \u0275fac=function(i){return new(i||n)(s(S,2))};static \u0275dir=v({type:n,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(i,r){i&2&&de("ng-untouched",r.isUntouched)("ng-touched",r.isTouched)("ng-pristine",r.isPristine)("ng-dirty",r.isDirty)("ng-valid",r.isValid)("ng-invalid",r.isInvalid)("ng-pending",r.isPending)},standalone:!1,features:[b]})}return n})();var M="VALID",N="INVALID",C="PENDING",w="DISABLED",g=class{},P=class extends g{value;source;constructor(e,t){super(),this.value=e,this.source=t}},E=class extends g{pristine;source;constructor(e,t){super(),this.pristine=e,this.source=t}},F=class extends g{touched;source;constructor(e,t){super(),this.touched=e,this.source=t}},V=class extends g{status;source;constructor(e,t){super(),this.status=e,this.source=t}};var X=class extends g{source;constructor(e){super(),this.source=e}};function Ke(n){return(j(n)?n.validators:n)||null}function Je(n){return Array.isArray(n)?xe(n):n||null}function Qe(n,e){return(j(e)?e.asyncValidators:n)||null}function et(n){return Array.isArray(n)?Ne(n):n||null}function j(n){return n!=null&&!Array.isArray(n)&&typeof n=="object"}var Y=class{_pendingDirty=!1;_hasOwnPendingAsyncValidator=null;_pendingTouched=!1;_onCollectionChange=()=>{};_updateOn;_parent=null;_asyncValidationSubscription;_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators;_rawAsyncValidators;value;constructor(e,t){this._assignValidators(e),this._assignAsyncValidators(t)}get validator(){return this._composedValidatorFn}set validator(e){this._rawValidators=this._composedValidatorFn=e}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(e){this._rawAsyncValidators=this._composedAsyncValidatorFn=e}get parent(){return this._parent}get status(){return f(this.statusReactive)}set status(e){f(()=>this.statusReactive.set(e))}_status=x(()=>this.statusReactive());statusReactive=I(void 0);get valid(){return this.status===M}get invalid(){return this.status===N}get pending(){return this.status===C}get disabled(){return this.status===w}get enabled(){return this.status!==w}errors;get pristine(){return f(this.pristineReactive)}set pristine(e){f(()=>this.pristineReactive.set(e))}_pristine=x(()=>this.pristineReactive());pristineReactive=I(!0);get dirty(){return!this.pristine}get touched(){return f(this.touchedReactive)}set touched(e){f(()=>this.touchedReactive.set(e))}_touched=x(()=>this.touchedReactive());touchedReactive=I(!1);get untouched(){return!this.touched}_events=new Q;events=this._events.asObservable();valueChanges;statusChanges;get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(e){this._assignValidators(e)}setAsyncValidators(e){this._assignAsyncValidators(e)}addValidators(e){this.setValidators(ve(e,this._rawValidators))}addAsyncValidators(e){this.setAsyncValidators(ve(e,this._rawAsyncValidators))}removeValidators(e){this.setValidators(ye(e,this._rawValidators))}removeAsyncValidators(e){this.setAsyncValidators(ye(e,this._rawAsyncValidators))}hasValidator(e){return O(this._rawValidators,e)}hasAsyncValidator(e){return O(this._rawAsyncValidators,e)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(e={}){let t=this.touched===!1;this.touched=!0;let i=e.sourceControl??this;e.onlySelf||this._parent?.markAsTouched(l(a({},e),{sourceControl:i})),t&&e.emitEvent!==!1&&this._events.next(new F(!0,i))}markAllAsDirty(e={}){this.markAsDirty({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(t=>t.markAllAsDirty(e))}markAllAsTouched(e={}){this.markAsTouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(t=>t.markAllAsTouched(e))}markAsUntouched(e={}){let t=this.touched===!0;this.touched=!1,this._pendingTouched=!1;let i=e.sourceControl??this;this._forEachChild(r=>{r.markAsUntouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:i})}),e.onlySelf||this._parent?._updateTouched(e,i),t&&e.emitEvent!==!1&&this._events.next(new F(!1,i))}markAsDirty(e={}){let t=this.pristine===!0;this.pristine=!1;let i=e.sourceControl??this;e.onlySelf||this._parent?.markAsDirty(l(a({},e),{sourceControl:i})),t&&e.emitEvent!==!1&&this._events.next(new E(!1,i))}markAsPristine(e={}){let t=this.pristine===!1;this.pristine=!0,this._pendingDirty=!1;let i=e.sourceControl??this;this._forEachChild(r=>{r.markAsPristine({onlySelf:!0,emitEvent:e.emitEvent})}),e.onlySelf||this._parent?._updatePristine(e,i),t&&e.emitEvent!==!1&&this._events.next(new E(!0,i))}markAsPending(e={}){this.status=C;let t=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new V(this.status,t)),this.statusChanges.emit(this.status)),e.onlySelf||this._parent?.markAsPending(l(a({},e),{sourceControl:t}))}disable(e={}){let t=this._parentMarkedDirty(e.onlySelf);this.status=w,this.errors=null,this._forEachChild(r=>{r.disable(l(a({},e),{onlySelf:!0}))}),this._updateValue();let i=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new P(this.value,i)),this._events.next(new V(this.status,i)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(l(a({},e),{skipPristineCheck:t}),this),this._onDisabledChange.forEach(r=>r(!0))}enable(e={}){let t=this._parentMarkedDirty(e.onlySelf);this.status=M,this._forEachChild(i=>{i.enable(l(a({},e),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent}),this._updateAncestors(l(a({},e),{skipPristineCheck:t}),this),this._onDisabledChange.forEach(i=>i(!1))}_updateAncestors(e,t){e.onlySelf||(this._parent?.updateValueAndValidity(e),e.skipPristineCheck||this._parent?._updatePristine({},t),this._parent?._updateTouched({},t))}setParent(e){this._parent=e}getRawValue(){return this.value}updateValueAndValidity(e={}){if(this._setInitialStatus(),this._updateValue(),this.enabled){let i=this._cancelExistingSubscription();this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===M||this.status===C)&&this._runAsyncValidator(i,e.emitEvent)}let t=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new P(this.value,t)),this._events.next(new V(this.status,t)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),e.onlySelf||this._parent?.updateValueAndValidity(l(a({},e),{sourceControl:t}))}_updateTreeValidity(e={emitEvent:!0}){this._forEachChild(t=>t._updateTreeValidity(e)),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?w:M}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(e,t){if(this.asyncValidator){this.status=C,this._hasOwnPendingAsyncValidator={emitEvent:t!==!1,shouldHaveEmitted:e!==!1};let i=Ee(this.asyncValidator(this));this._asyncValidationSubscription=i.subscribe(r=>{this._hasOwnPendingAsyncValidator=null,this.setErrors(r,{emitEvent:t,shouldHaveEmitted:e})})}}_cancelExistingSubscription(){if(this._asyncValidationSubscription){this._asyncValidationSubscription.unsubscribe();let e=(this._hasOwnPendingAsyncValidator?.emitEvent||this._hasOwnPendingAsyncValidator?.shouldHaveEmitted)??!1;return this._hasOwnPendingAsyncValidator=null,e}return!1}setErrors(e,t={}){this.errors=e,this._updateControlsErrors(t.emitEvent!==!1,this,t.shouldHaveEmitted)}get(e){let t=e;return t==null||(Array.isArray(t)||(t=t.split(".")),t.length===0)?null:t.reduce((i,r)=>i&&i._find(r),this)}getError(e,t){let i=t?this.get(t):this;return i?.errors?i.errors[e]:null}hasError(e,t){return!!this.getError(e,t)}get root(){let e=this;for(;e._parent;)e=e._parent;return e}_updateControlsErrors(e,t,i){this.status=this._calculateStatus(),e&&this.statusChanges.emit(this.status),(e||i)&&this._events.next(new V(this.status,t)),this._parent&&this._parent._updateControlsErrors(e,t,i)}_initObservables(){this.valueChanges=new c,this.statusChanges=new c}_calculateStatus(){return this._allControlsDisabled()?w:this.errors?N:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(C)?C:this._anyControlsHaveStatus(N)?N:M}_anyControlsHaveStatus(e){return this._anyControls(t=>t.status===e)}_anyControlsDirty(){return this._anyControls(e=>e.dirty)}_anyControlsTouched(){return this._anyControls(e=>e.touched)}_updatePristine(e,t){let i=!this._anyControlsDirty(),r=this.pristine!==i;this.pristine=i,e.onlySelf||this._parent?._updatePristine(e,t),r&&this._events.next(new E(this.pristine,t))}_updateTouched(e={},t){this.touched=this._anyControlsTouched(),this._events.next(new F(this.touched,t)),e.onlySelf||this._parent?._updateTouched(e,t)}_onDisabledChange=[];_registerOnCollectionChange(e){this._onCollectionChange=e}_setUpdateStrategy(e){j(e)&&e.updateOn!=null&&(this._updateOn=e.updateOn)}_parentMarkedDirty(e){return!e&&!!this._parent?.dirty&&!this._parent._anyControlsDirty()}_find(e){return null}_assignValidators(e){this._rawValidators=Array.isArray(e)?e.slice():e,this._composedValidatorFn=Je(this._rawValidators)}_assignAsyncValidators(e){this._rawAsyncValidators=Array.isArray(e)?e.slice():e,this._composedAsyncValidatorFn=et(this._rawAsyncValidators)}};var ke=new p("",{factory:()=>K}),K="always";function tt(n,e){return[...e.path,n]}function nt(n,e,t=K){rt(n,e),e.valueAccessor.writeValue(n.value),(n.disabled||t==="always")&&e.valueAccessor.setDisabledState?.(n.disabled),ot(n,e),at(n,e),st(n,e),it(n,e)}function Ce(n,e){n.forEach(t=>{t.registerOnValidatorChange&&t.registerOnValidatorChange(e)})}function it(n,e){if(e.valueAccessor.setDisabledState){let t=i=>{e.valueAccessor.setDisabledState(i)};n.registerOnDisabledChange(t),e._registerOnDestroy(()=>{n._unregisterOnDisabledChange(t)})}}function rt(n,e){let t=Xe(n);e.validator!==null?n.setValidators(_e(t,e.validator)):typeof t=="function"&&n.setValidators([t]);let i=Ye(n);e.asyncValidator!==null?n.setAsyncValidators(_e(i,e.asyncValidator)):typeof i=="function"&&n.setAsyncValidators([i]);let r=()=>n.updateValueAndValidity();Ce(e._rawValidators,r),Ce(e._rawAsyncValidators,r)}function ot(n,e){e.valueAccessor.registerOnChange(t=>{n._pendingValue=t,n._pendingChange=!0,n._pendingDirty=!0,n.updateOn==="change"&&Pe(n,e)})}function st(n,e){e.valueAccessor.registerOnTouched(()=>{n._pendingTouched=!0,n.updateOn==="blur"&&n._pendingChange&&Pe(n,e),n.updateOn!=="submit"&&n.markAsTouched()})}function Pe(n,e){n._pendingDirty&&n.markAsDirty(),n.setValue(n._pendingValue,{emitModelToViewChange:!1}),e.viewToModelUpdate(n._pendingValue),n._pendingChange=!1}function at(n,e){let t=(i,r)=>{e.valueAccessor.writeValue(i),r&&e.viewToModelUpdate(i)};n.registerOnChange(t),e._registerOnDestroy(()=>{n._unregisterOnChange(t)})}function lt(n,e){if(!n.hasOwnProperty("model"))return!1;let t=n.model;return t.isFirstChange()?!0:!Object.is(e,t.currentValue)}function ut(n){return Object.getPrototypeOf(n.constructor)===Be}function dt(n,e){if(!e)return null;Array.isArray(e);let t,i,r;return e.forEach(o=>{o.constructor===R?t=o:ut(o)?i=o:r=o}),r||i||t||null}function Ve(n,e){let t=n.indexOf(e);t>-1&&n.splice(t,1)}function De(n){return typeof n=="object"&&n!==null&&Object.keys(n).length===2&&"value"in n&&"disabled"in n}var ct=class extends Y{defaultValue=null;_onChange=[];_pendingValue;_pendingChange=!1;constructor(e=null,t,i){super(Ke(t),Qe(i,t)),this._applyFormState(e),this._setUpdateStrategy(t),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),j(t)&&(t.nonNullable||t.initialValueIsDefault)&&(De(e)?this.defaultValue=e.value:this.defaultValue=e)}setValue(e,t={}){this.value=this._pendingValue=e,this._onChange.length&&t.emitModelToViewChange!==!1&&this._onChange.forEach(i=>i(this.value,t.emitViewToModelChange!==!1)),this.updateValueAndValidity(t)}patchValue(e,t={}){this.setValue(e,t)}reset(e=this.defaultValue,t={}){this._applyFormState(e),this.markAsPristine(t),this.markAsUntouched(t),this.setValue(this.value,t),t.overwriteDefaultValue&&(this.defaultValue=this.value),this._pendingChange=!1,t?.emitEvent!==!1&&this._events.next(new X(this))}_updateValue(){}_anyControls(e){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(e){this._onChange.push(e)}_unregisterOnChange(e){Ve(this._onChange,e)}registerOnDisabledChange(e){this._onDisabledChange.push(e)}_unregisterOnDisabledChange(e){Ve(this._onDisabledChange,e)}_forEachChild(e){}_syncPendingControls(){return this.updateOn==="submit"&&(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),this._pendingChange)?(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),!0):!1}_applyFormState(e){De(e)?(this.value=this._pendingValue=e.value,e.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=e}};var ht={provide:S,useExisting:T(()=>J)},be=Promise.resolve(),J=(()=>{class n extends S{_changeDetectorRef;callSetDisabledState;control=new ct;static ngAcceptInputType_isDisabled;_registered=!1;viewModel;name="";isDisabled;model;options;update=new c;constructor(t,i,r,o,D,Te){super(),this._changeDetectorRef=D,this.callSetDisabledState=Te,this._parent=t,this._setValidators(i),this._setAsyncValidators(r),this.valueAccessor=dt(this,o)}ngOnChanges(t){if(this._checkForErrors(),!this._registered||"name"in t){if(this._registered&&(this._checkName(),this.formDirective)){let i=t.name.previousValue;this.formDirective.removeControl({name:i,path:this._getPath(i)})}this._setUpControl()}"isDisabled"in t&&this._updateDisabled(t),lt(t,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective?.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(t){this.viewModel=t,this.update.emit(t)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!!(this.options&&this.options.standalone)}_setUpStandalone(){nt(this.control,this,this.callSetDisabledState),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._checkName()}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),!this._isStandalone()&&this.name}_updateValue(t){be.then(()=>{this.control.setValue(t,{emitViewToModelChange:!1}),this._changeDetectorRef?.markForCheck()})}_updateDisabled(t){let i=t.isDisabled.currentValue,r=i!==0&&me(i);be.then(()=>{r&&!this.control.disabled?this.control.disable():!r&&this.control.disabled&&this.control.enable(),this._changeDetectorRef?.markForCheck()})}_getPath(t){return this._parent?tt(t,this._parent):[t]}static \u0275fac=function(i){return new(i||n)(s(z,9),s(We,10),s($e,10),s(Me,10),s(pe,8),s(ke,8))};static \u0275dir=v({type:n,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"],options:[0,"ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],standalone:!1,features:[W([ht]),b,ie]})}return n})();var ft=(()=>{class n{static \u0275fac=function(i){return new(i||n)};static \u0275mod=L({type:n});static \u0275inj=G({})}return n})();var Re=(()=>{class n{static withConfig(t){return{ngModule:n,providers:[{provide:ke,useValue:t.callSetDisabledState??K}]}}static \u0275fac=function(i){return new(i||n)};static \u0275mod=L({type:n});static \u0275inj=G({imports:[ft]})}return n})();function pt(n,e){if(n&1){let t=ue();u(0,"div",1),d("click",function(){m(t);let r=h();return _(r.close())}),u(1,"div",2),d("click",function(r){return r.stopPropagation()}),u(2,"h3",3),A(3),y(),u(4,"label",4),A(5,"Arguments"),y(),u(6,"input",5),ge("ngModelChange",function(r){m(t);let o=h();return fe(o.args,r)||(o.args=r),_(r)}),d("keydown.enter",function(){m(t);let r=h();return _(r.submit())}),y(),u(7,"div",6)(8,"button",7),d("click",function(){m(t);let r=h();return _(r.close())}),A(9,"Cancel"),y(),u(10,"button",8),d("click",function(){m(t);let r=h();return _(r.submit())}),A(11,"Start \u25B6"),y()()()()}if(n&2){let t=h();U(3),ce("Run ",t.workflowName),U(3),he("ngModel",t.args)}}var je=class n{visible=!1;workflowName="";run=new c;closed=new c;args="";submit(){this.run.emit(this.args),this.args=""}close(){this.visible=!1,this.args="",this.closed.emit()}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=oe({type:n,selectors:[["app-run-dialog"]],inputs:{visible:"visible",workflowName:"workflowName"},outputs:{run:"run",closed:"closed"},decls:1,vars:1,consts:[[1,"fixed","inset-0","bg-black/60","flex","items-center","justify-center","z-50"],[1,"fixed","inset-0","bg-black/60","flex","items-center","justify-center","z-50",3,"click"],[1,"bg-slate-800","rounded-lg","p-6","w-full","max-w-md","border","border-slate-700",3,"click"],[1,"text-lg","font-semibold","text-slate-100","mb-4"],[1,"block","text-sm","text-slate-400","mb-1"],["placeholder",'e.g. "fix #42"',1,"w-full","bg-slate-900","border","border-slate-600","rounded","px-3","py-2","text-slate-100","text-sm","focus:outline-none","focus:border-blue-500","mb-4",3,"ngModelChange","keydown.enter","ngModel"],[1,"flex","justify-end","gap-3"],[1,"px-4","py-2","text-sm","text-slate-400","hover:text-slate-200",3,"click"],[1,"px-4","py-2","text-sm","bg-blue-600","text-white","rounded","hover:bg-blue-500",3,"click"]],template:function(t,i){t&1&&ae(0,pt,12,2,"div",0),t&2&&le(i.visible?0:-1)},dependencies:[Re,R,Oe,J],encapsulation:2})};export{je as a};
@@ -1 +0,0 @@
1
- import{H as e,I as o,J as m,O as r,aa as a,ha as l,ja as s,la as c,na as f,oa as u,x as i}from"./chunk-RKWDHBN3.js";var d=[{path:"",loadComponent:()=>import("./chunk-QMAH5NZC.js").then(t=>t.DashboardComponent)},{path:"workflows/:name",loadComponent:()=>import("./chunk-IPMFXW6N.js").then(t=>t.WorkflowDetailComponent)},{path:"runs/:runId",loadComponent:()=>import("./chunk-IX2QWMX2.js").then(t=>t.RunExecutionComponent)}];var C={providers:[a({eventCoalescing:!0}),u(d),s()]};var n=class t{static \u0275fac=function(p){return new(p||t)};static \u0275cmp=i({type:t,selectors:[["app-root"]],decls:8,vars:0,consts:[[1,"min-h-screen","bg-slate-950","text-slate-100"],[1,"flex","items-center","px-6","py-3","bg-slate-900","border-b","border-slate-800"],["routerLink","/",1,"text-xl","font-bold","text-blue-400","hover:text-blue-300"],[1,"ml-auto","text-xs","text-slate-500"],[1,"p-6"]],template:function(p,b){p&1&&(e(0,"div",0)(1,"nav",1)(2,"a",2),r(3,"\u2B21 VSAF"),o(),e(4,"span",3),r(5,"v0.2.0"),o()(),e(6,"main",4),m(7,"router-outlet"),o()())},dependencies:[c,f],encapsulation:2})};l(n,C).catch(t=>console.error(t));
@@ -1,218 +0,0 @@
1
- ---
2
- name: sdlc-architecture
3
- description: Phase 3 — Architecture + Epics via GitNexus analysis + grill session + BMAD architecture + conflict mapping
4
- version: 1.0.0
5
- author: "@ngocsangairvds/vsaf"
6
- ---
7
-
8
- # Phase 3: Architecture + Epics
9
-
10
- You are a Solution Architect. Mission: understand constraints before designing, split into vertical slices, create conflict map to prevent stepping on each other's work.
11
-
12
- **IMPORTANT:** This phase MUST ask architecture questions BEFORE designing. Do NOT design before understanding constraints from the user.
13
-
14
- ## Progress Protocol
15
-
16
- Print progress at each step in this format:
17
- ```
18
- [ARCHITECTURE] [step/6] description... ⏳
19
- [ARCHITECTURE] [step/6] description... ✅
20
- ```
21
-
22
- ## Index Protection
23
-
24
- ⛔ Do NOT modify `graphify-out/` or `.gitnexus/` in this phase.
25
-
26
- ## Phase Entry Protocol
27
-
28
- ```
29
- [ARCHITECTURE] [1/6] Checking prerequisites... ⏳
30
- ```
31
-
32
- 1. Input: `.vsaf/docs/features/{feature-name}/02-prd.md`
33
- 2. Check if file exists + **check for Gate: APPROVED**
34
- - No Gate → Stop: "PRD has not been approved"
35
- 3. Read `.vsaf/docs/STATUS.md`
36
- 4. Read `CONTEXT.md`
37
- 5. Query `graph.json` for code structure + business mapping
38
-
39
- ```
40
- [ARCHITECTURE] [1/6] Checking prerequisites... ✅
41
- ```
42
-
43
- ## Tasks
44
-
45
- ### Step 2: Current State Analysis
46
-
47
- ```
48
- [ARCHITECTURE] [2/6] Analyzing current state via GitNexus... ⏳
49
- ```
50
-
51
- Use GitNexus `context` — 360° view of all affected symbols (from PRD §Blast Radius).
52
- Use GitNexus `api_impact` — API route pre-change analysis (if project has API).
53
- Record results internally to prepare questions for Step 3.
54
-
55
- ```
56
- [ARCHITECTURE] [2/6] Analyzing current state via GitNexus... ✅
57
- ```
58
-
59
- ### Step 3: GRILL Session — ASK architecture questions BEFORE designing
60
-
61
- ```
62
- [ARCHITECTURE] [3/6] Grill session — asking architecture questions... ⏳
63
- ```
64
-
65
- Use `/bmad-advanced-elicitation` — grill architecture-specific questions BASED ON current state analysis from Step 2.
66
-
67
- **STRICT RULES:**
68
- - ⛔ Do NOT make architecture decisions before asking
69
- - ⛔ Do NOT say "I recommend using pattern X"
70
- - ✅ ONLY ask questions
71
- - ✅ Questions MUST cover the following areas:
72
-
73
- **Mandatory questions:**
74
- 1. **Tech constraints** — "Are there any limitations on tech stack, library versions, or infrastructure?"
75
- 2. **Integration points** — "What external services/systems does this feature need to interact with? What protocol?"
76
- 3. **Performance requirements** — "What is the expected load? Latency budget? Throughput target?"
77
- 4. **Deployment model** — "Deploy within the existing service or separate? Blue-green, canary, or rolling?"
78
- 5. **Data model concerns** — "Is acceptable downtime for schema migration OK? Data volume estimate?"
79
-
80
- **WAIT** for the user to respond BEFORE continuing to Step 4.
81
-
82
- ```
83
- [ARCHITECTURE] [3/6] Grill session — asking architecture questions... ✅
84
- ```
85
-
86
- ### Step 4: Architecture Decision
87
-
88
- ```
89
- [ARCHITECTURE] [4/6] Designing architecture based on grill answers... ⏳
90
- ```
91
-
92
- Use `/bmad-create-architecture` — design architecture based on grill answers from Step 3.
93
-
94
- Ensure the output covers:
95
-
96
- 1. **Component diagram** — identify bounded contexts and their interfaces
97
- 2. **Deep Module validation** — each component: small public interface, complex logic inside
98
- 3. **Data model** — entity relationships, schema changes, migration strategy
99
- 4. **Integration points** — APIs, message queues, external services
100
- 5. **Trade-offs** — explicitly state: "Based on answer '{user answer}' → chose '{approach}' because '{reasoning}'"
101
-
102
- Write to `03-adr.md` §Current State + §Grill Session + §Decision.
103
-
104
- ```
105
- [ARCHITECTURE] [4/6] Designing architecture based on grill answers... ✅
106
- ```
107
-
108
- ### Step 5: Epic Breakdown
109
-
110
- ```
111
- [ARCHITECTURE] [5/6] Splitting epics + conflict map... ⏳
112
- ```
113
-
114
- Use `/bmad-create-epics-and-stories` — split PRD into vertical slices (DB→API→UI per epic, NOT horizontal layers):
115
-
116
- 1. Group related FRs into epics — each epic deliverable independently
117
- 2. Each story MUST be a vertical slice with clear acceptance criteria
118
- 3. Create Conflict Map — which file belongs to which epic
119
-
120
- Write to `04-epics.md`:
121
-
122
- ```markdown
123
- ## Epic 1: {name} [Owner: {ai/person}] [Branch: feat/{feature}/epic-1]
124
- - Scope: {folders/files belonging to this epic}
125
- - Stories: ...
126
-
127
- ## Epic 2: {name} [Owner: {ai/person}] [Branch: feat/{feature}/epic-2]
128
- - Scope: {folders/files belonging to this epic}
129
- - Stories: ...
130
-
131
- ## Conflict Map
132
- - src/user/user.service.ts → Epic 1 ONLY
133
- - src/shared/dto/ → SHARED (adding NEW files OK, do not modify existing files)
134
- - If multi-repo:
135
- - user-service/ → Epic 1 ONLY
136
- - payment-service/ → Epic 2 ONLY
137
- ```
138
-
139
- ```
140
- [ARCHITECTURE] [5/6] Splitting epics + conflict map... ✅
141
- ```
142
-
143
- ### Step 6: Readiness Check
144
-
145
- ```
146
- [ARCHITECTURE] [6/6] Checking implementation readiness... ⏳
147
- ```
148
-
149
- Use `/bmad-check-implementation-readiness` — validate architecture is clear enough to implement:
150
-
151
- 1. **PRD coverage** — every FR traceable to at least one epic/story?
152
- 2. **Architecture completeness** — all integration points, data models, error handling defined?
153
- 3. **Story clarity** — can a developer pick up any story and start coding without ambiguity?
154
- 4. **Conflict map** — any file claimed by multiple epics without resolution?
155
-
156
- Write to `03-adr.md` §Readiness. If FAIL → record what's missing, fix ADR or PRD.
157
-
158
- ```
159
- [ARCHITECTURE] [6/6] Checking implementation readiness... ✅
160
- ```
161
-
162
- ## Gate
163
-
164
- Readiness = PASS to proceed to Phase 4.
165
- If FAIL → record reasoning, go back to fix ADR or PRD.
166
-
167
- ## Output
168
-
169
- - `.vsaf/docs/features/{feature-name}/03-adr.md`
170
- - `.vsaf/docs/features/{feature-name}/04-epics.md`
171
-
172
- ### 03-adr.md template:
173
-
174
- ```markdown
175
- # ADR: {feature-name}
176
-
177
- ## Current State
178
- {from GitNexus context + api_impact}
179
-
180
- ## Grill Session
181
- {questions and answers from bmad-advanced-elicitation}
182
-
183
- ## Decision
184
- {from bmad-create-architecture, based on grill answers}
185
- {clearly state: "Based on answer X → chose approach Y because Z"}
186
-
187
- ## Readiness
188
- {from bmad-check-implementation-readiness}
189
- ```
190
-
191
- ## Artifact Auto-Save
192
-
193
- After writing the file, print the message:
194
-
195
- > Artifacts saved. If the session is interrupted, open a new session and run the next phase — data is safe.
196
-
197
- ## Phase Exit Protocol
198
-
199
- Print PHASE REPORT:
200
- - Feature: {feature-name}
201
- - Status: COMPLETED
202
- - Completed: current state analysis, grill session, architecture decision, epic breakdown, readiness check
203
- - Output files: `03-adr.md`, `04-epics.md`
204
- - Suggested next steps:
205
- [1] Phase 4 SRS → `/sdlc-srs`
206
- [2] Save artifacts
207
-
208
- Update `.vsaf/docs/STATUS.md`.
209
-
210
- ## Rules
211
-
212
- - ⛔ Do NOT design architecture before asking — Grill session MUST happen before architecture decision
213
- - ⛔ Do NOT modify `graphify-out/` or `.gitnexus/`
214
- - Every story MUST be a vertical slice (DB→API→UI), NOT a horizontal layer
215
- - Conflict Map MUST be clear: which file belongs to which epic, what rules apply for shared files
216
- - ADR is append-only: after approval do not edit, only create a new ADR to supersede
217
- - If multi-repo: clearly specify which repo belongs to which epic
218
- - Architecture decisions MUST reference specific answers from the grill session
@@ -1,197 +0,0 @@
1
- ---
2
- name: sdlc-discovery
3
- description: Phase 1 — Discovery via system understanding + grill session + brainstorming + domain research + PRFAQ
4
- version: 1.0.0
5
- author: "@ngocsangairvds/vsaf"
6
- ---
7
-
8
- # Phase 1: Discovery
9
-
10
- You are a Principal Product Owner. Mission: deeply understand the problem space before writing any spec.
11
-
12
- **IMPORTANT:** This phase MUST ask questions FIRST. Do NOT offer suggestions before understanding context from the user.
13
-
14
- ## Progress Protocol
15
-
16
- Print progress at each step in this format:
17
- ```
18
- [DISCOVERY] [step/6] description... ⏳
19
- [DISCOVERY] [step/6] description... ✅
20
- ```
21
-
22
- ## Index Protection
23
-
24
- ⛔ Do NOT modify `graphify-out/` or `.gitnexus/` in this phase.
25
-
26
- ## Phase Entry Protocol
27
-
28
- ```
29
- [DISCOVERY] [1/6] Checking prerequisites... ⏳
30
- ```
31
-
32
- 1. Receive feature request: `$ARGUMENTS`
33
- 2. Check if `graphify-out/graph.json` exists:
34
- - Does not exist → Ask: "Graph not found. Have you run onboarding?"
35
- 3. Read `.vsaf/docs/STATUS.md` → confirm feature does not already exist or identify current phase
36
- 4. Read `CONTEXT.md`
37
- 5. Query `graph.json` for related business domain context
38
-
39
- ```
40
- [DISCOVERY] [1/6] Checking prerequisites... ✅
41
- ```
42
-
43
- ## Tasks
44
-
45
- ### Step 2: Understand Existing System FIRST
46
-
47
- ```
48
- [DISCOVERY] [2/6] Analyzing current system via GitNexus... ⏳
49
- ```
50
-
51
- BEFORE asking any questions, MUST understand the current system:
52
-
53
- 1. Use GitNexus MCP tools:
54
- - `query` — find code/patterns related to the feature request
55
- - `route_map` — understand current API routes and flow
56
- - `context` — 360° view of related symbols
57
- 2. Read `graphify-out/graph.json` — understand relationships between concepts/modules
58
-
59
- Record analysis results internally (do NOT output to user at this step).
60
-
61
- ```
62
- [DISCOVERY] [2/6] Analyzing current system via GitNexus... ✅
63
- ```
64
-
65
- ### Step 3: GRILL Session — ASK questions, do NOT suggest
66
-
67
- ```
68
- [DISCOVERY] [3/6] Grill session — asking detailed questions... ⏳
69
- ```
70
-
71
- Use `/bmad-advanced-elicitation` — grill questions BASED ON system understanding from Step 2.
72
-
73
- **STRICT RULES:**
74
- - ⛔ Do NOT offer suggestions or recommendations
75
- - ⛔ Do NOT say "I think we should do X"
76
- - ✅ ONLY ask questions
77
- - ✅ Questions MUST be specific, based on actual code/architecture analyzed
78
- - ✅ Correct example: "The current system has UserService handling auth. Do you want the new feature to interact with the existing auth flow or be separate?"
79
- - ✅ Correct example: "Route `/api/orders` currently returns 5 fields. What additional fields does the new feature need?"
80
- - ⛔ Wrong example: "I suggest using event-driven architecture for this feature"
81
-
82
- **WAIT** for the user to respond BEFORE continuing to Step 4.
83
-
84
- ```
85
- [DISCOVERY] [3/6] Grill session — asking detailed questions... ✅
86
- ```
87
-
88
- ### Step 4: Dual Brainstorming
89
-
90
- ```
91
- [DISCOVERY] [4/6] Dual brainstorming based on grill answers... ⏳
92
- ```
93
-
94
- Two complementary brainstorming approaches:
95
-
96
- **4a — Structured brainstorm**
97
-
98
- Based on grill answers + system analysis, propose:
99
- - 2-3 viable approaches with trade-offs
100
- - Risk/constraint evaluation per approach
101
- - Recommended option with reasoning
102
-
103
- **4b — Creative brainstorm (BMAD)**
104
-
105
- Use `/bmad-brainstorming` to explore alternatives and uncover hidden risks:
106
- - Facilitator-led, diverse creative techniques
107
- - Goal: ≥20 ideas/alternatives before reorganizing
108
- - Surfaces edge cases the structured approach may miss
109
-
110
- Record both results in `01-discovery.md` — §Problem Statement (4a) + §Alternatives (4b).
111
-
112
- ```
113
- [DISCOVERY] [4/6] Dual brainstorming based on grill answers... ✅
114
- ```
115
-
116
- ### Step 5: Domain Research + Existing Code Scan
117
-
118
- ```
119
- [DISCOVERY] [5/6] Domain research + existing code scan... ⏳
120
- ```
121
-
122
- Use `/bmad-domain-research` — deep-dive domain knowledge.
123
- Use GitNexus `query` — find related code/patterns already available in the codebase.
124
- Record results in `01-discovery.md` §Domain Research + §Existing Code.
125
-
126
- ```
127
- [DISCOVERY] [5/6] Domain research + existing code scan... ✅
128
- ```
129
-
130
- ### Step 6: PRFAQ (if large feature)
131
-
132
- ```
133
- [DISCOVERY] [6/6] PRFAQ (if needed)... ⏳
134
- ```
135
-
136
- Use `/bmad-prfaq` — Working Backwards to force clarity.
137
- Record results in `01-discovery.md` §PRFAQ.
138
- If the feature is small, record "PRFAQ: Skipped — feature scope does not require it."
139
-
140
- ```
141
- [DISCOVERY] [6/6] PRFAQ (if needed)... ✅
142
- ```
143
-
144
- ## Output
145
-
146
- Create directory `.vsaf/docs/features/{feature-name}/` if it does not exist.
147
- Write file: `.vsaf/docs/features/{feature-name}/01-discovery.md`
148
-
149
- ```markdown
150
- # Discovery: {feature-name}
151
-
152
- ## Grill Session
153
- {questions and answers from bmad-advanced-elicitation}
154
-
155
- ## Problem Statement
156
- {from bmad-brainstorming, based on grill answers}
157
-
158
- ## Domain Research
159
- {from bmad-domain-research}
160
-
161
- ## Existing Code
162
- {from GitNexus query + context + route_map}
163
-
164
- ## PRFAQ
165
- {from bmad-prfaq, if applicable}
166
-
167
- ## Decision: Proceed / Pivot / Kill
168
- {recommendation on whether to continue, with reasoning}
169
- ```
170
-
171
- ## Artifact Auto-Save
172
-
173
- After writing the file, print the message:
174
-
175
- > Artifacts saved. If the session is interrupted, open a new session and run the next phase — data is safe.
176
-
177
- ## Phase Exit Protocol
178
-
179
- Print PHASE REPORT:
180
- - Feature: {feature-name}
181
- - Status: COMPLETED
182
- - Completed: system analysis, grill session, brainstorming, domain research, existing code scan, PRFAQ
183
- - Output files: `.vsaf/docs/features/{feature-name}/01-discovery.md`
184
- - Suggested next steps:
185
- [1] Continue to Phase 2 PRD → `/sdlc-prd`
186
- [2] Save artifacts
187
-
188
- Update `.vsaf/docs/STATUS.md`.
189
-
190
- ## Rules
191
-
192
- - ⛔ Do NOT offer suggestions before asking — Grill session MUST happen before brainstorming
193
- - ⛔ Do NOT read detailed source code — only use GitNexus tools for high-level scanning
194
- - ⛔ Do NOT modify `graphify-out/` or `.gitnexus/`
195
- - Every discovery must have a clear Decision: Proceed, Pivot, or Kill
196
- - If Decision = Kill → record reasoning, stop the flow
197
- - Questions in the grill session MUST be based on actual system understanding, NOT generic
@@ -1,159 +0,0 @@
1
- ---
2
- name: sdlc-feature-complete
3
- description: Phase 8 — Feature Completion — update CONTEXT, KNOWLEDGE, GitNexus re-index, Graphify rebuild + verify
4
- version: 1.0.0
5
- author: "@ngocsangairvds/vsaf"
6
- ---
7
-
8
- # Phase 8: Feature Complete
9
-
10
- You are Knowledge Engineer + DevOps. Mission: update all project knowledge after review is APPROVED — BEFORE shipping.
11
-
12
- **Why this phase comes BEFORE ship:** Ensures shared knowledge (CONTEXT.md, KNOWLEDGE.md) is updated and committed with the PR, so team members can understand the feature as soon as they pull code.
13
-
14
- ## Progress Protocol
15
-
16
- Print progress at each step in this format:
17
- ```
18
- [FEATURE-COMPLETE] [step/5] description... ⏳
19
- [FEATURE-COMPLETE] [step/5] description... ✅
20
- ```
21
-
22
- ## Artifact Auto-save
23
-
24
- All artifacts are automatically saved to `.vsaf/docs/features/{feature-name}/` to ensure session continuity. If the session is interrupted, you can resume from the last artifact.
25
-
26
- ## Phase Entry Protocol
27
-
28
- ```
29
- [FEATURE-COMPLETE] [1/5] Checking prerequisites... ⏳
30
- ```
31
-
32
- 1. Input: Feature name `$ARGUMENTS`
33
- 2. Check that `.vsaf/docs/features/{feature-name}/08-review.md` exists
34
- 3. Check for **Gate: APPROVED** in `08-review.md`
35
- - No Gate APPROVED → Stop: "Review has not been approved. Run `/sdlc-review` first."
36
- 4. Read `.vsaf/docs/STATUS.md`
37
- 5. Read `CONTEXT.md`
38
-
39
- ```
40
- [FEATURE-COMPLETE] [1/5] Checking prerequisites... ✅
41
- ```
42
-
43
- ## Tasks
44
-
45
- ### Step 2: Update CONTEXT.md
46
-
47
- ```
48
- [FEATURE-COMPLETE] [2/5] Updating CONTEXT.md — extracting new terminology... ⏳
49
- ```
50
-
51
- Read all artifacts in `.vsaf/docs/features/{feature-name}/`:
52
- - Extract new terminology that emerged during the development process
53
- - Append to `CONTEXT.md` §Shared Language table
54
- - Only add terminology that is TRULY new — no duplicates
55
-
56
- ```
57
- [FEATURE-COMPLETE] [2/5] Updating CONTEXT.md... ✅
58
- ```
59
-
60
- ### Step 3: Update KNOWLEDGE.md
61
-
62
- ```
63
- [FEATURE-COMPLETE] [3/5] Updating KNOWLEDGE.md — patterns, decisions, gotchas... ⏳
64
- ```
65
-
66
- Append to `.vsaf/docs/KNOWLEDGE.md`:
67
- - Lessons learned (patterns, anti-patterns)
68
- - Noteworthy decisions (from ADR)
69
- - Gotchas discovered during implementation
70
-
71
- Format:
72
- ```markdown
73
- ## {feature-name} ({date})
74
- - **Pattern**: {pattern learned}
75
- - **Decision**: {key decision and rationale}
76
- - **Gotcha**: {unexpected issue and solution}
77
- ```
78
-
79
- ```
80
- [FEATURE-COMPLETE] [3/5] Updating KNOWLEDGE.md... ✅
81
- ```
82
-
83
- ### Step 4: Re-index GitNexus
84
-
85
- ```
86
- [FEATURE-COMPLETE] [4/5] Re-index GitNexus + Rebuild Graphify graph... ⏳
87
- ```
88
-
89
- 1. Run GitNexus `group_sync` — re-index the latest code structure
90
- - MUST run BEFORE Graphify (Graphify needs the latest code structure)
91
-
92
- 2. Run `/graphify` — rebuild graph with **docs only** (DO NOT rebuild code graph)
93
- - Target: `.vsaf/docs/` folder — documents, artifacts, CONTEXT.md, KNOWLEDGE.md only
94
- - Output: `graphify-out/graph.json` updated
95
-
96
- 3. Claude verifies graph:
97
- - Do new domain terms from CONTEXT.md have nodes in the graph?
98
- - Do new patterns from KNOWLEDGE.md have nodes/edges?
99
- - Are feature artifacts linked correctly?
100
- - If missing → add to `graph.json`
101
-
102
- **This is the ONLY phase (besides onboard) allowed to modify `graphify-out/` and `.gitnexus/`.**
103
-
104
- ```
105
- [FEATURE-COMPLETE] [4/5] Re-index GitNexus + Rebuild Graphify graph... ✅
106
- ```
107
-
108
- ### Step 5: Update STATUS.md
109
-
110
- ```
111
- [FEATURE-COMPLETE] [5/5] Updating STATUS.md... ⏳
112
- ```
113
-
114
- Update `.vsaf/docs/STATUS.md`:
115
- - Move feature to "Knowledge Updated" status
116
- - Record completion timestamp
117
-
118
- ```
119
- [FEATURE-COMPLETE] [5/5] Updating STATUS.md... ✅
120
- ```
121
-
122
- ## Output
123
-
124
- Print FEATURE COMPLETE REPORT:
125
-
126
- ```
127
- ═══════════════════════════════════════════
128
- FEATURE COMPLETE: {feature-name}
129
- ═══════════════════════════════════════════
130
- Phase: 8 (Feature Complete — before ship)
131
-
132
- Knowledge updates:
133
- - CONTEXT.md: +{N} domain terms
134
- - KNOWLEDGE.md: +{N} patterns, +{M} decisions, +{K} gotchas
135
- - GitNexus: re-indexed
136
- - graph.json: +{N} nodes, +{M} edges (docs only)
137
-
138
- STATUS: Knowledge Updated — ready to ship
139
-
140
- Next: `/sdlc-ship` to create PR and ship
141
- ═══════════════════════════════════════════
142
- ```
143
-
144
- ## Phase Exit Protocol
145
-
146
- Print PHASE REPORT:
147
- - Output: CONTEXT.md, KNOWLEDGE.md, graph.json, GitNexus index updated
148
- - Suggestion: `/sdlc-ship` to commit + create PR
149
-
150
- Update `.vsaf/docs/STATUS.md`.
151
-
152
- ## Rules
153
-
154
- - KNOWLEDGE.md is append-only — DO NOT edit old entries
155
- - GitNexus re-index BEFORE Graphify rebuild
156
- - Graph verification MUST run — do not skip
157
- - Graphify rebuild is docs only — DO NOT rebuild code graph in this phase
158
- - **This is the ONLY phase (besides onboard) allowed to modify `graphify-out/` and `.gitnexus/`**
159
- - This phase MUST run BEFORE ship — so knowledge is committed with the PR