@seanmars/tospec 0.19.0-beta.7 → 0.19.0-beta.8

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 (194) hide show
  1. package/CHANGELOG.md +80 -1
  2. package/assets/dashboard/app.js +3 -3
  3. package/assets/rules/tospec/decision.md +3 -0
  4. package/dist/cli/index.d.ts.map +1 -1
  5. package/dist/cli/index.js +191 -33
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/commands/config.d.ts.map +1 -1
  8. package/dist/commands/config.js +135 -24
  9. package/dist/commands/config.js.map +1 -1
  10. package/dist/commands/dashboard.d.ts +2 -2
  11. package/dist/commands/dashboard.d.ts.map +1 -1
  12. package/dist/commands/dashboard.js +75 -10
  13. package/dist/commands/dashboard.js.map +1 -1
  14. package/dist/commands/decision.d.ts +11 -0
  15. package/dist/commands/decision.d.ts.map +1 -1
  16. package/dist/commands/decision.js +164 -26
  17. package/dist/commands/decision.js.map +1 -1
  18. package/dist/commands/shared-output.d.ts +12 -0
  19. package/dist/commands/shared-output.d.ts.map +1 -1
  20. package/dist/commands/shared-output.js +50 -1
  21. package/dist/commands/shared-output.js.map +1 -1
  22. package/dist/commands/show.d.ts +10 -0
  23. package/dist/commands/show.d.ts.map +1 -1
  24. package/dist/commands/show.js +13 -3
  25. package/dist/commands/show.js.map +1 -1
  26. package/dist/commands/validate.d.ts +23 -1
  27. package/dist/commands/validate.d.ts.map +1 -1
  28. package/dist/commands/validate.js +61 -12
  29. package/dist/commands/validate.js.map +1 -1
  30. package/dist/commands/workflow/index.d.ts +5 -5
  31. package/dist/commands/workflow/index.d.ts.map +1 -1
  32. package/dist/commands/workflow/index.js +5 -5
  33. package/dist/commands/workflow/index.js.map +1 -1
  34. package/dist/commands/workflow/instructions.d.ts +23 -0
  35. package/dist/commands/workflow/instructions.d.ts.map +1 -1
  36. package/dist/commands/workflow/instructions.js +84 -16
  37. package/dist/commands/workflow/instructions.js.map +1 -1
  38. package/dist/commands/workflow/new-change.d.ts +2 -0
  39. package/dist/commands/workflow/new-change.d.ts.map +1 -1
  40. package/dist/commands/workflow/new-change.js +32 -4
  41. package/dist/commands/workflow/new-change.js.map +1 -1
  42. package/dist/commands/workflow/schemas.d.ts +2 -0
  43. package/dist/commands/workflow/schemas.d.ts.map +1 -1
  44. package/dist/commands/workflow/schemas.js +38 -1
  45. package/dist/commands/workflow/schemas.js.map +1 -1
  46. package/dist/commands/workflow/shared.d.ts +34 -2
  47. package/dist/commands/workflow/shared.d.ts.map +1 -1
  48. package/dist/commands/workflow/shared.js +37 -3
  49. package/dist/commands/workflow/shared.js.map +1 -1
  50. package/dist/commands/workflow/status.d.ts +14 -0
  51. package/dist/commands/workflow/status.d.ts.map +1 -1
  52. package/dist/commands/workflow/status.js +62 -8
  53. package/dist/commands/workflow/status.js.map +1 -1
  54. package/dist/commands/workflow/templates.d.ts +7 -0
  55. package/dist/commands/workflow/templates.d.ts.map +1 -1
  56. package/dist/commands/workflow/templates.js +13 -0
  57. package/dist/commands/workflow/templates.js.map +1 -1
  58. package/dist/core/archive.d.ts +14 -0
  59. package/dist/core/archive.d.ts.map +1 -1
  60. package/dist/core/archive.js +151 -21
  61. package/dist/core/archive.js.map +1 -1
  62. package/dist/core/artifact-graph/index.d.ts +1 -1
  63. package/dist/core/artifact-graph/index.d.ts.map +1 -1
  64. package/dist/core/artifact-graph/index.js +1 -1
  65. package/dist/core/artifact-graph/index.js.map +1 -1
  66. package/dist/core/artifact-graph/instruction-loader.d.ts +63 -3
  67. package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -1
  68. package/dist/core/artifact-graph/instruction-loader.js +35 -26
  69. package/dist/core/artifact-graph/instruction-loader.js.map +1 -1
  70. package/dist/core/artifact-graph/resolver.d.ts +26 -0
  71. package/dist/core/artifact-graph/resolver.d.ts.map +1 -1
  72. package/dist/core/artifact-graph/resolver.js +44 -4
  73. package/dist/core/artifact-graph/resolver.js.map +1 -1
  74. package/dist/core/artifact-graph/stub-detection.d.ts +20 -0
  75. package/dist/core/artifact-graph/stub-detection.d.ts.map +1 -0
  76. package/dist/core/artifact-graph/stub-detection.js +42 -0
  77. package/dist/core/artifact-graph/stub-detection.js.map +1 -0
  78. package/dist/core/change-presenter.d.ts +16 -0
  79. package/dist/core/change-presenter.d.ts.map +1 -1
  80. package/dist/core/change-presenter.js +68 -9
  81. package/dist/core/change-presenter.js.map +1 -1
  82. package/dist/core/change-status-policy.d.ts +12 -1
  83. package/dist/core/change-status-policy.d.ts.map +1 -1
  84. package/dist/core/change-status-policy.js +33 -1
  85. package/dist/core/change-status-policy.js.map +1 -1
  86. package/dist/core/codex-residue.js +1 -1
  87. package/dist/core/config-schema.d.ts +1 -12
  88. package/dist/core/config-schema.d.ts.map +1 -1
  89. package/dist/core/config-schema.js +27 -1
  90. package/dist/core/config-schema.js.map +1 -1
  91. package/dist/core/config.d.ts +37 -0
  92. package/dist/core/config.d.ts.map +1 -1
  93. package/dist/core/config.js +37 -0
  94. package/dist/core/config.js.map +1 -1
  95. package/dist/core/dashboard-activity.js +2 -2
  96. package/dist/core/dashboard-activity.js.map +1 -1
  97. package/dist/core/dashboard-data.d.ts +5 -0
  98. package/dist/core/dashboard-data.d.ts.map +1 -1
  99. package/dist/core/dashboard-data.js +15 -8
  100. package/dist/core/dashboard-data.js.map +1 -1
  101. package/dist/core/init.d.ts +22 -0
  102. package/dist/core/init.d.ts.map +1 -1
  103. package/dist/core/init.js +107 -42
  104. package/dist/core/init.js.map +1 -1
  105. package/dist/core/list.d.ts +1 -1
  106. package/dist/core/list.d.ts.map +1 -1
  107. package/dist/core/list.js +68 -17
  108. package/dist/core/list.js.map +1 -1
  109. package/dist/core/markdown-render.d.ts +33 -0
  110. package/dist/core/markdown-render.d.ts.map +1 -0
  111. package/dist/core/markdown-render.js +103 -0
  112. package/dist/core/markdown-render.js.map +1 -0
  113. package/dist/core/migrate.d.ts +17 -5
  114. package/dist/core/migrate.d.ts.map +1 -1
  115. package/dist/core/migrate.js +48 -2
  116. package/dist/core/migrate.js.map +1 -1
  117. package/dist/core/parsers/change-parser.js +1 -1
  118. package/dist/core/parsers/change-parser.js.map +1 -1
  119. package/dist/core/parsers/markdown-parser.d.ts.map +1 -1
  120. package/dist/core/parsers/markdown-parser.js +16 -0
  121. package/dist/core/parsers/markdown-parser.js.map +1 -1
  122. package/dist/core/root-selection.d.ts +11 -1
  123. package/dist/core/root-selection.d.ts.map +1 -1
  124. package/dist/core/root-selection.js +4 -2
  125. package/dist/core/root-selection.js.map +1 -1
  126. package/dist/core/rules.d.ts +6 -1
  127. package/dist/core/rules.d.ts.map +1 -1
  128. package/dist/core/rules.js +24 -2
  129. package/dist/core/rules.js.map +1 -1
  130. package/dist/core/schemas/base.schema.d.ts +3 -0
  131. package/dist/core/schemas/base.schema.d.ts.map +1 -1
  132. package/dist/core/schemas/base.schema.js +22 -0
  133. package/dist/core/schemas/base.schema.js.map +1 -1
  134. package/dist/core/schemas/change.schema.d.ts +8 -0
  135. package/dist/core/schemas/change.schema.d.ts.map +1 -1
  136. package/dist/core/schemas/spec.schema.d.ts +2 -0
  137. package/dist/core/schemas/spec.schema.d.ts.map +1 -1
  138. package/dist/core/shared/index.d.ts +1 -1
  139. package/dist/core/shared/index.d.ts.map +1 -1
  140. package/dist/core/shared/index.js +1 -1
  141. package/dist/core/shared/index.js.map +1 -1
  142. package/dist/core/shared/rules-generation.d.ts +27 -6
  143. package/dist/core/shared/rules-generation.d.ts.map +1 -1
  144. package/dist/core/shared/rules-generation.js +115 -44
  145. package/dist/core/shared/rules-generation.js.map +1 -1
  146. package/dist/core/shared/tool-detection.d.ts +19 -0
  147. package/dist/core/shared/tool-detection.d.ts.map +1 -1
  148. package/dist/core/shared/tool-detection.js +30 -2
  149. package/dist/core/shared/tool-detection.js.map +1 -1
  150. package/dist/core/spec-presenter.d.ts.map +1 -1
  151. package/dist/core/spec-presenter.js +5 -0
  152. package/dist/core/spec-presenter.js.map +1 -1
  153. package/dist/core/specs-apply.d.ts +15 -1
  154. package/dist/core/specs-apply.d.ts.map +1 -1
  155. package/dist/core/specs-apply.js +33 -11
  156. package/dist/core/specs-apply.js.map +1 -1
  157. package/dist/core/templates/workflows/apply.js +1 -1
  158. package/dist/core/templates/workflows/apply.js.map +1 -1
  159. package/dist/core/templates/workflows/archive.d.ts.map +1 -1
  160. package/dist/core/templates/workflows/archive.js +4 -2
  161. package/dist/core/templates/workflows/archive.js.map +1 -1
  162. package/dist/core/templates/workflows/decision.js +1 -1
  163. package/dist/core/update.d.ts +26 -0
  164. package/dist/core/update.d.ts.map +1 -1
  165. package/dist/core/update.js +111 -23
  166. package/dist/core/update.js.map +1 -1
  167. package/dist/core/validation/constants.d.ts +1 -1
  168. package/dist/core/validation/constants.d.ts.map +1 -1
  169. package/dist/core/validation/constants.js +6 -1
  170. package/dist/core/validation/constants.js.map +1 -1
  171. package/dist/core/validation/section-validator.d.ts.map +1 -1
  172. package/dist/core/validation/section-validator.js +21 -3
  173. package/dist/core/validation/section-validator.js.map +1 -1
  174. package/dist/core/validation/validator.d.ts +9 -3
  175. package/dist/core/validation/validator.d.ts.map +1 -1
  176. package/dist/core/validation/validator.js +58 -8
  177. package/dist/core/validation/validator.js.map +1 -1
  178. package/dist/utils/change-utils.d.ts +28 -0
  179. package/dist/utils/change-utils.d.ts.map +1 -1
  180. package/dist/utils/change-utils.js +115 -26
  181. package/dist/utils/change-utils.js.map +1 -1
  182. package/dist/utils/file-system.d.ts +1 -1
  183. package/dist/utils/file-system.js +1 -1
  184. package/dist/utils/item-discovery.d.ts +20 -5
  185. package/dist/utils/item-discovery.d.ts.map +1 -1
  186. package/dist/utils/item-discovery.js +28 -9
  187. package/dist/utils/item-discovery.js.map +1 -1
  188. package/dist/utils/task-progress.js +1 -1
  189. package/package.json +1 -1
  190. package/schemas/decision/templates/decision.md +3 -1
  191. package/schemas/decision/templates/index.md +2 -2
  192. package/schemas/issue/templates/spec.md +8 -0
  193. package/schemas/sdd/templates/spec.md +8 -0
  194. /package/assets/rules/tospec/{single-sourc-of-truth.md → single-source-of-truth.md} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../../src/core/parsers/markdown-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../../src/core/parsers/markdown-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAStG;;;;;;;;GAQG;AACH,SAAS,gBAAgB,CAAC,KAAa,EAAE,KAAiC;IACxE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,OAAO,cAAc;IACjB,KAAK,CAAW;IAChB,iBAAiB,CAAY;IAErC,YAAY,OAAe;QACzB,MAAM,UAAU,GAAG,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;IAES,MAAM,CAAC,gBAAgB,CAAC,OAAe;QAC/C,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;QAErE,qEAAqE;QACrE,uEAAuE;QACvE,MAAM,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QAE1E,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QAEjE,OAAO;YACL,IAAI;YACJ,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE;YACxB,YAAY;YACZ,QAAQ,EAAE;gBACR,OAAO,EAAE,OAAO;gBAChB,MAAM,EAAE,QAAQ;aACjB;SACF,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;QAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;QAE9E,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAE7C,OAAO;YACL,IAAI;YACJ,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE;YACf,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE;YAC/B,MAAM;YACN,QAAQ,EAAE;gBACR,OAAO,EAAE,OAAO;gBAChB,MAAM,EAAE,eAAe;aACxB;SACF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9B,CAAC;IAES,aAAa;QACrB,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAc,EAAE,CAAC;QAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9B,SAAS;YACX,CAAC;YACD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAEpD,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACpC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,IAAI,CAAC,yBAAyB,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;gBAE7D,MAAM,OAAO,GAAY;oBACvB,KAAK;oBACL,KAAK;oBACL,OAAO;oBACP,QAAQ,EAAE,EAAE;iBACb,CAAC;gBAEF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;oBAClE,KAAK,CAAC,GAAG,EAAE,CAAC;gBACd,CAAC;gBAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACzB,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACjD,CAAC;gBAED,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAES,yBAAyB,CAAC,SAAiB,EAAE,YAAoB;QACzE,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAElF,IAAI,WAAW,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;gBACzD,MAAM;YACR,CAAC;YAED,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IAES,WAAW,CAAC,QAAmB,EAAE,KAAa,EAAE,KAAc;QACtE,OAAO,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;IAES,iBAAiB,CAAC,OAAgB;QAC1C,MAAM,YAAY,GAAkB,EAAE,CAAC;QAEvC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrC,0EAA0E;YAC1E,2EAA2E;YAC3E,MAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAE5E,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAE7C,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC;gBAClD,IAAI;gBACJ,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAES,cAAc,CAAC,kBAA2B;QAClD,MAAM,SAAS,GAAe,EAAE,CAAC;QAEjC,KAAK,MAAM,eAAe,IAAI,kBAAkB,CAAC,QAAQ,EAAE,CAAC;YAC1D,uEAAuE;YACvE,+DAA+D;YAC/D,2CAA2C;YAC3C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBACtD,SAAS;YACX,CAAC;YACD,qDAAqD;YACrD,IAAI,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnC,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,gBAAgB,CAAC,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC;oBACzD,OAAO,EAAE,eAAe,CAAC,OAAO;iBACjC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAGS,WAAW,CAAC,OAAe;QACnC,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,8CAA8C;YAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAC7E,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACtC,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAEzC,IAAI,SAAS,GAAmB,UAAU,CAAC;gBAC3C,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;gBAE5C,8EAA8E;gBAC9E,8EAA8E;gBAC9E,IAAI,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;oBACxF,SAAS,GAAG,SAAS,CAAC;gBACxB,CAAC;qBAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;oBACvH,SAAS,GAAG,OAAO,CAAC;gBACtB,CAAC;qBAAM,IAAI,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC5F,SAAS,GAAG,SAAS,CAAC;gBACxB,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,SAAS;oBACT,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAGD;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CACzB,QAAmB,EACnB,KAAa,EACb,KAAc;IAEd,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IACE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM;YAC7C,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,EAChD,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1D,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -7,7 +7,17 @@
7
7
  * implicit root (unless the caller forbids it).
8
8
  */
9
9
  import { type PlanningHome } from './planning-home.js';
10
- export type TospecRootSource = 'nearest' | 'implicit';
10
+ /**
11
+ * How a command arrived at the root it reports.
12
+ *
13
+ * `nearest` and `implicit` are the two outcomes of *searching* for a root.
14
+ * `explicit` is the install layer (`init`, `update`, `rules`, `migrate`), which
15
+ * never searches — it operates on the path it was handed. Those commands used
16
+ * to omit `source` entirely, and `JSON.stringify` drops an absent key, so a
17
+ * caller reading `root.source` could not tell "this command does not resolve a
18
+ * root" from "the field was renamed". Naming the case keeps the key present.
19
+ */
20
+ export type TospecRootSource = 'nearest' | 'implicit' | 'explicit';
11
21
  export interface ResolveTospecRootOptions {
12
22
  startPath?: string;
13
23
  allowImplicitRoot?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"root-selection.d.ts","sourceRoot":"","sources":["../../src/core/root-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,UAAU,CAAC;AAEtD,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,KAAK,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC;IAE7C,YACE,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAO,EAUhD;CACF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEhF;AAaD,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,kBAAkB,CAAC,CAgB7B;AAMD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,kBAAkB,GAAG,UAAU,CAKjE;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,YAAY,CAOrE;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,OAAO,EAClB,MAAM,GAAE;IACN,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACxB,GACL,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAcpC"}
1
+ {"version":3,"file":"root-selection.d.ts","sourceRoot":"","sources":["../../src/core/root-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAG5B;;;;;;;;;GASG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAEnE,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,KAAK,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC;IAE7C,YACE,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAO,EAUhD;CACF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEhF;AAaD,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,kBAAkB,CAAC,CAgB7B;AAMD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,kBAAkB,GAAG,UAAU,CAKjE;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,YAAY,CAOrE;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,OAAO,EAClB,MAAM,GAAE;IACN,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACxB,GACL,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAgBpC"}
@@ -8,7 +8,7 @@
8
8
  */
9
9
  import * as path from 'node:path';
10
10
  import { findRepoPlanningRootSync, getSearchStartDirectory, } from './planning-home.js';
11
- import { emitFailureStatus } from '../commands/shared-output.js';
11
+ import { emitFailureStatus, recordResolvedRoot } from '../commands/shared-output.js';
12
12
  export class RootSelectionError extends Error {
13
13
  diagnostic;
14
14
  constructor(message, code, options = {}) {
@@ -68,11 +68,13 @@ export function toPlanningHome(root) {
68
68
  */
69
69
  export async function resolveRootForCommand(_selector, output = {}) {
70
70
  try {
71
- return await resolveTospecRoot({
71
+ const root = await resolveTospecRoot({
72
72
  ...(output.allowImplicitRoot !== undefined
73
73
  ? { allowImplicitRoot: output.allowImplicitRoot }
74
74
  : {}),
75
75
  });
76
+ recordResolvedRoot(toRootOutput(root));
77
+ return root;
76
78
  }
77
79
  catch (error) {
78
80
  if (output.json && isRootSelectionError(error)) {
@@ -1 +1 @@
1
- {"version":3,"file":"root-selection.js","sourceRoot":"","sources":["../../src/core/root-selection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"root-selection.js","sourceRoot":"","sources":["../../src/core/root-selection.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,10 @@
1
+ export interface RulesCommandOptions {
2
+ json?: boolean;
3
+ }
4
+ /** The `--json` null-shape; mirrors the success payload with `rules` nulled. */
5
+ export declare const RULES_FAILURE_PAYLOAD: Record<string, unknown>;
1
6
  /** Refresh only the workflow rule files of agents already configured for tospec. */
2
7
  export declare class RulesCommand {
3
- execute(targetPath: string): Promise<void>;
8
+ execute(targetPath: string, options?: RulesCommandOptions): Promise<void>;
4
9
  }
5
10
  //# sourceMappingURL=rules.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/core/rules.ts"],"names":[],"mappings":"AAMA,oFAAoF;AACpF,qBAAa,YAAY;IACjB,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY/C;CACF"}
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/core/rules.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAA+B,CAAC;AAE1F,oFAAoF;AACpF,qBAAa,YAAY;IACjB,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmClF;CACF"}
@@ -3,20 +3,42 @@ import { FileSystemUtils } from '../utils/file-system.js';
3
3
  import { TOSPEC_DIR_NAME } from './config.js';
4
4
  import { getConfiguredTools } from './shared/tool-detection.js';
5
5
  import { planWorkflowRules, writeWorkflowRules } from './shared/rules-generation.js';
6
+ import { emitSuccess } from '../commands/shared-output.js';
7
+ /** The `--json` null-shape; mirrors the success payload with `rules` nulled. */
8
+ export const RULES_FAILURE_PAYLOAD = { rules: null, root: null };
6
9
  /** Refresh only the workflow rule files of agents already configured for tospec. */
7
10
  export class RulesCommand {
8
- async execute(targetPath) {
11
+ async execute(targetPath, options = {}) {
9
12
  const projectPath = path.resolve(targetPath);
10
13
  if (!await FileSystemUtils.directoryExists(path.join(projectPath, TOSPEC_DIR_NAME))) {
11
14
  throw new Error("No Tospec directory found. Run 'tospec init' first.");
12
15
  }
13
16
  const tools = getConfiguredTools(projectPath);
14
17
  if (tools.length === 0) {
18
+ // Not an error: a project can legitimately have no agent configured. The
19
+ // JSON form says so with an empty list rather than prose, so a caller does
20
+ // not have to tell "nothing to do" from "something went wrong" by reading
21
+ // English.
22
+ if (options.json) {
23
+ emitSuccess({ rules: [], message: 'No configured tools found.' }, { path: projectPath, source: 'explicit' });
24
+ return;
25
+ }
15
26
  console.log('No configured tools found. Run "tospec init" to set up tools.');
16
27
  return;
17
28
  }
18
29
  const plan = await planWorkflowRules(projectPath, tools);
19
- await writeWorkflowRules(plan);
30
+ await writeWorkflowRules(plan, { silent: options.json });
31
+ if (options.json) {
32
+ emitSuccess({
33
+ rules: plan.map((entry) => ({
34
+ tool: entry.toolId,
35
+ rule: entry.rule,
36
+ path: entry.destination,
37
+ action: entry.action,
38
+ ...(entry.retire ? { retiredPath: entry.retire } : {}),
39
+ })),
40
+ }, { path: projectPath, source: 'explicit' });
41
+ }
20
42
  }
21
43
  }
22
44
  //# sourceMappingURL=rules.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/core/rules.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAErF,oFAAoF;AACpF,MAAM,OAAO,YAAY;IACvB,KAAK,CAAC,OAAO,CAAC,UAAkB;QAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,eAAe,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;YACpF,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACzD,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;CACF"}
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/core/rules.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAM3D,gFAAgF;AAChF,MAAM,CAAC,MAAM,qBAAqB,GAA4B,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAE1F,oFAAoF;AACpF,MAAM,OAAO,YAAY;IACvB,KAAK,CAAC,OAAO,CAAC,UAAkB,EAAE,OAAO,GAAwB,EAAE;QACjE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,eAAe,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;YACpF,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,yEAAyE;YACzE,2EAA2E;YAC3E,0EAA0E;YAC1E,WAAW;YACX,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,4BAA4B,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC7G,OAAO;YACT,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACzD,MAAM,kBAAkB,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAEzD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,WAAW,CACT;gBACE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBAC1B,IAAI,EAAE,KAAK,CAAC,MAAM;oBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,KAAK,CAAC,WAAW;oBACvB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACvD,CAAC,CAAC;aACJ,EACD,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAC1C,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -1,10 +1,13 @@
1
1
  import { z } from 'zod';
2
2
  export declare const ScenarioSchema: z.ZodObject<{
3
+ name: z.ZodOptional<z.ZodString>;
3
4
  rawText: z.ZodString;
4
5
  }, z.core.$strip>;
5
6
  export declare const RequirementSchema: z.ZodObject<{
7
+ name: z.ZodOptional<z.ZodString>;
6
8
  text: z.ZodString;
7
9
  scenarios: z.ZodArray<z.ZodObject<{
10
+ name: z.ZodOptional<z.ZodString>;
8
11
  rawText: z.ZodString;
9
12
  }, z.core.$strip>>;
10
13
  }, z.core.$strip>;
@@ -1 +1 @@
1
- {"version":3,"file":"base.schema.d.ts","sourceRoot":"","sources":["../../../src/core/schemas/base.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,cAAc;;iBAEzB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;iBAW5B,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
1
+ {"version":3,"file":"base.schema.d.ts","sourceRoot":"","sources":["../../../src/core/schemas/base.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,cAAc;;;iBASzB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;iBA0B5B,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -1,9 +1,31 @@
1
1
  import { z } from 'zod';
2
2
  import { VALIDATION_MESSAGES } from '../validation/constants.js';
3
3
  export const ScenarioSchema = z.object({
4
+ /**
5
+ * The `#### Scenario: <name>` heading text, without the `Scenario:` prefix.
6
+ *
7
+ * Optional only so a hand-built Scenario in a test or a future caller does
8
+ * not have to invent one; every parsed scenario carries it.
9
+ */
10
+ name: z.string().optional(),
4
11
  rawText: z.string().min(1, VALIDATION_MESSAGES.SCENARIO_EMPTY),
5
12
  });
6
13
  export const RequirementSchema = z.object({
14
+ /**
15
+ * The `### Requirement: <name>` heading text, without the `Requirement:`
16
+ * prefix.
17
+ *
18
+ * Carried rather than discarded because this string is load-bearing: a
19
+ * MODIFIED, REMOVED or RENAMED delta must reproduce the header exactly, and
20
+ * archive hard-fails on a mismatch. While `show --json` reported only `text`,
21
+ * the one command an agent would use to read the current spec withheld the
22
+ * single field needed to write a delta against it, forcing a fall back to
23
+ * parsing raw Markdown.
24
+ *
25
+ * Optional in the schema so a hand-built Requirement need not supply one;
26
+ * every parsed requirement carries it.
27
+ */
28
+ name: z.string().optional(),
7
29
  // SHALL/MUST body-keyword enforcement lives in the imperative validator
8
30
  // (Validator.applySpecRules), not here: the parser collapses the requirement
9
31
  // header into `text`, so a Zod refine on `text` cannot tell "keyword in header
@@ -1 +1 @@
1
- {"version":3,"file":"base.schema.js","sourceRoot":"","sources":["../../../src/core/schemas/base.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,mBAAmB,CAAC,cAAc,CAAC;CAC/D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,wEAAwE;IACxE,6EAA6E;IAC7E,+EAA+E;IAC/E,yEAAyE;IACzE,yEAAyE;IACzE,4CAA4C;IAC5C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;SACb,GAAG,CAAC,CAAC,EAAE,mBAAmB,CAAC,iBAAiB,CAAC;IAChD,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;SAC/B,GAAG,CAAC,CAAC,EAAE,mBAAmB,CAAC,wBAAwB,CAAC;CACxD,CAAC,CAAC"}
1
+ {"version":3,"file":"base.schema.js","sourceRoot":"","sources":["../../../src/core/schemas/base.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC;;;;;OAKG;IACH,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,mBAAmB,CAAC,cAAc,CAAC;CAC/D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC;;;;;;;;;;;;;OAaG;IACH,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,wEAAwE;IACxE,6EAA6E;IAC7E,+EAA+E;IAC/E,yEAAyE;IACzE,yEAAyE;IACzE,4CAA4C;IAC5C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;SACb,GAAG,CAAC,CAAC,EAAE,mBAAmB,CAAC,iBAAiB,CAAC;IAChD,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;SAC/B,GAAG,CAAC,CAAC,EAAE,mBAAmB,CAAC,wBAAwB,CAAC;CACxD,CAAC,CAAC"}
@@ -15,14 +15,18 @@ export declare const DeltaSchema: z.ZodObject<{
15
15
  }>;
16
16
  description: z.ZodString;
17
17
  requirement: z.ZodOptional<z.ZodObject<{
18
+ name: z.ZodOptional<z.ZodString>;
18
19
  text: z.ZodString;
19
20
  scenarios: z.ZodArray<z.ZodObject<{
21
+ name: z.ZodOptional<z.ZodString>;
20
22
  rawText: z.ZodString;
21
23
  }, z.core.$strip>>;
22
24
  }, z.core.$strip>>;
23
25
  requirements: z.ZodOptional<z.ZodArray<z.ZodObject<{
26
+ name: z.ZodOptional<z.ZodString>;
24
27
  text: z.ZodString;
25
28
  scenarios: z.ZodArray<z.ZodObject<{
29
+ name: z.ZodOptional<z.ZodString>;
26
30
  rawText: z.ZodString;
27
31
  }, z.core.$strip>>;
28
32
  }, z.core.$strip>>>;
@@ -45,14 +49,18 @@ export declare const ChangeSchema: z.ZodObject<{
45
49
  }>;
46
50
  description: z.ZodString;
47
51
  requirement: z.ZodOptional<z.ZodObject<{
52
+ name: z.ZodOptional<z.ZodString>;
48
53
  text: z.ZodString;
49
54
  scenarios: z.ZodArray<z.ZodObject<{
55
+ name: z.ZodOptional<z.ZodString>;
50
56
  rawText: z.ZodString;
51
57
  }, z.core.$strip>>;
52
58
  }, z.core.$strip>>;
53
59
  requirements: z.ZodOptional<z.ZodArray<z.ZodObject<{
60
+ name: z.ZodOptional<z.ZodString>;
54
61
  text: z.ZodString;
55
62
  scenarios: z.ZodArray<z.ZodObject<{
63
+ name: z.ZodOptional<z.ZodString>;
56
64
  rawText: z.ZodString;
57
65
  }, z.core.$strip>>;
58
66
  }, z.core.$strip>>>;
@@ -1 +1 @@
1
- {"version":3,"file":"change.schema.d.ts","sourceRoot":"","sources":["../../../src/core/schemas/change.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,kBAAkB;;;;;EAAsD,CAAC;AAEtF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;iBAUtB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAcvB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAChD,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"change.schema.d.ts","sourceRoot":"","sources":["../../../src/core/schemas/change.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,kBAAkB;;;;;EAAsD,CAAC;AAEtF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAUtB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAcvB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAChD,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
@@ -3,8 +3,10 @@ export declare const SpecSchema: z.ZodObject<{
3
3
  name: z.ZodString;
4
4
  overview: z.ZodString;
5
5
  requirements: z.ZodArray<z.ZodObject<{
6
+ name: z.ZodOptional<z.ZodString>;
6
7
  text: z.ZodString;
7
8
  scenarios: z.ZodArray<z.ZodObject<{
9
+ name: z.ZodOptional<z.ZodString>;
8
10
  rawText: z.ZodString;
9
11
  }, z.core.$strip>>;
10
12
  }, z.core.$strip>>;
@@ -1 +1 @@
1
- {"version":3,"file":"spec.schema.d.ts","sourceRoot":"","sources":["../../../src/core/schemas/spec.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;iBAUrB,CAAC;AAEH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC"}
1
+ {"version":3,"file":"spec.schema.d.ts","sourceRoot":"","sources":["../../../src/core/schemas/spec.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;iBAUrB,CAAC;AAEH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC"}
@@ -5,5 +5,5 @@
5
5
  */
6
6
  export { SKILL_NAMES, LEGACY_SKILL_DIRS, type ToolSkillStatus, type ToolVersionStatus, removeLegacySkillDirs, removeLegacyToolSkillLayout, getToolsWithSkillsDir, getToolSkillStatus, getToolStates, extractGeneratedByVersion, getToolVersionStatus, getConfiguredTools, } from './tool-detection.js';
7
7
  export { type SkillTemplateEntry, type CommandTemplateEntry, getSkillTemplates, getCommandTemplates, getCommandContents, generateSkillContent, writeSkillDir, writeToolCommands, } from './skill-generation.js';
8
- export { writeToolRules } from './rules-generation.js';
8
+ export { planWorkflowRules, writeWorkflowRules } from './rules-generation.js';
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/shared/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/shared/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -5,5 +5,5 @@
5
5
  */
6
6
  export { SKILL_NAMES, LEGACY_SKILL_DIRS, removeLegacySkillDirs, removeLegacyToolSkillLayout, getToolsWithSkillsDir, getToolSkillStatus, getToolStates, extractGeneratedByVersion, getToolVersionStatus, getConfiguredTools, } from './tool-detection.js';
7
7
  export { getSkillTemplates, getCommandTemplates, getCommandContents, generateSkillContent, writeSkillDir, writeToolCommands, } from './skill-generation.js';
8
- export { writeToolRules } from './rules-generation.js';
8
+ export { planWorkflowRules, writeWorkflowRules } from './rules-generation.js';
9
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/shared/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,WAAW,EACX,iBAAiB,EAGjB,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAGL,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/shared/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,WAAW,EACX,iBAAiB,EAGjB,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAGL,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -1,19 +1,40 @@
1
1
  /**
2
2
  * Rules Generation
3
3
  *
4
- * Legacy decision rules retain their init-only writer. Workflow rules use a
5
- * shipped Markdown template and a read-only plan before any project writes.
4
+ * Every rule document tospec writes is managed the same way: a shipped Markdown
5
+ * template, wrapped in a hash-stamped marker, planned read-only before any
6
+ * project write, and refused rather than overwritten once somebody has edited it.
7
+ *
8
+ * `decision.md` used to be the exception — an init-only writer that overwrote it
9
+ * unconditionally, with no marker to tell a generated file from an edited one and
10
+ * no entry in what `rules`/`update` reported. Editing it therefore lost the edit
11
+ * on the next `tospec init`, silently, in the default path, while its sibling in
12
+ * the same directory refused even `--force`. Two standards in one directory teach
13
+ * the safer one and then break it, so there is now only one.
6
14
  */
7
- /** Write tospec rule files into `<projectPath>/<agentBaseDir>/rules/` for one tool. */
8
- export declare function writeToolRules(projectPath: string, agentBaseDir: string): Promise<void>;
9
15
  export interface WorkflowRulePlan {
10
16
  toolId: string;
17
+ /** Which managed rule this entry writes; distinguishes a tool's entries. */
18
+ rule: string;
11
19
  destination: string;
12
20
  content: string;
13
21
  action: 'created' | 'updated' | 'unchanged';
22
+ /**
23
+ * A copy under the previous misspelled filename to delete after the write.
24
+ * Absent unless one is there and is verifiably tospec-generated.
25
+ */
26
+ retire?: string;
14
27
  }
15
28
  /** Read every target before allowing any project mutation. */
16
29
  export declare function planWorkflowRules(projectPath: string, toolIds: string[]): Promise<WorkflowRulePlan[]>;
17
- /** Call only after the complete plan passed preflight. */
18
- export declare function writeWorkflowRules(plan: WorkflowRulePlan[]): Promise<void>;
30
+ /**
31
+ * Call only after the complete plan passed preflight.
32
+ *
33
+ * `silent` suppresses the progress prose for a `--json` caller, which reports
34
+ * the same facts from the plan itself — prose on stdout would break the
35
+ * one-document envelope.
36
+ */
37
+ export declare function writeWorkflowRules(plan: WorkflowRulePlan[], options?: {
38
+ silent?: boolean;
39
+ }): Promise<void>;
19
40
  //# sourceMappingURL=rules-generation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rules-generation.d.ts","sourceRoot":"","sources":["../../../src/core/shared/rules-generation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyBH,uFAAuF;AACvF,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7F;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;CAC7C;AAwBD,8DAA8D;AAC9D,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA2B3G;AAED,0DAA0D;AAC1D,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAchF"}
1
+ {"version":3,"file":"rules-generation.d.ts","sourceRoot":"","sources":["../../../src/core/shared/rules-generation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAoEH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IAC5C;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAkCD,8DAA8D;AAC9D,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA8D3G;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,gBAAgB,EAAE,EACxB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC,IAAI,CAAC,CAuBf"}
@@ -1,95 +1,166 @@
1
1
  /**
2
2
  * Rules Generation
3
3
  *
4
- * Legacy decision rules retain their init-only writer. Workflow rules use a
5
- * shipped Markdown template and a read-only plan before any project writes.
4
+ * Every rule document tospec writes is managed the same way: a shipped Markdown
5
+ * template, wrapped in a hash-stamped marker, planned read-only before any
6
+ * project write, and refused rather than overwritten once somebody has edited it.
7
+ *
8
+ * `decision.md` used to be the exception — an init-only writer that overwrote it
9
+ * unconditionally, with no marker to tell a generated file from an edited one and
10
+ * no entry in what `rules`/`update` reported. Editing it therefore lost the edit
11
+ * on the next `tospec init`, silently, in the default path, while its sibling in
12
+ * the same directory refused even `--force`. Two standards in one directory teach
13
+ * the safer one and then break it, so there is now only one.
6
14
  */
7
15
  import path from 'node:path';
8
16
  import { promises as fs } from 'node:fs';
9
17
  import { createHash } from 'node:crypto';
10
- import { AI_TOOLS, CODEX_TARGET_ID } from '../config.js';
18
+ import { AI_TOOLS, CODEX_TARGET_ID, DECISION_RULE_FILENAME, LEGACY_WORKFLOW_RULE_FILENAME, TOOL_RULES_SUBDIR, WORKFLOW_RULE_FILENAME, } from '../config.js';
11
19
  import { FileSystemUtils } from '../../utils/file-system.js';
12
- // Trailing newline intentional.
13
- const DECISION_RULE = `# Decision
20
+ /**
21
+ * The exact text the init-only writer produced. Kept verbatim — not regenerated
22
+ * from the template — because its only job is to recognise files already on disk.
23
+ * If the shipped body ever changes, this string must not follow it.
24
+ */
25
+ const UNMARKED_DECISION_RULE = `# Decision
14
26
 
15
27
  Any material decision reached during discussion must be recorded with /tospec-decision, which creates a decision file and captures the relevant decision details.
16
28
  `;
17
- // Single entry today; the array keeps adding a rule a one-line change.
18
- const RULE_FILES = [
19
- { relPath: path.join('tospec', 'decision.md'), content: DECISION_RULE },
29
+ const MANAGED_RULES = [
30
+ {
31
+ filename: WORKFLOW_RULE_FILENAME,
32
+ slug: 'single-source-of-truth',
33
+ templateUrl: new URL('../../../assets/rules/tospec/single-source-of-truth.md', import.meta.url),
34
+ // Carries the same `sourc` typo as the filename it was written beside.
35
+ legacySlugs: ['single-sourc-of-truth'],
36
+ legacyFilename: LEGACY_WORKFLOW_RULE_FILENAME,
37
+ },
38
+ {
39
+ filename: DECISION_RULE_FILENAME,
40
+ slug: 'decision',
41
+ templateUrl: new URL('../../../assets/rules/tospec/decision.md', import.meta.url),
42
+ unmarkedLegacyBodies: [UNMARKED_DECISION_RULE],
43
+ },
20
44
  ];
21
- /** Write tospec rule files into `<projectPath>/<agentBaseDir>/rules/` for one tool. */
22
- export async function writeToolRules(projectPath, agentBaseDir) {
23
- for (const rule of RULE_FILES) {
24
- const dest = path.join(projectPath, agentBaseDir, 'rules', rule.relPath);
25
- await FileSystemUtils.writeFile(dest, rule.content); // auto-creates parent dirs
26
- }
27
- }
28
- const TEMPLATE_URL = new URL('../../../assets/rules/tospec/single-sourc-of-truth.md', import.meta.url);
29
- const RULE_NAME = 'single-sourc-of-truth.md';
30
- const END_MARKER = '<!-- /tospec:single-sourc-of-truth -->';
31
- const MANAGED_DOCUMENT = /^<!-- tospec:single-sourc-of-truth:v1 sha256=([a-f0-9]{64}) -->\n([\s\S]*\n)<!-- \/tospec:single-sourc-of-truth -->\n$/;
32
45
  function normalizeNewlines(content) {
33
46
  return content.replace(/\r\n/g, '\n');
34
47
  }
35
48
  function bodyHash(body) {
36
49
  return createHash('sha256').update(body, 'utf8').digest('hex');
37
50
  }
38
- function isIntactDocument(content) {
39
- const match = MANAGED_DOCUMENT.exec(content);
40
- // A dedicated file has exactly one frame; never silently drop text outside it.
41
- return match !== null && match[0] === content
42
- && !match[2].includes('<!-- tospec:single-sourc-of-truth:')
43
- && !match[2].includes(END_MARKER)
44
- && bodyHash(match[2]) === match[1];
51
+ const managedDocumentPattern = (slug) => new RegExp(`^<!-- tospec:${slug}:v1 sha256=([a-f0-9]{64}) -->\\n([\\s\\S]*\\n)<!-- \\/tospec:${slug} -->\\n$`);
52
+ /**
53
+ * Whether the file is an untouched tospec-generated rule document.
54
+ *
55
+ * Every slug this rule has ever used is accepted, and so is any unmarked body a
56
+ * previous tospec wrote: refusing either would turn a routine `tospec update`
57
+ * into a rule conflict for every project that predates the change.
58
+ */
59
+ function isIntactDocument(rule, content) {
60
+ if (rule.unmarkedLegacyBodies?.some((body) => content === body))
61
+ return true;
62
+ return [rule.slug, ...(rule.legacySlugs ?? [])].some((slug) => {
63
+ const match = managedDocumentPattern(slug).exec(content);
64
+ // A dedicated file has exactly one frame; never silently drop text outside it.
65
+ return match !== null && match[0] === content
66
+ && !match[2].includes(`<!-- tospec:${slug}:`)
67
+ && !match[2].includes(`<!-- /tospec:${slug} -->`)
68
+ && bodyHash(match[2]) === match[1];
69
+ });
45
70
  }
46
71
  /** Read every target before allowing any project mutation. */
47
72
  export async function planWorkflowRules(projectPath, toolIds) {
48
73
  if (toolIds.length === 0)
49
74
  return [];
50
- const body = normalizeNewlines(await fs.readFile(TEMPLATE_URL, 'utf8')).replace(/\n*$/, '\n');
51
- const hash = bodyHash(body);
52
- const content = `<!-- tospec:single-sourc-of-truth:v1 sha256=${hash} -->\n${body}${END_MARKER}\n`;
75
+ const contents = new Map();
76
+ for (const rule of MANAGED_RULES) {
77
+ const body = normalizeNewlines(await fs.readFile(rule.templateUrl, 'utf8')).replace(/\n*$/, '\n');
78
+ contents.set(rule.filename, `<!-- tospec:${rule.slug}:v1 sha256=${bodyHash(body)} -->\n${body}<!-- /tospec:${rule.slug} -->\n`);
79
+ }
53
80
  const plan = [];
54
81
  const conflicts = [];
55
- for (const toolId of toolIds) {
56
- const tool = AI_TOOLS.find((tool) => tool.value === toolId);
57
- if (!tool?.skillsDir)
58
- throw new Error(`Unknown rule target: ${toolId}`);
59
- const destination = path.join(projectPath, tool.skillsDir, 'rules', 'tospec', RULE_NAME);
60
- let previous;
82
+ const readIfPresent = async (file) => {
61
83
  try {
62
- previous = normalizeNewlines(await fs.readFile(destination, 'utf8'));
84
+ return normalizeNewlines(await fs.readFile(file, 'utf8'));
63
85
  }
64
86
  catch (error) {
65
87
  if (error.code !== 'ENOENT')
66
88
  throw error;
89
+ return undefined;
67
90
  }
68
- if (previous !== undefined && !isIntactDocument(previous)) {
69
- conflicts.push(destination);
91
+ };
92
+ for (const toolId of toolIds) {
93
+ const tool = AI_TOOLS.find((tool) => tool.value === toolId);
94
+ if (!tool?.skillsDir)
95
+ throw new Error(`Unknown rule target: ${toolId}`);
96
+ const rulesDir = path.join(projectPath, tool.skillsDir, ...TOOL_RULES_SUBDIR);
97
+ for (const rule of MANAGED_RULES) {
98
+ const content = contents.get(rule.filename);
99
+ const destination = path.join(rulesDir, rule.filename);
100
+ const previous = await readIfPresent(destination);
101
+ if (previous !== undefined && !isIntactDocument(rule, previous)) {
102
+ conflicts.push(destination);
103
+ }
104
+ let retire;
105
+ if (rule.legacyFilename) {
106
+ const legacy = path.join(rulesDir, rule.legacyFilename);
107
+ const legacyPrevious = await readIfPresent(legacy);
108
+ if (legacyPrevious !== undefined) {
109
+ // An edited copy under the old name is left exactly where it is and
110
+ // reported, not deleted: the rename is tospec's housekeeping, and it
111
+ // must not be the reason somebody's notes disappear. Removing it by
112
+ // hand is the same one-step fix the conflict message already asks for.
113
+ if (isIntactDocument(rule, legacyPrevious))
114
+ retire = legacy;
115
+ else
116
+ conflicts.push(legacy);
117
+ }
118
+ }
119
+ plan.push({
120
+ toolId,
121
+ rule: rule.filename,
122
+ destination,
123
+ content,
124
+ action: previous === undefined ? 'created' : previous === content ? 'unchanged' : 'updated',
125
+ ...(retire ? { retire } : {}),
126
+ });
70
127
  }
71
- plan.push({ toolId, destination, content,
72
- action: previous === undefined ? 'created' : previous === content ? 'unchanged' : 'updated' });
73
128
  }
74
129
  if (conflicts.length > 0) {
75
130
  throw new Error(`Workflow rule conflict:\n${conflicts.join('\n')}\nPreserve your edits, remove the conflicting generated files, then rerun. Force does not bypass rule conflicts.`);
76
131
  }
77
132
  return plan;
78
133
  }
79
- /** Call only after the complete plan passed preflight. */
80
- export async function writeWorkflowRules(plan) {
134
+ /**
135
+ * Call only after the complete plan passed preflight.
136
+ *
137
+ * `silent` suppresses the progress prose for a `--json` caller, which reports
138
+ * the same facts from the plan itself — prose on stdout would break the
139
+ * one-document envelope.
140
+ */
141
+ export async function writeWorkflowRules(plan, options = {}) {
142
+ const say = (line) => {
143
+ if (!options.silent)
144
+ console.log(line);
145
+ };
81
146
  for (const entry of plan) {
82
147
  if (entry.action !== 'unchanged') {
83
148
  await FileSystemUtils.writeFile(entry.destination, entry.content);
84
149
  }
85
- console.log(`Rules ${entry.action}: ${entry.destination}`);
150
+ say(`Rules ${entry.action}: ${entry.destination}`);
151
+ // After the write, never before: a failure between the two would otherwise
152
+ // leave the project with no rule document at all.
153
+ if (entry.retire) {
154
+ await fs.rm(entry.retire, { force: true });
155
+ say(`Rules removed (renamed): ${entry.retire}`);
156
+ }
86
157
  }
87
158
  // Kept, not dropped, when the rules moved to `.agents`: Codex reads command
88
159
  // approval rules, AGENTS.md and skill files, never project Markdown under
89
160
  // rules/. Relocating the file did not give it a loading path, so removing the
90
161
  // notice would turn a known limitation into a silent failure.
91
162
  if (plan.some((entry) => entry.toolId === CODEX_TARGET_ID)) {
92
- console.log('Codex: rule documents are reference material; configure loading yourself. Markdown files in .agents/rules/ are not automatically loaded as instructions — Codex takes its text guidance from AGENTS.md and skill files.');
163
+ say('Codex: rule documents are reference material; configure loading yourself. Markdown files in .agents/rules/ are not automatically loaded as instructions — Codex takes its text guidance from AGENTS.md and skill files.');
93
164
  }
94
165
  }
95
166
  //# sourceMappingURL=rules-generation.js.map