@ngocsangairvds/vsaf 6.0.1 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/package.json +1 -1
  2. package/packages/cli/dist/commands/run.d.ts +3 -0
  3. package/packages/cli/dist/commands/run.d.ts.map +1 -1
  4. package/packages/cli/dist/commands/run.js +10 -0
  5. package/packages/cli/dist/commands/run.js.map +1 -1
  6. package/packages/cli/dist/server/routes/runs.d.ts +3 -1
  7. package/packages/cli/dist/server/routes/runs.d.ts.map +1 -1
  8. package/packages/cli/dist/server/routes/runs.js +33 -9
  9. package/packages/cli/dist/server/routes/runs.js.map +1 -1
  10. package/packages/cli/dist/server/routes/workflows.js +1 -1
  11. package/packages/cli/dist/server/routes/workflows.js.map +1 -1
  12. package/packages/cli/dist/server/services/execution-manager.d.ts.map +1 -1
  13. package/packages/cli/dist/server/services/execution-manager.js +5 -0
  14. package/packages/cli/dist/server/services/execution-manager.js.map +1 -1
  15. package/packages/core/dist/config/ai-config.d.ts +3 -0
  16. package/packages/core/dist/config/ai-config.d.ts.map +1 -1
  17. package/packages/core/dist/config/ai-config.js +9 -0
  18. package/packages/core/dist/config/ai-config.js.map +1 -1
  19. package/packages/core/dist/index.d.ts +1 -1
  20. package/packages/core/dist/index.d.ts.map +1 -1
  21. package/packages/core/dist/index.js +3 -2
  22. package/packages/core/dist/index.js.map +1 -1
  23. package/packages/core/dist/runtime/executor.d.ts.map +1 -1
  24. package/packages/core/dist/runtime/executor.js +1 -0
  25. package/packages/core/dist/runtime/executor.js.map +1 -1
  26. package/packages/web/dist/web/browser/{chunk-FE2VGLSN.js → chunk-7L4OEPXU.js} +1 -1
  27. package/packages/web/dist/web/browser/{chunk-FBCNCNPM.js → chunk-BDLVJ3JS.js} +1 -1
  28. package/packages/web/dist/web/browser/{chunk-MCW5ACIZ.js → chunk-CQQRQYJU.js} +1 -1
  29. package/packages/web/dist/web/browser/{chunk-6H3AYIT3.js → chunk-E3BSTPAZ.js} +1 -1
  30. package/packages/web/dist/web/browser/{chunk-L7B3BT5E.js → chunk-IBUECISR.js} +1 -1
  31. package/packages/web/dist/web/browser/{chunk-7ELOO4IC.js → chunk-OYL4KDHJ.js} +1 -1
  32. package/packages/web/dist/web/browser/{chunk-GR7SKUVU.js → chunk-Q6S2YOXT.js} +1 -1
  33. package/packages/web/dist/web/browser/chunk-RM7DW5FD.js +5 -0
  34. package/packages/web/dist/web/browser/chunk-SM2S63GA.js +1 -0
  35. package/packages/web/dist/web/browser/{chunk-N3FOQ3O5.js → chunk-ZZWA24BS.js} +1 -1
  36. package/packages/web/dist/web/browser/index.html +2 -2
  37. package/packages/web/dist/web/browser/{main-3UCJ3N4F.js → main-MOJ6YEDN.js} +1 -1
  38. package/packages/web/dist/web/browser/styles-KOJ4NEWT.css +1 -0
  39. package/skills/sdlc/onboard-code/cross-domain/SKILL.md +10 -0
  40. package/skills/sdlc/onboard-code/cross-domain/step.md +11 -0
  41. package/skills/sdlc/onboard-code/detect-structure/SKILL.md +10 -0
  42. package/skills/sdlc/onboard-code/detect-structure/step.md +7 -0
  43. package/skills/sdlc/onboard-code/env-docker/SKILL.md +10 -0
  44. package/skills/sdlc/onboard-code/env-docker/step.md +7 -0
  45. package/skills/sdlc/onboard-code/summary/SKILL.md +10 -0
  46. package/skills/sdlc/onboard-code/summary/step.md +4 -0
  47. package/skills/sdlc/onboard-code/verify-index/SKILL.md +10 -0
  48. package/skills/sdlc/onboard-code/verify-index/step.md +9 -0
  49. package/skills/sdlc/onboard-docs/extract-terms/SKILL.md +10 -0
  50. package/skills/sdlc/onboard-docs/extract-terms/step.md +20 -0
  51. package/skills/sdlc/onboard-docs/graphify-build/SKILL.md +10 -0
  52. package/skills/sdlc/onboard-docs/graphify-build/step.md +11 -0
  53. package/skills/sdlc/onboard-docs/scan-import/SKILL.md +10 -0
  54. package/skills/sdlc/onboard-docs/scan-import/step.md +19 -0
  55. package/skills/sdlc/onboard-docs/verify-fix/SKILL.md +10 -0
  56. package/skills/sdlc/onboard-docs/verify-fix/step.md +10 -0
  57. package/skills/sdlc/pack.yaml +9 -2
  58. package/workflows/sdlc/onboard-code.yaml +5 -43
  59. package/workflows/sdlc/onboard-docs.yaml +4 -64
  60. package/packages/web/dist/web/browser/chunk-4R37VVI4.js +0 -5
  61. package/packages/web/dist/web/browser/chunk-UDCOYDXU.js +0 -1
  62. package/packages/web/dist/web/browser/styles-5MTP4CCO.css +0 -1
  63. package/skills/sdlc/onboard-code/SKILL.md +0 -210
  64. package/skills/sdlc/onboard-docs/SKILL.md +0 -194
  65. /package/skills/sdlc/onboard-docs/{convert.py → scan-import/convert.py} +0 -0
@@ -1 +1 @@
1
- import{a as S,c as P,e as M,f as O,g as A}from"./chunk-N3FOQ3O5.js";import{Ba as f,Bb as w,La as x,Ma as u,O as d,Oa as C,Pa as v,Qa as s,Ra as n,Sa as o,T as m,Ta as h,U as g,Vb as j,Wb as L,Xa as b,Ya as k,Za as c,ib as i,jb as _,qa as a,qb as y}from"./chunk-4R37VVI4.js";var E=[{path:"",loadComponent:()=>import("./chunk-MCW5ACIZ.js").then(e=>e.DashboardComponent)},{path:"workflows",loadComponent:()=>import("./chunk-GR7SKUVU.js").then(e=>e.WorkflowsComponent)},{path:"workflows/builder",loadComponent:()=>import("./chunk-FBCNCNPM.js").then(e=>e.WorkflowBuilderComponent)},{path:"workflows/detail",loadComponent:()=>import("./chunk-6H3AYIT3.js").then(e=>e.WorkflowDetailComponent)},{path:"conversations",loadComponent:()=>import("./chunk-FE2VGLSN.js").then(e=>e.ConversationsComponent)},{path:"conversations/:conversationId",loadComponent:()=>import("./chunk-FE2VGLSN.js").then(e=>e.ConversationsComponent)},{path:"runs/:runId",loadComponent:()=>import("./chunk-UDCOYDXU.js").then(e=>e.RunExecutionComponent)},{path:"settings",loadComponent:()=>import("./chunk-L7B3BT5E.js").then(e=>e.SettingsComponent)}];var I={providers:[w({eventCoalescing:!0}),A(E),j()]};var R=()=>({exact:!0}),T=(e,r)=>r.id;function V(e,r){if(e&1&&(n(0,"option",14),i(1),o()),e&2){let t=r.$implicit,p=c(2);s("value",t.id)("selected",t.id===p.selectedId()),a(),_(t.name)}}function F(e,r){if(e&1){let t=b();n(0,"select",13),k("change",function(z){m(t);let D=c();return g(D.onProjectChange(z))}),C(1,V,2,3,"option",14,T),o()}if(e&2){let t=c();a(),v(t.projects())}}var l=class e{projectService=d(L);projects=this.projectService.projects;selectedId=this.projectService.selectedId;constructor(){this.projectService.load()}onProjectChange(r){let t=r.target.value;!t||t===this.selectedId()||(this.projectService.select(t),document.location.reload())}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=f({type:e,selectors:[["app-root"]],decls:21,vars:3,consts:[[1,"app-shell"],[1,"app-nav"],["routerLink","/",1,"brand-link"],[1,"brand-icon"],[1,"brand-name"],["routerLink","/","routerLinkActive","border-primary text-primary",1,"nav-link",3,"routerLinkActiveOptions"],["routerLink","/workflows","routerLinkActive","border-primary text-primary",1,"nav-link"],["routerLink","/conversations","routerLinkActive","border-primary text-primary",1,"nav-link"],["routerLink","/settings","routerLinkActive","border-primary text-primary",1,"nav-link"],[1,"nav-spacer"],["aria-label","Project","title","Switch project",1,"project-select"],[1,"version-pill"],[1,"app-main"],["aria-label","Project","title","Switch project",1,"project-select",3,"change"],[3,"value","selected"]],template:function(t,p){t&1&&(n(0,"div",0)(1,"nav",1)(2,"a",2)(3,"span",3),i(4,"V"),o(),n(5,"span",4),i(6,"VSAF"),o()(),n(7,"a",5),i(8," Dashboard "),o(),n(9,"a",6),i(10," Workflows "),o(),n(11,"a",7),i(12," Conversations "),o(),n(13,"a",8),i(14," Settings "),o(),n(15,"div",9),x(16,F,3,0,"select",10),n(17,"span",11),i(18,"v0.2.0"),o()()(),n(19,"main",12),h(20,"router-outlet"),o()()),t&2&&(a(7),s("routerLinkActiveOptions",y(2,R)),a(9),u(p.projects().length>1?16:-1))},dependencies:[P,M,O],styles:["[_nghost-%COMP%]{display:block;min-height:100vh;background:#101114;color:#e7e7ea}.app-shell[_ngcontent-%COMP%]{min-height:100vh;background:#101114;color:#e7e7ea}.app-nav[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;height:56px;border-bottom:1px solid #2b2d33;background:#17181d;padding:0 16px;box-sizing:border-box}.brand-link[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:9px;margin-right:18px;color:#f4f4f5;text-decoration:none}.brand-link[_ngcontent-%COMP%]:hover{opacity:.82}.brand-icon[_ngcontent-%COMP%]{display:grid;place-items:center;width:30px;height:30px;border-radius:7px;background:#6366f1;color:#fff;font-size:14px;font-weight:800}.brand-name[_ngcontent-%COMP%]{font-size:14px;font-weight:800}.nav-link[_ngcontent-%COMP%]{display:inline-flex;align-items:center;height:56px;border-bottom:2px solid transparent;padding:0 13px;color:#a1a1aa;font-size:14px;font-weight:650;text-decoration:none;box-sizing:border-box}.nav-link[_ngcontent-%COMP%]:hover{color:#f4f4f5}.nav-link.border-primary[_ngcontent-%COMP%], .nav-link.text-primary[_ngcontent-%COMP%]{border-bottom-color:#6366f1;color:#a5b4fc}.nav-spacer[_ngcontent-%COMP%]{margin-left:auto;display:flex;align-items:center;gap:12px}.project-select[_ngcontent-%COMP%]{border:1px solid #2b2d33;border-radius:7px;background:#20222a;color:#e7e7ea;padding:5px 8px;font:inherit;font-size:12px;max-width:220px;cursor:pointer}.project-select[_ngcontent-%COMP%]:focus{outline:none;border-color:#6366f1}.version-pill[_ngcontent-%COMP%]{border:1px solid #2b2d33;border-radius:7px;background:#20222a;color:#a1a1aa;padding:5px 8px;font-size:12px}.app-main[_ngcontent-%COMP%]{min-height:calc(100vh - 56px);overflow:auto;background:#101114}"]})};S(l,I).catch(e=>console.error(e));
1
+ import{a as S,c as P,e as M,f as O,g as A}from"./chunk-ZZWA24BS.js";import{Ba as f,Cb as w,La as x,Ma as u,O as d,Oa as C,Pa as v,Qa as s,Ra as n,Sa as o,T as m,Ta as h,U as g,Wb as j,Xa as b,Xb as L,Ya as k,Za as c,ib as i,jb as _,qa as a,rb as y}from"./chunk-RM7DW5FD.js";var E=[{path:"",loadComponent:()=>import("./chunk-CQQRQYJU.js").then(e=>e.DashboardComponent)},{path:"workflows",loadComponent:()=>import("./chunk-Q6S2YOXT.js").then(e=>e.WorkflowsComponent)},{path:"workflows/builder",loadComponent:()=>import("./chunk-BDLVJ3JS.js").then(e=>e.WorkflowBuilderComponent)},{path:"workflows/detail",loadComponent:()=>import("./chunk-E3BSTPAZ.js").then(e=>e.WorkflowDetailComponent)},{path:"conversations",loadComponent:()=>import("./chunk-7L4OEPXU.js").then(e=>e.ConversationsComponent)},{path:"conversations/:conversationId",loadComponent:()=>import("./chunk-7L4OEPXU.js").then(e=>e.ConversationsComponent)},{path:"runs/:runId",loadComponent:()=>import("./chunk-SM2S63GA.js").then(e=>e.RunExecutionComponent)},{path:"settings",loadComponent:()=>import("./chunk-IBUECISR.js").then(e=>e.SettingsComponent)}];var I={providers:[w({eventCoalescing:!0}),A(E),j()]};var R=()=>({exact:!0}),T=(e,r)=>r.id;function V(e,r){if(e&1&&(n(0,"option",14),i(1),o()),e&2){let t=r.$implicit,p=c(2);s("value",t.id)("selected",t.id===p.selectedId()),a(),_(t.name)}}function F(e,r){if(e&1){let t=b();n(0,"select",13),k("change",function(z){m(t);let D=c();return g(D.onProjectChange(z))}),C(1,V,2,3,"option",14,T),o()}if(e&2){let t=c();a(),v(t.projects())}}var l=class e{projectService=d(L);projects=this.projectService.projects;selectedId=this.projectService.selectedId;constructor(){this.projectService.load()}onProjectChange(r){let t=r.target.value;!t||t===this.selectedId()||(this.projectService.select(t),document.location.reload())}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=f({type:e,selectors:[["app-root"]],decls:21,vars:3,consts:[[1,"app-shell"],[1,"app-nav"],["routerLink","/",1,"brand-link"],[1,"brand-icon"],[1,"brand-name"],["routerLink","/","routerLinkActive","border-primary text-primary",1,"nav-link",3,"routerLinkActiveOptions"],["routerLink","/workflows","routerLinkActive","border-primary text-primary",1,"nav-link"],["routerLink","/conversations","routerLinkActive","border-primary text-primary",1,"nav-link"],["routerLink","/settings","routerLinkActive","border-primary text-primary",1,"nav-link"],[1,"nav-spacer"],["aria-label","Project","title","Switch project",1,"project-select"],[1,"version-pill"],[1,"app-main"],["aria-label","Project","title","Switch project",1,"project-select",3,"change"],[3,"value","selected"]],template:function(t,p){t&1&&(n(0,"div",0)(1,"nav",1)(2,"a",2)(3,"span",3),i(4,"V"),o(),n(5,"span",4),i(6,"VSAF"),o()(),n(7,"a",5),i(8," Dashboard "),o(),n(9,"a",6),i(10," Workflows "),o(),n(11,"a",7),i(12," Conversations "),o(),n(13,"a",8),i(14," Settings "),o(),n(15,"div",9),x(16,F,3,0,"select",10),n(17,"span",11),i(18,"v0.2.0"),o()()(),n(19,"main",12),h(20,"router-outlet"),o()()),t&2&&(a(7),s("routerLinkActiveOptions",y(2,R)),a(9),u(p.projects().length>1?16:-1))},dependencies:[P,M,O],styles:["[_nghost-%COMP%]{display:block;min-height:100vh;background:#101114;color:#e7e7ea}.app-shell[_ngcontent-%COMP%]{min-height:100vh;background:#101114;color:#e7e7ea}.app-nav[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;height:56px;border-bottom:1px solid #2b2d33;background:#17181d;padding:0 16px;box-sizing:border-box}.brand-link[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:9px;margin-right:18px;color:#f4f4f5;text-decoration:none}.brand-link[_ngcontent-%COMP%]:hover{opacity:.82}.brand-icon[_ngcontent-%COMP%]{display:grid;place-items:center;width:30px;height:30px;border-radius:7px;background:#6366f1;color:#fff;font-size:14px;font-weight:800}.brand-name[_ngcontent-%COMP%]{font-size:14px;font-weight:800}.nav-link[_ngcontent-%COMP%]{display:inline-flex;align-items:center;height:56px;border-bottom:2px solid transparent;padding:0 13px;color:#a1a1aa;font-size:14px;font-weight:650;text-decoration:none;box-sizing:border-box}.nav-link[_ngcontent-%COMP%]:hover{color:#f4f4f5}.nav-link.border-primary[_ngcontent-%COMP%], .nav-link.text-primary[_ngcontent-%COMP%]{border-bottom-color:#6366f1;color:#a5b4fc}.nav-spacer[_ngcontent-%COMP%]{margin-left:auto;display:flex;align-items:center;gap:12px}.project-select[_ngcontent-%COMP%]{border:1px solid #2b2d33;border-radius:7px;background:#20222a;color:#e7e7ea;padding:5px 8px;font:inherit;font-size:12px;max-width:220px;cursor:pointer}.project-select[_ngcontent-%COMP%]:focus{outline:none;border-color:#6366f1}.version-pill[_ngcontent-%COMP%]{border:1px solid #2b2d33;border-radius:7px;background:#20222a;color:#a1a1aa;padding:5px 8px;font-size:12px}.app-main[_ngcontent-%COMP%]{min-height:calc(100vh - 56px);overflow:auto;background:#101114}"]})};S(l,I).catch(e=>console.error(e));
@@ -0,0 +1 @@
1
+ @layer properties;@layer theme,base,components,utilities;@layer theme{:root,:host{--color-red-300: oklch(80.8% .114 19.571);--color-red-400: oklch(70.4% .191 22.216);--color-red-500: oklch(63.7% .237 25.331);--color-amber-400: oklch(82.8% .189 84.429);--color-amber-500: oklch(76.9% .188 70.08);--color-green-400: oklch(79.2% .209 151.711);--color-green-500: oklch(72.3% .219 149.579);--color-blue-400: oklch(70.7% .165 254.624);--color-blue-500: oklch(62.3% .214 259.815);--color-blue-600: oklch(54.6% .245 262.881);--color-indigo-100: oklch(93% .034 272.788);--color-indigo-300: oklch(78.5% .115 274.713);--color-indigo-400: oklch(67.3% .182 276.935);--color-indigo-500: oklch(58.5% .233 277.117);--color-slate-100: oklch(96.8% .007 247.896);--color-slate-200: oklch(92.9% .013 255.508);--color-slate-300: oklch(86.9% .022 252.894);--color-slate-400: oklch(70.4% .04 256.788);--color-slate-500: oklch(55.4% .046 257.417);--color-slate-600: oklch(44.6% .043 257.281);--color-slate-700: oklch(37.2% .044 257.287);--color-slate-800: oklch(27.9% .041 260.031);--color-slate-900: oklch(20.8% .042 265.755);--color-slate-950: oklch(12.9% .042 264.695);--color-black: #000;--color-white: #fff;--spacing: .25rem;--container-md: 28rem;--text-xs: .75rem;--text-xs--line-height: calc(1 / .75);--text-sm: .875rem;--text-sm--line-height: calc(1.25 / .875);--text-lg: 1.125rem;--text-lg--line-height: calc(1.75 / 1.125);--font-weight-medium: 500;--font-weight-semibold: 600;--tracking-wide: .025em;--radius-lg: .5rem;--radius-xl: .75rem;--ease-in-out: cubic-bezier(.4, 0, .2, 1);--animate-pulse: pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-font-family: Inter, ui-sans-serif, system-ui, sans-serif;--default-mono-font-family: "JetBrains Mono", ui-monospace, monospace}}@layer base{*,:after,:before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;tab-size:4;font-family:var(--default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings, normal);font-variation-settings:var(--default-font-variation-settings, normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings, normal);font-variation-settings:var(--default-mono-font-variation-settings, normal);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:transparent;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px){::placeholder{color:currentcolor}@supports (color: color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.top-2{top:calc(var(--spacing) * 2)}.bottom-2{bottom:calc(var(--spacing) * 2)}.left-2{left:calc(var(--spacing) * 2)}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.m-3{margin:calc(var(--spacing) * 3)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-2{margin-left:calc(var(--spacing) * 2)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.table{display:table}.h-\[calc\(100vh-6rem\)\]{height:calc(100vh - 6rem)}.h-full{height:100%}.min-h-0{min-height:calc(var(--spacing) * 0)}.w-10{width:calc(var(--spacing) * 10)}.w-auto{width:auto}.w-full{width:100%}.max-w-\[78\%\]{max-width:78%}.max-w-\[90\%\]{max-width:90%}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.flex-\[1\.6\]{flex:1.6}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-primary{border-color:var(--primary)}.border-red-500\/30{border-color:color-mix(in srgb,oklch(63.7% .237 25.331) 30%,transparent)}@supports (color: color-mix(in lab,red,red)){.border-red-500\/30{border-color:color-mix(in oklab,var(--color-red-500) 30%,transparent)}}.border-red-500\/50{border-color:color-mix(in srgb,oklch(63.7% .237 25.331) 50%,transparent)}@supports (color: color-mix(in lab,red,red)){.border-red-500\/50{border-color:color-mix(in oklab,var(--color-red-500) 50%,transparent)}}.border-slate-600{border-color:var(--color-slate-600)}.border-slate-700{border-color:var(--color-slate-700)}.border-slate-800{border-color:var(--color-slate-800)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-black\/40{background-color:color-mix(in srgb,#000 40%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.bg-black\/60{background-color:color-mix(in srgb,#000 60%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-blue-500\/10{background-color:color-mix(in srgb,oklch(62.3% .214 259.815) 10%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500) 10%,transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-green-500\/10{background-color:color-mix(in srgb,oklch(72.3% .219 149.579) 10%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500) 10%,transparent)}}.bg-indigo-500\/15{background-color:color-mix(in srgb,oklch(58.5% .233 277.117) 15%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-indigo-500\/15{background-color:color-mix(in oklab,var(--color-indigo-500) 15%,transparent)}}.bg-red-500\/10{background-color:color-mix(in srgb,oklch(63.7% .237 25.331) 10%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500) 10%,transparent)}}.bg-slate-700{background-color:var(--color-slate-700)}.bg-slate-800{background-color:var(--color-slate-800)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-900\/40{background-color:color-mix(in srgb,oklch(20.8% .042 265.755) 40%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-slate-900\/40{background-color:color-mix(in oklab,var(--color-slate-900) 40%,transparent)}}.bg-slate-950{background-color:var(--color-slate-950)}.bg-slate-950\/40{background-color:color-mix(in srgb,oklch(12.9% .042 264.695) 40%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-slate-950\/40{background-color:color-mix(in oklab,var(--color-slate-950) 40%,transparent)}}.bg-slate-950\/50{background-color:color-mix(in srgb,oklch(12.9% .042 264.695) 50%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-slate-950\/50{background-color:color-mix(in oklab,var(--color-slate-950) 50%,transparent)}}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.text-center{text-align:center}.font-mono{font-family:JetBrains Mono,ui-monospace,monospace}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading, var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading, var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.font-medium{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight: var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking: var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-400{color:var(--color-amber-400)}.text-blue-400{color:var(--color-blue-400)}.text-green-400{color:var(--color-green-400)}.text-indigo-100{color:var(--color-indigo-100)}.text-indigo-400{color:var(--color-indigo-400)}.text-primary{color:var(--primary)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-slate-100{color:var(--color-slate-100)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-950{color:var(--color-slate-950)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.shadow-2xl{--tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / .25));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur: blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.ease-in-out{--tw-ease: var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.hover\:bg-amber-400:hover{background-color:var(--color-amber-400)}}@media(hover:hover){.hover\:bg-blue-500:hover{background-color:var(--color-blue-500)}}@media(hover:hover){.hover\:bg-red-500\/10:hover{background-color:color-mix(in srgb,oklch(63.7% .237 25.331) 10%,transparent)}@supports (color: color-mix(in lab,red,red)){.hover\:bg-red-500\/10:hover{background-color:color-mix(in oklab,var(--color-red-500) 10%,transparent)}}}@media(hover:hover){.hover\:text-indigo-300:hover{color:var(--color-indigo-300)}}@media(hover:hover){.hover\:text-slate-100:hover{color:var(--color-slate-100)}}@media(hover:hover){.hover\:text-slate-200:hover{color:var(--color-slate-200)}}@media(hover:hover){.hover\:text-slate-300:hover{color:var(--color-slate-300)}}.focus\:border-amber-500:focus{border-color:var(--color-amber-500)}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:outline-none:focus{--tw-outline-style: none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:40%}}:root{--background: oklch(.14 .005 260);--surface: oklch(.18 .008 260);--surface-elevated: oklch(.22 .01 260);--border: oklch(.28 .01 260);--border-bright: oklch(.35 .015 260);--text-primary: oklch(.93 .005 260);--text-secondary: oklch(.65 .01 260);--text-tertiary: oklch(.45 .01 260);--primary: oklch(.65 .18 250);--primary-foreground: oklch(.98 .005 260);--success: oklch(.65 .17 155);--warning: oklch(.75 .15 75);--error: oklch(.6 .2 25)}html,body{min-height:100%;background:var(--background);color:var(--text-primary);font-family:Inter,ui-sans-serif,system-ui,sans-serif}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--background)}::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--border-bright)}@property --tw-rotate-x{syntax: "*"; inherits: false;}@property --tw-rotate-y{syntax: "*"; inherits: false;}@property --tw-rotate-z{syntax: "*"; inherits: false;}@property --tw-skew-x{syntax: "*"; inherits: false;}@property --tw-skew-y{syntax: "*"; inherits: false;}@property --tw-space-y-reverse{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-border-style{syntax: "*"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: "*"; inherits: false;}@property --tw-tracking{syntax: "*"; inherits: false;}@property --tw-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: "*"; inherits: false;}@property --tw-shadow-alpha{syntax: "<percentage>"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: "*"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: "<percentage>"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: "*"; inherits: false;}@property --tw-ring-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: "*"; inherits: false;}@property --tw-inset-ring-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: "*"; inherits: false;}@property --tw-ring-offset-width{syntax: "<length>"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: "*"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-outline-style{syntax: "*"; inherits: false; initial-value: solid;}@property --tw-blur{syntax: "*"; inherits: false;}@property --tw-brightness{syntax: "*"; inherits: false;}@property --tw-contrast{syntax: "*"; inherits: false;}@property --tw-grayscale{syntax: "*"; inherits: false;}@property --tw-hue-rotate{syntax: "*"; inherits: false;}@property --tw-invert{syntax: "*"; inherits: false;}@property --tw-opacity{syntax: "*"; inherits: false;}@property --tw-saturate{syntax: "*"; inherits: false;}@property --tw-sepia{syntax: "*"; inherits: false;}@property --tw-drop-shadow{syntax: "*"; inherits: false;}@property --tw-drop-shadow-color{syntax: "*"; inherits: false;}@property --tw-drop-shadow-alpha{syntax: "<percentage>"; inherits: false; initial-value: 100%;}@property --tw-drop-shadow-size{syntax: "*"; inherits: false;}@property --tw-ease{syntax: "*"; inherits: false;}@keyframes pulse{50%{opacity:.5}}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x: initial;--tw-rotate-y: initial;--tw-rotate-z: initial;--tw-skew-x: initial;--tw-skew-y: initial;--tw-space-y-reverse: 0;--tw-border-style: solid;--tw-font-weight: initial;--tw-tracking: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-outline-style: solid;--tw-blur: initial;--tw-brightness: initial;--tw-contrast: initial;--tw-grayscale: initial;--tw-hue-rotate: initial;--tw-invert: initial;--tw-opacity: initial;--tw-saturate: initial;--tw-sepia: initial;--tw-drop-shadow: initial;--tw-drop-shadow-color: initial;--tw-drop-shadow-alpha: 100%;--tw-drop-shadow-size: initial;--tw-ease: initial}}}
@@ -0,0 +1,10 @@
1
+ ---
2
+ name: sdlc-onboard-code-cross-domain
3
+ description: "Code 5/6 — cross-domain verify (GitNexus code ↔ docs graph.json) + technical terms"
4
+ version: 1.0.0
5
+ author: "@ngocsangairvds/vsaf"
6
+ ---
7
+
8
+ # Code 5/6 — cross-domain verify (GitNexus code ↔ docs graph.json) + technical terms
9
+
10
+ @include(step.md)
@@ -0,0 +1,11 @@
1
+ Print `[ONBOARD-CODE] [5/6] Cross-domain verify... ⏳/✅`.
2
+
3
+ Read `graphify-out/graph.json` (the docs graph from onboard-docs — READ ONLY) and query the code via GitNexus (`query`, `context`). Cross-reference:
4
+ - business concept (graph.json) → is there a matching code module? YES → record `{concept} ↔ {module/class}`; NO → "{concept} not yet implemented".
5
+ - code module (GitNexus) → matching business concept? YES → mapping; NO → technical module (infra/utils), record as such.
6
+ Update `CONTEXT.md` IDEMPOTENTLY — never overwrite the whole file, and never blind-append (re-runs would bloat it). Manage BY SECTION:
7
+ - PRESERVE the `## Shared Language` section written by onboard-docs — do NOT delete or rewrite it.
8
+ - You OWN `## Cross-Domain Verification` (the concept↔module mappings above) and `## Technical Terms`
9
+ (table: | Term | Definition | Maps to Business Concept |). If a section already exists, REPLACE its body in place; otherwise append it.
10
+ - Keep ONE row per mapping/term (dedupe by key) — update rather than duplicate.
11
+ Flag any cross-database access. If `graphify-out/graph.json` is absent, note that onboard-docs must run first.
@@ -0,0 +1,10 @@
1
+ ---
2
+ name: sdlc-onboard-code-detect-structure
3
+ description: "Code 1/6 — detect project structure (single / multi-repo / non-git)"
4
+ version: 1.0.0
5
+ author: "@ngocsangairvds/vsaf"
6
+ ---
7
+
8
+ # Code 1/6 — detect project structure (single / multi-repo / non-git)
9
+
10
+ @include(step.md)
@@ -0,0 +1,7 @@
1
+ You are a Senior DevOps + Code Architect onboarding a codebase. Project path: $ARGUMENTS (or current dir).
2
+ Print `[ONBOARD-CODE] [1/6] Detect project structure... ⏳/✅`.
3
+
4
+ Determine structure: root `.git`? → single repo. No root `.git` → scan 1–2 levels for `.git/`:
5
+ found N → multi-repo/microservice (list {path, remote, branch}); none → non-git project.
6
+ Record the result under `## Project Structure` in `.vsaf/docs/onboarding/env-setup.md`.
7
+ Artifact boundary: write only at project root or under root `.vsaf/`. ⛔ Do NOT modify `graphify-out/` or `.gitnexus/`.
@@ -0,0 +1,10 @@
1
+ ---
2
+ name: sdlc-onboard-code-env-docker
3
+ description: "Code 4/6 — environment check + Docker setup suggestion"
4
+ version: 1.0.0
5
+ author: "@ngocsangairvds/vsaf"
6
+ ---
7
+
8
+ # Code 4/6 — environment check + Docker setup suggestion
9
+
10
+ @include(step.md)
@@ -0,0 +1,7 @@
1
+ Print `[ONBOARD-CODE] [4/6] Environment check + Docker setup... ⏳/✅`.
2
+
3
+ Detect the tech stack (read package.json, pom.xml, build.gradle, requirements.txt, Dockerfile, docker-compose.yml).
4
+ Check the current env (`java -version`, `node -v`, `docker -v`, `python3 --version`, …); compare required vs present
5
+ and suggest installs. Docker: if no Dockerfile/docker-compose.yml, suggest creating them (app + DB/cache/broker as needed);
6
+ if present, sanity-check the config. Record everything under `.vsaf/docs/onboarding/env-setup.md`
7
+ (this is the only md file this phase creates — no project-overview/codebase-map).
@@ -0,0 +1,10 @@
1
+ ---
2
+ name: sdlc-onboard-code-summary
3
+ description: "Code 6/6 — onboarding summary report"
4
+ version: 1.0.0
5
+ author: "@ngocsangairvds/vsaf"
6
+ ---
7
+
8
+ # Code 6/6 — onboarding summary report
9
+
10
+ @include(step.md)
@@ -0,0 +1,4 @@
1
+ Print `[ONBOARD-CODE] [6/6] Create summary report... ⏳/✅` then the report table:
2
+ Project structure / GitNexus index (N repos) / Index verification / Tech stack / Environment (ready or missing) /
3
+ Docker (exists or suggested) / Cross-domain mapping (N mapped, M gaps) / CONTEXT.md updated.
4
+ End with: "Artifacts saved. If interrupted, re-run the next phase — data is safe."
@@ -0,0 +1,10 @@
1
+ ---
2
+ name: sdlc-onboard-code-verify-index
3
+ description: "Code 3/6 — map + verify the GitNexus index via MCP (do NOT trust blindly)"
4
+ version: 1.0.0
5
+ author: "@ngocsangairvds/vsaf"
6
+ ---
7
+
8
+ # Code 3/6 — map + verify the GitNexus index via MCP (do NOT trust blindly)
9
+
10
+ @include(step.md)
@@ -0,0 +1,9 @@
1
+ Print `[ONBOARD-CODE] [3/6] Verify GitNexus index... ⏳/✅`.
2
+
3
+ Claude MUST review the index — do not assume it is correct. Using the GitNexus MCP tools:
4
+ - `group_sync` if the index needs (re)syncing; `list_repos` — confirm the project root is indexed (one unified index).
5
+ - `route_map` — confirm API routes from ALL repos are mapped; `tool_map` + `context` on 3–5 key entry points per repo.
6
+ Check: main entry points indexed? inter-module dependencies correct? for multi-repo, cross-service calls
7
+ (HTTP/gRPC/event) captured? If something is missing, re-run `group_sync` or record
8
+ "{module/route} not indexed — needs manual review" in `.vsaf/docs/onboarding/env-setup.md`.
9
+ ⛔ Only GitNexus writes `.gitnexus/`; do not edit it directly.
@@ -0,0 +1,10 @@
1
+ ---
2
+ name: sdlc-onboard-docs-extract-terms
3
+ description: "Docs 4/4 — extract domain terms from the graph into CONTEXT.md (Shared Language)"
4
+ version: 1.0.0
5
+ author: "@ngocsangairvds/vsaf"
6
+ ---
7
+
8
+ # Docs 4/4 — extract domain terms from the graph into CONTEXT.md (Shared Language)
9
+
10
+ @include(step.md)
@@ -0,0 +1,20 @@
1
+ Print progress `[ONBOARD-DOCS] [4/4] Extract domain terms → CONTEXT.md... ⏳/✅`.
2
+
3
+ From the completed `graph.json`, extract DOMAIN terms (business vocabulary, not technical/code terms —
4
+ those are added later by onboard-code).
5
+
6
+ Update `CONTEXT.md` at the project root IDEMPOTENTLY — never overwrite the whole file, and never blind-append
7
+ (re-running onboarding would bloat it). Manage the file BY SECTION:
8
+ - Ensure a single top `# Project Context: {project-name}` heading (create once if missing).
9
+ - You OWN the `## Shared Language` section: if it already exists, REPLACE its body in place; otherwise append it.
10
+ Leave every other section (e.g. `## Technical Terms`, `## Cross-Domain Verification`) untouched.
11
+ - Keep ONE row per Term (dedupe by term name) — update an existing term's row instead of adding a duplicate.
12
+
13
+ ## Shared Language
14
+
15
+ | Term | Definition | Example |
16
+ |------|-----------|---------|
17
+ | {term} | {1-line definition} | {concrete example} |
18
+
19
+ The graph is the single source of truth — do NOT create redundant overview/summary md files.
20
+ Then print: "Artifacts saved. If interrupted, re-run the next phase — data is safe."
@@ -0,0 +1,10 @@
1
+ ---
2
+ name: sdlc-onboard-docs-graphify-build
3
+ description: "Docs 2/4 — graphify build over a docs-only staging dir -> graph.json"
4
+ version: 1.0.0
5
+ author: "@ngocsangairvds/vsaf"
6
+ ---
7
+
8
+ # Docs 2/4 — graphify build over a docs-only staging dir -> graph.json
9
+
10
+ @include(step.md)
@@ -0,0 +1,11 @@
1
+ Print progress `[ONBOARD-DOCS] [2/4] Graphify build for docs... ⏳/✅`.
2
+
3
+ 1. Create `.vsaf/docs/onboarding/graphify-staging/` and populate it with ALL doc inputs:
4
+ original text docs (.md/.txt/README), converted .md from `.vsaf/docs/onboarding/doc-imports/`,
5
+ and the original binaries listed in `.vsaf/docs/onboarding/graphify-direct-read.txt`.
6
+ This staging dir is the SINGLE input to graphify — it guarantees graphify sees docs only, never code.
7
+ 2. Run `/graphify .vsaf/docs/onboarding/graphify-staging/`.
8
+ 3. Output: `graphify-out/graph.json`.
9
+
10
+ ⛔ CRITICAL: graphify is ONLY for docs — DO NOT run graphify on source code (code = GitNexus, in onboard-code).
11
+ Only graphify may write `graphify-out/`.
@@ -0,0 +1,10 @@
1
+ ---
2
+ name: sdlc-onboard-docs-scan-import
3
+ description: "Docs 1/4 — scan & import documents (markitdown conversion + tier fallbacks)"
4
+ version: 1.0.0
5
+ author: "@ngocsangairvds/vsaf"
6
+ ---
7
+
8
+ # Docs 1/4 — scan & import documents (markitdown conversion + tier fallbacks)
9
+
10
+ @include(step.md)
@@ -0,0 +1,19 @@
1
+ You are a Knowledge Engineer onboarding project documents. Project path: $ARGUMENTS (or current dir).
2
+ Print progress as `[ONBOARD-DOCS] [1/4] Scan & import documents... ⏳/✅`.
3
+
4
+ 1. Scan ALL documents: README, docs/, wiki/, specs/, *.md, *.txt (+ complex binaries). List them.
5
+ 2. Resolve markitdown python:
6
+ VENVS=$(pipx environment --value PIPX_LOCAL_VENVS 2>/dev/null)
7
+ MARKITDOWN_PYTHON="${VENVS}/markitdown/bin/python" (fallback ~/.local/pipx/venvs/markitdown/bin/python)
8
+ If markitdown is missing, skip conversion and route ALL complex files through fallbacks (step 4).
9
+ 3. Classify each complex file into a tier:
10
+ - Tier 1 (graphify-native): PDF, DOCX, XLSX, PNG, JPG, GIF, WEBP
11
+ - Tier 2 (graphify-blind): HTML, PPTX, EPUB, ZIP
12
+ - .md/.txt are NOT complex (read directly).
13
+ 4. For each complex file: attempt `"$MARKITDOWN_PYTHON" "<this-skill-dir>/convert.py" --input {file} --output .vsaf/docs/onboarding/doc-imports/{name}.md`.
14
+ Verify the output has real content (not just headers, not an LLM refusal, not hallucinated). On success use it.
15
+ On failure/verify-fail: Tier 1 -> append original path to `.vsaf/docs/onboarding/graphify-direct-read.txt`;
16
+ Tier 2 HTML -> Read the file + write clean markdown to doc-imports/{name}.md; Tier 2 PPTX/EPUB/ZIP -> skip.
17
+ 5. Print a conversion summary (markitdown OK / graphify-direct / Claude-Read / skipped counts).
18
+
19
+ Artifact boundary: write generated artifacts ONLY at project root or under root `.vsaf/`. ⛔ Do NOT modify `graphify-out/` or `.gitnexus/`.
@@ -0,0 +1,10 @@
1
+ ---
2
+ name: sdlc-onboard-docs-verify-fix
3
+ description: "Docs 3/4 — Claude verifies graph vs docs and supplements missing nodes/edges"
4
+ version: 1.0.0
5
+ author: "@ngocsangairvds/vsaf"
6
+ ---
7
+
8
+ # Docs 3/4 — Claude verifies graph vs docs and supplements missing nodes/edges
9
+
10
+ @include(step.md)
@@ -0,0 +1,10 @@
1
+ Print progress `[ONBOARD-DOCS] [3/4] Verify & fix graph... ⏳/✅`.
2
+
3
+ Do NOT trust the graph blindly. For EACH original doc:
4
+ 1. Re-read it — extract concepts, relationships, business rules, constraints.
5
+ 2. Read `graphify-out/graph.json` — find the corresponding nodes/edges.
6
+ 3. Compare: concept/relationship/rule present in the doc but missing in the graph = MISSING.
7
+ 4. Supplement any MISSING nodes/edges DIRECTLY into `graph.json` (this Phase-3 supplementation is the
8
+ ONLY permitted direct write to graph.json). Report per doc: "{doc}: +N nodes, +M edges".
9
+
10
+ Every missing concept/relationship MUST be supplemented, not skipped.
@@ -10,8 +10,15 @@ skills:
10
10
 
11
11
  # Phase 0 — Onboarding
12
12
  - init
13
- - onboard-docs
14
- - onboard-code
13
+ - onboard-docs/scan-import
14
+ - onboard-docs/graphify-build
15
+ - onboard-docs/verify-fix
16
+ - onboard-docs/extract-terms
17
+ - onboard-code/detect-structure
18
+ - onboard-code/verify-index
19
+ - onboard-code/env-docker
20
+ - onboard-code/cross-domain
21
+ - onboard-code/summary
15
22
 
16
23
  # Phase 1-9 — Main flow
17
24
  - write-srs
@@ -12,14 +12,7 @@ nodes:
12
12
  permission_mode: bypassPermissions
13
13
  workspace: false
14
14
  timeout: 900000
15
- prompt: |
16
- You are a Senior DevOps + Code Architect onboarding a codebase. Project path: $ARGUMENTS (or current dir).
17
- Print `[ONBOARD-CODE] [1/6] Detect project structure... ⏳/✅`.
18
-
19
- Determine structure: root `.git`? → single repo. No root `.git` → scan 1–2 levels for `.git/`:
20
- found N → multi-repo/microservice (list {path, remote, branch}); none → non-git project.
21
- Record the result under `## Project Structure` in `.vsaf/docs/onboarding/env-setup.md`.
22
- Artifact boundary: write only at project root or under root `.vsaf/`. ⛔ Do NOT modify `graphify-out/` or `.gitnexus/`.
15
+ command: sdlc-onboard-code-detect-structure
23
16
 
24
17
  - id: gitnexus-index
25
18
  description: Code 2/6 — build the GitNexus code index (single unified index at project root)
@@ -47,16 +40,7 @@ nodes:
47
40
  timeout: 1800000
48
41
  depends_on:
49
42
  - gitnexus-index
50
- prompt: |
51
- Print `[ONBOARD-CODE] [3/6] Verify GitNexus index... ⏳/✅`.
52
-
53
- Claude MUST review the index — do not assume it is correct. Using the GitNexus MCP tools:
54
- - `group_sync` if the index needs (re)syncing; `list_repos` — confirm the project root is indexed (one unified index).
55
- - `route_map` — confirm API routes from ALL repos are mapped; `tool_map` + `context` on 3–5 key entry points per repo.
56
- Check: main entry points indexed? inter-module dependencies correct? for multi-repo, cross-service calls
57
- (HTTP/gRPC/event) captured? If something is missing, re-run `group_sync` or record
58
- "{module/route} not indexed — needs manual review" in `.vsaf/docs/onboarding/env-setup.md`.
59
- ⛔ Only GitNexus writes `.gitnexus/`; do not edit it directly.
43
+ command: sdlc-onboard-code-verify-index
60
44
 
61
45
  - id: env-docker
62
46
  description: Code 4/6 — environment check + Docker setup suggestion
@@ -65,14 +49,7 @@ nodes:
65
49
  timeout: 1800000
66
50
  depends_on:
67
51
  - verify-index
68
- prompt: |
69
- Print `[ONBOARD-CODE] [4/6] Environment check + Docker setup... ⏳/✅`.
70
-
71
- Detect the tech stack (read package.json, pom.xml, build.gradle, requirements.txt, Dockerfile, docker-compose.yml).
72
- Check the current env (`java -version`, `node -v`, `docker -v`, `python3 --version`, …); compare required vs present
73
- and suggest installs. Docker: if no Dockerfile/docker-compose.yml, suggest creating them (app + DB/cache/broker as needed);
74
- if present, sanity-check the config. Record everything under `.vsaf/docs/onboarding/env-setup.md`
75
- (this is the only md file this phase creates — no project-overview/codebase-map).
52
+ command: sdlc-onboard-code-env-docker
76
53
 
77
54
  - id: cross-domain
78
55
  description: Code 5/6 — cross-domain verify (GitNexus code ↔ docs graph.json) + technical terms
@@ -81,18 +58,7 @@ nodes:
81
58
  timeout: 1800000
82
59
  depends_on:
83
60
  - env-docker
84
- prompt: |
85
- Print `[ONBOARD-CODE] [5/6] Cross-domain verify... ⏳/✅`.
86
-
87
- Read `graphify-out/graph.json` (the docs graph from onboard-docs — READ ONLY) and query the code via GitNexus (`query`, `context`). Cross-reference:
88
- - business concept (graph.json) → is there a matching code module? YES → record `{concept} ↔ {module/class}`; NO → "{concept} not yet implemented".
89
- - code module (GitNexus) → matching business concept? YES → mapping; NO → technical module (infra/utils), record as such.
90
- Update `CONTEXT.md` IDEMPOTENTLY — never overwrite the whole file, and never blind-append (re-runs would bloat it). Manage BY SECTION:
91
- - PRESERVE the `## Shared Language` section written by onboard-docs — do NOT delete or rewrite it.
92
- - You OWN `## Cross-Domain Verification` (the concept↔module mappings above) and `## Technical Terms`
93
- (table: | Term | Definition | Maps to Business Concept |). If a section already exists, REPLACE its body in place; otherwise append it.
94
- - Keep ONE row per mapping/term (dedupe by key) — update rather than duplicate.
95
- Flag any cross-database access. If `graphify-out/graph.json` is absent, note that onboard-docs must run first.
61
+ command: sdlc-onboard-code-cross-domain
96
62
 
97
63
  - id: summary
98
64
  description: Code 6/6 — onboarding summary report
@@ -101,8 +67,4 @@ nodes:
101
67
  timeout: 600000
102
68
  depends_on:
103
69
  - cross-domain
104
- prompt: |
105
- Print `[ONBOARD-CODE] [6/6] Create summary report... ⏳/✅` then the report table:
106
- Project structure / GitNexus index (N repos) / Index verification / Tech stack / Environment (ready or missing) /
107
- Docker (exists or suggested) / Cross-domain mapping (N mapped, M gaps) / CONTEXT.md updated.
108
- End with: "Artifacts saved. If interrupted, re-run the next phase — data is safe."
70
+ command: sdlc-onboard-code-summary
@@ -11,26 +11,7 @@ nodes:
11
11
  permission_mode: bypassPermissions
12
12
  workspace: false
13
13
  timeout: 1800000
14
- prompt: |
15
- You are a Knowledge Engineer onboarding project documents. Project path: $ARGUMENTS (or current dir).
16
- Print progress as `[ONBOARD-DOCS] [1/4] Scan & import documents... ⏳/✅`.
17
-
18
- 1. Scan ALL documents: README, docs/, wiki/, specs/, *.md, *.txt (+ complex binaries). List them.
19
- 2. Resolve markitdown python:
20
- VENVS=$(pipx environment --value PIPX_LOCAL_VENVS 2>/dev/null)
21
- MARKITDOWN_PYTHON="${VENVS}/markitdown/bin/python" (fallback ~/.local/pipx/venvs/markitdown/bin/python)
22
- If markitdown is missing, skip conversion and route ALL complex files through fallbacks (step 4).
23
- 3. Classify each complex file into a tier:
24
- - Tier 1 (graphify-native): PDF, DOCX, XLSX, PNG, JPG, GIF, WEBP
25
- - Tier 2 (graphify-blind): HTML, PPTX, EPUB, ZIP
26
- - .md/.txt are NOT complex (read directly).
27
- 4. For each complex file: attempt `"$MARKITDOWN_PYTHON" "<this-skill-dir>/convert.py" --input {file} --output .vsaf/docs/onboarding/doc-imports/{name}.md`.
28
- Verify the output has real content (not just headers, not an LLM refusal, not hallucinated). On success use it.
29
- On failure/verify-fail: Tier 1 -> append original path to `.vsaf/docs/onboarding/graphify-direct-read.txt`;
30
- Tier 2 HTML -> Read the file + write clean markdown to doc-imports/{name}.md; Tier 2 PPTX/EPUB/ZIP -> skip.
31
- 5. Print a conversion summary (markitdown OK / graphify-direct / Claude-Read / skipped counts).
32
-
33
- Artifact boundary: write generated artifacts ONLY at project root or under root `.vsaf/`. ⛔ Do NOT modify `graphify-out/` or `.gitnexus/`.
14
+ command: sdlc-onboard-docs-scan-import
34
15
 
35
16
  - id: graphify-build
36
17
  description: Docs 2/4 — graphify build over a docs-only staging dir -> graph.json
@@ -39,18 +20,7 @@ nodes:
39
20
  timeout: 3600000
40
21
  depends_on:
41
22
  - scan-import
42
- prompt: |
43
- Print progress `[ONBOARD-DOCS] [2/4] Graphify build for docs... ⏳/✅`.
44
-
45
- 1. Create `.vsaf/docs/onboarding/graphify-staging/` and populate it with ALL doc inputs:
46
- original text docs (.md/.txt/README), converted .md from `.vsaf/docs/onboarding/doc-imports/`,
47
- and the original binaries listed in `.vsaf/docs/onboarding/graphify-direct-read.txt`.
48
- This staging dir is the SINGLE input to graphify — it guarantees graphify sees docs only, never code.
49
- 2. Run `/graphify .vsaf/docs/onboarding/graphify-staging/`.
50
- 3. Output: `graphify-out/graph.json`.
51
-
52
- ⛔ CRITICAL: graphify is ONLY for docs — DO NOT run graphify on source code (code = GitNexus, in onboard-code).
53
- Only graphify may write `graphify-out/`.
23
+ command: sdlc-onboard-docs-graphify-build
54
24
 
55
25
  - id: verify-fix
56
26
  description: Docs 3/4 — Claude verifies graph vs docs and supplements missing nodes/edges
@@ -59,17 +29,7 @@ nodes:
59
29
  timeout: 3600000
60
30
  depends_on:
61
31
  - graphify-build
62
- prompt: |
63
- Print progress `[ONBOARD-DOCS] [3/4] Verify & fix graph... ⏳/✅`.
64
-
65
- Do NOT trust the graph blindly. For EACH original doc:
66
- 1. Re-read it — extract concepts, relationships, business rules, constraints.
67
- 2. Read `graphify-out/graph.json` — find the corresponding nodes/edges.
68
- 3. Compare: concept/relationship/rule present in the doc but missing in the graph = MISSING.
69
- 4. Supplement any MISSING nodes/edges DIRECTLY into `graph.json` (this Phase-3 supplementation is the
70
- ONLY permitted direct write to graph.json). Report per doc: "{doc}: +N nodes, +M edges".
71
-
72
- Every missing concept/relationship MUST be supplemented, not skipped.
32
+ command: sdlc-onboard-docs-verify-fix
73
33
 
74
34
  - id: extract-terms
75
35
  description: Docs 4/4 — extract domain terms from the graph into CONTEXT.md (Shared Language)
@@ -79,24 +39,4 @@ nodes:
79
39
  timeout: 900000
80
40
  depends_on:
81
41
  - verify-fix
82
- prompt: |
83
- Print progress `[ONBOARD-DOCS] [4/4] Extract domain terms → CONTEXT.md... ⏳/✅`.
84
-
85
- From the completed `graph.json`, extract DOMAIN terms (business vocabulary, not technical/code terms —
86
- those are added later by onboard-code).
87
-
88
- Update `CONTEXT.md` at the project root IDEMPOTENTLY — never overwrite the whole file, and never blind-append
89
- (re-running onboarding would bloat it). Manage the file BY SECTION:
90
- - Ensure a single top `# Project Context: {project-name}` heading (create once if missing).
91
- - You OWN the `## Shared Language` section: if it already exists, REPLACE its body in place; otherwise append it.
92
- Leave every other section (e.g. `## Technical Terms`, `## Cross-Domain Verification`) untouched.
93
- - Keep ONE row per Term (dedupe by term name) — update an existing term's row instead of adding a duplicate.
94
-
95
- ## Shared Language
96
-
97
- | Term | Definition | Example |
98
- |------|-----------|---------|
99
- | {term} | {1-line definition} | {concrete example} |
100
-
101
- The graph is the single source of truth — do NOT create redundant overview/summary md files.
102
- Then print: "Artifacts saved. If interrupted, re-run the next phase — data is safe."
42
+ command: sdlc-onboard-docs-extract-terms