@soleri/forge 9.7.2 → 9.9.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 (39) hide show
  1. package/dist/agent-schema.d.ts +177 -6
  2. package/dist/agent-schema.js +58 -0
  3. package/dist/agent-schema.js.map +1 -1
  4. package/dist/compose-claude-md.js +56 -3
  5. package/dist/compose-claude-md.js.map +1 -1
  6. package/dist/domain-manager.d.ts +1 -0
  7. package/dist/domain-manager.js +57 -1
  8. package/dist/domain-manager.js.map +1 -1
  9. package/dist/knowledge-installer.d.ts +2 -0
  10. package/dist/knowledge-installer.js +107 -1
  11. package/dist/knowledge-installer.js.map +1 -1
  12. package/dist/lib.d.ts +1 -1
  13. package/dist/lib.js +1 -1
  14. package/dist/lib.js.map +1 -1
  15. package/dist/scaffold-filetree.d.ts +12 -0
  16. package/dist/scaffold-filetree.js +356 -10
  17. package/dist/scaffold-filetree.js.map +1 -1
  18. package/dist/scaffolder.js +12 -0
  19. package/dist/scaffolder.js.map +1 -1
  20. package/dist/skills/subagent-driven-development/SKILL.md +87 -20
  21. package/dist/templates/setup-script.js +71 -0
  22. package/dist/templates/setup-script.js.map +1 -1
  23. package/dist/templates/shared-rules.js +163 -6
  24. package/dist/templates/shared-rules.js.map +1 -1
  25. package/package.json +1 -1
  26. package/src/__tests__/domain-manager.test.ts +140 -0
  27. package/src/__tests__/scaffold-filetree.test.ts +326 -1
  28. package/src/__tests__/scaffolder.test.ts +7 -5
  29. package/src/__tests__/shared-rules.test.ts +48 -0
  30. package/src/agent-schema.ts +66 -0
  31. package/src/compose-claude-md.ts +63 -3
  32. package/src/domain-manager.ts +74 -1
  33. package/src/knowledge-installer.ts +124 -1
  34. package/src/lib.ts +6 -1
  35. package/src/scaffold-filetree.ts +404 -10
  36. package/src/scaffolder.ts +17 -0
  37. package/src/skills/subagent-driven-development/SKILL.md +87 -20
  38. package/src/templates/setup-script.ts +71 -0
  39. package/src/templates/shared-rules.ts +166 -6
@@ -1 +1 @@
1
- {"version":3,"file":"shared-rules.js","sourceRoot":"","sources":["../../src/templates/shared-rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared-rules.js","sourceRoot":"","sources":["../../src/templates/shared-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAE5C,MAAM,UAAU,eAAe;IAC7B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,qBAAqB;IACnC,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,kBAAkB,GAAa;IACnC,QAAQ,aAAa,MAAM;IAC3B,EAAE;IACF,uBAAuB;IACvB,EAAE;IACF,qGAAqG;IACrG,EAAE;IAEF,2DAA2D;IAC3D,mBAAmB;IACnB,gCAAgC;IAChC,EAAE;IACF,2MAA2M;IAC3M,EAAE;IACF,kIAAkI;IAClI,qHAAqH;IACrH,iFAAiF;IACjF,iGAAiG;IACjG,8GAA8G;IAC9G,EAAE;IACF,uBAAuB;IACvB,EAAE;IACF,2EAA2E;IAC3E,EAAE;IACF,4EAA4E;IAC5E,2DAA2D;IAC3D,qDAAqD;IACrD,gFAAgF;IAChF,gEAAgE;IAChE,EAAE;IACF,+BAA+B;IAC/B,EAAE;IACF,iFAAiF;IACjF,EAAE;IACF,oGAAoG;IACpG,oFAAoF;IACpF,wEAAwE;IACxE,EAAE;IACF,oIAAoI;IACpI,EAAE;IAEF,2DAA2D;IAC3D,uBAAuB;IACvB,oCAAoC;IACpC,EAAE;IACF,8FAA8F;IAC9F,uFAAuF;IACvF,EAAE;IAEF,2DAA2D;IAC3D,+BAA+B;IAC/B,wCAAwC;IACxC,EAAE;IACF,+GAA+G;IAC/G,EAAE;IACF,iGAAiG;IACjG,yEAAyE;IACzE,iGAAiG;IACjG,uEAAuE;IACvE,EAAE;IACF,yOAAyO;IACzO,EAAE;IACF,mBAAmB;IACnB,mBAAmB;IACnB,yFAAyF;IACzF,mGAAmG;IACnG,+FAA+F;IAC/F,EAAE;IAEF,0DAA0D;IAC1D,wBAAwB;IACxB,gCAAgC;IAChC,EAAE;IACF,2FAA2F;IAC3F,EAAE;IACF,2GAA2G;IAC3G,+KAA+K;IAC/K,EAAE;IACF,qFAAqF;IACrF,EAAE;IAEF,4DAA4D;IAC5D,4CAA4C;IAC5C,gCAAgC;IAChC,EAAE;IACF,2KAA2K;IAC3K,EAAE;IACF,8FAA8F;IAC9F,wHAAwH;IACxH,+HAA+H;IAC/H,uGAAuG;IACvG,qEAAqE;IACrE,sGAAsG;IACtG,EAAE;IACF,2BAA2B;IAC3B,EAAE;IACF,mHAAmH;IACnH,EAAE;IACF,0BAA0B;IAC1B,0BAA0B;IAC1B,oGAAoG;IACpG,oDAAoD;IACpD,gFAAgF;IAChF,6EAA6E;IAC7E,EAAE;IACF,qIAAqI;IACrI,EAAE;IAEF,4DAA4D;IAC5D,aAAa;IACb,0BAA0B;IAC1B,EAAE;IACF,8IAA8I;IAC9I,+FAA+F;IAC/F,yEAAyE;IACzE,uHAAuH;IACvH,2FAA2F;IAC3F,oFAAoF;IACpF,gFAAgF;IAChF,EAAE;IACF,0BAA0B;IAC1B,EAAE;IACF,iKAAiK;IACjK,EAAE;IACF,sCAAsC;IACtC,qCAAqC;IACrC,4EAA4E;IAC5E,+EAA+E;IAC/E,uFAAuF;IACvF,uFAAuF;IACvF,yFAAyF;IACzF,EAAE;IACF,wGAAwG;IACxG,EAAE;IACF,4HAA4H;IAC5H,EAAE;IACF,iJAAiJ;IACjJ,EAAE;IACF,wHAAwH;IACxH,EAAE;IACF,gBAAgB;IAChB,EAAE;IACF,6GAA6G;IAC7G,EAAE;IACF,wFAAwF;IACxF,8HAA8H;IAC9H,4GAA4G;IAC5G,6EAA6E;IAC7E,EAAE;IACF,sBAAsB;IACtB,EAAE;IACF,mCAAmC;IACnC,mCAAmC;IACnC,mDAAmD;IACnD,2CAA2C;IAC3C,+CAA+C;IAC/C,0DAA0D;IAC1D,4BAA4B;IAC5B,EAAE;IACF,uBAAuB;IACvB,EAAE;IACF,8CAA8C;IAC9C,EAAE;IACF,KAAK;IACL,wBAAwB;IACxB,EAAE;IACF,mBAAmB;IACnB,mBAAmB;IACnB,4BAA4B;IAC5B,8BAA8B;IAC9B,uCAAuC;IACvC,2BAA2B;IAC3B,uCAAuC;IACvC,EAAE;IACF,+BAA+B;IAC/B,EAAE;IACF,YAAY;IACZ,yBAAyB;IACzB,yBAAyB;IACzB,yBAAyB;IACzB,EAAE;IACF,eAAe;IACf,iBAAiB;IACjB,iBAAiB;IACjB,qBAAqB;IACrB,KAAK;IACL,EAAE;IACF,wEAAwE;IACxE,EAAE;IACF,kBAAkB;IAClB,EAAE;IACF,KAAK;IACL,mBAAmB;IACnB,mBAAmB;IACnB,wCAAwC;IACxC,+BAA+B;IAC/B,EAAE;IACF,6CAA6C;IAC7C,6CAA6C;IAC7C,kCAAkC;IAClC,KAAK;IACL,EAAE;IAEF,4DAA4D;IAC5D,uBAAuB;IACvB,oCAAoC;IACpC,EAAE;IACF,qHAAqH;IACrH,EAAE;IACF,kCAAkC;IAClC,sEAAsE;IACtE,+EAA+E;IAC/E,0EAA0E;IAC1E,EAAE;IACF,6DAA6D;IAC7D,uBAAuB;IACvB,uBAAuB;IACvB,2BAA2B;IAC3B,qBAAqB;IACrB,4BAA4B;IAC5B,iCAAiC;IACjC,EAAE;IACF,2BAA2B;IAC3B,SAAS;IACT,kBAAkB;IAClB,6BAA6B;IAC7B,2BAA2B;IAC3B,KAAK;IACL,EAAE;IACF,mBAAmB;IACnB,4CAA4C;IAC5C,yCAAyC;IACzC,yFAAyF;IACzF,mGAAmG;IACnG,6CAA6C;IAC7C,EAAE;IACF,6JAA6J;IAC7J,EAAE;IAEF,2DAA2D;IAC3D,cAAc;IACd,2BAA2B;IAC3B,EAAE;IACF,sLAAsL;IACtL,EAAE;IACF,kBAAkB;IAClB,EAAE;IACF,4EAA4E;IAC5E,kGAAkG;IAClG,EAAE;IACF,0BAA0B;IAC1B,EAAE;IACF,mFAAmF;IACnF,mFAAmF;IACnF,uCAAuC;IACvC,4DAA4D;IAC5D,EAAE;IACF,mBAAmB;IACnB,EAAE;IACF,oFAAoF;IACpF,4HAA4H;IAC5H,8DAA8D;IAC9D,EAAE;IACF,+BAA+B;IAC/B,EAAE;IACF,qBAAqB;IACrB,qBAAqB;IACrB,yEAAyE;IACzE,yFAAyF;IACzF,EAAE;IAEF,4DAA4D;IAC5D,sBAAsB;IACtB,mCAAmC;IACnC,EAAE;IACF,6EAA6E;IAC7E,EAAE;IACF,qCAAqC;IACrC,KAAK;IACL,kCAAkC;IAClC,kCAAkC;IAClC,2BAA2B;IAC3B,KAAK;IACL,EAAE;IACF,wEAAwE;IACxE,EAAE;IACF,4FAA4F;IAC5F,EAAE;IAEF,4DAA4D;IAC5D,kBAAkB;IAClB,+BAA+B;IAC/B,EAAE;IACF,sDAAsD;IACtD,EAAE;IACF,mBAAmB;IACnB,0CAA0C;IAC1C,2BAA2B;IAC3B,2CAA2C;IAC3C,8EAA8E;IAC9E,EAAE;IACF,2BAA2B;IAC3B,KAAK;IACL,+BAA+B;IAC/B,kCAAkC;IAClC,wCAAwC;IACxC,KAAK;IACL,EAAE;IAEF,2DAA2D;IAC3D,sBAAsB;IACtB,mCAAmC;IACnC,EAAE;IACF,2FAA2F;IAC3F,EAAE;IACF,+CAA+C;IAC/C,+CAA+C;IAC/C,2DAA2D;IAC3D,2DAA2D;IAC3D,oEAAoE;IACpE,6DAA6D;IAC7D,EAAE;IACF,gEAAgE;IAChE,EAAE;IACF,6BAA6B;IAC7B,8BAA8B;IAC9B,6DAA6D;IAC7D,mEAAmE;IACnE,gDAAgD;IAChD,uDAAuD;IACvD,EAAE;IAEF,4DAA4D;IAC5D,sBAAsB;IACtB,8BAA8B;IAC9B,EAAE;IACF,mDAAmD;IACnD,EAAE;IACF,qBAAqB;IACrB,EAAE;IACF,4DAA4D;IAC5D,EAAE;IACF,6CAA6C;IAC7C,6CAA6C;IAC7C,8BAA8B;IAC9B,uCAAuC;IACvC,mCAAmC;IACnC,qDAAqD;IACrD,yDAAyD;IACzD,EAAE;IACF,aAAa;IACb,EAAE;IACF,4EAA4E;IAC5E,sGAAsG;IACtG,EAAE;IACF,6BAA6B;IAC7B,EAAE;IACF,wIAAwI;IACxI,EAAE;IACF,gBAAgB;IAChB,yDAAyD;IACzD,kDAAkD;IAClD,6CAA6C;IAC7C,EAAE;IACF,8FAA8F;IAC9F,EAAE;IACF,6BAA6B;IAC7B,EAAE;IACF,mHAAmH;IACnH,EAAE;IACF,wCAAwC;IACxC,wCAAwC;IACxC,sHAAsH;IACtH,kMAAkM;IAClM,+IAA+I;IAC/I,EAAE;IACF,qHAAqH;IACrH,EAAE;IACF,oLAAoL;IACpL,EAAE;IACF,oDAAoD;IACpD,EAAE;IACF,uDAAuD;IACvD,qCAAqC;IACrC,+CAA+C;IAC/C,8BAA8B;IAC9B,EAAE;IAEF,4DAA4D;IAC5D,qBAAqB;IACrB,kCAAkC;IAClC,EAAE;IACF,4EAA4E;IAC5E,EAAE;IACF,qBAAqB;IACrB,qBAAqB;IACrB,0DAA0D;IAC1D,yDAAyD;IACzD,oDAAoD;IACpD,uDAAuD;IACvD,wDAAwD;IACxD,mDAAmD;IACnD,EAAE;IACF,iFAAiF;IACjF,EAAE;IAEF,4DAA4D;IAC5D,8BAA8B;IAC9B,iCAAiC;IACjC,EAAE;IACF,gHAAgH;IAChH,uHAAuH;IACvH,EAAE;IACF,mCAAmC;IACnC,oCAAoC;IACpC,2DAA2D;IAC3D,kDAAkD;IAClD,EAAE;IAEF,4DAA4D;IAC5D,wBAAwB;IACxB,uBAAuB;IACvB,EAAE;IACF,2GAA2G;IAC3G,6HAA6H;IAC7H,2FAA2F;IAC3F,EAAE;IACF,2BAA2B;IAC3B,EAAE;IACF,0BAA0B;IAC1B,yBAAyB;IACzB,wKAAwK;IACxK,iJAAiJ;IACjJ,oHAAoH;IACpH,qLAAqL;IACrL,yIAAyI;IACzI,0HAA0H;IAC1H,kHAAkH;IAClH,EAAE;IACF,yBAAyB;IACzB,EAAE;IACF,8GAA8G;IAC9G,sCAAsC;IACtC,+CAA+C;IAC/C,wFAAwF;IACxF,iEAAiE;IACjE,EAAE;IACF,cAAc;IACd,gEAAgE;IAChE,uDAAuD;IACvD,oDAAoD;IACpD,EAAE;IACF,6BAA6B;IAC7B,iEAAiE;IACjE,uCAAuC;IACvC,0DAA0D;IAC1D,EAAE;IAEF,2DAA2D;IAC3D,2BAA2B;IAC3B,+BAA+B;IAC/B,EAAE;IACF,6HAA6H;IAC7H,EAAE;IACF,qCAAqC;IACrC,oCAAoC;IACpC,mFAAmF;IACnF,wFAAwF;IACxF,yEAAyE;IACzE,iFAAiF;IACjF,6DAA6D;IAC7D,6EAA6E;IAC7E,EAAE;IACF,2HAA2H;IAC3H,EAAE;IAEF,4DAA4D;IAC5D,yBAAyB;IACzB,+BAA+B;IAC/B,EAAE;IACF,wFAAwF;IACxF,iFAAiF;IACjF,EAAE;IAEF,0DAA0D;IAC1D,kBAAkB;IAClB,+BAA+B;IAC/B,EAAE;IACF,wJAAwJ;IACxJ,EAAE;IACF,kOAAkO;IAClO,EAAE;IACF,2BAA2B;IAC3B,EAAE;IACF,4CAA4C;IAC5C,2CAA2C;IAC3C,oJAAoJ;IACpJ,wJAAwJ;IACxJ,wIAAwI;IACxI,kJAAkJ;IAClJ,kHAAkH;IAClH,4HAA4H;IAC5H,0IAA0I;IAC1I,sJAAsJ;IACtJ,mIAAmI;IACnI,oHAAoH;IACpH,EAAE;IACF,oBAAoB;IACpB,EAAE;IACF,mHAAmH;IACnH,EAAE;IACF,qIAAqI;IACrI,EAAE;IAEF,6DAA6D;IAC7D,yCAAyC;IACzC,8BAA8B;IAC9B,EAAE;IACF,iLAAiL;IACjL,EAAE;IACF,gDAAgD;IAChD,EAAE;IACF,wBAAwB;IACxB,0IAA0I;IAC1I,6EAA6E;IAC7E,4FAA4F;IAC5F,iFAAiF;IACjF,wEAAwE;IACxE,4DAA4D;IAC5D,4EAA4E;IAC5E,gFAAgF;IAChF,qHAAqH;IACrH,EAAE;IACF,4BAA4B;IAC5B,EAAE;IACF,0GAA0G;IAC1G,wEAAwE;IACxE,+EAA+E;IAC/E,EAAE;IACF,2BAA2B;IAC3B,EAAE;IACF,0KAA0K;IAC1K,qFAAqF;IACrF,kDAAkD;IAClD,qFAAqF;IACrF,8EAA8E;IAC9E,EAAE;IACF,2CAA2C;IAC3C,oHAAoH;IACpH,EAAE;IACF,gKAAgK;IAChK,4HAA4H;IAC5H,qHAAqH;IACrH,uHAAuH;IACvH,EAAE;IACF,QAAQ;IACR,oEAAoE;IACpE,gGAAgG;IAChG,gEAAgE;IAChE,8FAA8F;IAC9F,0EAA0E;IAC1E,EAAE;IACF,qCAAqC;IACrC,EAAE;IACF,+EAA+E;IAC/E,iDAAiD;IACjD,+CAA+C;IAC/C,gDAAgD;IAChD,2DAA2D;IAC3D,EAAE;IAEF,4DAA4D;IAC5D,sBAAsB;IACtB,yBAAyB;IACzB,EAAE;IACF,4BAA4B;IAC5B,EAAE;IACF,qKAAqK;IACrK,uJAAuJ;IACvJ,yGAAyG;IACzG,EAAE;IACF,wBAAwB;IACxB,EAAE;IACF,yEAAyE;IACzE,gEAAgE;IAChE,EAAE;IACF,sBAAsB;IACtB,EAAE;IACF,4HAA4H;IAC5H,EAAE;IACF,wJAAwJ;IACxJ,0IAA0I;IAC1I,EAAE;IACF,uJAAuJ;IACvJ,EAAE;IACF,sBAAsB;IACtB,sBAAsB;IACtB,sEAAsE;IACtE,yFAAyF;IACzF,sFAAsF;IACtF,EAAE;IAEF,0DAA0D;IAC1D,8BAA8B;IAC9B,iCAAiC;IACjC,EAAE;IACF,8FAA8F;IAC9F,EAAE;IACF,0BAA0B;IAC1B,EAAE;IACF,SAAS;IACT,uDAAuD;IACvD,4BAA4B;IAC5B,EAAE;IACF,qCAAqC;IACrC,aAAa;IACb,sEAAsE;IACtE,KAAK;IACL,EAAE;IACF,iGAAiG;IACjG,gRAAgR;IAChR,EAAE;IACF,yBAAyB;IACzB,EAAE;IACF,sIAAsI;IACtI,EAAE;IACF,SAAS;IACT,sDAAsD;IACtD,oDAAoD;IACpD,KAAK;IACL,EAAE;IACF,qFAAqF;IACrF,EAAE;IACF,qBAAqB;IACrB,EAAE;IACF,8BAA8B;IAC9B,8BAA8B;IAC9B,yEAAyE;IACzE,yFAAyF;IACzF,4CAA4C;IAC5C,gFAAgF;IAChF,EAAE;IACF,kCAAkC;IAClC,EAAE;IACF,oEAAoE;IACpE,EAAE;IACF,SAAS;IACT,0DAA0D;IAC1D,mCAAmC;IACnC,KAAK;IACL,EAAE;IACF,kCAAkC;IAClC,EAAE;IACF,wBAAwB;IACxB,wBAAwB;IACxB,uGAAuG;IACvG,6GAA6G;IAC7G,0GAA0G;IAC1G,wGAAwG;IACxG,oGAAoG;IACpG,EAAE;IACF,iCAAiC;IACjC,EAAE;IACF,+HAA+H;IAC/H,EAAE;IACF,mBAAmB;IACnB,mBAAmB;IACnB,gEAAgE;IAChE,2EAA2E;IAC3E,mFAAmF;IACnF,6EAA6E;IAC7E,EAAE;IACF,oDAAoD;IACpD,EAAE;IACF,2CAA2C;IAC3C,oGAAoG;IACpG,wEAAwE;IACxE,mHAAmH;IACnH,+CAA+C;IAC/C,2CAA2C;IAC3C,sCAAsC;IACtC,EAAE;IACF,wOAAwO;IACxO,EAAE;IACF,0PAA0P;IAC1P,EAAE;IACF,yBAAyB;IACzB,EAAE;IACF,iBAAiB;IACjB,gFAAgF;IAChF,oDAAoD;IACpD,EAAE;IAEF,2DAA2D;IAC3D,eAAe;IACf,qBAAqB;IACrB,EAAE;IACF,mJAAmJ;IACnJ,EAAE;IACF,qBAAqB;IACrB,EAAE;IACF,4BAA4B;IAC5B,2BAA2B;IAC3B,uFAAuF;IACvF,gGAAgG;IAChG,kHAAkH;IAClH,kFAAkF;IAClF,mEAAmE;IACnE,8DAA8D;IAC9D,+DAA+D;IAC/D,EAAE;IACF,WAAW;IACX,EAAE;IACF,4BAA4B;IAC5B,2BAA2B;IAC3B,8EAA8E;IAC9E,4FAA4F;IAC5F,mFAAmF;IACnF,EAAE;IACF,uBAAuB;IACvB,EAAE;IACF,4BAA4B;IAC5B,2BAA2B;IAC3B,8FAA8F;IAC9F,kFAAkF;IAClF,kFAAkF;IAClF,qDAAqD;IACrD,sEAAsE;IACtE,2EAA2E;IAC3E,+DAA+D;IAC/D,EAAE;IACF,gBAAgB;IAChB,EAAE;IACF,4BAA4B;IAC5B,2BAA2B;IAC3B,4DAA4D;IAC5D,uEAAuE;IACvE,+EAA+E;IAC/E,mEAAmE;IACnE,EAAE;IACF,oBAAoB;IACpB,EAAE;IACF,6QAA6Q;IAC7Q,EAAE;IACF,0EAA0E;IAC1E,EAAE;IACF,4BAA4B;IAC5B,2BAA2B;IAC3B,4EAA4E;IAC5E,uFAAuF;IACvF,4DAA4D;IAC5D,uDAAuD;IACvD,2DAA2D;IAC3D,EAAE;IACF,0BAA0B;IAC1B,EAAE;IACF,4BAA4B;IAC5B,2BAA2B;IAC3B,kGAAkG;IAClG,wDAAwD;IACxD,0EAA0E;IAC1E,+DAA+D;IAC/D,8FAA8F;IAC9F,mEAAmE;IACnE,EAAE;IACF,kCAAkC;IAClC,EAAE;IACF,2BAA2B;IAC3B,2BAA2B;IAC3B,4FAA4F;IAC5F,6FAA6F;IAC7F,oFAAoF;IACpF,wCAAwC;IACxC,wEAAwE;IACxE,EAAE;IAEF,+DAA+D;IAC/D,wBAAwB;IACxB,qCAAqC;IACrC,EAAE;IACF,6EAA6E;IAC7E,EAAE;IACF,qGAAqG;IACrG,4KAA4K;IAC5K,sHAAsH;IACtH,EAAE;IACF,yBAAyB;IACzB,EAAE;IACF,qBAAqB;IACrB,qBAAqB;IACrB,qEAAqE;IACrE,6DAA6D;IAC7D,6CAA6C;IAC7C,iEAAiE;IACjE,2CAA2C;IAC3C,4DAA4D;IAC5D,0DAA0D;IAC1D,2DAA2D;IAC3D,oDAAoD;IACpD,kDAAkD;IAClD,+CAA+C;IAC/C,EAAE;IACF,8BAA8B;IAC9B,EAAE;IACF,8DAA8D;IAC9D,oCAAoC;IACpC,qDAAqD;IACrD,EAAE;IAEF,8DAA8D;IAC9D,sBAAsB;IACtB,mCAAmC;IACnC,EAAE;IACF,0JAA0J;IAC1J,EAAE;IACF,kBAAkB;IAClB,EAAE;IACF,uEAAuE;IACvE,gFAAgF;IAChF,0DAA0D;IAC1D,iFAAiF;IACjF,EAAE;IACF,mBAAmB;IACnB,EAAE;IACF,wEAAwE;IACxE,0EAA0E;IAC1E,+EAA+E;IAC/E,0FAA0F;IAC1F,uGAAuG;IACvG,EAAE;IAEF,8DAA8D;IAC9D,0BAA0B;IAC1B,uCAAuC;IACvC,EAAE;IACF,mEAAmE;IACnE,EAAE;IACF,cAAc;IACd,EAAE;IACF,mDAAmD;IACnD,wEAAwE;IACxE,0DAA0D;IAC1D,EAAE;IACF,mBAAmB;IACnB,EAAE;IACF,uEAAuE;IACvE,uDAAuD;IACvD,yDAAyD;IACzD,6NAA6N;IAC7N,EAAE;IACF,WAAW;IACX,EAAE;IACF,mDAAmD;IACnD,iEAAiE;IACjE,0DAA0D;IAC1D,EAAE;IAEF,6DAA6D;IAC7D,4CAA4C;IAC5C,mCAAmC;IACnC,EAAE;IACF,oIAAoI;IACpI,EAAE;IACF,iBAAiB;IACjB,EAAE;IACF,kDAAkD;IAClD,iDAAiD;IACjD,6KAA6K;IAC7K,4NAA4N;IAC5N,EAAE;IACF,mBAAmB;IACnB,EAAE;IACF,uBAAuB;IACvB,sBAAsB;IACtB,qFAAqF;IACrF,oEAAoE;IACpE,0EAA0E;IAC1E,4EAA4E;IAC5E,8EAA8E;IAC9E,EAAE;IACF,eAAe;IACf,EAAE;IACF,uMAAuM;IACvM,iNAAiN;IACjN,6OAA6O;IAC7O,sOAAsO;IACtO,kLAAkL;IAClL,+GAA+G;IAC/G,EAAE;IACF,sBAAsB;IACtB,EAAE;IACF,wBAAwB;IACxB,KAAK;IACL,oCAAoC;IACpC,EAAE;IACF,+CAA+C;IAC/C,iDAAiD;IACjD,KAAK;IACL,EAAE;IACF,gDAAgD;IAChD,KAAK;IACL,2CAA2C;IAC3C,2CAA2C;IAC3C,oDAAoD;IACpD,KAAK;IACL,EAAE;IACF,yEAAyE;IACzE,EAAE;IACF,oBAAoB;IACpB,EAAE;IACF,8EAA8E;IAC9E,sFAAsF;IACtF,+CAA+C;IAC/C,EAAE;IAEF,SAAS,aAAa,MAAM;CAC7B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soleri/forge",
3
- "version": "9.7.2",
3
+ "version": "9.9.0",
4
4
  "description": "Scaffold AI agents that learn, remember, and grow with you.",
5
5
  "keywords": [
6
6
  "agent",
@@ -0,0 +1,140 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { mkdirSync, rmSync, writeFileSync, readFileSync, existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { stringify as stringifyYaml, parse as parseYaml } from 'yaml';
6
+ import { addDomain } from '../domain-manager.js';
7
+
8
+ describe('addDomain — file-tree agents', () => {
9
+ let tempDir: string;
10
+ let agentDir: string;
11
+
12
+ beforeEach(() => {
13
+ tempDir = join(
14
+ tmpdir(),
15
+ `domain-manager-test-${Date.now()}-${Math.random().toString(36).slice(2)}`,
16
+ );
17
+ agentDir = join(tempDir, 'my-agent');
18
+ mkdirSync(agentDir, { recursive: true });
19
+ });
20
+
21
+ afterEach(() => {
22
+ rmSync(tempDir, { recursive: true, force: true });
23
+ });
24
+
25
+ function createFileTreeAgent(opts: { domains?: string[] } = {}): void {
26
+ const yaml = {
27
+ id: 'test-agent',
28
+ name: 'Test Agent',
29
+ role: 'A test agent',
30
+ domains: opts.domains ?? [],
31
+ };
32
+ writeFileSync(join(agentDir, 'agent.yaml'), stringifyYaml(yaml), 'utf-8');
33
+ }
34
+
35
+ it('creates knowledge/{domain}.json with empty bundle', async () => {
36
+ createFileTreeAgent();
37
+
38
+ const result = await addDomain({
39
+ agentPath: agentDir,
40
+ domain: 'security',
41
+ format: 'filetree',
42
+ });
43
+
44
+ expect(result.success).toBe(true);
45
+ expect(result.domain).toBe('security');
46
+ expect(result.agentId).toBe('test-agent');
47
+
48
+ const bundlePath = join(agentDir, 'knowledge', 'security.json');
49
+ expect(existsSync(bundlePath)).toBe(true);
50
+
51
+ const bundle = JSON.parse(readFileSync(bundlePath, 'utf-8'));
52
+ expect(bundle).toEqual({ domain: 'security', entries: [] });
53
+ });
54
+
55
+ it('updates agent.yaml domains array', async () => {
56
+ createFileTreeAgent({ domains: ['existing'] });
57
+
58
+ const result = await addDomain({
59
+ agentPath: agentDir,
60
+ domain: 'security',
61
+ format: 'filetree',
62
+ });
63
+
64
+ expect(result.success).toBe(true);
65
+
66
+ const yaml = parseYaml(readFileSync(join(agentDir, 'agent.yaml'), 'utf-8')) as Record<
67
+ string,
68
+ unknown
69
+ >;
70
+ expect(yaml.domains).toEqual(['existing', 'security']);
71
+ });
72
+
73
+ it('does NOT require package.json', async () => {
74
+ createFileTreeAgent();
75
+ // Explicitly verify no package.json exists
76
+ expect(existsSync(join(agentDir, 'package.json'))).toBe(false);
77
+
78
+ const result = await addDomain({
79
+ agentPath: agentDir,
80
+ domain: 'security',
81
+ format: 'filetree',
82
+ });
83
+
84
+ expect(result.success).toBe(true);
85
+ expect(result.facadeGenerated).toBe(false);
86
+ expect(result.buildOutput).toBe('');
87
+ });
88
+
89
+ it('rejects duplicate domain', async () => {
90
+ createFileTreeAgent({ domains: ['security'] });
91
+
92
+ const result = await addDomain({
93
+ agentPath: agentDir,
94
+ domain: 'security',
95
+ format: 'filetree',
96
+ });
97
+
98
+ expect(result.success).toBe(false);
99
+ expect(result.warnings[0]).toContain('already exists');
100
+ });
101
+
102
+ it('rejects invalid domain name', async () => {
103
+ createFileTreeAgent();
104
+
105
+ const result = await addDomain({
106
+ agentPath: agentDir,
107
+ domain: 'Invalid-Name',
108
+ format: 'filetree',
109
+ });
110
+
111
+ expect(result.success).toBe(false);
112
+ expect(result.warnings[0]).toContain('kebab-case');
113
+ });
114
+
115
+ it('fails when agent.yaml is missing', async () => {
116
+ // No agent.yaml created
117
+
118
+ const result = await addDomain({
119
+ agentPath: agentDir,
120
+ domain: 'security',
121
+ format: 'filetree',
122
+ });
123
+
124
+ expect(result.success).toBe(false);
125
+ expect(result.warnings[0]).toContain('No agent.yaml found');
126
+ });
127
+
128
+ it('creates knowledge/ directory if it does not exist', async () => {
129
+ createFileTreeAgent();
130
+ expect(existsSync(join(agentDir, 'knowledge'))).toBe(false);
131
+
132
+ await addDomain({
133
+ agentPath: agentDir,
134
+ domain: 'security',
135
+ format: 'filetree',
136
+ });
137
+
138
+ expect(existsSync(join(agentDir, 'knowledge'))).toBe(true);
139
+ });
140
+ });
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
9
- import { mkdirSync, rmSync, existsSync, readFileSync } from 'node:fs';
9
+ import { mkdirSync, rmSync, existsSync, readFileSync, readdirSync } from 'node:fs';
10
10
  import { join } from 'node:path';
11
11
  import { tmpdir } from 'node:os';
12
12
  import { parse as parseYaml } from 'yaml';
@@ -158,6 +158,50 @@ describe('scaffoldFileTree', () => {
158
158
  expect(existsSync(join(result.agentDir, 'workflows', 'code-review', 'prompt.md'))).toBe(true);
159
159
  });
160
160
 
161
+ it('scaffolded gates.yaml contains schema comment header', () => {
162
+ const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
163
+ expect(result.success).toBe(true);
164
+
165
+ const gatesContent = readFileSync(
166
+ join(result.agentDir, 'workflows', 'feature-dev', 'gates.yaml'),
167
+ 'utf-8',
168
+ );
169
+ expect(gatesContent).toContain(
170
+ '# Workflow gates — engine reads these and enforces them during plan execution.',
171
+ );
172
+ expect(gatesContent).toContain(
173
+ '# Format: phase (brainstorming|pre-execution|post-task|completion), requirement, check',
174
+ );
175
+
176
+ // Verify all workflow gates have the header
177
+ const bugFixGates = readFileSync(
178
+ join(result.agentDir, 'workflows', 'bug-fix', 'gates.yaml'),
179
+ 'utf-8',
180
+ );
181
+ expect(bugFixGates).toContain('# Workflow gates');
182
+ });
183
+
184
+ it('scaffolded tools.yaml contains schema comment header', () => {
185
+ const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
186
+ expect(result.success).toBe(true);
187
+
188
+ const toolsContent = readFileSync(
189
+ join(result.agentDir, 'workflows', 'feature-dev', 'tools.yaml'),
190
+ 'utf-8',
191
+ );
192
+ expect(toolsContent).toContain('# Workflow tools — engine merges these into plan steps.');
193
+ expect(toolsContent).toContain(
194
+ '# Format: list of operation strings (agentId_facade op:operation_name)',
195
+ );
196
+
197
+ // Verify all workflow tools have the header
198
+ const bugFixTools = readFileSync(
199
+ join(result.agentDir, 'workflows', 'bug-fix', 'tools.yaml'),
200
+ 'utf-8',
201
+ );
202
+ expect(bugFixTools).toContain('# Workflow tools');
203
+ });
204
+
161
205
  it('generates knowledge bundles per domain', () => {
162
206
  const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
163
207
  expect(result.success).toBe(true);
@@ -197,6 +241,31 @@ describe('scaffoldFileTree', () => {
197
241
  expect(gitignore).toContain('_engine.md');
198
242
  });
199
243
 
244
+ it('generates conventions.md example instruction file', () => {
245
+ const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
246
+ expect(result.success).toBe(true);
247
+
248
+ const content = readFileSync(join(result.agentDir, 'instructions', 'conventions.md'), 'utf-8');
249
+ expect(content).toContain('# Conventions');
250
+ expect(content).toContain('Naming Conventions');
251
+ expect(content).toContain('What to Avoid');
252
+ expect(content).toContain('kebab-case');
253
+ });
254
+
255
+ it('generates getting-started.md example instruction file', () => {
256
+ const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
257
+ expect(result.success).toBe(true);
258
+
259
+ const content = readFileSync(
260
+ join(result.agentDir, 'instructions', 'getting-started.md'),
261
+ 'utf-8',
262
+ );
263
+ expect(content).toContain('Getting Started with Instructions');
264
+ expect(content).toContain('_engine.md');
265
+ expect(content).toContain('soleri dev');
266
+ expect(content).toContain('alphabetical order');
267
+ });
268
+
200
269
  it('fails if directory already exists', () => {
201
270
  scaffoldFileTree(MINIMAL_CONFIG, tempDir);
202
271
  const result2 = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
@@ -252,4 +321,260 @@ describe('scaffoldFileTree', () => {
252
321
  expect(result.success).toBe(true);
253
322
  expect(result.summary).toContain('No build step needed');
254
323
  });
324
+
325
+ it('generates user.md with placeholder content', () => {
326
+ const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
327
+ expect(result.success).toBe(true);
328
+
329
+ const userMdPath = join(result.agentDir, 'instructions', 'user.md');
330
+ expect(existsSync(userMdPath)).toBe(true);
331
+
332
+ const content = readFileSync(userMdPath, 'utf-8');
333
+ expect(content).toContain('# Your Custom Rules');
334
+ expect(content).toContain('priority placement in CLAUDE.md');
335
+ expect(content).toContain('Delete these instructions and replace with your own content.');
336
+ });
337
+
338
+ it('includes user.md in filesCreated', () => {
339
+ const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
340
+ expect(result.success).toBe(true);
341
+ expect(result.filesCreated).toContain('instructions/user.md');
342
+ });
343
+
344
+ it('places user.md content before engine rules ref in CLAUDE.md', () => {
345
+ const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
346
+ expect(result.success).toBe(true);
347
+
348
+ const claudeMd = readFileSync(join(result.agentDir, 'CLAUDE.md'), 'utf-8');
349
+ const userPos = claudeMd.indexOf('# Your Custom Rules');
350
+ const enginePos = claudeMd.indexOf('soleri:engine-rules-ref');
351
+
352
+ expect(userPos).toBeGreaterThan(-1);
353
+ expect(enginePos).toBeGreaterThan(-1);
354
+ expect(userPos).toBeLessThan(enginePos);
355
+ });
356
+
357
+ it('does not duplicate user.md in the alphabetical instructions section', () => {
358
+ const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
359
+ expect(result.success).toBe(true);
360
+
361
+ const claudeMd = readFileSync(join(result.agentDir, 'CLAUDE.md'), 'utf-8');
362
+ // user.md content should appear exactly once
363
+ const matches = claudeMd.match(/# Your Custom Rules/g);
364
+ expect(matches).toHaveLength(1);
365
+ });
366
+
367
+ // ─── Skills Filter Tests ─────────────────────────────────────
368
+
369
+ it('default scaffold creates only essential skills (~7)', () => {
370
+ const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
371
+ expect(result.success).toBe(true);
372
+
373
+ const skillDirs = readdirSync(join(result.agentDir, 'skills'), { withFileTypes: true })
374
+ .filter((d) => d.isDirectory())
375
+ .map((d) => d.name);
376
+
377
+ // Should have ~7 essential skills, not 30+
378
+ expect(skillDirs.length).toBeGreaterThanOrEqual(5);
379
+ expect(skillDirs.length).toBeLessThanOrEqual(10);
380
+
381
+ // Essential skills should be present
382
+ expect(skillDirs).toContain('agent-guide');
383
+ expect(skillDirs).toContain('vault-navigator');
384
+ expect(skillDirs).toContain('vault-capture');
385
+ expect(skillDirs).toContain('systematic-debugging');
386
+ expect(skillDirs).toContain('writing-plans');
387
+ expect(skillDirs).toContain('context-resume');
388
+ expect(skillDirs).toContain('agent-persona');
389
+
390
+ // Optional skills should NOT be present
391
+ expect(skillDirs).not.toContain('brainstorming');
392
+ expect(skillDirs).not.toContain('deep-review');
393
+ expect(skillDirs).not.toContain('code-patrol');
394
+ expect(skillDirs).not.toContain('yolo-mode');
395
+ });
396
+
397
+ it('skillsFilter: "all" creates all skills', () => {
398
+ const result = scaffoldFileTree(
399
+ { ...MINIMAL_CONFIG, id: 'all-skills', skillsFilter: 'all' },
400
+ tempDir,
401
+ );
402
+ expect(result.success).toBe(true);
403
+
404
+ const skillDirs = readdirSync(join(result.agentDir, 'skills'), { withFileTypes: true })
405
+ .filter((d) => d.isDirectory())
406
+ .map((d) => d.name);
407
+
408
+ // Should have all 30+ skills
409
+ expect(skillDirs.length).toBeGreaterThanOrEqual(25);
410
+ expect(skillDirs).toContain('brainstorming');
411
+ expect(skillDirs).toContain('deep-review');
412
+ expect(skillDirs).toContain('yolo-mode');
413
+ });
414
+
415
+ it('skillsFilter: explicit array creates exactly those skills', () => {
416
+ const result = scaffoldFileTree(
417
+ { ...MINIMAL_CONFIG, id: 'custom-skills', skillsFilter: ['vault-navigator', 'agent-guide'] },
418
+ tempDir,
419
+ );
420
+ expect(result.success).toBe(true);
421
+
422
+ const skillDirs = readdirSync(join(result.agentDir, 'skills'), { withFileTypes: true })
423
+ .filter((d) => d.isDirectory())
424
+ .map((d) => d.name);
425
+
426
+ expect(skillDirs).toEqual(['agent-guide', 'vault-navigator']);
427
+ });
428
+
429
+ it('CLAUDE.md only lists on-disk skills', () => {
430
+ // Default scaffold = essential only
431
+ const result = scaffoldFileTree({ ...MINIMAL_CONFIG, id: 'claude-md-skills' }, tempDir);
432
+ expect(result.success).toBe(true);
433
+
434
+ const claudeMd = readFileSync(join(result.agentDir, 'CLAUDE.md'), 'utf-8');
435
+
436
+ // Essential skills should appear
437
+ expect(claudeMd).toContain('vault-navigator');
438
+ expect(claudeMd).toContain('agent-guide');
439
+
440
+ // Optional skills should NOT appear (not on disk)
441
+ expect(claudeMd).not.toContain('brainstorming');
442
+ expect(claudeMd).not.toContain('yolo-mode');
443
+ });
444
+
445
+ it('skillsFilter default (essential) is not written to agent.yaml', () => {
446
+ const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
447
+ expect(result.success).toBe(true);
448
+
449
+ const content = readFileSync(join(result.agentDir, 'agent.yaml'), 'utf-8');
450
+ expect(content).not.toContain('skillsFilter');
451
+ });
452
+
453
+ it('skillsFilter: "all" IS written to agent.yaml', () => {
454
+ const result = scaffoldFileTree(
455
+ { ...MINIMAL_CONFIG, id: 'written-filter', skillsFilter: 'all' },
456
+ tempDir,
457
+ );
458
+ expect(result.success).toBe(true);
459
+
460
+ const content = readFileSync(join(result.agentDir, 'agent.yaml'), 'utf-8');
461
+ const parsed = parseYaml(content);
462
+ expect(parsed.skillsFilter).toBe('all');
463
+ });
464
+
465
+ // ─── Workspace & Routing Tests ─────────────────────────────
466
+
467
+ it('creates workspace directories with CONTEXT.md when workspaces defined', () => {
468
+ const result = scaffoldFileTree(
469
+ {
470
+ ...MINIMAL_CONFIG,
471
+ workspaces: [
472
+ { id: 'design', name: 'Design', description: 'Design workspace' },
473
+ { id: 'review', name: 'Review', description: 'Review workspace' },
474
+ ],
475
+ },
476
+ tempDir,
477
+ );
478
+ expect(result.success).toBe(true);
479
+
480
+ // Workspace directories and CONTEXT.md files exist
481
+ expect(existsSync(join(result.agentDir, 'workspaces', 'design', 'CONTEXT.md'))).toBe(true);
482
+ expect(existsSync(join(result.agentDir, 'workspaces', 'review', 'CONTEXT.md'))).toBe(true);
483
+
484
+ // CONTEXT.md contains workspace name and description
485
+ const content = readFileSync(
486
+ join(result.agentDir, 'workspaces', 'design', 'CONTEXT.md'),
487
+ 'utf-8',
488
+ );
489
+ expect(content).toContain('# Design');
490
+ expect(content).toContain('Design workspace');
491
+ });
492
+
493
+ it('seeds default workspaces from domains when no explicit workspaces', () => {
494
+ const result = scaffoldFileTree(
495
+ {
496
+ ...MINIMAL_CONFIG,
497
+ domains: ['architecture'],
498
+ },
499
+ tempDir,
500
+ );
501
+ expect(result.success).toBe(true);
502
+
503
+ // Architecture domain seeds planning, src, docs workspaces
504
+ expect(existsSync(join(result.agentDir, 'workspaces', 'planning', 'CONTEXT.md'))).toBe(true);
505
+ expect(existsSync(join(result.agentDir, 'workspaces', 'src', 'CONTEXT.md'))).toBe(true);
506
+ expect(existsSync(join(result.agentDir, 'workspaces', 'docs', 'CONTEXT.md'))).toBe(true);
507
+ });
508
+
509
+ it('includes routing entries in agent.yaml', () => {
510
+ const result = scaffoldFileTree(
511
+ {
512
+ ...MINIMAL_CONFIG,
513
+ workspaces: [{ id: 'src', name: 'Source', description: 'Source code' }],
514
+ routing: [{ pattern: 'implement feature', workspace: 'src', skills: ['tdd'] }],
515
+ },
516
+ tempDir,
517
+ );
518
+ expect(result.success).toBe(true);
519
+
520
+ const content = readFileSync(join(result.agentDir, 'agent.yaml'), 'utf-8');
521
+ const parsed = parseYaml(content);
522
+
523
+ expect(parsed.workspaces).toHaveLength(1);
524
+ expect(parsed.workspaces[0].id).toBe('src');
525
+ expect(parsed.routing).toHaveLength(1);
526
+ expect(parsed.routing[0].pattern).toBe('implement feature');
527
+ expect(parsed.routing[0].workspace).toBe('src');
528
+ expect(parsed.routing[0].skills).toEqual(['tdd']);
529
+ });
530
+
531
+ it('creates no workspaces directory when no workspaces and no matching domains', () => {
532
+ const result = scaffoldFileTree(
533
+ {
534
+ ...MINIMAL_CONFIG,
535
+ domains: ['testing', 'quality'], // no workspace seeds for these
536
+ },
537
+ tempDir,
538
+ );
539
+ expect(result.success).toBe(true);
540
+
541
+ // No workspaces directory
542
+ expect(existsSync(join(result.agentDir, 'workspaces'))).toBe(false);
543
+ });
544
+
545
+ it('includes workspaces and routing sections in CLAUDE.md when defined', () => {
546
+ const result = scaffoldFileTree(
547
+ {
548
+ ...MINIMAL_CONFIG,
549
+ workspaces: [{ id: 'design', name: 'Design', description: 'Design patterns' }],
550
+ routing: [
551
+ { pattern: 'design component', workspace: 'design', skills: ['vault-navigator'] },
552
+ ],
553
+ },
554
+ tempDir,
555
+ );
556
+ expect(result.success).toBe(true);
557
+
558
+ const claudeMd = readFileSync(join(result.agentDir, 'CLAUDE.md'), 'utf-8');
559
+ expect(claudeMd).toContain('## Workspaces');
560
+ expect(claudeMd).toContain('Design patterns');
561
+ expect(claudeMd).toContain('## Task Routing');
562
+ expect(claudeMd).toContain('design component');
563
+ });
564
+
565
+ it('omits workspaces and routing sections from CLAUDE.md when not defined', () => {
566
+ // Use domains with no workspace seeds
567
+ const result = scaffoldFileTree(
568
+ {
569
+ ...MINIMAL_CONFIG,
570
+ domains: ['testing', 'quality'],
571
+ },
572
+ tempDir,
573
+ );
574
+ expect(result.success).toBe(true);
575
+
576
+ const claudeMd = readFileSync(join(result.agentDir, 'CLAUDE.md'), 'utf-8');
577
+ expect(claudeMd).not.toContain('## Workspaces');
578
+ expect(claudeMd).not.toContain('## Task Routing');
579
+ });
255
580
  });
@@ -212,9 +212,11 @@ describe('Scaffolder', () => {
212
212
  expect(setup).toContain('AGENT_NAME="atlas"');
213
213
  expect(setup).toContain('#!/usr/bin/env bash');
214
214
 
215
- const stats = statSync(setupPath);
216
- const isExecutable = (stats.mode & 0o111) !== 0;
217
- expect(isExecutable).toBe(true);
215
+ if (process.platform !== 'win32') {
216
+ const stats = statSync(setupPath);
217
+ const isExecutable = (stats.mode & 0o111) !== 0;
218
+ expect(isExecutable).toBe(true);
219
+ }
218
220
  });
219
221
 
220
222
  it('should generate facade tests using runtime factories', () => {
@@ -297,7 +299,7 @@ describe('Scaffolder', () => {
297
299
 
298
300
  for (const dir of skillDirs) {
299
301
  const content = readFileSync(join(skillsDir, dir, 'SKILL.md'), 'utf-8');
300
- expect(content).toMatch(/^---\nname: /);
302
+ expect(content).toMatch(/^---\r?\nname: /);
301
303
  expect(content).toContain('description:');
302
304
  }
303
305
  });
@@ -326,7 +328,7 @@ describe('Scaffolder', () => {
326
328
  const skillPath = join(skillsDir, name, 'SKILL.md');
327
329
  if (existsSync(skillPath)) {
328
330
  const content = readFileSync(skillPath, 'utf-8');
329
- expect(content).toMatch(/^---\nname: /);
331
+ expect(content).toMatch(/^---\r?\nname: /);
330
332
  }
331
333
  }
332
334
  });
@@ -0,0 +1,48 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { getEngineRulesContent, getEngineMarker } from '../templates/shared-rules.js';
3
+
4
+ describe('shared-rules', () => {
5
+ const content = getEngineRulesContent();
6
+
7
+ it('includes the engine marker', () => {
8
+ expect(content).toContain(`<!-- ${getEngineMarker()} -->`);
9
+ });
10
+
11
+ describe('Reconciliation Triggers', () => {
12
+ it('includes the Reconciliation Triggers section', () => {
13
+ expect(content).toContain('### Reconciliation Triggers');
14
+ });
15
+
16
+ it('includes the explicit trigger (user says "done")', () => {
17
+ expect(content).toContain('**Explicit**');
18
+ expect(content).toMatch(/User says.*done.*ship it.*looks good/);
19
+ });
20
+
21
+ it('includes the plan-complete trigger', () => {
22
+ expect(content).toContain('**Plan-complete**');
23
+ expect(content).toContain(
24
+ 'All tasks are complete. Want me to wrap up and capture what we learned, or is there more to fix?',
25
+ );
26
+ });
27
+
28
+ it('includes the idle trigger', () => {
29
+ expect(content).toContain('**Idle**');
30
+ expect(content).toContain(
31
+ "We've been idle on this plan. Ready to wrap up, or still working?",
32
+ );
33
+ });
34
+
35
+ it('includes the NEVER auto-complete rule', () => {
36
+ expect(content).toContain('**NEVER auto-complete without asking the user.**');
37
+ });
38
+
39
+ it('references orchestrate_status readiness field', () => {
40
+ expect(content).toContain('op:orchestrate_status');
41
+ expect(content).toContain('allTasksTerminal');
42
+ });
43
+ });
44
+
45
+ it('describes orchestrate_complete as user-gated in the Non-Negotiable Rule', () => {
46
+ expect(content).toContain('user-gated');
47
+ });
48
+ });