@warpgogol/forge 0.3.1 → 0.5.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 (180) hide show
  1. package/AGENTS.md +152 -5
  2. package/dist/bin/cli.js +4 -5
  3. package/dist/bin/cli.js.map +1 -1
  4. package/dist/os/adr/adr.module.d.ts.map +1 -1
  5. package/dist/os/adr/adr.module.js +4 -2
  6. package/dist/os/adr/adr.module.js.map +1 -1
  7. package/dist/os/adr/handlers/validate.d.ts.map +1 -1
  8. package/dist/os/adr/handlers/validate.js +32 -4
  9. package/dist/os/adr/handlers/validate.js.map +1 -1
  10. package/dist/os/compass/compass.module.d.ts.map +1 -1
  11. package/dist/os/compass/compass.module.js +4 -0
  12. package/dist/os/compass/compass.module.js.map +1 -1
  13. package/dist/os/compass/handlers/resolve-scan-root.d.ts.map +1 -1
  14. package/dist/os/compass/handlers/resolve-scan-root.js +16 -0
  15. package/dist/os/compass/handlers/resolve-scan-root.js.map +1 -1
  16. package/dist/os/core/core.module.d.ts.map +1 -1
  17. package/dist/os/core/core.module.js +82 -3
  18. package/dist/os/core/core.module.js.map +1 -1
  19. package/dist/os/core/handlers/knowledge-compact.d.ts +4 -0
  20. package/dist/os/core/handlers/knowledge-compact.d.ts.map +1 -0
  21. package/dist/os/core/handlers/knowledge-compact.js +198 -0
  22. package/dist/os/core/handlers/knowledge-compact.js.map +1 -0
  23. package/dist/os/rfc/handlers/implement-stamp.d.ts.map +1 -1
  24. package/dist/os/rfc/handlers/implement-stamp.js +10 -6
  25. package/dist/os/rfc/handlers/implement-stamp.js.map +1 -1
  26. package/dist/os/rfc/handlers/index-graph.js +2 -2
  27. package/dist/os/rfc/handlers/index-graph.js.map +1 -1
  28. package/dist/os/rfc/handlers/lifecycle.d.ts.map +1 -1
  29. package/dist/os/rfc/handlers/lifecycle.js +4 -5
  30. package/dist/os/rfc/handlers/lifecycle.js.map +1 -1
  31. package/dist/os/rfc/handlers/pipeline-status.js +1 -1
  32. package/dist/os/rfc/handlers/pipeline-status.js.map +1 -1
  33. package/dist/os/rfc/handlers/validate-rules.d.ts.map +1 -1
  34. package/dist/os/rfc/handlers/validate-rules.js +41 -3
  35. package/dist/os/rfc/handlers/validate-rules.js.map +1 -1
  36. package/dist/os/rfc/handlers/validate.js +1 -1
  37. package/dist/os/rfc/handlers/validate.js.map +1 -1
  38. package/dist/os/rfc/rfc.module.d.ts.map +1 -1
  39. package/dist/os/rfc/rfc.module.js +15 -10
  40. package/dist/os/rfc/rfc.module.js.map +1 -1
  41. package/dist/os/session/handlers/validate.js +1 -1
  42. package/dist/os/session/handlers/validate.js.map +1 -1
  43. package/dist/os/session/session.module.d.ts.map +1 -1
  44. package/dist/os/session/session.module.js +4 -2
  45. package/dist/os/session/session.module.js.map +1 -1
  46. package/dist/os/spec/spec-schema.d.ts +1 -1
  47. package/dist/os/werkstatt/handlers/lock.d.ts.map +1 -1
  48. package/dist/os/werkstatt/handlers/lock.js +27 -1
  49. package/dist/os/werkstatt/handlers/lock.js.map +1 -1
  50. package/dist/os/werkstatt/handlers/schema.d.ts +1 -0
  51. package/dist/os/werkstatt/handlers/schema.d.ts.map +1 -1
  52. package/dist/os/werkstatt/handlers/schema.js +1 -0
  53. package/dist/os/werkstatt/handlers/schema.js.map +1 -1
  54. package/dist/src/config/forge-config.d.ts +70 -3
  55. package/dist/src/config/forge-config.d.ts.map +1 -1
  56. package/dist/src/config/forge-config.js +91 -4
  57. package/dist/src/config/forge-config.js.map +1 -1
  58. package/dist/src/index.d.ts +3 -1
  59. package/dist/src/index.d.ts.map +1 -1
  60. package/dist/src/index.js +6 -2
  61. package/dist/src/index.js.map +1 -1
  62. package/dist/src/knowledge/budgets.d.ts +38 -0
  63. package/dist/src/knowledge/budgets.d.ts.map +1 -0
  64. package/dist/src/knowledge/budgets.js +157 -0
  65. package/dist/src/knowledge/budgets.js.map +1 -0
  66. package/dist/src/knowledge/compact.d.ts +47 -0
  67. package/dist/src/knowledge/compact.d.ts.map +1 -0
  68. package/dist/src/knowledge/compact.js +322 -0
  69. package/dist/src/knowledge/compact.js.map +1 -0
  70. package/dist/src/knowledge/index.d.ts +7 -0
  71. package/dist/src/knowledge/index.d.ts.map +1 -0
  72. package/dist/src/knowledge/index.js +19 -0
  73. package/dist/src/knowledge/index.js.map +1 -0
  74. package/dist/src/knowledge/parse.d.ts +3 -0
  75. package/dist/src/knowledge/parse.d.ts.map +1 -0
  76. package/dist/src/knowledge/parse.js +205 -0
  77. package/dist/src/knowledge/parse.js.map +1 -0
  78. package/dist/src/knowledge/promote.d.ts +37 -0
  79. package/dist/src/knowledge/promote.d.ts.map +1 -0
  80. package/dist/src/knowledge/promote.js +120 -0
  81. package/dist/src/knowledge/promote.js.map +1 -0
  82. package/dist/src/knowledge/schema.d.ts +61 -0
  83. package/dist/src/knowledge/schema.d.ts.map +1 -0
  84. package/dist/src/knowledge/schema.js +64 -0
  85. package/dist/src/knowledge/schema.js.map +1 -0
  86. package/dist/src/knowledge/serialize.d.ts +3 -0
  87. package/dist/src/knowledge/serialize.d.ts.map +1 -0
  88. package/dist/src/knowledge/serialize.js +67 -0
  89. package/dist/src/knowledge/serialize.js.map +1 -0
  90. package/dist/src/onboarding/agents-generate.d.ts +19 -0
  91. package/dist/src/onboarding/agents-generate.d.ts.map +1 -1
  92. package/dist/src/onboarding/agents-generate.js +156 -66
  93. package/dist/src/onboarding/agents-generate.js.map +1 -1
  94. package/dist/src/onboarding/create.d.ts.map +1 -1
  95. package/dist/src/onboarding/create.js +66 -10
  96. package/dist/src/onboarding/create.js.map +1 -1
  97. package/dist/src/onboarding/doctor.d.ts +13 -1
  98. package/dist/src/onboarding/doctor.d.ts.map +1 -1
  99. package/dist/src/onboarding/doctor.js +613 -7
  100. package/dist/src/onboarding/doctor.js.map +1 -1
  101. package/dist/src/onboarding/init.d.ts +8 -1
  102. package/dist/src/onboarding/init.d.ts.map +1 -1
  103. package/dist/src/onboarding/init.js +33 -2
  104. package/dist/src/onboarding/init.js.map +1 -1
  105. package/dist/src/onboarding/memory-scaffold.d.ts +18 -0
  106. package/dist/src/onboarding/memory-scaffold.d.ts.map +1 -0
  107. package/dist/src/onboarding/memory-scaffold.js +151 -0
  108. package/dist/src/onboarding/memory-scaffold.js.map +1 -0
  109. package/dist/src/onboarding/nested-agents-generate.d.ts +16 -0
  110. package/dist/src/onboarding/nested-agents-generate.d.ts.map +1 -0
  111. package/dist/src/onboarding/nested-agents-generate.js +69 -0
  112. package/dist/src/onboarding/nested-agents-generate.js.map +1 -0
  113. package/dist/src/onboarding/nested-agents-templates.d.ts +26 -0
  114. package/dist/src/onboarding/nested-agents-templates.d.ts.map +1 -0
  115. package/dist/src/onboarding/nested-agents-templates.js +178 -0
  116. package/dist/src/onboarding/nested-agents-templates.js.map +1 -0
  117. package/dist/src/onboarding/profile-validate.d.ts +13 -0
  118. package/dist/src/onboarding/profile-validate.d.ts.map +1 -0
  119. package/dist/src/onboarding/profile-validate.js +109 -0
  120. package/dist/src/onboarding/profile-validate.js.map +1 -0
  121. package/dist/src/onboarding/upgrade.d.ts +6 -0
  122. package/dist/src/onboarding/upgrade.d.ts.map +1 -1
  123. package/dist/src/onboarding/upgrade.js +45 -1
  124. package/dist/src/onboarding/upgrade.js.map +1 -1
  125. package/dist/src/onboarding/workspace-discovery.d.ts +11 -0
  126. package/dist/src/onboarding/workspace-discovery.d.ts.map +1 -0
  127. package/dist/src/onboarding/workspace-discovery.js +138 -0
  128. package/dist/src/onboarding/workspace-discovery.js.map +1 -0
  129. package/dist/src/profiles/profile-schema.d.ts +116 -0
  130. package/dist/src/profiles/profile-schema.d.ts.map +1 -0
  131. package/dist/src/profiles/profile-schema.js +94 -0
  132. package/dist/src/profiles/profile-schema.js.map +1 -0
  133. package/dist/src/profiles/stack-profile.d.ts +41 -1
  134. package/dist/src/profiles/stack-profile.d.ts.map +1 -1
  135. package/dist/src/profiles/stack-profile.js +9 -0
  136. package/dist/src/profiles/stack-profile.js.map +1 -1
  137. package/dist/src/profiles/terminology-utils.d.ts +8 -0
  138. package/dist/src/profiles/terminology-utils.d.ts.map +1 -0
  139. package/dist/src/profiles/terminology-utils.js +31 -0
  140. package/dist/src/profiles/terminology-utils.js.map +1 -0
  141. package/dist/src/types.d.ts +0 -1
  142. package/dist/src/types.d.ts.map +1 -1
  143. package/dist/src/utils/fs-idempotent.d.ts +1 -1
  144. package/dist/src/utils/fs-idempotent.d.ts.map +1 -1
  145. package/dist/src/utils/fs-idempotent.js +12 -3
  146. package/dist/src/utils/fs-idempotent.js.map +1 -1
  147. package/dist/src/validators/skill-validate.d.ts +15 -0
  148. package/dist/src/validators/skill-validate.d.ts.map +1 -1
  149. package/dist/src/validators/skill-validate.js +204 -2
  150. package/dist/src/validators/skill-validate.js.map +1 -1
  151. package/package.json +2 -2
  152. package/profiles/astro-typescript-turborepo.yaml +87 -0
  153. package/profiles/editframe-html-templates/composition-agents.md +34 -0
  154. package/profiles/editframe-html-templates/composition.html +32 -0
  155. package/profiles/editframe-html.yaml +283 -0
  156. package/profiles/forge-shell.yaml +77 -0
  157. package/profiles/phaser-turborepo.yaml +87 -0
  158. package/skills/fo/fo-doc-audit/SKILL.md +6 -6
  159. package/skills/fo/fo-fix/SKILL.md +11 -0
  160. package/skills/fo/fo-handoff/SKILL.md +2 -1
  161. package/skills/fo/fo-idea-implement/SKILL.md +44 -2
  162. package/skills/fo/fo-idea-plan/SKILL.md +1 -0
  163. package/skills/fo/fo-knowledge-distill/SKILL.md +170 -0
  164. package/skills/fo/fo-memory-sync/SKILL.md +6 -3
  165. package/skills/fo/fo-memory-sync/fix-patterns.md +38 -4
  166. package/skills/fo/fo-review/SKILL.md +2 -2
  167. package/skills/fo/fo-session-retro/SKILL.md +21 -11
  168. package/skills/fo/fo-session-save/SKILL.md +3 -4
  169. package/skills/fo/fo-session-save/fix-patterns.md +53 -29
  170. package/skills/fo/fo-session-save/learned-principles.md +59 -8
  171. package/skills/fo/fo-step-commit/SKILL.md +55 -0
  172. package/skills/meta/forge-bootstrap/SKILL.md +28 -4
  173. package/skills/meta/forge-bootstrap/operator-profile-template.md +1 -0
  174. package/skills/meta/skill-create/SKILL.md +1 -1
  175. package/skills/shared/grilling/SKILL.md +1 -1
  176. package/skills/shared/grilling/learned-principles.md +14 -0
  177. package/skills/shared/grilling/qa-log.md +105 -6
  178. package/skills/shared/knowledge/learned-principles.md +5 -0
  179. package/skills/shared/windows-ai-tooling/SKILL.md +154 -1
  180. package/skills/shared/writing-great-skills/SKILL.md +74 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../src/knowledge/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAEF,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EACL,wBAAwB,GAOzB,MAAM,aAAa,CAAC;AAErB,MAAM,qBAAqB,GAAG,8BAA8B,CAAC;AAC7D,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAChD,MAAM,qBAAqB,GAAG,0CAA0C,CAAC;AAEzE,MAAM,kBAAkB,GAAmC;IACzD,WAAW,EAAE,IAAI;IACjB,iBAAiB,EAAE,IAAI;IACvB,uBAAuB,EAAE,IAAI;CAC9B,CAAC;AAEF,SAAS,WAAW,CAAC,OAAe,EAAE,QAAgB;IACpD,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC1D,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC,CAAC,CAAmB,CAAC;IAC3C,CAAC;IACD,OAAO,kBAAkB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;QAChE,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,EAAE;YACX,cAAc,EAAE,EAAE;YAClB,WAAW,EAAE,EAAE;YACf,mBAAmB,EAAE,IAAI;SAC1B,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,MAAM,cAAc,GAAoB,EAAE,CAAC;IAC3C,MAAM,WAAW,GAAiB,EAAE,CAAC;IAErC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,iEAAiE;IACjE,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,cAAc,GAAG,CAAC,CAAC;YACnB,MAAM;QACR,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,MAAM,mBAAmB,GAAG,cAAc,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC;IAEpE,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,EAAE;YACX,cAAc,EAAE,EAAE;YAClB,WAAW,EAAE,EAAE;YACf,mBAAmB,EAAE,IAAI;SAC1B,CAAC;IACJ,CAAC;IAED,wDAAwD;IACxD,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1B,6EAA6E;QAC7E,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,KAAK;YACL,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,EAAE;YACX,cAAc,EAAE,EAAE;YAClB,WAAW,EAAE,EAAE;YACf,mBAAmB,EAAE,KAAK;SAC3B,CAAC;IACJ,CAAC;IAED,WAAW,GAAG,cAAc,CAAC;IAC7B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExD,oCAAoC;IACpC,CAAC,GAAG,WAAW,CAAC;IAChB,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAE3D,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU;YACxC,CAAC,EAAE,CAAC;YAEJ,kEAAkE;YAClE,IAAI,IAAI,GAA8B,IAAI,CAAC;YAC3C,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC;YACxB,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;YAEtB,6CAA6C;YAC7C,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAClD,CAAC,EAAE,CAAC;YACN,CAAC;YAED,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC5D,IAAI,QAAQ,KAAK,qBAAqB,EAAE,CAAC;oBACvC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,iCAAiC;oBACzD,CAAC,EAAE,CAAC;oBACJ,MAAM,SAAS,GAAa,EAAE,CAAC;oBAC/B,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC9D,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;wBACzB,CAAC,EAAE,CAAC;oBACN,CAAC;oBACD,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC1D,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,6BAA6B;wBACnD,CAAC,EAAE,CAAC;wBAEJ,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACtC,IAAI,CAAC;4BACH,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAA4B,CAAC;4BAC3D,MAAM,MAAM,GAAG,wBAAwB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;4BACvD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gCACnB,IAAI,GAAG,MAAM,CAAC,IAA0B,CAAC;4BAC3C,CAAC;iCAAM,CAAC;gCACN,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;oCACxC,WAAW,CAAC,IAAI,CAAC;wCACf,IAAI,EAAE,cAAc;wCACpB,OAAO,EAAE,SAAS,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE;wCAC7C,OAAO;qCACR,CAAC,CAAC;gCACL,CAAC;4BACH,CAAC;wBACH,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,WAAW,CAAC,IAAI,CAAC;gCACf,IAAI,EAAE,cAAc;gCACpB,OAAO,EAAE,SAAS,OAAO,uBAAwB,GAAa,CAAC,OAAO,EAAE;gCACxE,OAAO;6BACR,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,WAAW,CAAC,IAAI,CAAC;4BACf,IAAI,EAAE,cAAc;4BACpB,OAAO,EAAE,SAAS,OAAO,sCAAsC;4BAC/D,OAAO;yBACR,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAED,+CAA+C;YAC/C,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,CAAC,EAAE,CAAC;YACN,CAAC;YACD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAEtD,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI;oBACJ,KAAK;oBACL,IAAI;oBACJ,SAAS,EAAE,cAAc;iBAC1B,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjC,wEAAwE;gBACxE,cAAc,CAAC,IAAI,CAAC;oBAClB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;oBACnD,SAAS,EAAE,cAAc;iBAC1B,CAAC,CAAC;YACL,CAAC;YACD,8DAA8D;QAChE,CAAC;aAAM,CAAC;YACN,gDAAgD;YAChD,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU;YACrC,MAAM,WAAW,GAAa,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3B,CAAC,EAAE,CAAC;YACN,CAAC;YACD,cAAc,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC5B,SAAS,EAAE,WAAW;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,KAAK;QACL,QAAQ;QACR,OAAO;QACP,cAAc;QACd,WAAW;QACX,mBAAmB,EAAE,KAAK;KAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { ParsedKnowledgeFile, KnowledgeEntry } from "./schema.ts";
2
+ export interface DuplicatePair {
3
+ a: {
4
+ skill: string;
5
+ entryId: string;
6
+ title: string;
7
+ };
8
+ b: {
9
+ skill: string;
10
+ entryId: string;
11
+ title: string;
12
+ };
13
+ normalizedTitle: string;
14
+ kind: "exact" | "containment";
15
+ }
16
+ export interface PromotionPlan {
17
+ sharedEntry: KnowledgeEntry;
18
+ localPointers: Array<{
19
+ skill: string;
20
+ file: string;
21
+ entryId: string;
22
+ }>;
23
+ }
24
+ export declare function normalizeTitle(title: string): string;
25
+ export declare function detectDuplicatePrinciples(files: Array<{
26
+ skill: string;
27
+ parsed: ParsedKnowledgeFile;
28
+ }>): DuplicatePair[];
29
+ export declare function planPromotion(sources: Array<{
30
+ skill: string;
31
+ file: string;
32
+ entry: KnowledgeEntry;
33
+ }>, merged: {
34
+ title: string;
35
+ body: string;
36
+ }, nextSharedId: string, today: string): PromotionPlan;
37
+ //# sourceMappingURL=promote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../../src/knowledge/promote.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAsB,MAAM,aAAa,CAAC;AAO3F,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,OAAO,GAAG,aAAa,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,cAAc,CAAC;IAC5B,aAAa,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpD;AAuCD,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC,GAC3D,aAAa,EAAE,CAuCjB;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,CAAC,EACtE,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACvC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,aAAa,CAgCf"}
@@ -0,0 +1,120 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>Cross-skill duplicate detection and promotion planning for shared knowledge layer (RFC-0663).</purpose>
4
+ <non-goals>
5
+ <item>Do not read or write files — that is handled by parse.ts/serialize.ts and the distill skill.</item>
6
+ <item>Do not execute promotions — that is the operator's decision inside fo-knowledge-distill.</item>
7
+ </non-goals>
8
+ </MODULE_CONTRACT>
9
+ <CHANGE_SUMMARY>
10
+ <item>RFC-0663: initial cross-skill duplicate detection and promotion planning.</item>
11
+ </CHANGE_SUMMARY>
12
+ */
13
+ const STOP_WORDS = new Set(["the", "a", "an"]);
14
+ const MIN_CONTAINMENT_LENGTH = 20;
15
+ const MIN_CONTAINMENT_RATIO = 0.6;
16
+ export function normalizeTitle(title) {
17
+ let result = title.toLowerCase();
18
+ result = result.replace(/[^\p{L}\p{N}\s]/gu, " ");
19
+ result = result.replace(/\s+/g, " ").trim();
20
+ const words = result.split(" ").filter((w) => w.length > 0 && !STOP_WORDS.has(w));
21
+ return words.join(" ");
22
+ }
23
+ function isExcludedEntry(meta) {
24
+ if (meta.status === "stale" || meta.status === "archived")
25
+ return true;
26
+ if (meta.promotedTo !== undefined && meta.promotedTo !== null)
27
+ return true;
28
+ return false;
29
+ }
30
+ function isLinkedPair(metaA, metaB) {
31
+ if (metaA.supersedes && metaB.id && metaA.supersedes.includes(metaB.id))
32
+ return true;
33
+ if (metaB.supersedes && metaA.id && metaB.supersedes.includes(metaA.id))
34
+ return true;
35
+ if (metaA.promotedTo && metaB.id && metaA.promotedTo === `shared/${metaB.id}`)
36
+ return true;
37
+ if (metaB.promotedTo && metaA.id && metaB.promotedTo === `shared/${metaA.id}`)
38
+ return true;
39
+ return false;
40
+ }
41
+ function collectActiveEntries(files) {
42
+ const active = [];
43
+ for (const file of files) {
44
+ if (file.parsed.isKnowledgeAdjacent)
45
+ continue;
46
+ if (file.parsed.parseIssues.length > 0)
47
+ continue;
48
+ for (const entry of file.parsed.entries) {
49
+ if (isExcludedEntry(entry.meta))
50
+ continue;
51
+ const normalized = normalizeTitle(entry.title);
52
+ if (normalized.length === 0)
53
+ continue;
54
+ active.push({ skill: file.skill, entry, normalizedTitle: normalized });
55
+ }
56
+ }
57
+ return active;
58
+ }
59
+ export function detectDuplicatePrinciples(files) {
60
+ const active = collectActiveEntries(files);
61
+ const pairs = [];
62
+ for (let i = 0; i < active.length; i++) {
63
+ for (let j = i + 1; j < active.length; j++) {
64
+ const a = active[i];
65
+ const b = active[j];
66
+ if (isLinkedPair(a.entry.meta, b.entry.meta))
67
+ continue;
68
+ if (a.normalizedTitle === b.normalizedTitle) {
69
+ pairs.push({
70
+ a: { skill: a.skill, entryId: a.entry.meta.id, title: a.entry.title },
71
+ b: { skill: b.skill, entryId: b.entry.meta.id, title: b.entry.title },
72
+ normalizedTitle: a.normalizedTitle,
73
+ kind: "exact",
74
+ });
75
+ continue;
76
+ }
77
+ const shorter = a.normalizedTitle.length <= b.normalizedTitle.length ? a : b;
78
+ const longer = a.normalizedTitle.length <= b.normalizedTitle.length ? b : a;
79
+ if (shorter.normalizedTitle.length < MIN_CONTAINMENT_LENGTH)
80
+ continue;
81
+ if (shorter.normalizedTitle.length < longer.normalizedTitle.length * MIN_CONTAINMENT_RATIO)
82
+ continue;
83
+ if (longer.normalizedTitle.includes(shorter.normalizedTitle)) {
84
+ pairs.push({
85
+ a: { skill: a.skill, entryId: a.entry.meta.id, title: a.entry.title },
86
+ b: { skill: b.skill, entryId: b.entry.meta.id, title: b.entry.title },
87
+ normalizedTitle: shorter.normalizedTitle,
88
+ kind: "containment",
89
+ });
90
+ }
91
+ }
92
+ }
93
+ return pairs;
94
+ }
95
+ export function planPromotion(sources, merged, nextSharedId, today) {
96
+ const totalConfirmations = sources.reduce((sum, s) => sum + (s.entry.meta.confirmations ?? 0), 0);
97
+ const promotedFrom = sources.map((s) => `${s.skill}/${s.entry.meta.id}`);
98
+ const sharedMeta = {
99
+ id: nextSharedId,
100
+ layer: "L2",
101
+ created: today,
102
+ lastConfirmedAt: today,
103
+ confirmations: totalConfirmations,
104
+ status: "active",
105
+ promotedFrom,
106
+ };
107
+ const sharedEntry = {
108
+ meta: sharedMeta,
109
+ title: merged.title,
110
+ body: merged.body,
111
+ lineStart: 0,
112
+ };
113
+ const localPointers = sources.map((s) => ({
114
+ skill: s.skill,
115
+ file: s.file,
116
+ entryId: s.entry.meta.id,
117
+ }));
118
+ return { sharedEntry, localPointers };
119
+ }
120
+ //# sourceMappingURL=promote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promote.js","sourceRoot":"","sources":["../../../src/knowledge/promote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { z } from "zod";
2
+ export type KnowledgeLayer = "L0" | "L1" | "L2";
3
+ export type KnowledgeEntryStatus = "active" | "stale" | "superseded" | "archived";
4
+ export declare const knowledgeEntryMetaSchema: z.ZodObject<{
5
+ id: z.ZodString;
6
+ layer: z.ZodEnum<{
7
+ L0: "L0";
8
+ L1: "L1";
9
+ L2: "L2";
10
+ }>;
11
+ created: z.ZodString;
12
+ lastConfirmedAt: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNull]>>;
13
+ confirmations: z.ZodOptional<z.ZodNumber>;
14
+ expiresAt: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNull]>>;
15
+ supersedes: z.ZodOptional<z.ZodArray<z.ZodString>>;
16
+ promotedTo: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNull]>>;
17
+ promotedFrom: z.ZodOptional<z.ZodArray<z.ZodString>>;
18
+ status: z.ZodEnum<{
19
+ active: "active";
20
+ stale: "stale";
21
+ superseded: "superseded";
22
+ archived: "archived";
23
+ }>;
24
+ }, z.core.$strip>;
25
+ export interface KnowledgeEntryMeta {
26
+ id: string;
27
+ layer: KnowledgeLayer;
28
+ created: string;
29
+ lastConfirmedAt?: string | null;
30
+ confirmations?: number;
31
+ expiresAt?: string | null;
32
+ supersedes?: string[];
33
+ promotedTo?: string | null;
34
+ promotedFrom?: string[];
35
+ status: KnowledgeEntryStatus;
36
+ }
37
+ export interface KnowledgeEntry {
38
+ meta: KnowledgeEntryMeta;
39
+ title: string;
40
+ body: string;
41
+ lineStart: number;
42
+ }
43
+ export interface LegacySection {
44
+ text: string;
45
+ lineStart: number;
46
+ }
47
+ export interface ParseIssue {
48
+ line: number;
49
+ message: string;
50
+ entryId?: string;
51
+ }
52
+ export interface ParsedKnowledgeFile {
53
+ path: string;
54
+ layer: KnowledgeLayer | null;
55
+ preamble: string;
56
+ entries: KnowledgeEntry[];
57
+ legacySections: LegacySection[];
58
+ parseIssues: ParseIssue[];
59
+ isKnowledgeAdjacent: boolean;
60
+ }
61
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/knowledge/schema.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAChD,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,OAAO,GAAG,YAAY,GAAG,UAAU,CAAC;AAmBlF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;iBAkCnC,CAAC;AAEH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,mBAAmB,EAAE,OAAO,CAAC;CAC9B"}
@@ -0,0 +1,64 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>Define the Zod metadata schema for knowledge entries with layer-specific refinements (RFC-0660).</purpose>
4
+ <non-goals>
5
+ <item>Do not parse markdown — that is handled by parse.ts.</item>
6
+ <item>Do not serialize — that is handled by serialize.ts.</item>
7
+ </non-goals>
8
+ </MODULE_CONTRACT>
9
+ <CHANGE_SUMMARY>
10
+ <item>RFC-0660: initial knowledge entry metadata schema with L0/L1/L2 layer-specific refinements.</item>
11
+ <item>RFC-0663: added promotedFrom field for shared-layer provenance tracking.</item>
12
+ </CHANGE_SUMMARY>
13
+ */
14
+ import { z } from "zod";
15
+ const ENTRY_ID_PATTERN = /^K-\d{4}$/;
16
+ const PROMOTED_TO_PATTERN = /^shared\/K-\d{4}$/;
17
+ const PROMOTED_FROM_PATTERN = /^[a-z0-9-]+\/K-\d{4}$/;
18
+ const baseMetaSchema = z.object({
19
+ id: z.string().regex(ENTRY_ID_PATTERN, "id must match ^K-\\d{4}$"),
20
+ layer: z.enum(["L0", "L1", "L2"]),
21
+ created: z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "created must be YYYY-MM-DD"),
22
+ lastConfirmedAt: z.union([z.string().regex(/^\d{4}-\d{2}-\d{2}$/), z.null()]).optional(),
23
+ confirmations: z.number().int().min(0).optional(),
24
+ expiresAt: z.union([z.string().regex(/^\d{4}-\d{2}-\d{2}$/), z.null()]).optional(),
25
+ supersedes: z.array(z.string().regex(ENTRY_ID_PATTERN)).optional(),
26
+ promotedTo: z.union([z.string().regex(PROMOTED_TO_PATTERN), z.null()]).optional(),
27
+ promotedFrom: z.array(z.string().regex(PROMOTED_FROM_PATTERN)).optional(),
28
+ status: z.enum(["active", "stale", "superseded", "archived"]),
29
+ });
30
+ export const knowledgeEntryMetaSchema = baseMetaSchema.superRefine((data, ctx) => {
31
+ if (data.layer === "L0" || data.layer === "L1") {
32
+ if (data.confirmations !== undefined) {
33
+ ctx.addIssue({
34
+ code: z.ZodIssueCode.custom,
35
+ message: `confirmations is forbidden on ${data.layer} entries`,
36
+ path: ["confirmations"],
37
+ });
38
+ }
39
+ if (data.lastConfirmedAt !== undefined) {
40
+ ctx.addIssue({
41
+ code: z.ZodIssueCode.custom,
42
+ message: `lastConfirmedAt is forbidden on ${data.layer} entries`,
43
+ path: ["lastConfirmedAt"],
44
+ });
45
+ }
46
+ }
47
+ if (data.layer === "L2") {
48
+ if (data.confirmations === undefined) {
49
+ ctx.addIssue({
50
+ code: z.ZodIssueCode.custom,
51
+ message: "confirmations is required on L2 entries",
52
+ path: ["confirmations"],
53
+ });
54
+ }
55
+ if (data.lastConfirmedAt === undefined) {
56
+ ctx.addIssue({
57
+ code: z.ZodIssueCode.custom,
58
+ message: "lastConfirmedAt is required on L2 entries",
59
+ path: ["lastConfirmedAt"],
60
+ });
61
+ }
62
+ }
63
+ });
64
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/knowledge/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ParsedKnowledgeFile } from "./schema.ts";
2
+ export declare function serializeKnowledgeFile(parsed: ParsedKnowledgeFile): string;
3
+ //# sourceMappingURL=serialize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../../src/knowledge/serialize.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,mBAAmB,EAAsB,MAAM,aAAa,CAAC;AAoC3E,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAsB1E"}
@@ -0,0 +1,67 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>Round-trip serializer for knowledge files — reconstructs markdown from ParsedKnowledgeFile (RFC-0660).</purpose>
4
+ <non-goals>
5
+ <item>Do not parse — that is handled by parse.ts.</item>
6
+ </non-goals>
7
+ </MODULE_CONTRACT>
8
+ <CHANGE_SUMMARY>
9
+ <item>RFC-0660: initial round-trip serializer for structured knowledge entries.</item>
10
+ <item>RFC-0663: added promotedFrom to FIELD_ORDER for shared-layer provenance.</item>
11
+ </CHANGE_SUMMARY>
12
+ */
13
+ const FIELD_ORDER = [
14
+ "id",
15
+ "layer",
16
+ "created",
17
+ "lastConfirmedAt",
18
+ "confirmations",
19
+ "expiresAt",
20
+ "supersedes",
21
+ "promotedTo",
22
+ "promotedFrom",
23
+ "status",
24
+ ];
25
+ function formatYamlValue(value) {
26
+ if (value === null)
27
+ return "null";
28
+ if (Array.isArray(value)) {
29
+ if (value.length === 0)
30
+ return "[]";
31
+ return `[${value.join(", ")}]`;
32
+ }
33
+ if (typeof value === "string")
34
+ return value;
35
+ return String(value);
36
+ }
37
+ function serializeMeta(meta) {
38
+ const lines = ["```knowledge-entry"];
39
+ for (const field of FIELD_ORDER) {
40
+ const value = meta[field];
41
+ if (value === undefined)
42
+ continue;
43
+ lines.push(`${field}: ${formatYamlValue(value)}`);
44
+ }
45
+ lines.push("```");
46
+ return lines.join("\n");
47
+ }
48
+ export function serializeKnowledgeFile(parsed) {
49
+ const parts = [];
50
+ if (parsed.preamble) {
51
+ parts.push(parsed.preamble);
52
+ }
53
+ for (const entry of parsed.entries) {
54
+ parts.push(`### ${entry.meta.id}: ${entry.title}`);
55
+ parts.push("");
56
+ parts.push(serializeMeta(entry.meta));
57
+ if (entry.body) {
58
+ parts.push("");
59
+ parts.push(entry.body);
60
+ }
61
+ }
62
+ for (const legacy of parsed.legacySections) {
63
+ parts.push(legacy.text);
64
+ }
65
+ return parts.join("\n").replace(/\n{3,}/g, "\n\n") + "\n";
66
+ }
67
+ //# sourceMappingURL=serialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../../src/knowledge/serialize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAIF,MAAM,WAAW,GAAiC;IAChD,IAAI;IACJ,OAAO;IACP,SAAS;IACT,iBAAiB;IACjB,eAAe;IACf,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,QAAQ;CACT,CAAC;AAEF,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACjC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,aAAa,CAAC,IAAwB;IAC7C,MAAM,KAAK,GAAa,CAAC,oBAAoB,CAAC,CAAC;IAC/C,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAA2B;IAChE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACtC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;AAC5D,CAAC"}
@@ -1,10 +1,29 @@
1
1
  import type { ForgeCommandInput, ForgeCommandResult, ForgeRuntimeContext } from "../types.ts";
2
+ type BehavioralRegister = "business" | "creative";
3
+ export declare function substituteTemplate(content: string, terminology: Record<string, string>): string;
4
+ export interface TemplateContext {
5
+ terminology: Record<string, string>;
6
+ register: BehavioralRegister;
7
+ domain: string | null;
8
+ workspaceType?: string;
9
+ }
10
+ export declare function selectRootTemplate(register: BehavioralRegister): string;
2
11
  interface AgentsGenerateResult {
3
12
  command: string;
4
13
  status: "pass" | "fail";
5
14
  configPath: string;
6
15
  generated: string[];
16
+ skipped: string[];
7
17
  errors: string[];
18
+ renderedFiles?: {
19
+ [relPath: string]: string;
20
+ };
21
+ details?: Array<{
22
+ path: string;
23
+ domain?: string;
24
+ register?: string;
25
+ workspaceType?: string;
26
+ }>;
8
27
  }
9
28
  export declare function runAgentsGenerate(_input: ForgeCommandInput, context: ForgeRuntimeContext): Promise<ForgeCommandResult<AgentsGenerateResult>>;
10
29
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"agents-generate.d.ts","sourceRoot":"","sources":["../../../src/onboarding/agents-generate.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAqQrB,UAAU,oBAAoB;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,CA+KnD"}
1
+ {"version":3,"file":"agents-generate.d.ts","sourceRoot":"","sources":["../../../src/onboarding/agents-generate.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAErB,KAAK,kBAAkB,GAAG,UAAU,GAAG,UAAU,CAAC;AAGlD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,MAAM,CAKR;AAGD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAQvE;AAsRD,UAAU,oBAAoB;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,CAAC,EAAE;QAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAC9C,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/F;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,CAqOnD"}