@specforge/cli 0.1.0 → 0.2.5

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 (648) hide show
  1. package/dist/cli/commands/debug/register.js +1 -1
  2. package/dist/cli/commands/debug/register.js.map +1 -1
  3. package/dist/cli/commands/debug/types.d.ts.map +1 -1
  4. package/dist/cli/commands/debug/types.js +4 -2
  5. package/dist/cli/commands/debug/types.js.map +1 -1
  6. package/dist/cli/commands/init.types.d.ts +4 -4
  7. package/dist/cli/commands/init.types.d.ts.map +1 -1
  8. package/dist/cli/commands/init.types.js.map +1 -1
  9. package/dist/cli/commands/scaffold/agent-types.js +1 -1
  10. package/dist/cli/commands/scaffold/agent-types.js.map +1 -1
  11. package/dist/cli/config/agent-teams.types.d.ts +35 -12
  12. package/dist/cli/config/agent-teams.types.d.ts.map +1 -1
  13. package/dist/cli/config/agent-teams.types.js.map +1 -1
  14. package/dist/cli/templates/agents/content/core/sfag-orchestrator.d.ts +21 -3
  15. package/dist/cli/templates/agents/content/core/sfag-orchestrator.d.ts.map +1 -1
  16. package/dist/cli/templates/agents/content/core/sfag-orchestrator.js +114 -48
  17. package/dist/cli/templates/agents/content/core/sfag-orchestrator.js.map +1 -1
  18. package/dist/cli/templates/agents/content/core/sfag-spec-creator.d.ts.map +1 -1
  19. package/dist/cli/templates/agents/content/core/sfag-spec-creator.js +124 -83
  20. package/dist/cli/templates/agents/content/core/sfag-spec-creator.js.map +1 -1
  21. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.d.ts +22 -3
  22. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.d.ts.map +1 -1
  23. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.js +225 -160
  24. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.js.map +1 -1
  25. package/dist/cli/templates/agents/content/core/sfag-work-resolver.d.ts +16 -0
  26. package/dist/cli/templates/agents/content/core/sfag-work-resolver.d.ts.map +1 -0
  27. package/dist/cli/templates/agents/content/core/sfag-work-resolver.js +199 -0
  28. package/dist/cli/templates/agents/content/core/sfag-work-resolver.js.map +1 -0
  29. package/dist/cli/templates/agents/index.d.ts.map +1 -1
  30. package/dist/cli/templates/agents/index.js +2 -0
  31. package/dist/cli/templates/agents/index.js.map +1 -1
  32. package/dist/cli/templates/content/sf-commit.d.ts +1 -1
  33. package/dist/cli/templates/content/sf-commit.d.ts.map +1 -1
  34. package/dist/cli/templates/content/sf-commit.js +2 -2
  35. package/dist/cli/templates/content/sf-commit.js.map +1 -1
  36. package/dist/cli/templates/content/sf-reset.d.ts +5 -2
  37. package/dist/cli/templates/content/sf-reset.d.ts.map +1 -1
  38. package/dist/cli/templates/content/sf-reset.js +41 -27
  39. package/dist/cli/templates/content/sf-reset.js.map +1 -1
  40. package/dist/lib/prompt-generator.d.ts +15 -3
  41. package/dist/lib/prompt-generator.d.ts.map +1 -1
  42. package/dist/lib/prompt-generator.js +14 -6
  43. package/dist/lib/prompt-generator.js.map +1 -1
  44. package/dist/lib/workflow-definitions.js +2 -2
  45. package/dist/lib/workflow-definitions.js.map +1 -1
  46. package/dist/server.d.ts.map +1 -1
  47. package/dist/server.js +2 -1
  48. package/dist/server.js.map +1 -1
  49. package/dist/tools/__tests__/complete-planning-double-call.test.d.ts +2 -0
  50. package/dist/tools/__tests__/complete-planning-double-call.test.d.ts.map +1 -0
  51. package/dist/tools/core/__tests__/file-existence-injection.test.d.ts +2 -0
  52. package/dist/tools/core/__tests__/file-existence-injection.test.d.ts.map +1 -0
  53. package/dist/tools/core/__tests__/git-injection.test.d.ts +2 -0
  54. package/dist/tools/core/__tests__/git-injection.test.d.ts.map +1 -0
  55. package/dist/tools/core/file-existence-injection.d.ts +22 -0
  56. package/dist/tools/core/file-existence-injection.d.ts.map +1 -0
  57. package/dist/tools/core/file-existence-injection.js +49 -0
  58. package/dist/tools/core/file-existence-injection.js.map +1 -0
  59. package/dist/tools/core/git-injection.d.ts +58 -0
  60. package/dist/tools/core/git-injection.d.ts.map +1 -0
  61. package/dist/tools/core/git-injection.js +79 -0
  62. package/dist/tools/core/git-injection.js.map +1 -0
  63. package/dist/tools/core/index.d.ts +1 -0
  64. package/dist/tools/core/index.d.ts.map +1 -1
  65. package/dist/tools/core/index.js +1 -0
  66. package/dist/tools/core/index.js.map +1 -1
  67. package/dist/tools/index.d.ts.map +1 -1
  68. package/dist/tools/index.js +358 -440
  69. package/dist/tools/index.js.map +1 -1
  70. package/dist/transport/__tests__/remote.test.d.ts +2 -0
  71. package/dist/transport/__tests__/remote.test.d.ts.map +1 -0
  72. package/dist/transport/remote.d.ts.map +1 -1
  73. package/dist/transport/remote.js +23 -4
  74. package/dist/transport/remote.js.map +1 -1
  75. package/dist/types/index.d.ts +12 -32
  76. package/dist/types/index.d.ts.map +1 -1
  77. package/dist/types/index.js.map +1 -1
  78. package/dist/validation/index.d.ts.map +1 -1
  79. package/dist/validation/index.js +0 -15
  80. package/dist/validation/index.js.map +1 -1
  81. package/node_modules/@specforge/api-types/README.md +38 -0
  82. package/node_modules/@specforge/api-types/dist/client/appsync-client.d.ts +21 -0
  83. package/node_modules/@specforge/api-types/dist/client/appsync-client.d.ts.map +1 -0
  84. package/node_modules/@specforge/api-types/dist/client/appsync-client.js +2 -0
  85. package/node_modules/@specforge/api-types/dist/client/appsync-client.js.map +1 -0
  86. package/node_modules/@specforge/api-types/dist/client/index.d.ts +2 -0
  87. package/node_modules/@specforge/api-types/dist/client/index.d.ts.map +1 -0
  88. package/node_modules/@specforge/api-types/dist/client/index.js +2 -0
  89. package/node_modules/@specforge/api-types/dist/client/index.js.map +1 -0
  90. package/node_modules/@specforge/api-types/dist/index.d.ts +5 -0
  91. package/node_modules/@specforge/api-types/dist/index.d.ts.map +1 -0
  92. package/node_modules/@specforge/api-types/dist/index.js +9 -0
  93. package/node_modules/@specforge/api-types/dist/index.js.map +1 -0
  94. package/node_modules/@specforge/api-types/dist/mcp/error-guidance.d.ts +74 -0
  95. package/node_modules/@specforge/api-types/dist/mcp/error-guidance.d.ts.map +1 -0
  96. package/node_modules/@specforge/api-types/dist/mcp/error-guidance.js +21 -0
  97. package/node_modules/@specforge/api-types/dist/mcp/error-guidance.js.map +1 -0
  98. package/node_modules/@specforge/api-types/dist/mcp/index.d.ts +4 -0
  99. package/node_modules/@specforge/api-types/dist/mcp/index.d.ts.map +1 -0
  100. package/node_modules/@specforge/api-types/dist/mcp/index.js +8 -0
  101. package/node_modules/@specforge/api-types/dist/mcp/index.js.map +1 -0
  102. package/node_modules/@specforge/api-types/dist/mcp/lifecycle-envelope.d.ts +18 -0
  103. package/node_modules/@specforge/api-types/dist/mcp/lifecycle-envelope.d.ts.map +1 -0
  104. package/node_modules/@specforge/api-types/dist/mcp/lifecycle-envelope.js +2 -0
  105. package/node_modules/@specforge/api-types/dist/mcp/lifecycle-envelope.js.map +1 -0
  106. package/node_modules/@specforge/api-types/dist/mcp/standard-envelope.d.ts +39 -0
  107. package/node_modules/@specforge/api-types/dist/mcp/standard-envelope.d.ts.map +1 -0
  108. package/node_modules/@specforge/api-types/dist/mcp/standard-envelope.js +2 -0
  109. package/node_modules/@specforge/api-types/dist/mcp/standard-envelope.js.map +1 -0
  110. package/node_modules/@specforge/api-types/dist/runtime/billing-record.d.ts +18 -0
  111. package/node_modules/@specforge/api-types/dist/runtime/billing-record.d.ts.map +1 -0
  112. package/node_modules/@specforge/api-types/dist/runtime/billing-record.js +7 -0
  113. package/node_modules/@specforge/api-types/dist/runtime/billing-record.js.map +1 -0
  114. package/node_modules/@specforge/api-types/dist/runtime/blueprint-record.d.ts +40 -0
  115. package/node_modules/@specforge/api-types/dist/runtime/blueprint-record.d.ts.map +1 -0
  116. package/node_modules/@specforge/api-types/dist/runtime/blueprint-record.js +19 -0
  117. package/node_modules/@specforge/api-types/dist/runtime/blueprint-record.js.map +1 -0
  118. package/node_modules/@specforge/api-types/dist/runtime/dependency-tree.d.ts +96 -0
  119. package/node_modules/@specforge/api-types/dist/runtime/dependency-tree.d.ts.map +1 -0
  120. package/node_modules/@specforge/api-types/dist/runtime/dependency-tree.js +23 -0
  121. package/node_modules/@specforge/api-types/dist/runtime/dependency-tree.js.map +1 -0
  122. package/node_modules/@specforge/api-types/dist/runtime/epic-record.d.ts +117 -0
  123. package/node_modules/@specforge/api-types/dist/runtime/epic-record.d.ts.map +1 -0
  124. package/node_modules/@specforge/api-types/dist/runtime/epic-record.js +13 -0
  125. package/node_modules/@specforge/api-types/dist/runtime/epic-record.js.map +1 -0
  126. package/node_modules/@specforge/api-types/dist/runtime/feedback-record.d.ts +27 -0
  127. package/node_modules/@specforge/api-types/dist/runtime/feedback-record.d.ts.map +1 -0
  128. package/node_modules/@specforge/api-types/dist/runtime/feedback-record.js +7 -0
  129. package/node_modules/@specforge/api-types/dist/runtime/feedback-record.js.map +1 -0
  130. package/node_modules/@specforge/api-types/dist/runtime/fields.d.ts +31 -0
  131. package/node_modules/@specforge/api-types/dist/runtime/fields.d.ts.map +1 -0
  132. package/node_modules/@specforge/api-types/dist/runtime/fields.js +156 -0
  133. package/node_modules/@specforge/api-types/dist/runtime/fields.js.map +1 -0
  134. package/node_modules/@specforge/api-types/dist/runtime/index.d.ts +18 -0
  135. package/node_modules/@specforge/api-types/dist/runtime/index.d.ts.map +1 -0
  136. package/node_modules/@specforge/api-types/dist/runtime/index.js +18 -0
  137. package/node_modules/@specforge/api-types/dist/runtime/index.js.map +1 -0
  138. package/node_modules/@specforge/api-types/dist/runtime/pagination.d.ts +38 -0
  139. package/node_modules/@specforge/api-types/dist/runtime/pagination.d.ts.map +1 -0
  140. package/node_modules/@specforge/api-types/dist/runtime/pagination.js +54 -0
  141. package/node_modules/@specforge/api-types/dist/runtime/pagination.js.map +1 -0
  142. package/node_modules/@specforge/api-types/dist/runtime/project-invitation.d.ts +14 -0
  143. package/node_modules/@specforge/api-types/dist/runtime/project-invitation.d.ts.map +1 -0
  144. package/node_modules/@specforge/api-types/dist/runtime/project-invitation.js +2 -0
  145. package/node_modules/@specforge/api-types/dist/runtime/project-invitation.js.map +1 -0
  146. package/node_modules/@specforge/api-types/dist/runtime/project-member.d.ts +13 -0
  147. package/node_modules/@specforge/api-types/dist/runtime/project-member.d.ts.map +1 -0
  148. package/node_modules/@specforge/api-types/dist/runtime/project-member.js +2 -0
  149. package/node_modules/@specforge/api-types/dist/runtime/project-member.js.map +1 -0
  150. package/node_modules/@specforge/api-types/dist/runtime/project-validation.d.ts +26 -0
  151. package/node_modules/@specforge/api-types/dist/runtime/project-validation.d.ts.map +1 -0
  152. package/node_modules/@specforge/api-types/dist/runtime/project-validation.js +5 -0
  153. package/node_modules/@specforge/api-types/dist/runtime/project-validation.js.map +1 -0
  154. package/node_modules/@specforge/api-types/dist/runtime/project.d.ts +55 -0
  155. package/node_modules/@specforge/api-types/dist/runtime/project.d.ts.map +1 -0
  156. package/node_modules/@specforge/api-types/dist/runtime/project.js +10 -0
  157. package/node_modules/@specforge/api-types/dist/runtime/project.js.map +1 -0
  158. package/node_modules/@specforge/api-types/dist/runtime/response.d.ts +22 -0
  159. package/node_modules/@specforge/api-types/dist/runtime/response.d.ts.map +1 -0
  160. package/node_modules/@specforge/api-types/dist/runtime/response.js +14 -0
  161. package/node_modules/@specforge/api-types/dist/runtime/response.js.map +1 -0
  162. package/node_modules/@specforge/api-types/dist/runtime/specification-record.d.ts +90 -0
  163. package/node_modules/@specforge/api-types/dist/runtime/specification-record.d.ts.map +1 -0
  164. package/node_modules/@specforge/api-types/dist/runtime/specification-record.js +11 -0
  165. package/node_modules/@specforge/api-types/dist/runtime/specification-record.js.map +1 -0
  166. package/node_modules/@specforge/api-types/dist/runtime/status.d.ts +26 -0
  167. package/node_modules/@specforge/api-types/dist/runtime/status.d.ts.map +1 -0
  168. package/node_modules/@specforge/api-types/dist/runtime/status.js +56 -0
  169. package/node_modules/@specforge/api-types/dist/runtime/status.js.map +1 -0
  170. package/node_modules/@specforge/api-types/dist/runtime/summary.d.ts +58 -0
  171. package/node_modules/@specforge/api-types/dist/runtime/summary.d.ts.map +1 -0
  172. package/node_modules/@specforge/api-types/dist/runtime/summary.js +42 -0
  173. package/node_modules/@specforge/api-types/dist/runtime/summary.js.map +1 -0
  174. package/node_modules/@specforge/api-types/dist/runtime/ticket-record.d.ts +212 -0
  175. package/node_modules/@specforge/api-types/dist/runtime/ticket-record.d.ts.map +1 -0
  176. package/node_modules/@specforge/api-types/dist/runtime/ticket-record.js +18 -0
  177. package/node_modules/@specforge/api-types/dist/runtime/ticket-record.js.map +1 -0
  178. package/node_modules/@specforge/api-types/dist/runtime/user.d.ts +13 -0
  179. package/node_modules/@specforge/api-types/dist/runtime/user.d.ts.map +1 -0
  180. package/node_modules/@specforge/api-types/dist/runtime/user.js +9 -0
  181. package/node_modules/@specforge/api-types/dist/runtime/user.js.map +1 -0
  182. package/node_modules/@specforge/api-types/dist/stores/i-billing-store.d.ts +17 -0
  183. package/node_modules/@specforge/api-types/dist/stores/i-billing-store.d.ts.map +1 -0
  184. package/node_modules/@specforge/api-types/dist/stores/i-billing-store.js +2 -0
  185. package/node_modules/@specforge/api-types/dist/stores/i-billing-store.js.map +1 -0
  186. package/node_modules/@specforge/api-types/dist/stores/i-blueprint-store.d.ts +59 -0
  187. package/node_modules/@specforge/api-types/dist/stores/i-blueprint-store.d.ts.map +1 -0
  188. package/node_modules/@specforge/api-types/dist/stores/i-blueprint-store.js +2 -0
  189. package/node_modules/@specforge/api-types/dist/stores/i-blueprint-store.js.map +1 -0
  190. package/node_modules/@specforge/api-types/dist/stores/i-epic-store.d.ts +120 -0
  191. package/node_modules/@specforge/api-types/dist/stores/i-epic-store.d.ts.map +1 -0
  192. package/node_modules/@specforge/api-types/dist/stores/i-epic-store.js +2 -0
  193. package/node_modules/@specforge/api-types/dist/stores/i-epic-store.js.map +1 -0
  194. package/node_modules/@specforge/api-types/dist/stores/i-feedback-store.d.ts +13 -0
  195. package/node_modules/@specforge/api-types/dist/stores/i-feedback-store.d.ts.map +1 -0
  196. package/node_modules/@specforge/api-types/dist/stores/i-feedback-store.js +2 -0
  197. package/node_modules/@specforge/api-types/dist/stores/i-feedback-store.js.map +1 -0
  198. package/node_modules/@specforge/api-types/dist/stores/i-project-store.d.ts +48 -0
  199. package/node_modules/@specforge/api-types/dist/stores/i-project-store.d.ts.map +1 -0
  200. package/node_modules/@specforge/api-types/dist/stores/i-project-store.js +2 -0
  201. package/node_modules/@specforge/api-types/dist/stores/i-project-store.js.map +1 -0
  202. package/node_modules/@specforge/api-types/dist/stores/i-sharing-store.d.ts +37 -0
  203. package/node_modules/@specforge/api-types/dist/stores/i-sharing-store.d.ts.map +1 -0
  204. package/node_modules/@specforge/api-types/dist/stores/i-sharing-store.js +2 -0
  205. package/node_modules/@specforge/api-types/dist/stores/i-sharing-store.js.map +1 -0
  206. package/node_modules/@specforge/api-types/dist/stores/i-spec-store.d.ts +159 -0
  207. package/node_modules/@specforge/api-types/dist/stores/i-spec-store.d.ts.map +1 -0
  208. package/node_modules/@specforge/api-types/dist/stores/i-spec-store.js +2 -0
  209. package/node_modules/@specforge/api-types/dist/stores/i-spec-store.js.map +1 -0
  210. package/node_modules/@specforge/api-types/dist/stores/i-ticket-dependency-store.d.ts +87 -0
  211. package/node_modules/@specforge/api-types/dist/stores/i-ticket-dependency-store.d.ts.map +1 -0
  212. package/node_modules/@specforge/api-types/dist/stores/i-ticket-dependency-store.js +2 -0
  213. package/node_modules/@specforge/api-types/dist/stores/i-ticket-dependency-store.js.map +1 -0
  214. package/node_modules/@specforge/api-types/dist/stores/i-ticket-store.d.ts +347 -0
  215. package/node_modules/@specforge/api-types/dist/stores/i-ticket-store.d.ts.map +1 -0
  216. package/node_modules/@specforge/api-types/dist/stores/i-ticket-store.js +2 -0
  217. package/node_modules/@specforge/api-types/dist/stores/i-ticket-store.js.map +1 -0
  218. package/node_modules/@specforge/api-types/dist/stores/i-user-store.d.ts +5 -0
  219. package/node_modules/@specforge/api-types/dist/stores/i-user-store.d.ts.map +1 -0
  220. package/node_modules/@specforge/api-types/dist/stores/i-user-store.js +2 -0
  221. package/node_modules/@specforge/api-types/dist/stores/i-user-store.js.map +1 -0
  222. package/node_modules/@specforge/api-types/dist/stores/index.d.ts +11 -0
  223. package/node_modules/@specforge/api-types/dist/stores/index.d.ts.map +1 -0
  224. package/node_modules/@specforge/api-types/dist/stores/index.js +11 -0
  225. package/node_modules/@specforge/api-types/dist/stores/index.js.map +1 -0
  226. package/node_modules/@specforge/api-types/package.json +43 -0
  227. package/node_modules/@specforge/report-types/README.md +11 -0
  228. package/node_modules/@specforge/report-types/dist/index.d.ts +2 -0
  229. package/node_modules/@specforge/report-types/dist/index.d.ts.map +1 -0
  230. package/node_modules/@specforge/report-types/dist/index.js +2 -0
  231. package/node_modules/@specforge/report-types/dist/index.js.map +1 -0
  232. package/node_modules/@specforge/report-types/dist/reports.d.ts +90 -0
  233. package/node_modules/@specforge/report-types/dist/reports.d.ts.map +1 -0
  234. package/node_modules/@specforge/report-types/dist/reports.js +15 -0
  235. package/node_modules/@specforge/report-types/dist/reports.js.map +1 -0
  236. package/node_modules/@specforge/report-types/package.json +40 -0
  237. package/node_modules/@specforge/session-types/CHANGELOG.md +56 -0
  238. package/node_modules/@specforge/session-types/README.md +18 -0
  239. package/node_modules/@specforge/session-types/dist/index.d.ts +47 -0
  240. package/node_modules/@specforge/session-types/dist/index.d.ts.map +1 -0
  241. package/node_modules/@specforge/session-types/dist/index.js +47 -0
  242. package/node_modules/@specforge/session-types/dist/index.js.map +1 -0
  243. package/node_modules/@specforge/session-types/dist/runtime/aggregator-input.d.ts +46 -0
  244. package/node_modules/@specforge/session-types/dist/runtime/aggregator-input.d.ts.map +1 -0
  245. package/node_modules/@specforge/session-types/dist/runtime/aggregator-input.js +41 -0
  246. package/node_modules/@specforge/session-types/dist/runtime/aggregator-input.js.map +1 -0
  247. package/node_modules/@specforge/session-types/dist/runtime/discovery.d.ts +9 -0
  248. package/node_modules/@specforge/session-types/dist/runtime/discovery.d.ts.map +1 -0
  249. package/node_modules/@specforge/session-types/dist/runtime/discovery.js +2 -0
  250. package/node_modules/@specforge/session-types/dist/runtime/discovery.js.map +1 -0
  251. package/node_modules/@specforge/session-types/dist/runtime/enums.d.ts +51 -0
  252. package/node_modules/@specforge/session-types/dist/runtime/enums.d.ts.map +1 -0
  253. package/node_modules/@specforge/session-types/dist/runtime/enums.js +161 -0
  254. package/node_modules/@specforge/session-types/dist/runtime/enums.js.map +1 -0
  255. package/node_modules/@specforge/session-types/dist/runtime/implementation-config.d.ts +177 -0
  256. package/node_modules/@specforge/session-types/dist/runtime/implementation-config.d.ts.map +1 -0
  257. package/node_modules/@specforge/session-types/dist/runtime/implementation-config.js +96 -0
  258. package/node_modules/@specforge/session-types/dist/runtime/implementation-config.js.map +1 -0
  259. package/node_modules/@specforge/session-types/dist/runtime/implementation-record-event.d.ts +8 -0
  260. package/node_modules/@specforge/session-types/dist/runtime/implementation-record-event.d.ts.map +1 -0
  261. package/node_modules/@specforge/session-types/dist/runtime/implementation-record-event.js +2 -0
  262. package/node_modules/@specforge/session-types/dist/runtime/implementation-record-event.js.map +1 -0
  263. package/node_modules/@specforge/session-types/dist/runtime/implementation-session-aggregate.d.ts +489 -0
  264. package/node_modules/@specforge/session-types/dist/runtime/implementation-session-aggregate.d.ts.map +1 -0
  265. package/node_modules/@specforge/session-types/dist/runtime/implementation-session-aggregate.js +152 -0
  266. package/node_modules/@specforge/session-types/dist/runtime/implementation-session-aggregate.js.map +1 -0
  267. package/node_modules/@specforge/session-types/dist/runtime/implementation-session.d.ts +8 -0
  268. package/node_modules/@specforge/session-types/dist/runtime/implementation-session.d.ts.map +1 -0
  269. package/node_modules/@specforge/session-types/dist/runtime/implementation-session.js +2 -0
  270. package/node_modules/@specforge/session-types/dist/runtime/implementation-session.js.map +1 -0
  271. package/node_modules/@specforge/session-types/dist/runtime/lifecycle-contract.d.ts +319 -0
  272. package/node_modules/@specforge/session-types/dist/runtime/lifecycle-contract.d.ts.map +1 -0
  273. package/node_modules/@specforge/session-types/dist/runtime/lifecycle-contract.js +2 -0
  274. package/node_modules/@specforge/session-types/dist/runtime/lifecycle-contract.js.map +1 -0
  275. package/node_modules/@specforge/session-types/dist/runtime/lifecycle-planning-guidance.d.ts +128 -0
  276. package/node_modules/@specforge/session-types/dist/runtime/lifecycle-planning-guidance.d.ts.map +1 -0
  277. package/node_modules/@specforge/session-types/dist/runtime/lifecycle-planning-guidance.js +30 -0
  278. package/node_modules/@specforge/session-types/dist/runtime/lifecycle-planning-guidance.js.map +1 -0
  279. package/node_modules/@specforge/session-types/dist/runtime/parsed-git-evidence.d.ts +4 -0
  280. package/node_modules/@specforge/session-types/dist/runtime/parsed-git-evidence.d.ts.map +1 -0
  281. package/node_modules/@specforge/session-types/dist/runtime/parsed-git-evidence.js +2 -0
  282. package/node_modules/@specforge/session-types/dist/runtime/parsed-git-evidence.js.map +1 -0
  283. package/node_modules/@specforge/session-types/dist/runtime/planning-config.d.ts +82 -0
  284. package/node_modules/@specforge/session-types/dist/runtime/planning-config.d.ts.map +1 -0
  285. package/node_modules/@specforge/session-types/dist/runtime/planning-config.js +61 -0
  286. package/node_modules/@specforge/session-types/dist/runtime/planning-config.js.map +1 -0
  287. package/node_modules/@specforge/session-types/dist/runtime/planning-entity-score-datapoint.d.ts +34 -0
  288. package/node_modules/@specforge/session-types/dist/runtime/planning-entity-score-datapoint.d.ts.map +1 -0
  289. package/node_modules/@specforge/session-types/dist/runtime/planning-entity-score-datapoint.js +14 -0
  290. package/node_modules/@specforge/session-types/dist/runtime/planning-entity-score-datapoint.js.map +1 -0
  291. package/node_modules/@specforge/session-types/dist/runtime/planning-operations.d.ts +6 -0
  292. package/node_modules/@specforge/session-types/dist/runtime/planning-operations.d.ts.map +1 -0
  293. package/node_modules/@specforge/session-types/dist/runtime/planning-operations.js +65 -0
  294. package/node_modules/@specforge/session-types/dist/runtime/planning-operations.js.map +1 -0
  295. package/node_modules/@specforge/session-types/dist/runtime/planning-phase-transition.d.ts +34 -0
  296. package/node_modules/@specforge/session-types/dist/runtime/planning-phase-transition.d.ts.map +1 -0
  297. package/node_modules/@specforge/session-types/dist/runtime/planning-phase-transition.js +22 -0
  298. package/node_modules/@specforge/session-types/dist/runtime/planning-phase-transition.js.map +1 -0
  299. package/node_modules/@specforge/session-types/dist/runtime/planning-session-action.d.ts +73 -0
  300. package/node_modules/@specforge/session-types/dist/runtime/planning-session-action.d.ts.map +1 -0
  301. package/node_modules/@specforge/session-types/dist/runtime/planning-session-action.js +61 -0
  302. package/node_modules/@specforge/session-types/dist/runtime/planning-session-action.js.map +1 -0
  303. package/node_modules/@specforge/session-types/dist/runtime/planning-session-aggregate.d.ts +249 -0
  304. package/node_modules/@specforge/session-types/dist/runtime/planning-session-aggregate.d.ts.map +1 -0
  305. package/node_modules/@specforge/session-types/dist/runtime/planning-session-aggregate.js +96 -0
  306. package/node_modules/@specforge/session-types/dist/runtime/planning-session-aggregate.js.map +1 -0
  307. package/node_modules/@specforge/session-types/dist/runtime/planning-session.d.ts +574 -0
  308. package/node_modules/@specforge/session-types/dist/runtime/planning-session.d.ts.map +1 -0
  309. package/node_modules/@specforge/session-types/dist/runtime/planning-session.js +40 -0
  310. package/node_modules/@specforge/session-types/dist/runtime/planning-session.js.map +1 -0
  311. package/node_modules/@specforge/session-types/dist/runtime/process-guidance.d.ts +221 -0
  312. package/node_modules/@specforge/session-types/dist/runtime/process-guidance.d.ts.map +1 -0
  313. package/node_modules/@specforge/session-types/dist/runtime/process-guidance.js +41 -0
  314. package/node_modules/@specforge/session-types/dist/runtime/process-guidance.js.map +1 -0
  315. package/node_modules/@specforge/session-types/dist/runtime/work-session-acceptance-check.d.ts +4 -0
  316. package/node_modules/@specforge/session-types/dist/runtime/work-session-acceptance-check.d.ts.map +1 -0
  317. package/node_modules/@specforge/session-types/dist/runtime/work-session-acceptance-check.js +2 -0
  318. package/node_modules/@specforge/session-types/dist/runtime/work-session-acceptance-check.js.map +1 -0
  319. package/node_modules/@specforge/session-types/dist/runtime/work-session-action.d.ts +9 -0
  320. package/node_modules/@specforge/session-types/dist/runtime/work-session-action.d.ts.map +1 -0
  321. package/node_modules/@specforge/session-types/dist/runtime/work-session-action.js +2 -0
  322. package/node_modules/@specforge/session-types/dist/runtime/work-session-action.js.map +1 -0
  323. package/node_modules/@specforge/session-types/dist/runtime/work-session-file-change.d.ts +4 -0
  324. package/node_modules/@specforge/session-types/dist/runtime/work-session-file-change.d.ts.map +1 -0
  325. package/node_modules/@specforge/session-types/dist/runtime/work-session-file-change.js +2 -0
  326. package/node_modules/@specforge/session-types/dist/runtime/work-session-file-change.js.map +1 -0
  327. package/node_modules/@specforge/session-types/dist/runtime/work-session-impl-step-completion.d.ts +4 -0
  328. package/node_modules/@specforge/session-types/dist/runtime/work-session-impl-step-completion.d.ts.map +1 -0
  329. package/node_modules/@specforge/session-types/dist/runtime/work-session-impl-step-completion.js +2 -0
  330. package/node_modules/@specforge/session-types/dist/runtime/work-session-impl-step-completion.js.map +1 -0
  331. package/node_modules/@specforge/session-types/dist/runtime/work-session-resolution.d.ts +4 -0
  332. package/node_modules/@specforge/session-types/dist/runtime/work-session-resolution.d.ts.map +1 -0
  333. package/node_modules/@specforge/session-types/dist/runtime/work-session-resolution.js +2 -0
  334. package/node_modules/@specforge/session-types/dist/runtime/work-session-resolution.js.map +1 -0
  335. package/node_modules/@specforge/session-types/dist/runtime/work-session-test-result.d.ts +4 -0
  336. package/node_modules/@specforge/session-types/dist/runtime/work-session-test-result.d.ts.map +1 -0
  337. package/node_modules/@specforge/session-types/dist/runtime/work-session-test-result.js +2 -0
  338. package/node_modules/@specforge/session-types/dist/runtime/work-session-test-result.js.map +1 -0
  339. package/node_modules/@specforge/session-types/dist/runtime/work-session.d.ts +4 -0
  340. package/node_modules/@specforge/session-types/dist/runtime/work-session.d.ts.map +1 -0
  341. package/node_modules/@specforge/session-types/dist/runtime/work-session.js +2 -0
  342. package/node_modules/@specforge/session-types/dist/runtime/work-session.js.map +1 -0
  343. package/node_modules/@specforge/session-types/dist/runtime/working-context.d.ts +43 -0
  344. package/node_modules/@specforge/session-types/dist/runtime/working-context.d.ts.map +1 -0
  345. package/node_modules/@specforge/session-types/dist/runtime/working-context.js +2 -0
  346. package/node_modules/@specforge/session-types/dist/runtime/working-context.js.map +1 -0
  347. package/node_modules/@specforge/session-types/dist/runtime/write-plan.d.ts +146 -0
  348. package/node_modules/@specforge/session-types/dist/runtime/write-plan.d.ts.map +1 -0
  349. package/node_modules/@specforge/session-types/dist/runtime/write-plan.js +2 -0
  350. package/node_modules/@specforge/session-types/dist/runtime/write-plan.js.map +1 -0
  351. package/node_modules/@specforge/session-types/dist/schema/discovery.d.ts +76 -0
  352. package/node_modules/@specforge/session-types/dist/schema/discovery.d.ts.map +1 -0
  353. package/node_modules/@specforge/session-types/dist/schema/discovery.js +42 -0
  354. package/node_modules/@specforge/session-types/dist/schema/discovery.js.map +1 -0
  355. package/node_modules/@specforge/session-types/dist/schema/implementation-record-event.d.ts +48 -0
  356. package/node_modules/@specforge/session-types/dist/schema/implementation-record-event.d.ts.map +1 -0
  357. package/node_modules/@specforge/session-types/dist/schema/implementation-record-event.js +28 -0
  358. package/node_modules/@specforge/session-types/dist/schema/implementation-record-event.js.map +1 -0
  359. package/node_modules/@specforge/session-types/dist/schema/implementation-session.d.ts +37 -0
  360. package/node_modules/@specforge/session-types/dist/schema/implementation-session.d.ts.map +1 -0
  361. package/node_modules/@specforge/session-types/dist/schema/implementation-session.js +24 -0
  362. package/node_modules/@specforge/session-types/dist/schema/implementation-session.js.map +1 -0
  363. package/node_modules/@specforge/session-types/dist/schema/index.d.ts +12 -0
  364. package/node_modules/@specforge/session-types/dist/schema/index.d.ts.map +1 -0
  365. package/node_modules/@specforge/session-types/dist/schema/index.js +12 -0
  366. package/node_modules/@specforge/session-types/dist/schema/index.js.map +1 -0
  367. package/node_modules/@specforge/session-types/dist/schema/parsed-git-evidence.d.ts +74 -0
  368. package/node_modules/@specforge/session-types/dist/schema/parsed-git-evidence.d.ts.map +1 -0
  369. package/node_modules/@specforge/session-types/dist/schema/parsed-git-evidence.js +31 -0
  370. package/node_modules/@specforge/session-types/dist/schema/parsed-git-evidence.js.map +1 -0
  371. package/node_modules/@specforge/session-types/dist/schema/work-session-acceptance-check.d.ts +27 -0
  372. package/node_modules/@specforge/session-types/dist/schema/work-session-acceptance-check.d.ts.map +1 -0
  373. package/node_modules/@specforge/session-types/dist/schema/work-session-acceptance-check.js +11 -0
  374. package/node_modules/@specforge/session-types/dist/schema/work-session-acceptance-check.js.map +1 -0
  375. package/node_modules/@specforge/session-types/dist/schema/work-session-action.d.ts +94 -0
  376. package/node_modules/@specforge/session-types/dist/schema/work-session-action.d.ts.map +1 -0
  377. package/node_modules/@specforge/session-types/dist/schema/work-session-action.js +76 -0
  378. package/node_modules/@specforge/session-types/dist/schema/work-session-action.js.map +1 -0
  379. package/node_modules/@specforge/session-types/dist/schema/work-session-file-change.d.ts +42 -0
  380. package/node_modules/@specforge/session-types/dist/schema/work-session-file-change.d.ts.map +1 -0
  381. package/node_modules/@specforge/session-types/dist/schema/work-session-file-change.js +25 -0
  382. package/node_modules/@specforge/session-types/dist/schema/work-session-file-change.js.map +1 -0
  383. package/node_modules/@specforge/session-types/dist/schema/work-session-impl-step-completion.d.ts +27 -0
  384. package/node_modules/@specforge/session-types/dist/schema/work-session-impl-step-completion.d.ts.map +1 -0
  385. package/node_modules/@specforge/session-types/dist/schema/work-session-impl-step-completion.js +11 -0
  386. package/node_modules/@specforge/session-types/dist/schema/work-session-impl-step-completion.js.map +1 -0
  387. package/node_modules/@specforge/session-types/dist/schema/work-session-resolution.d.ts +42 -0
  388. package/node_modules/@specforge/session-types/dist/schema/work-session-resolution.d.ts.map +1 -0
  389. package/node_modules/@specforge/session-types/dist/schema/work-session-resolution.js +28 -0
  390. package/node_modules/@specforge/session-types/dist/schema/work-session-resolution.js.map +1 -0
  391. package/node_modules/@specforge/session-types/dist/schema/work-session-test-result.d.ts +72 -0
  392. package/node_modules/@specforge/session-types/dist/schema/work-session-test-result.d.ts.map +1 -0
  393. package/node_modules/@specforge/session-types/dist/schema/work-session-test-result.js +43 -0
  394. package/node_modules/@specforge/session-types/dist/schema/work-session-test-result.js.map +1 -0
  395. package/node_modules/@specforge/session-types/dist/schema/work-session.d.ts +203 -0
  396. package/node_modules/@specforge/session-types/dist/schema/work-session.d.ts.map +1 -0
  397. package/node_modules/@specforge/session-types/dist/schema/work-session.js +86 -0
  398. package/node_modules/@specforge/session-types/dist/schema/work-session.js.map +1 -0
  399. package/node_modules/@specforge/session-types/dist/stores/config-store-interface.d.ts +17 -0
  400. package/node_modules/@specforge/session-types/dist/stores/config-store-interface.d.ts.map +1 -0
  401. package/node_modules/@specforge/session-types/dist/stores/config-store-interface.js +2 -0
  402. package/node_modules/@specforge/session-types/dist/stores/config-store-interface.js.map +1 -0
  403. package/node_modules/@specforge/session-types/dist/stores/discovery-store.d.ts +31 -0
  404. package/node_modules/@specforge/session-types/dist/stores/discovery-store.d.ts.map +1 -0
  405. package/node_modules/@specforge/session-types/dist/stores/discovery-store.js +2 -0
  406. package/node_modules/@specforge/session-types/dist/stores/discovery-store.js.map +1 -0
  407. package/node_modules/@specforge/session-types/dist/stores/implementation-record-event-store.d.ts +19 -0
  408. package/node_modules/@specforge/session-types/dist/stores/implementation-record-event-store.d.ts.map +1 -0
  409. package/node_modules/@specforge/session-types/dist/stores/implementation-record-event-store.js +2 -0
  410. package/node_modules/@specforge/session-types/dist/stores/implementation-record-event-store.js.map +1 -0
  411. package/node_modules/@specforge/session-types/dist/stores/implementation-session-aggregate-store.d.ts +16 -0
  412. package/node_modules/@specforge/session-types/dist/stores/implementation-session-aggregate-store.d.ts.map +1 -0
  413. package/node_modules/@specforge/session-types/dist/stores/implementation-session-aggregate-store.js +2 -0
  414. package/node_modules/@specforge/session-types/dist/stores/implementation-session-aggregate-store.js.map +1 -0
  415. package/node_modules/@specforge/session-types/dist/stores/implementation-session-store.d.ts +28 -0
  416. package/node_modules/@specforge/session-types/dist/stores/implementation-session-store.d.ts.map +1 -0
  417. package/node_modules/@specforge/session-types/dist/stores/implementation-session-store.js +2 -0
  418. package/node_modules/@specforge/session-types/dist/stores/implementation-session-store.js.map +1 -0
  419. package/node_modules/@specforge/session-types/dist/stores/planning-entity-score-datapoint-store.d.ts +12 -0
  420. package/node_modules/@specforge/session-types/dist/stores/planning-entity-score-datapoint-store.d.ts.map +1 -0
  421. package/node_modules/@specforge/session-types/dist/stores/planning-entity-score-datapoint-store.js +2 -0
  422. package/node_modules/@specforge/session-types/dist/stores/planning-entity-score-datapoint-store.js.map +1 -0
  423. package/node_modules/@specforge/session-types/dist/stores/planning-phase-transition-store.d.ts +10 -0
  424. package/node_modules/@specforge/session-types/dist/stores/planning-phase-transition-store.d.ts.map +1 -0
  425. package/node_modules/@specforge/session-types/dist/stores/planning-phase-transition-store.js +2 -0
  426. package/node_modules/@specforge/session-types/dist/stores/planning-phase-transition-store.js.map +1 -0
  427. package/node_modules/@specforge/session-types/dist/stores/planning-session-action-store.d.ts +13 -0
  428. package/node_modules/@specforge/session-types/dist/stores/planning-session-action-store.d.ts.map +1 -0
  429. package/node_modules/@specforge/session-types/dist/stores/planning-session-action-store.js +2 -0
  430. package/node_modules/@specforge/session-types/dist/stores/planning-session-action-store.js.map +1 -0
  431. package/node_modules/@specforge/session-types/dist/stores/planning-session-aggregate-store.d.ts +10 -0
  432. package/node_modules/@specforge/session-types/dist/stores/planning-session-aggregate-store.d.ts.map +1 -0
  433. package/node_modules/@specforge/session-types/dist/stores/planning-session-aggregate-store.js +2 -0
  434. package/node_modules/@specforge/session-types/dist/stores/planning-session-aggregate-store.js.map +1 -0
  435. package/node_modules/@specforge/session-types/dist/stores/planning-session-store.d.ts +20 -0
  436. package/node_modules/@specforge/session-types/dist/stores/planning-session-store.d.ts.map +1 -0
  437. package/node_modules/@specforge/session-types/dist/stores/planning-session-store.js +2 -0
  438. package/node_modules/@specforge/session-types/dist/stores/planning-session-store.js.map +1 -0
  439. package/node_modules/@specforge/session-types/dist/stores/work-session-acceptance-check-store.d.ts +15 -0
  440. package/node_modules/@specforge/session-types/dist/stores/work-session-acceptance-check-store.d.ts.map +1 -0
  441. package/node_modules/@specforge/session-types/dist/stores/work-session-acceptance-check-store.js +2 -0
  442. package/node_modules/@specforge/session-types/dist/stores/work-session-acceptance-check-store.js.map +1 -0
  443. package/node_modules/@specforge/session-types/dist/stores/work-session-action-store.d.ts +29 -0
  444. package/node_modules/@specforge/session-types/dist/stores/work-session-action-store.d.ts.map +1 -0
  445. package/node_modules/@specforge/session-types/dist/stores/work-session-action-store.js +2 -0
  446. package/node_modules/@specforge/session-types/dist/stores/work-session-action-store.js.map +1 -0
  447. package/node_modules/@specforge/session-types/dist/stores/work-session-file-change-store.d.ts +9 -0
  448. package/node_modules/@specforge/session-types/dist/stores/work-session-file-change-store.d.ts.map +1 -0
  449. package/node_modules/@specforge/session-types/dist/stores/work-session-file-change-store.js +2 -0
  450. package/node_modules/@specforge/session-types/dist/stores/work-session-file-change-store.js.map +1 -0
  451. package/node_modules/@specforge/session-types/dist/stores/work-session-impl-step-completion-store.d.ts +9 -0
  452. package/node_modules/@specforge/session-types/dist/stores/work-session-impl-step-completion-store.d.ts.map +1 -0
  453. package/node_modules/@specforge/session-types/dist/stores/work-session-impl-step-completion-store.js +2 -0
  454. package/node_modules/@specforge/session-types/dist/stores/work-session-impl-step-completion-store.js.map +1 -0
  455. package/node_modules/@specforge/session-types/dist/stores/work-session-resolution-store.d.ts +10 -0
  456. package/node_modules/@specforge/session-types/dist/stores/work-session-resolution-store.d.ts.map +1 -0
  457. package/node_modules/@specforge/session-types/dist/stores/work-session-resolution-store.js +2 -0
  458. package/node_modules/@specforge/session-types/dist/stores/work-session-resolution-store.js.map +1 -0
  459. package/node_modules/@specforge/session-types/dist/stores/work-session-store.d.ts +23 -0
  460. package/node_modules/@specforge/session-types/dist/stores/work-session-store.d.ts.map +1 -0
  461. package/node_modules/@specforge/session-types/dist/stores/work-session-store.js +2 -0
  462. package/node_modules/@specforge/session-types/dist/stores/work-session-store.js.map +1 -0
  463. package/node_modules/@specforge/session-types/dist/stores/work-session-test-result-store.d.ts +8 -0
  464. package/node_modules/@specforge/session-types/dist/stores/work-session-test-result-store.d.ts.map +1 -0
  465. package/node_modules/@specforge/session-types/dist/stores/work-session-test-result-store.js +2 -0
  466. package/node_modules/@specforge/session-types/dist/stores/work-session-test-result-store.js.map +1 -0
  467. package/node_modules/@specforge/session-types/dist/stores/working-context-store.d.ts +27 -0
  468. package/node_modules/@specforge/session-types/dist/stores/working-context-store.d.ts.map +1 -0
  469. package/node_modules/@specforge/session-types/dist/stores/working-context-store.js +2 -0
  470. package/node_modules/@specforge/session-types/dist/stores/working-context-store.js.map +1 -0
  471. package/node_modules/@specforge/session-types/package.json +43 -0
  472. package/node_modules/@specforge/spec-types/README.md +28 -0
  473. package/node_modules/@specforge/spec-types/dist/index.d.ts +4 -0
  474. package/node_modules/@specforge/spec-types/dist/index.d.ts.map +1 -0
  475. package/node_modules/@specforge/spec-types/dist/index.js +6 -0
  476. package/node_modules/@specforge/spec-types/dist/index.js.map +1 -0
  477. package/node_modules/@specforge/spec-types/dist/json-schema/v1.1/openspec.schema.json +1129 -0
  478. package/node_modules/@specforge/spec-types/dist/openspec-schema.d.ts +4 -0
  479. package/node_modules/@specforge/spec-types/dist/openspec-schema.d.ts.map +1 -0
  480. package/node_modules/@specforge/spec-types/dist/openspec-schema.js +77 -0
  481. package/node_modules/@specforge/spec-types/dist/openspec-schema.js.map +1 -0
  482. package/node_modules/@specforge/spec-types/dist/runtime/auxiliary.d.ts +14 -0
  483. package/node_modules/@specforge/spec-types/dist/runtime/auxiliary.d.ts.map +1 -0
  484. package/node_modules/@specforge/spec-types/dist/runtime/auxiliary.js +2 -0
  485. package/node_modules/@specforge/spec-types/dist/runtime/auxiliary.js.map +1 -0
  486. package/node_modules/@specforge/spec-types/dist/runtime/blueprint.d.ts +7 -0
  487. package/node_modules/@specforge/spec-types/dist/runtime/blueprint.d.ts.map +1 -0
  488. package/node_modules/@specforge/spec-types/dist/runtime/blueprint.js +2 -0
  489. package/node_modules/@specforge/spec-types/dist/runtime/blueprint.js.map +1 -0
  490. package/node_modules/@specforge/spec-types/dist/runtime/epic.d.ts +2 -0
  491. package/node_modules/@specforge/spec-types/dist/runtime/epic.d.ts.map +1 -0
  492. package/node_modules/@specforge/spec-types/dist/runtime/epic.js +2 -0
  493. package/node_modules/@specforge/spec-types/dist/runtime/epic.js.map +1 -0
  494. package/node_modules/@specforge/spec-types/dist/runtime/index.d.ts +7 -0
  495. package/node_modules/@specforge/spec-types/dist/runtime/index.d.ts.map +1 -0
  496. package/node_modules/@specforge/spec-types/dist/runtime/index.js +7 -0
  497. package/node_modules/@specforge/spec-types/dist/runtime/index.js.map +1 -0
  498. package/node_modules/@specforge/spec-types/dist/runtime/planning/api-contract.d.ts +2 -0
  499. package/node_modules/@specforge/spec-types/dist/runtime/planning/api-contract.d.ts.map +1 -0
  500. package/node_modules/@specforge/spec-types/dist/runtime/planning/api-contract.js +2 -0
  501. package/node_modules/@specforge/spec-types/dist/runtime/planning/api-contract.js.map +1 -0
  502. package/node_modules/@specforge/spec-types/dist/runtime/planning/goal.d.ts +2 -0
  503. package/node_modules/@specforge/spec-types/dist/runtime/planning/goal.d.ts.map +1 -0
  504. package/node_modules/@specforge/spec-types/dist/runtime/planning/goal.js +2 -0
  505. package/node_modules/@specforge/spec-types/dist/runtime/planning/goal.js.map +1 -0
  506. package/node_modules/@specforge/spec-types/dist/runtime/planning/guardrail.d.ts +2 -0
  507. package/node_modules/@specforge/spec-types/dist/runtime/planning/guardrail.d.ts.map +1 -0
  508. package/node_modules/@specforge/spec-types/dist/runtime/planning/guardrail.js +2 -0
  509. package/node_modules/@specforge/spec-types/dist/runtime/planning/guardrail.js.map +1 -0
  510. package/node_modules/@specforge/spec-types/dist/runtime/planning/index.d.ts +10 -0
  511. package/node_modules/@specforge/spec-types/dist/runtime/planning/index.d.ts.map +1 -0
  512. package/node_modules/@specforge/spec-types/dist/runtime/planning/index.js +10 -0
  513. package/node_modules/@specforge/spec-types/dist/runtime/planning/index.js.map +1 -0
  514. package/node_modules/@specforge/spec-types/dist/runtime/planning/nfr.d.ts +2 -0
  515. package/node_modules/@specforge/spec-types/dist/runtime/planning/nfr.d.ts.map +1 -0
  516. package/node_modules/@specforge/spec-types/dist/runtime/planning/nfr.js +2 -0
  517. package/node_modules/@specforge/spec-types/dist/runtime/planning/nfr.js.map +1 -0
  518. package/node_modules/@specforge/spec-types/dist/runtime/planning/requirement.d.ts +2 -0
  519. package/node_modules/@specforge/spec-types/dist/runtime/planning/requirement.d.ts.map +1 -0
  520. package/node_modules/@specforge/spec-types/dist/runtime/planning/requirement.js +2 -0
  521. package/node_modules/@specforge/spec-types/dist/runtime/planning/requirement.js.map +1 -0
  522. package/node_modules/@specforge/spec-types/dist/runtime/planning/scope.d.ts +2 -0
  523. package/node_modules/@specforge/spec-types/dist/runtime/planning/scope.d.ts.map +1 -0
  524. package/node_modules/@specforge/spec-types/dist/runtime/planning/scope.js +2 -0
  525. package/node_modules/@specforge/spec-types/dist/runtime/planning/scope.js.map +1 -0
  526. package/node_modules/@specforge/spec-types/dist/runtime/planning/shared-pattern.d.ts +2 -0
  527. package/node_modules/@specforge/spec-types/dist/runtime/planning/shared-pattern.d.ts.map +1 -0
  528. package/node_modules/@specforge/spec-types/dist/runtime/planning/shared-pattern.js +2 -0
  529. package/node_modules/@specforge/spec-types/dist/runtime/planning/shared-pattern.js.map +1 -0
  530. package/node_modules/@specforge/spec-types/dist/runtime/planning/structure-item.d.ts +2 -0
  531. package/node_modules/@specforge/spec-types/dist/runtime/planning/structure-item.d.ts.map +1 -0
  532. package/node_modules/@specforge/spec-types/dist/runtime/planning/structure-item.js +2 -0
  533. package/node_modules/@specforge/spec-types/dist/runtime/planning/structure-item.js.map +1 -0
  534. package/node_modules/@specforge/spec-types/dist/runtime/planning/tech-stack.d.ts +2 -0
  535. package/node_modules/@specforge/spec-types/dist/runtime/planning/tech-stack.d.ts.map +1 -0
  536. package/node_modules/@specforge/spec-types/dist/runtime/planning/tech-stack.js +2 -0
  537. package/node_modules/@specforge/spec-types/dist/runtime/planning/tech-stack.js.map +1 -0
  538. package/node_modules/@specforge/spec-types/dist/runtime/specification.d.ts +2 -0
  539. package/node_modules/@specforge/spec-types/dist/runtime/specification.d.ts.map +1 -0
  540. package/node_modules/@specforge/spec-types/dist/runtime/specification.js +2 -0
  541. package/node_modules/@specforge/spec-types/dist/runtime/specification.js.map +1 -0
  542. package/node_modules/@specforge/spec-types/dist/runtime/ticket.d.ts +2 -0
  543. package/node_modules/@specforge/spec-types/dist/runtime/ticket.d.ts.map +1 -0
  544. package/node_modules/@specforge/spec-types/dist/runtime/ticket.js +2 -0
  545. package/node_modules/@specforge/spec-types/dist/runtime/ticket.js.map +1 -0
  546. package/node_modules/@specforge/spec-types/dist/schema/auxiliary.d.ts +266 -0
  547. package/node_modules/@specforge/spec-types/dist/schema/auxiliary.d.ts.map +1 -0
  548. package/node_modules/@specforge/spec-types/dist/schema/auxiliary.js +143 -0
  549. package/node_modules/@specforge/spec-types/dist/schema/auxiliary.js.map +1 -0
  550. package/node_modules/@specforge/spec-types/dist/schema/blueprint.d.ts +47 -0
  551. package/node_modules/@specforge/spec-types/dist/schema/blueprint.d.ts.map +1 -0
  552. package/node_modules/@specforge/spec-types/dist/schema/blueprint.js +33 -0
  553. package/node_modules/@specforge/spec-types/dist/schema/blueprint.js.map +1 -0
  554. package/node_modules/@specforge/spec-types/dist/schema/entity-field-schemas.d.ts +33 -0
  555. package/node_modules/@specforge/spec-types/dist/schema/entity-field-schemas.d.ts.map +1 -0
  556. package/node_modules/@specforge/spec-types/dist/schema/entity-field-schemas.js +181 -0
  557. package/node_modules/@specforge/spec-types/dist/schema/entity-field-schemas.js.map +1 -0
  558. package/node_modules/@specforge/spec-types/dist/schema/epic.d.ts +955 -0
  559. package/node_modules/@specforge/spec-types/dist/schema/epic.d.ts.map +1 -0
  560. package/node_modules/@specforge/spec-types/dist/schema/epic.js +33 -0
  561. package/node_modules/@specforge/spec-types/dist/schema/epic.js.map +1 -0
  562. package/node_modules/@specforge/spec-types/dist/schema/index.d.ts +12 -0
  563. package/node_modules/@specforge/spec-types/dist/schema/index.d.ts.map +1 -0
  564. package/node_modules/@specforge/spec-types/dist/schema/index.js +25 -0
  565. package/node_modules/@specforge/spec-types/dist/schema/index.js.map +1 -0
  566. package/node_modules/@specforge/spec-types/dist/schema/node-verb-steps.d.ts +174 -0
  567. package/node_modules/@specforge/spec-types/dist/schema/node-verb-steps.d.ts.map +1 -0
  568. package/node_modules/@specforge/spec-types/dist/schema/node-verb-steps.js +317 -0
  569. package/node_modules/@specforge/spec-types/dist/schema/node-verb-steps.js.map +1 -0
  570. package/node_modules/@specforge/spec-types/dist/schema/patterns.d.ts +274 -0
  571. package/node_modules/@specforge/spec-types/dist/schema/patterns.d.ts.map +1 -0
  572. package/node_modules/@specforge/spec-types/dist/schema/patterns.js +106 -0
  573. package/node_modules/@specforge/spec-types/dist/schema/patterns.js.map +1 -0
  574. package/node_modules/@specforge/spec-types/dist/schema/planning/api-contract.d.ts +44 -0
  575. package/node_modules/@specforge/spec-types/dist/schema/planning/api-contract.d.ts.map +1 -0
  576. package/node_modules/@specforge/spec-types/dist/schema/planning/api-contract.js +13 -0
  577. package/node_modules/@specforge/spec-types/dist/schema/planning/api-contract.js.map +1 -0
  578. package/node_modules/@specforge/spec-types/dist/schema/planning/epic-category.d.ts +21 -0
  579. package/node_modules/@specforge/spec-types/dist/schema/planning/epic-category.d.ts.map +1 -0
  580. package/node_modules/@specforge/spec-types/dist/schema/planning/epic-category.js +14 -0
  581. package/node_modules/@specforge/spec-types/dist/schema/planning/epic-category.js.map +1 -0
  582. package/node_modules/@specforge/spec-types/dist/schema/planning/goal.d.ts +27 -0
  583. package/node_modules/@specforge/spec-types/dist/schema/planning/goal.d.ts.map +1 -0
  584. package/node_modules/@specforge/spec-types/dist/schema/planning/goal.js +13 -0
  585. package/node_modules/@specforge/spec-types/dist/schema/planning/goal.js.map +1 -0
  586. package/node_modules/@specforge/spec-types/dist/schema/planning/guardrail.d.ts +29 -0
  587. package/node_modules/@specforge/spec-types/dist/schema/planning/guardrail.d.ts.map +1 -0
  588. package/node_modules/@specforge/spec-types/dist/schema/planning/guardrail.js +14 -0
  589. package/node_modules/@specforge/spec-types/dist/schema/planning/guardrail.js.map +1 -0
  590. package/node_modules/@specforge/spec-types/dist/schema/planning/index.d.ts +12 -0
  591. package/node_modules/@specforge/spec-types/dist/schema/planning/index.d.ts.map +1 -0
  592. package/node_modules/@specforge/spec-types/dist/schema/planning/index.js +12 -0
  593. package/node_modules/@specforge/spec-types/dist/schema/planning/index.js.map +1 -0
  594. package/node_modules/@specforge/spec-types/dist/schema/planning/nfr.d.ts +27 -0
  595. package/node_modules/@specforge/spec-types/dist/schema/planning/nfr.d.ts.map +1 -0
  596. package/node_modules/@specforge/spec-types/dist/schema/planning/nfr.js +15 -0
  597. package/node_modules/@specforge/spec-types/dist/schema/planning/nfr.js.map +1 -0
  598. package/node_modules/@specforge/spec-types/dist/schema/planning/planning-type.d.ts +17 -0
  599. package/node_modules/@specforge/spec-types/dist/schema/planning/planning-type.d.ts.map +1 -0
  600. package/node_modules/@specforge/spec-types/dist/schema/planning/planning-type.js +16 -0
  601. package/node_modules/@specforge/spec-types/dist/schema/planning/planning-type.js.map +1 -0
  602. package/node_modules/@specforge/spec-types/dist/schema/planning/requirement.d.ts +63 -0
  603. package/node_modules/@specforge/spec-types/dist/schema/planning/requirement.d.ts.map +1 -0
  604. package/node_modules/@specforge/spec-types/dist/schema/planning/requirement.js +16 -0
  605. package/node_modules/@specforge/spec-types/dist/schema/planning/requirement.js.map +1 -0
  606. package/node_modules/@specforge/spec-types/dist/schema/planning/scope.d.ts +19 -0
  607. package/node_modules/@specforge/spec-types/dist/schema/planning/scope.d.ts.map +1 -0
  608. package/node_modules/@specforge/spec-types/dist/schema/planning/scope.js +8 -0
  609. package/node_modules/@specforge/spec-types/dist/schema/planning/scope.js.map +1 -0
  610. package/node_modules/@specforge/spec-types/dist/schema/planning/shared-pattern.d.ts +51 -0
  611. package/node_modules/@specforge/spec-types/dist/schema/planning/shared-pattern.d.ts.map +1 -0
  612. package/node_modules/@specforge/spec-types/dist/schema/planning/shared-pattern.js +16 -0
  613. package/node_modules/@specforge/spec-types/dist/schema/planning/shared-pattern.js.map +1 -0
  614. package/node_modules/@specforge/spec-types/dist/schema/planning/structure-item.d.ts +19 -0
  615. package/node_modules/@specforge/spec-types/dist/schema/planning/structure-item.d.ts.map +1 -0
  616. package/node_modules/@specforge/spec-types/dist/schema/planning/structure-item.js +8 -0
  617. package/node_modules/@specforge/spec-types/dist/schema/planning/structure-item.js.map +1 -0
  618. package/node_modules/@specforge/spec-types/dist/schema/planning/tech-stack.d.ts +27 -0
  619. package/node_modules/@specforge/spec-types/dist/schema/planning/tech-stack.d.ts.map +1 -0
  620. package/node_modules/@specforge/spec-types/dist/schema/planning/tech-stack.js +14 -0
  621. package/node_modules/@specforge/spec-types/dist/schema/planning/tech-stack.js.map +1 -0
  622. package/node_modules/@specforge/spec-types/dist/schema/specification.d.ts +1839 -0
  623. package/node_modules/@specforge/spec-types/dist/schema/specification.d.ts.map +1 -0
  624. package/node_modules/@specforge/spec-types/dist/schema/specification.js +43 -0
  625. package/node_modules/@specforge/spec-types/dist/schema/specification.js.map +1 -0
  626. package/node_modules/@specforge/spec-types/dist/schema/step-link-coverage.d.ts +58 -0
  627. package/node_modules/@specforge/spec-types/dist/schema/step-link-coverage.d.ts.map +1 -0
  628. package/node_modules/@specforge/spec-types/dist/schema/step-link-coverage.js +73 -0
  629. package/node_modules/@specforge/spec-types/dist/schema/step-link-coverage.js.map +1 -0
  630. package/node_modules/@specforge/spec-types/dist/schema/step-link-ids.d.ts +71 -0
  631. package/node_modules/@specforge/spec-types/dist/schema/step-link-ids.d.ts.map +1 -0
  632. package/node_modules/@specforge/spec-types/dist/schema/step-link-ids.js +96 -0
  633. package/node_modules/@specforge/spec-types/dist/schema/step-link-ids.js.map +1 -0
  634. package/node_modules/@specforge/spec-types/dist/schema/ticket.d.ts +444 -0
  635. package/node_modules/@specforge/spec-types/dist/schema/ticket.d.ts.map +1 -0
  636. package/node_modules/@specforge/spec-types/dist/schema/ticket.js +49 -0
  637. package/node_modules/@specforge/spec-types/dist/schema/ticket.js.map +1 -0
  638. package/node_modules/@specforge/spec-types/package.json +41 -0
  639. package/package.json +40 -25
  640. package/src/cli/templates/agents/content/core/sfag-orchestrator.ts +135 -51
  641. package/src/cli/templates/agents/content/core/sfag-spec-creator.ts +124 -83
  642. package/src/cli/templates/agents/content/core/sfag-ticket-implementer.ts +247 -163
  643. package/src/cli/templates/agents/content/core/sfag-work-resolver.ts +211 -0
  644. package/src/cli/templates/agents/index.ts +2 -0
  645. package/src/cli/templates/content/sf-commit.ts +2 -2
  646. package/src/cli/templates/content/sf-reset.ts +45 -28
  647. package/src/cli/templates/skills/specforge-orchestrator.md +15 -10
  648. package/src/cli/templates/skills/specforge-worker.md +4 -3
@@ -0,0 +1,199 @@
1
+ const SFAG_WORK_RESOLVER = {
2
+ name: "sfag-work-resolver",
3
+ description: "Triage discoveries and blocked tickets with the human, then hand work back to autonomous implementation",
4
+ triggerDescription: `Use this agent when autonomous implementation has stalled on blocked tickets or has recorded discoveries (blockers, tech debt, improvements, scope changes) that need a human decision. It triages each one WITH the human in chat, converts the ones worth acting on into tickets/epics, and points the human at the web app to unblock a blocking discovery.
5
+
6
+ <example>
7
+ Context: The ticket-implementer reported a blocking discovery and stopped.
8
+ user: "O worker travou num blocker, resolve isso"
9
+ assistant: "Launching sfag-work-resolver to triage the blocked ticket and its discovery with you, then hand work back once it's unblocked."
10
+ </example>
11
+
12
+ <example>
13
+ Context: Several discoveries piled up during a run and need a decision.
14
+ user: "Revisa as discoveries que apareceram na implementa\xE7\xE3o"
15
+ assistant: "Launching sfag-work-resolver to walk through each discovery with you \u2014 convert, dismiss, or unblock."
16
+ </example>
17
+
18
+ <example>
19
+ Context: A ticket is stuck as blocked and the user wants it moving again.
20
+ user: "O ticket AUTH-004 t\xE1 blocked, o que aconteceu?"
21
+ assistant: "Launching sfag-work-resolver to read the blocking discovery, decide with you, and get AUTH-004 back to ready."
22
+ </example>`,
23
+ model: "opus",
24
+ color: "yellow",
25
+ category: "SpecForge",
26
+ memory: "project",
27
+ content: `# SpecForge Work Resolver Agent
28
+
29
+ You triage the **discoveries** and **blocked tickets** that autonomous implementation
30
+ surfaces. You do this WITH the human, in chat. You are the manual stand-in for the
31
+ (dormant) review lifecycle: there is no deterministic resolution loop, so every decision
32
+ is made by a human and enacted by you.
33
+
34
+ You do NOT implement tickets. You do NOT write code. You decide, with the human, what
35
+ each recorded discovery deserves, and you get blocked tickets moving again.
36
+
37
+ ## Prime Directive \u2014 you do not unblock, the human does
38
+
39
+ A ticket is blocked because a **blocking discovery** was recorded against it (there is
40
+ **no** \`clear_ticket_block\` and **no** \`set_ticket_blocked\` verb). The only thing that
41
+ unblocks it is the human's **\`resolve_discovery\`** action **in the SpecForge web app** \u2014
42
+ \`resolve_discovery\` is a webapp action, **NOT an MCP tool you can call**. Resolving the
43
+ blocking discovery flips the ticket \`blocked \u2192 pending\`; the readiness cascade then
44
+ re-derives dependency-free tickets \`\u2192 ready\`.
45
+
46
+ Your job: surface each blocker/discovery clearly, recommend a decision, and \u2014 once the
47
+ human has resolved it in the web app \u2014 hand the ticket back to autonomous work.
48
+
49
+ ## Context Bootstrapping
50
+
51
+ Before any tool call, read the project context from the local config:
52
+ \`\`\`
53
+ Read .specforge.json from project root \u2192 extract:
54
+ - project.id \u2192 projectId
55
+ - activeSpecification.id \u2192 specificationId
56
+ \`\`\`
57
+ All tool calls that need projectId/specificationId use these values. No session store.
58
+
59
+ ## Workflow
60
+
61
+ ### Step 1: Survey what's open
62
+
63
+ Read the spec's recorded discoveries and blocked tickets:
64
+ \`\`\`
65
+ // The spec's open discoveries (a blocking discovery IS the block).
66
+ get_pending_discoveries({ specificationId })
67
+
68
+ // The spec-wide dispatch view \u2014 blocked + paused sessions and their reasons.
69
+ get_implementation_status({ projectId, specificationId, status: "blocked" })
70
+
71
+ // The blocked tickets with the statusReason that explains why.
72
+ get_blocked_tickets({ specificationId })
73
+ \`\`\`
74
+
75
+ For any discovery you need to inspect in detail:
76
+ \`\`\`
77
+ get_discovery({ discoveryId }) // a single Discovery
78
+ list_discoveries({ workSessionId }) // discoveries scoped to one session
79
+ \`\`\`
80
+
81
+ Build one list: each blocked ticket, the discovery that blocked it, and every other
82
+ open (non-blocking) discovery \u2014 tech debt, improvements, scope changes.
83
+
84
+ ### Step 2: Triage each item WITH the human
85
+
86
+ For EACH discovery, present it to the human and ask for a decision. Never decide silently.
87
+
88
+ Each discovery carries an **Observation** (what was concretely found) and an
89
+ **Evaluation** (why it matters + options). Surface both, then recommend:
90
+
91
+ - **Convert \u2192 ticket/epic** \u2014 the discovery is real work the spec should carry.
92
+ - **Dismiss / accept as-is** \u2014 noted, but no action (won't-fix, already-covered, out of scope).
93
+ - **Unblock** (blocking discoveries only) \u2014 the human resolves it in the web app so the
94
+ ticket returns to the queue.
95
+
96
+ Present it like this and WAIT for the human's call:
97
+ \`\`\`
98
+ DISCOVERY {discoveryId} ({type}, {severity})
99
+ Ticket: {ticketId} ({blocked | active})
100
+ Observation: {what was found}
101
+ Evaluation: {why it matters + options}
102
+ Recommend: convert \u2192 ticket | convert \u2192 epic | dismiss | unblock (you resolve in web app)
103
+ \`\`\`
104
+
105
+ ### Step 3: Act on the decision
106
+
107
+ **Convert \u2192 ticket / epic** (planning ops). Open a planning session and create the
108
+ follow-up work \u2014 planning runs independently of implementation:
109
+ \`\`\`
110
+ start_planning_session({ specificationId })
111
+
112
+ // A follow-up ticket under an existing epic:
113
+ action_planning_session({
114
+ operation: {
115
+ type: "create_ticket",
116
+ epicId,
117
+ title: "...",
118
+ description: "From discovery {discoveryId}: ...",
119
+ acceptanceCriteria: [...],
120
+ implementationSteps: [...],
121
+ dependsOn: [...]
122
+ }
123
+ })
124
+
125
+ // Or a new epic when the discovery is a larger body of work:
126
+ action_planning_session({
127
+ operation: { type: "create_epic", title: "...", objective: "...", acceptanceCriteria: [...] }
128
+ })
129
+ \`\`\`
130
+ When the new ticket exists, the discovery's own resolution (converted/dismissed) is what
131
+ the human records via \`resolve_discovery\` in the web app.
132
+
133
+ **Dismiss / accept.** No planning op. The discovery stays on record; for a *blocking*
134
+ discovery the human still has to resolve it in the web app to move the ticket.
135
+
136
+ ### Step 4: Unblock \u2014 the human resolves the blocking discovery
137
+
138
+ You cannot unblock from here. Direct the human to the web app:
139
+
140
+ - Open the specification in the SpecForge web app.
141
+ - For each blocking discovery, choose its resolution (\`resolve_discovery\`) \u2014 convert to
142
+ the ticket/epic you drafted in Step 3, or dismiss it.
143
+ - Resolving sets the ticket \`blocked \u2192 pending\`; the readiness cascade re-derives
144
+ dependency-free tickets \`\u2192 ready\`.
145
+
146
+ Confirm it landed:
147
+ \`\`\`
148
+ get_implementation_status({ projectId, specificationId, status: "ready" })
149
+ get_blocked_tickets({ specificationId }) // the ticket should be gone from here
150
+ \`\`\`
151
+
152
+ ### Step 5: Hand back to autonomous work
153
+
154
+ Once a ticket is \`ready\` again, hand it back to autonomous implementation \u2014 a fresh
155
+ work session (SWS). The re-dispatched worker re-attaches to any paused session and
156
+ continues; the per-attempt retry is tracked on \`WorkSession.retryCount\`.
157
+ \`\`\`
158
+ start_work_session({ ticketId })
159
+ \`\`\`
160
+ Or tell the human to relaunch \`sfag-ticket-implementer\` on the now-\`ready\` ticket.
161
+
162
+ ## Report
163
+
164
+ Close every session with a short summary:
165
+ \`\`\`
166
+ \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
167
+ WORK RESOLUTION SUMMARY
168
+ \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
169
+ Converted \u2192 tickets/epics: {list}
170
+ Dismissed: {list}
171
+ Unblocked (via web app): {ticketId: blocked \u2192 pending \u2192 ready}
172
+ Handed back to work: {ticketId}
173
+ Still open: {list \u2014 awaiting the human's resolve_discovery}
174
+ \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
175
+ \`\`\`
176
+
177
+ ## What You Are NOT
178
+
179
+ - You are NOT an implementer. You never write code or complete tickets \u2014 hand \`ready\`
180
+ tickets back to \`sfag-ticket-implementer\`.
181
+ - You are NOT able to unblock a ticket yourself. Unblocking is the human's
182
+ \`resolve_discovery\` in the web app. There is no \`clear_ticket_block\` and no
183
+ \`set_ticket_blocked\` verb.
184
+ - You are NOT autonomous. Every triage decision goes through the human first.
185
+
186
+ ## Rules
187
+
188
+ - **Always surface the decision.** One discovery, one recommendation, one human call.
189
+ - **Convert with substance.** A converted ticket carries the discovery's observation,
190
+ concrete acceptance criteria, and its dependencies \u2014 not a one-line stub.
191
+ - **Blocking discoveries are resolved in the web app, not here.** Draft the follow-up,
192
+ then point the human at \`resolve_discovery\`.
193
+ - **Re-work is a fresh \`start_work_session\` on a \`ready\` ticket** \u2014 never a reset.
194
+ `
195
+ };
196
+ export {
197
+ SFAG_WORK_RESOLVER
198
+ };
199
+ //# sourceMappingURL=sfag-work-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../src/cli/templates/agents/content/core/sfag-work-resolver.ts"],"sourcesContent":["/**\n * SFAG-Work-Resolver Agent Template\n *\n * Human-in-the-loop triage of the recorded discoveries + blocked tickets that\n * autonomous implementation surfaces. This agent is the MANUAL stand-in for the\n * (dormant) review lifecycle: there is no deterministic resolution loop, so a\n * human + this chat agent decide what happens to each discovery, then hand work\n * back to the autonomous ticket-implementer (SWS).\n *\n * Unblocking a blocking discovery is the HUMAN's `resolve_discovery` action in\n * the SpecForge web app — it is NOT an MCP tool. There is no\n * `clear_ticket_block` / `set_ticket_blocked` verb.\n */\n\nimport type { AgentTemplate } from '../../../../commands/scaffold/agent-types.js';\n\nexport const SFAG_WORK_RESOLVER: AgentTemplate = {\n name: 'sfag-work-resolver',\n description: 'Triage discoveries and blocked tickets with the human, then hand work back to autonomous implementation',\n triggerDescription: `Use this agent when autonomous implementation has stalled on blocked tickets or has recorded discoveries (blockers, tech debt, improvements, scope changes) that need a human decision. It triages each one WITH the human in chat, converts the ones worth acting on into tickets/epics, and points the human at the web app to unblock a blocking discovery.\n\n<example>\nContext: The ticket-implementer reported a blocking discovery and stopped.\nuser: \"O worker travou num blocker, resolve isso\"\nassistant: \"Launching sfag-work-resolver to triage the blocked ticket and its discovery with you, then hand work back once it's unblocked.\"\n</example>\n\n<example>\nContext: Several discoveries piled up during a run and need a decision.\nuser: \"Revisa as discoveries que apareceram na implementação\"\nassistant: \"Launching sfag-work-resolver to walk through each discovery with you — convert, dismiss, or unblock.\"\n</example>\n\n<example>\nContext: A ticket is stuck as blocked and the user wants it moving again.\nuser: \"O ticket AUTH-004 tá blocked, o que aconteceu?\"\nassistant: \"Launching sfag-work-resolver to read the blocking discovery, decide with you, and get AUTH-004 back to ready.\"\n</example>`,\n model: 'opus',\n color: 'yellow',\n category: 'SpecForge',\n memory: 'project',\n content: `# SpecForge Work Resolver Agent\n\nYou triage the **discoveries** and **blocked tickets** that autonomous implementation\nsurfaces. You do this WITH the human, in chat. You are the manual stand-in for the\n(dormant) review lifecycle: there is no deterministic resolution loop, so every decision\nis made by a human and enacted by you.\n\nYou do NOT implement tickets. You do NOT write code. You decide, with the human, what\neach recorded discovery deserves, and you get blocked tickets moving again.\n\n## Prime Directive — you do not unblock, the human does\n\nA ticket is blocked because a **blocking discovery** was recorded against it (there is\n**no** \\`clear_ticket_block\\` and **no** \\`set_ticket_blocked\\` verb). The only thing that\nunblocks it is the human's **\\`resolve_discovery\\`** action **in the SpecForge web app** —\n\\`resolve_discovery\\` is a webapp action, **NOT an MCP tool you can call**. Resolving the\nblocking discovery flips the ticket \\`blocked → pending\\`; the readiness cascade then\nre-derives dependency-free tickets \\`→ ready\\`.\n\nYour job: surface each blocker/discovery clearly, recommend a decision, and — once the\nhuman has resolved it in the web app — hand the ticket back to autonomous work.\n\n## Context Bootstrapping\n\nBefore any tool call, read the project context from the local config:\n\\`\\`\\`\nRead .specforge.json from project root → extract:\n - project.id → projectId\n - activeSpecification.id → specificationId\n\\`\\`\\`\nAll tool calls that need projectId/specificationId use these values. No session store.\n\n## Workflow\n\n### Step 1: Survey what's open\n\nRead the spec's recorded discoveries and blocked tickets:\n\\`\\`\\`\n// The spec's open discoveries (a blocking discovery IS the block).\nget_pending_discoveries({ specificationId })\n\n// The spec-wide dispatch view — blocked + paused sessions and their reasons.\nget_implementation_status({ projectId, specificationId, status: \"blocked\" })\n\n// The blocked tickets with the statusReason that explains why.\nget_blocked_tickets({ specificationId })\n\\`\\`\\`\n\nFor any discovery you need to inspect in detail:\n\\`\\`\\`\nget_discovery({ discoveryId }) // a single Discovery\nlist_discoveries({ workSessionId }) // discoveries scoped to one session\n\\`\\`\\`\n\nBuild one list: each blocked ticket, the discovery that blocked it, and every other\nopen (non-blocking) discovery — tech debt, improvements, scope changes.\n\n### Step 2: Triage each item WITH the human\n\nFor EACH discovery, present it to the human and ask for a decision. Never decide silently.\n\nEach discovery carries an **Observation** (what was concretely found) and an\n**Evaluation** (why it matters + options). Surface both, then recommend:\n\n- **Convert → ticket/epic** — the discovery is real work the spec should carry.\n- **Dismiss / accept as-is** — noted, but no action (won't-fix, already-covered, out of scope).\n- **Unblock** (blocking discoveries only) — the human resolves it in the web app so the\n ticket returns to the queue.\n\nPresent it like this and WAIT for the human's call:\n\\`\\`\\`\nDISCOVERY {discoveryId} ({type}, {severity})\n Ticket: {ticketId} ({blocked | active})\n Observation: {what was found}\n Evaluation: {why it matters + options}\n Recommend: convert → ticket | convert → epic | dismiss | unblock (you resolve in web app)\n\\`\\`\\`\n\n### Step 3: Act on the decision\n\n**Convert → ticket / epic** (planning ops). Open a planning session and create the\nfollow-up work — planning runs independently of implementation:\n\\`\\`\\`\nstart_planning_session({ specificationId })\n\n// A follow-up ticket under an existing epic:\naction_planning_session({\n operation: {\n type: \"create_ticket\",\n epicId,\n title: \"...\",\n description: \"From discovery {discoveryId}: ...\",\n acceptanceCriteria: [...],\n implementationSteps: [...],\n dependsOn: [...]\n }\n})\n\n// Or a new epic when the discovery is a larger body of work:\naction_planning_session({\n operation: { type: \"create_epic\", title: \"...\", objective: \"...\", acceptanceCriteria: [...] }\n})\n\\`\\`\\`\nWhen the new ticket exists, the discovery's own resolution (converted/dismissed) is what\nthe human records via \\`resolve_discovery\\` in the web app.\n\n**Dismiss / accept.** No planning op. The discovery stays on record; for a *blocking*\ndiscovery the human still has to resolve it in the web app to move the ticket.\n\n### Step 4: Unblock — the human resolves the blocking discovery\n\nYou cannot unblock from here. Direct the human to the web app:\n\n- Open the specification in the SpecForge web app.\n- For each blocking discovery, choose its resolution (\\`resolve_discovery\\`) — convert to\n the ticket/epic you drafted in Step 3, or dismiss it.\n- Resolving sets the ticket \\`blocked → pending\\`; the readiness cascade re-derives\n dependency-free tickets \\`→ ready\\`.\n\nConfirm it landed:\n\\`\\`\\`\nget_implementation_status({ projectId, specificationId, status: \"ready\" })\nget_blocked_tickets({ specificationId }) // the ticket should be gone from here\n\\`\\`\\`\n\n### Step 5: Hand back to autonomous work\n\nOnce a ticket is \\`ready\\` again, hand it back to autonomous implementation — a fresh\nwork session (SWS). The re-dispatched worker re-attaches to any paused session and\ncontinues; the per-attempt retry is tracked on \\`WorkSession.retryCount\\`.\n\\`\\`\\`\nstart_work_session({ ticketId })\n\\`\\`\\`\nOr tell the human to relaunch \\`sfag-ticket-implementer\\` on the now-\\`ready\\` ticket.\n\n## Report\n\nClose every session with a short summary:\n\\`\\`\\`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nWORK RESOLUTION SUMMARY\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nConverted → tickets/epics: {list}\nDismissed: {list}\nUnblocked (via web app): {ticketId: blocked → pending → ready}\nHanded back to work: {ticketId}\nStill open: {list — awaiting the human's resolve_discovery}\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\\`\\`\\`\n\n## What You Are NOT\n\n- You are NOT an implementer. You never write code or complete tickets — hand \\`ready\\`\n tickets back to \\`sfag-ticket-implementer\\`.\n- You are NOT able to unblock a ticket yourself. Unblocking is the human's\n \\`resolve_discovery\\` in the web app. There is no \\`clear_ticket_block\\` and no\n \\`set_ticket_blocked\\` verb.\n- You are NOT autonomous. Every triage decision goes through the human first.\n\n## Rules\n\n- **Always surface the decision.** One discovery, one recommendation, one human call.\n- **Convert with substance.** A converted ticket carries the discovery's observation,\n concrete acceptance criteria, and its dependencies — not a one-line stub.\n- **Blocking discoveries are resolved in the web app, not here.** Draft the follow-up,\n then point the human at \\`resolve_discovery\\`.\n- **Re-work is a fresh \\`start_work_session\\` on a \\`ready\\` ticket** — never a reset.\n`,\n};\n"],"mappings":"AAgBO,MAAM,qBAAoC;AAAA,EAC/C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBpB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwKX;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/agents/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAc3F;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,EAAE,CAEnD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAExE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG,aAAa,EAAE,CAE5E;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/agents/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAgB3F;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,EAAE,CAEnD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAExE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG,aAAa,EAAE,CAE5E;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC"}
@@ -1,11 +1,13 @@
1
1
  import { SFAG_ORCHESTRATOR } from "./content/core/sfag-orchestrator.js";
2
2
  import { SFAG_SPEC_CREATOR } from "./content/core/sfag-spec-creator.js";
3
3
  import { SFAG_TICKET_IMPLEMENTER } from "./content/core/sfag-ticket-implementer.js";
4
+ import { SFAG_WORK_RESOLVER } from "./content/core/sfag-work-resolver.js";
4
5
  import { SFAG_PACKAGE_RESEARCHER } from "./content/research/sfag-package-researcher.js";
5
6
  const AGENT_TEMPLATES = [
6
7
  SFAG_ORCHESTRATOR,
7
8
  SFAG_SPEC_CREATOR,
8
9
  SFAG_TICKET_IMPLEMENTER,
10
+ SFAG_WORK_RESOLVER,
9
11
  SFAG_PACKAGE_RESEARCHER
10
12
  ];
11
13
  function getAgentTemplates() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/cli/templates/agents/index.ts"],"sourcesContent":["/**\n * Agent Templates Module\n *\n * Defines all SpecForge agent templates for scaffolding to AI CLI tools.\n */\n\nimport type { AgentTemplate, AgentCategory } from '../../commands/scaffold/agent-types.js';\n\nimport { SFAG_ORCHESTRATOR } from './content/core/sfag-orchestrator.js';\nimport { SFAG_SPEC_CREATOR } from './content/core/sfag-spec-creator.js';\nimport { SFAG_TICKET_IMPLEMENTER } from './content/core/sfag-ticket-implementer.js';\nimport { SFAG_PACKAGE_RESEARCHER } from './content/research/sfag-package-researcher.js';\n\nconst AGENT_TEMPLATES: AgentTemplate[] = [\n SFAG_ORCHESTRATOR,\n SFAG_SPEC_CREATOR,\n SFAG_TICKET_IMPLEMENTER,\n SFAG_PACKAGE_RESEARCHER,\n];\n\n/**\n * Get all agent templates\n */\nexport function getAgentTemplates(): AgentTemplate[] {\n return AGENT_TEMPLATES;\n}\n\n/**\n * Get a specific agent template by name\n */\nexport function getAgentTemplate(name: string): AgentTemplate | undefined {\n return AGENT_TEMPLATES.find(t => t.name === name);\n}\n\n/**\n * Get agent templates by category\n */\nexport function getAgentsByCategory(category: AgentCategory): AgentTemplate[] {\n return AGENT_TEMPLATES.filter(t => t.category === category);\n}\n\n/**\n * Get all agent template names\n */\nexport function getAgentNames(): string[] {\n return AGENT_TEMPLATES.map(t => t.name);\n}\n"],"mappings":"AAQA,SAAS,yBAAyB;AAClC,SAAS,yBAAyB;AAClC,SAAS,+BAA+B;AACxC,SAAS,+BAA+B;AAExC,MAAM,kBAAmC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,SAAS,oBAAqC;AACnD,SAAO;AACT;AAKO,SAAS,iBAAiB,MAAyC;AACxE,SAAO,gBAAgB,KAAK,OAAK,EAAE,SAAS,IAAI;AAClD;AAKO,SAAS,oBAAoB,UAA0C;AAC5E,SAAO,gBAAgB,OAAO,OAAK,EAAE,aAAa,QAAQ;AAC5D;AAKO,SAAS,gBAA0B;AACxC,SAAO,gBAAgB,IAAI,OAAK,EAAE,IAAI;AACxC;","names":[]}
1
+ {"version":3,"sources":["../../../../src/cli/templates/agents/index.ts"],"sourcesContent":["/**\n * Agent Templates Module\n *\n * Defines all SpecForge agent templates for scaffolding to AI CLI tools.\n */\n\nimport type { AgentTemplate, AgentCategory } from '../../commands/scaffold/agent-types.js';\n\nimport { SFAG_ORCHESTRATOR } from './content/core/sfag-orchestrator.js';\nimport { SFAG_SPEC_CREATOR } from './content/core/sfag-spec-creator.js';\nimport { SFAG_TICKET_IMPLEMENTER } from './content/core/sfag-ticket-implementer.js';\nimport { SFAG_WORK_RESOLVER } from './content/core/sfag-work-resolver.js';\nimport { SFAG_PACKAGE_RESEARCHER } from './content/research/sfag-package-researcher.js';\n\nconst AGENT_TEMPLATES: AgentTemplate[] = [\n SFAG_ORCHESTRATOR,\n SFAG_SPEC_CREATOR,\n SFAG_TICKET_IMPLEMENTER,\n SFAG_WORK_RESOLVER,\n SFAG_PACKAGE_RESEARCHER,\n];\n\n/**\n * Get all agent templates\n */\nexport function getAgentTemplates(): AgentTemplate[] {\n return AGENT_TEMPLATES;\n}\n\n/**\n * Get a specific agent template by name\n */\nexport function getAgentTemplate(name: string): AgentTemplate | undefined {\n return AGENT_TEMPLATES.find(t => t.name === name);\n}\n\n/**\n * Get agent templates by category\n */\nexport function getAgentsByCategory(category: AgentCategory): AgentTemplate[] {\n return AGENT_TEMPLATES.filter(t => t.category === category);\n}\n\n/**\n * Get all agent template names\n */\nexport function getAgentNames(): string[] {\n return AGENT_TEMPLATES.map(t => t.name);\n}\n"],"mappings":"AAQA,SAAS,yBAAyB;AAClC,SAAS,yBAAyB;AAClC,SAAS,+BAA+B;AACxC,SAAS,0BAA0B;AACnC,SAAS,+BAA+B;AAExC,MAAM,kBAAmC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,SAAS,oBAAqC;AACnD,SAAO;AACT;AAKO,SAAS,iBAAiB,MAAyC;AACxE,SAAO,gBAAgB,KAAK,OAAK,EAAE,SAAS,IAAI;AAClD;AAKO,SAAS,oBAAoB,UAA0C;AAC5E,SAAO,gBAAgB,OAAO,OAAK,EAAE,aAAa,QAAQ;AAC5D;AAKO,SAAS,gBAA0B;AACxC,SAAO,gBAAgB,IAAI,OAAK,EAAE,IAAI;AACxC;","names":[]}
@@ -3,5 +3,5 @@
3
3
  *
4
4
  * Template for committing changes with SpecForge ticket metadata.
5
5
  */
6
- export declare const SF_COMMIT_CONTENT = "# Commit Changes (SpecForge)\n\nCreate a git commit with SpecForge ticket metadata.\n\n## Arguments\n- `$ARGUMENTS` - Optional: Ticket ID (uses context if not provided)\n\n## Task\n\n### 1. Get Ticket Context\n\n**MCP Calls:**\n```typescript\nif ($ARGUMENTS) {\n get_ticket({ ticketId: $ARGUMENTS })\n} else {\n // Read active ticket from .specforge.json or find active ticket\n const config = readFile('.specforge.json')\n const specificationId = config.activeSpecification?.id\n // Find the currently active ticket\n list_tickets({ specificationId, status: [\"active\"] })\n // Use the active ticket\n get_ticket({ ticketId: activeTicket.id })\n}\n```\n\n### 2. Generate Commit Message\n\n**Logic:**\n- Format: `feat(scope): description (TICKET-ID)`\n- Extract scope from epic\n- Use ticket title as description\n- Add ticket ID reference\n\n### 3. Create Commit\n\n**Shell:**\n```bash\ngit add .\ngit commit -m \"{type}({scope}): {description} ({ticketId})\"\n```\n\n### 4. Update Ticket Status\n\n**MCP Calls:**\n```typescript\ncomplete_work_session({\n ticketId: ticket.id\n})\n```\n\n### 5. Display Commit Result\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nCOMMIT CREATED\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nTicket: E{n}-T{m}\nMessage: {commitMessage}\nHash: {commitHash}\n\nTICKET COMPLETED\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\u2713 E{n}-T{m} marked as done\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\nNext: Run /sf-next for the next ticket\n```\n\n## Notes\n- Automatically completes the work session\n- Uses conventional commit format\n- Includes ticket ID for traceability\n";
6
+ export declare const SF_COMMIT_CONTENT = "# Commit Changes (SpecForge)\n\nCreate a git commit with SpecForge ticket metadata.\n\n## Arguments\n- `$ARGUMENTS` - Optional: Ticket ID (uses context if not provided)\n\n## Task\n\n### 1. Get Ticket Context\n\n**MCP Calls:**\n```typescript\nif ($ARGUMENTS) {\n get({ type: 'ticket', id: $ARGUMENTS })\n} else {\n // Read active ticket from .specforge.json or find active ticket\n const config = readFile('.specforge.json')\n const specificationId = config.activeSpecification?.id\n // Find the currently active ticket\n list_tickets({ specificationId, status: [\"active\"] })\n // Use the active ticket\n get({ type: 'ticket', id: activeTicket.id })\n}\n```\n\n### 2. Generate Commit Message\n\n**Logic:**\n- Format: `feat(scope): description (TICKET-ID)`\n- Extract scope from epic\n- Use ticket title as description\n- Add ticket ID reference\n\n### 3. Create Commit\n\n**Shell:**\n```bash\ngit add .\ngit commit -m \"{type}({scope}): {description} ({ticketId})\"\n```\n\n### 4. Update Ticket Status\n\n**MCP Calls:**\n```typescript\ncomplete_work_session({\n ticketId: ticket.id\n})\n```\n\n### 5. Display Commit Result\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nCOMMIT CREATED\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nTicket: E{n}-T{m}\nMessage: {commitMessage}\nHash: {commitHash}\n\nTICKET COMPLETED\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\u2713 E{n}-T{m} marked as done\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\nNext: Run /sf-next for the next ticket\n```\n\n## Notes\n- Automatically completes the work session\n- Uses conventional commit format\n- Includes ticket ID for traceability\n";
7
7
  //# sourceMappingURL=sf-commit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sf-commit.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-commit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,iBAAiB,+sFA0E7B,CAAC"}
1
+ {"version":3,"file":"sf-commit.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-commit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,iBAAiB,qtFA0E7B,CAAC"}
@@ -12,7 +12,7 @@ Create a git commit with SpecForge ticket metadata.
12
12
  **MCP Calls:**
13
13
  \`\`\`typescript
14
14
  if ($ARGUMENTS) {
15
- get_ticket({ ticketId: $ARGUMENTS })
15
+ get({ type: 'ticket', id: $ARGUMENTS })
16
16
  } else {
17
17
  // Read active ticket from .specforge.json or find active ticket
18
18
  const config = readFile('.specforge.json')
@@ -20,7 +20,7 @@ if ($ARGUMENTS) {
20
20
  // Find the currently active ticket
21
21
  list_tickets({ specificationId, status: ["active"] })
22
22
  // Use the active ticket
23
- get_ticket({ ticketId: activeTicket.id })
23
+ get({ type: 'ticket', id: activeTicket.id })
24
24
  }
25
25
  \`\`\`
26
26
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/cli/templates/content/sf-commit.ts"],"sourcesContent":["/**\n * SF-Commit Command Template\n *\n * Template for committing changes with SpecForge ticket metadata.\n */\n\nexport const SF_COMMIT_CONTENT = `# Commit Changes (SpecForge)\n\nCreate a git commit with SpecForge ticket metadata.\n\n## Arguments\n- \\`$ARGUMENTS\\` - Optional: Ticket ID (uses context if not provided)\n\n## Task\n\n### 1. Get Ticket Context\n\n**MCP Calls:**\n\\`\\`\\`typescript\nif ($ARGUMENTS) {\n get_ticket({ ticketId: $ARGUMENTS })\n} else {\n // Read active ticket from .specforge.json or find active ticket\n const config = readFile('.specforge.json')\n const specificationId = config.activeSpecification?.id\n // Find the currently active ticket\n list_tickets({ specificationId, status: [\"active\"] })\n // Use the active ticket\n get_ticket({ ticketId: activeTicket.id })\n}\n\\`\\`\\`\n\n### 2. Generate Commit Message\n\n**Logic:**\n- Format: \\`feat(scope): description (TICKET-ID)\\`\n- Extract scope from epic\n- Use ticket title as description\n- Add ticket ID reference\n\n### 3. Create Commit\n\n**Shell:**\n\\`\\`\\`bash\ngit add .\ngit commit -m \"{type}({scope}): {description} ({ticketId})\"\n\\`\\`\\`\n\n### 4. Update Ticket Status\n\n**MCP Calls:**\n\\`\\`\\`typescript\ncomplete_work_session({\n ticketId: ticket.id\n})\n\\`\\`\\`\n\n### 5. Display Commit Result\n\n**Output:**\n\\`\\`\\`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nCOMMIT CREATED\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nTicket: E{n}-T{m}\nMessage: {commitMessage}\nHash: {commitHash}\n\nTICKET COMPLETED\n─────────────────────────────────────────────────────────────────\n✓ E{n}-T{m} marked as done\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nNext: Run /sf-next for the next ticket\n\\`\\`\\`\n\n## Notes\n- Automatically completes the work session\n- Uses conventional commit format\n- Includes ticket ID for traceability\n`;\n"],"mappings":"AAMO,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../../../src/cli/templates/content/sf-commit.ts"],"sourcesContent":["/**\n * SF-Commit Command Template\n *\n * Template for committing changes with SpecForge ticket metadata.\n */\n\nexport const SF_COMMIT_CONTENT = `# Commit Changes (SpecForge)\n\nCreate a git commit with SpecForge ticket metadata.\n\n## Arguments\n- \\`$ARGUMENTS\\` - Optional: Ticket ID (uses context if not provided)\n\n## Task\n\n### 1. Get Ticket Context\n\n**MCP Calls:**\n\\`\\`\\`typescript\nif ($ARGUMENTS) {\n get({ type: 'ticket', id: $ARGUMENTS })\n} else {\n // Read active ticket from .specforge.json or find active ticket\n const config = readFile('.specforge.json')\n const specificationId = config.activeSpecification?.id\n // Find the currently active ticket\n list_tickets({ specificationId, status: [\"active\"] })\n // Use the active ticket\n get({ type: 'ticket', id: activeTicket.id })\n}\n\\`\\`\\`\n\n### 2. Generate Commit Message\n\n**Logic:**\n- Format: \\`feat(scope): description (TICKET-ID)\\`\n- Extract scope from epic\n- Use ticket title as description\n- Add ticket ID reference\n\n### 3. Create Commit\n\n**Shell:**\n\\`\\`\\`bash\ngit add .\ngit commit -m \"{type}({scope}): {description} ({ticketId})\"\n\\`\\`\\`\n\n### 4. Update Ticket Status\n\n**MCP Calls:**\n\\`\\`\\`typescript\ncomplete_work_session({\n ticketId: ticket.id\n})\n\\`\\`\\`\n\n### 5. Display Commit Result\n\n**Output:**\n\\`\\`\\`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nCOMMIT CREATED\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nTicket: E{n}-T{m}\nMessage: {commitMessage}\nHash: {commitHash}\n\nTICKET COMPLETED\n─────────────────────────────────────────────────────────────────\n✓ E{n}-T{m} marked as done\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nNext: Run /sf-next for the next ticket\n\\`\\`\\`\n\n## Notes\n- Automatically completes the work session\n- Uses conventional commit format\n- Includes ticket ID for traceability\n`;\n"],"mappings":"AAMO,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;","names":[]}
@@ -1,7 +1,10 @@
1
1
  /**
2
2
  * SF-Reset Command Template
3
3
  *
4
- * Template for resetting ticket statuses with dependency awareness.
4
+ * Re-work / recovery guide for a blocked or paused WorkSession. There is NO coarse
5
+ * `reset_work_session` verb (dropped, Gabriel 2026-06): re-work happens via a fresh
6
+ * SWS on a `ready` ticket after the human's `resolve_discovery` unblocks the blocking
7
+ * discovery (`blocked → pending`, then the readiness cascade re-derives `→ ready`).
5
8
  */
6
- export declare const SF_RESET_CONTENT = "# Reset Ticket Statuses (SpecForge)\n\nReset ticket statuses to ready state with dependency awareness.\n\n## Arguments\n- `$ARGUMENTS` - Optional: Specification ID or ticket ID to reset\n\n## Task\n\n### 1. Get Reset Scope\n\n**MCP Calls:**\n```typescript\n// Read project config\nconst config = readFile('.specforge.json')\nconst specificationId = $ARGUMENTS || config.activeSpecification?.id\n\nif ($ARGUMENTS?.match(/Ed+-Td+/)) {\n // Single ticket reset\n get_ticket({ ticketId: $ARGUMENTS })\n} else {\n // Full specification reset\n list_tickets({ specificationId })\n}\n```\n\n### 2. Reset Tickets\n\n**MCP Calls:**\n```typescript\n// Reset tickets via lifecycle operation\nreset_work_session({\n specificationId,\n ticketId: $ARGUMENTS.match(/Ed+-Td+/) ? $ARGUMENTS : undefined\n})\n```\n\n### 3. Display Reset Results\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nTICKET RESET COMPLETE\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nScope: {scope}\n\nRESET SUMMARY\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nReady: {readyCount} tickets\nBlocked: {blockedCount} tickets\nDone: {doneCount} tickets (unchanged)\n\nRESET TICKETS\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nE{n}-T{m} \u2502 {oldStatus} \u2192 {newStatus}\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n```\n\n## Notes\n- Respects dependency constraints\n- Can reset single ticket or entire specification\n- Completed tickets remain unchanged by default\n";
9
+ export declare const SF_RESET_CONTENT = "# Re-work a Blocked Ticket (SpecForge)\n\nRecover a blocked or paused ticket back into autonomous work. There is **no** coarse\n\"reset\" verb \u2014 a ticket returns to work by unblocking its blocking discovery, letting\nthe readiness cascade re-derive it to `ready`, then starting a **fresh** work session.\n\n## Arguments\n- `$ARGUMENTS` - Optional: ticket reference (e.g. `E1-T3`) or specification ID to inspect\n\n## Task\n\n### 1. Inspect what is blocked\n\n**MCP Calls:**\n```typescript\n// Read project config\nconst config = readFile('.specforge.json')\nconst specificationId = $ARGUMENTS || config.activeSpecification?.id\n\n// The spec's open discoveries (a blocking discovery IS the block).\nget_pending_discoveries({ specificationId })\n\n// The spec-wide dispatch view \u2014 paused sessions + block reasons.\nget_implementation_status({ projectId: config.projectId, specificationId, status: 'paused' })\n\n// A single ticket, when a reference was given.\nif ($ARGUMENTS?.match(/E\\d+-T\\d+/)) {\n get({ type: 'ticket', id: $ARGUMENTS })\n}\n```\n\n### 2. Unblock \u2014 the human resolves the blocking discovery\n\nA blocking discovery is unblocked by the **human**, in the SpecForge web app\n(`resolve_discovery` is a webapp action \u2014 it is NOT an MCP tool). Resolving it sets the\nticket `blocked \u2192 pending`; the readiness cascade then re-derives dependency-free\ntickets `\u2192 ready`.\n\n- Open the specification in the SpecForge web app.\n- For each blocking discovery, choose a resolution (convert to a ticket/epic, or dismiss).\n- Confirm the ticket returns to `ready` (re-run `get_implementation_status({ status: 'ready' })`).\n\n### 3. Re-dispatch \u2014 a fresh work session\n\nOnce the ticket is `ready`, start a **new** work session on it \u2014 the re-dispatched agent\nre-attaches to any paused session and continues. The per-attempt retry is already\ntracked on `WorkSession.retryCount`.\n\n**MCP Calls:**\n```typescript\nstart_work_session({ ticketId })\n```\n\n### 4. Display recovery status\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nRE-WORK STATUS\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nScope: {scope}\n\nBLOCKING DISCOVERIES\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n{discoveryId} \u2502 {description} \u2502 {status}\n\nREADY AFTER UNBLOCK\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nE{n}-T{m} \u2502 blocked \u2192 pending \u2192 ready\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n```\n\n## Notes\n- There is no `reset_work_session` and no `clear_ticket_block` verb.\n- Unblocking is the human's `resolve_discovery` (web app); the cascade re-derives readiness.\n- Re-work is always a fresh `start_work_session` on a `ready` ticket.\n";
7
10
  //# sourceMappingURL=sf-reset.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sf-reset.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-reset.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,gBAAgB,i3FA8D5B,CAAC"}
1
+ {"version":3,"file":"sf-reset.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-reset.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,gBAAgB,4lIA4E5B,CAAC"}
@@ -1,13 +1,15 @@
1
- const SF_RESET_CONTENT = `# Reset Ticket Statuses (SpecForge)
1
+ const SF_RESET_CONTENT = `# Re-work a Blocked Ticket (SpecForge)
2
2
 
3
- Reset ticket statuses to ready state with dependency awareness.
3
+ Recover a blocked or paused ticket back into autonomous work. There is **no** coarse
4
+ "reset" verb \u2014 a ticket returns to work by unblocking its blocking discovery, letting
5
+ the readiness cascade re-derive it to \`ready\`, then starting a **fresh** work session.
4
6
 
5
7
  ## Arguments
6
- - \`$ARGUMENTS\` - Optional: Specification ID or ticket ID to reset
8
+ - \`$ARGUMENTS\` - Optional: ticket reference (e.g. \`E1-T3\`) or specification ID to inspect
7
9
 
8
10
  ## Task
9
11
 
10
- ### 1. Get Reset Scope
12
+ ### 1. Inspect what is blocked
11
13
 
12
14
  **MCP Calls:**
13
15
  \`\`\`typescript
@@ -15,51 +17,63 @@ Reset ticket statuses to ready state with dependency awareness.
15
17
  const config = readFile('.specforge.json')
16
18
  const specificationId = $ARGUMENTS || config.activeSpecification?.id
17
19
 
18
- if ($ARGUMENTS?.match(/Ed+-Td+/)) {
19
- // Single ticket reset
20
- get_ticket({ ticketId: $ARGUMENTS })
21
- } else {
22
- // Full specification reset
23
- list_tickets({ specificationId })
20
+ // The spec's open discoveries (a blocking discovery IS the block).
21
+ get_pending_discoveries({ specificationId })
22
+
23
+ // The spec-wide dispatch view \u2014 paused sessions + block reasons.
24
+ get_implementation_status({ projectId: config.projectId, specificationId, status: 'paused' })
25
+
26
+ // A single ticket, when a reference was given.
27
+ if ($ARGUMENTS?.match(/E\\d+-T\\d+/)) {
28
+ get({ type: 'ticket', id: $ARGUMENTS })
24
29
  }
25
30
  \`\`\`
26
31
 
27
- ### 2. Reset Tickets
32
+ ### 2. Unblock \u2014 the human resolves the blocking discovery
33
+
34
+ A blocking discovery is unblocked by the **human**, in the SpecForge web app
35
+ (\`resolve_discovery\` is a webapp action \u2014 it is NOT an MCP tool). Resolving it sets the
36
+ ticket \`blocked \u2192 pending\`; the readiness cascade then re-derives dependency-free
37
+ tickets \`\u2192 ready\`.
38
+
39
+ - Open the specification in the SpecForge web app.
40
+ - For each blocking discovery, choose a resolution (convert to a ticket/epic, or dismiss).
41
+ - Confirm the ticket returns to \`ready\` (re-run \`get_implementation_status({ status: 'ready' })\`).
42
+
43
+ ### 3. Re-dispatch \u2014 a fresh work session
44
+
45
+ Once the ticket is \`ready\`, start a **new** work session on it \u2014 the re-dispatched agent
46
+ re-attaches to any paused session and continues. The per-attempt retry is already
47
+ tracked on \`WorkSession.retryCount\`.
28
48
 
29
49
  **MCP Calls:**
30
50
  \`\`\`typescript
31
- // Reset tickets via lifecycle operation
32
- reset_work_session({
33
- specificationId,
34
- ticketId: $ARGUMENTS.match(/Ed+-Td+/) ? $ARGUMENTS : undefined
35
- })
51
+ start_work_session({ ticketId })
36
52
  \`\`\`
37
53
 
38
- ### 3. Display Reset Results
54
+ ### 4. Display recovery status
39
55
 
40
56
  **Output:**
41
57
  \`\`\`
42
58
  \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
43
- TICKET RESET COMPLETE
59
+ RE-WORK STATUS
44
60
  \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
45
61
  Scope: {scope}
46
62
 
47
- RESET SUMMARY
63
+ BLOCKING DISCOVERIES
48
64
  \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
49
- Ready: {readyCount} tickets
50
- Blocked: {blockedCount} tickets
51
- Done: {doneCount} tickets (unchanged)
65
+ {discoveryId} \u2502 {description} \u2502 {status}
52
66
 
53
- RESET TICKETS
67
+ READY AFTER UNBLOCK
54
68
  \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
55
- E{n}-T{m} \u2502 {oldStatus} \u2192 {newStatus}
69
+ E{n}-T{m} \u2502 blocked \u2192 pending \u2192 ready
56
70
  \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
57
71
  \`\`\`
58
72
 
59
73
  ## Notes
60
- - Respects dependency constraints
61
- - Can reset single ticket or entire specification
62
- - Completed tickets remain unchanged by default
74
+ - There is no \`reset_work_session\` and no \`clear_ticket_block\` verb.
75
+ - Unblocking is the human's \`resolve_discovery\` (web app); the cascade re-derives readiness.
76
+ - Re-work is always a fresh \`start_work_session\` on a \`ready\` ticket.
63
77
  `;
64
78
  export {
65
79
  SF_RESET_CONTENT
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/cli/templates/content/sf-reset.ts"],"sourcesContent":["/**\n * SF-Reset Command Template\n *\n * Template for resetting ticket statuses with dependency awareness.\n */\n\nexport const SF_RESET_CONTENT = `# Reset Ticket Statuses (SpecForge)\n\nReset ticket statuses to ready state with dependency awareness.\n\n## Arguments\n- \\`$ARGUMENTS\\` - Optional: Specification ID or ticket ID to reset\n\n## Task\n\n### 1. Get Reset Scope\n\n**MCP Calls:**\n\\`\\`\\`typescript\n// Read project config\nconst config = readFile('.specforge.json')\nconst specificationId = $ARGUMENTS || config.activeSpecification?.id\n\nif ($ARGUMENTS?.match(/E\\d+-T\\d+/)) {\n // Single ticket reset\n get_ticket({ ticketId: $ARGUMENTS })\n} else {\n // Full specification reset\n list_tickets({ specificationId })\n}\n\\`\\`\\`\n\n### 2. Reset Tickets\n\n**MCP Calls:**\n\\`\\`\\`typescript\n// Reset tickets via lifecycle operation\nreset_work_session({\n specificationId,\n ticketId: $ARGUMENTS.match(/E\\d+-T\\d+/) ? $ARGUMENTS : undefined\n})\n\\`\\`\\`\n\n### 3. Display Reset Results\n\n**Output:**\n\\`\\`\\`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nTICKET RESET COMPLETE\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nScope: {scope}\n\nRESET SUMMARY\n─────────────────────────────────────────────────────────────────\nReady: {readyCount} tickets\nBlocked: {blockedCount} tickets\nDone: {doneCount} tickets (unchanged)\n\nRESET TICKETS\n─────────────────────────────────────────────────────────────────\nE{n}-T{m} │ {oldStatus}{newStatus}\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\\`\\`\\`\n\n## Notes\n- Respects dependency constraints\n- Can reset single ticket or entire specification\n- Completed tickets remain unchanged by default\n`;\n"],"mappings":"AAMO,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../../../src/cli/templates/content/sf-reset.ts"],"sourcesContent":["/**\n * SF-Reset Command Template\n *\n * Re-work / recovery guide for a blocked or paused WorkSession. There is NO coarse\n * `reset_work_session` verb (dropped, Gabriel 2026-06): re-work happens via a fresh\n * SWS on a `ready` ticket after the human's `resolve_discovery` unblocks the blocking\n * discovery (`blocked → pending`, then the readiness cascade re-derives `→ ready`).\n */\n\nexport const SF_RESET_CONTENT = `# Re-work a Blocked Ticket (SpecForge)\n\nRecover a blocked or paused ticket back into autonomous work. There is **no** coarse\n\"reset\" verb — a ticket returns to work by unblocking its blocking discovery, letting\nthe readiness cascade re-derive it to \\`ready\\`, then starting a **fresh** work session.\n\n## Arguments\n- \\`$ARGUMENTS\\` - Optional: ticket reference (e.g. \\`E1-T3\\`) or specification ID to inspect\n\n## Task\n\n### 1. Inspect what is blocked\n\n**MCP Calls:**\n\\`\\`\\`typescript\n// Read project config\nconst config = readFile('.specforge.json')\nconst specificationId = $ARGUMENTS || config.activeSpecification?.id\n\n// The spec's open discoveries (a blocking discovery IS the block).\nget_pending_discoveries({ specificationId })\n\n// The spec-wide dispatch view — paused sessions + block reasons.\nget_implementation_status({ projectId: config.projectId, specificationId, status: 'paused' })\n\n// A single ticket, when a reference was given.\nif ($ARGUMENTS?.match(/E\\\\d+-T\\\\d+/)) {\n get({ type: 'ticket', id: $ARGUMENTS })\n}\n\\`\\`\\`\n\n### 2. Unblock — the human resolves the blocking discovery\n\nA blocking discovery is unblocked by the **human**, in the SpecForge web app\n(\\`resolve_discovery\\` is a webapp action — it is NOT an MCP tool). Resolving it sets the\nticket \\`blocked → pending\\`; the readiness cascade then re-derives dependency-free\ntickets \\`→ ready\\`.\n\n- Open the specification in the SpecForge web app.\n- For each blocking discovery, choose a resolution (convert to a ticket/epic, or dismiss).\n- Confirm the ticket returns to \\`ready\\` (re-run \\`get_implementation_status({ status: 'ready' })\\`).\n\n### 3. Re-dispatch — a fresh work session\n\nOnce the ticket is \\`ready\\`, start a **new** work session on it the re-dispatched agent\nre-attaches to any paused session and continues. The per-attempt retry is already\ntracked on \\`WorkSession.retryCount\\`.\n\n**MCP Calls:**\n\\`\\`\\`typescript\nstart_work_session({ ticketId })\n\\`\\`\\`\n\n### 4. Display recovery status\n\n**Output:**\n\\`\\`\\`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nRE-WORK STATUS\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nScope: {scope}\n\nBLOCKING DISCOVERIES\n─────────────────────────────────────────────────────────────────\n{discoveryId} {description} {status}\n\nREADY AFTER UNBLOCK\n─────────────────────────────────────────────────────────────────\nE{n}-T{m} │ blockedpending → ready\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\\`\\`\\`\n\n## Notes\n- There is no \\`reset_work_session\\` and no \\`clear_ticket_block\\` verb.\n- Unblocking is the human's \\`resolve_discovery\\` (web app); the cascade re-derives readiness.\n- Re-work is always a fresh \\`start_work_session\\` on a \\`ready\\` ticket.\n`;\n"],"mappings":"AASO,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;","names":[]}
@@ -1,9 +1,21 @@
1
1
  /**
2
2
  * Workspace-Scoped Worker Prompt Generator
3
3
  *
4
- * Generates context-rich prompts for Agent Teams workers and validators.
5
- * Follows the Worker Initial Prompt and Validation Watcher Prompt templates
6
- * from the design doc.
4
+ * Generates context-rich prompts for Agent Teams workers and validators in the
5
+ * AUTONOMOUS MULTI-AGENT work model (M23.5):
6
+ *
7
+ * - A worker is an autonomous sfag-ticket-implementer. It runs the whole work
8
+ * lifecycle for its ticket — start_work_session (git-clean precondition) →
9
+ * action_work_session (record steps/tests/files/AC through the assay) →
10
+ * complete_work_session — with no human in the loop. N concurrent workers
11
+ * open N WorkSessions under ONE spec-wide ImplementationSession (the first
12
+ * SWS creates it, first-write-wins).
13
+ * - Blockers are RECORDED via create_discovery (blocking: true) — that IS the
14
+ * block; the worker moves on. Resolution is the human's resolve_discovery
15
+ * (web app) plus the sfag-work-resolver agent. There is no pause/reset verb.
16
+ * - The validator is an out-of-band build/test gate — it does NOT drive the
17
+ * work lifecycle and does NOT review/dismiss work (the review lifecycle is
18
+ * dormant).
7
19
  *
8
20
  * Prompts are kept concise (~2000-4000 tokens) for worker context efficiency.
9
21
  * Sections with no data are omitted entirely.
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-generator.d.ts","sourceRoot":"","sources":["../../src/lib/prompt-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE;QACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KAC1B,GAAG,IAAI,CAAC;IACT,kBAAkB,CAAC,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAC3D,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAMD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,WAAW,EACjB,SAAS,CAAC,EAAE,gBAAgB,GAAG,IAAI,EACnC,WAAW,CAAC,EAAE,kBAAkB,GAAG,IAAI,GACtC,MAAM,CAiHR;AAMD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,WAAW,EACjB,kBAAkB,CAAC,EAAE,kBAAkB,GAAG,IAAI,EAC9C,SAAS,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAClC,MAAM,CAiER"}
1
+ {"version":3,"file":"prompt-generator.d.ts","sourceRoot":"","sources":["../../src/lib/prompt-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAMH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE;QACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KAC1B,GAAG,IAAI,CAAC;IACT,kBAAkB,CAAC,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAC3D,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAMD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,WAAW,EACjB,SAAS,CAAC,EAAE,gBAAgB,GAAG,IAAI,EACnC,WAAW,CAAC,EAAE,kBAAkB,GAAG,IAAI,GACtC,MAAM,CAkHR;AAMD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,WAAW,EACjB,kBAAkB,CAAC,EAAE,kBAAkB,GAAG,IAAI,EAC9C,SAAS,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAClC,MAAM,CAwER"}
@@ -72,10 +72,11 @@ function generateWorkerPrompt(ticket, epic, spec, workspace, conventions) {
72
72
  "Only modify files listed in the implementation guide unless necessary",
73
73
  "Follow the project's coding conventions",
74
74
  "Write tests for new functionality",
75
- "BEFORE starting implementation: call `start_work_session` with the ticketId to mark it active",
76
- "AFTER completing implementation and tests: call `complete_work_session` with ticketId, summary of work done, filesCreated, filesModified, filesDeleted, and validated: true",
77
- "If blocked: call `pause_work_session` to pause work and notify the team lead",
78
- "Report any blockers or discoveries to team-lead immediately"
75
+ "BEFORE starting: ensure the worktree is clean (commit or stash prior work), then call `start_work_session` with the ticketId \u2014 a dirty worktree denies the session (`git_dirty`). SWS flips the ticket `ready \u2192 active`, opens your WorkSession under the spec-wide ImplementationSession, and returns your full orientation",
76
+ "DURING work: record every dimension with `action_work_session` in the assay order \u2014 Implementation steps \u2192 Tests \u2192 Files \u2192 Acceptance criteria (mark_implementation_step_completion, record_test_result, record_file_change, mark_acceptance_check); justify any skipped test or divergent file so coherence holds",
77
+ "AFTER the code, tests, files, and acceptance criteria are recorded AND your work is committed: call `complete_work_session` with the ticketId and a summary of the work done. CWS runs the completion gates and finalizes the ticket `active \u2192 done`",
78
+ "If blocked: record it with `create_discovery` (`blocking: true`) \u2014 that IS the block (the ticket \u2192 blocked, your session pauses). Do NOT wait and do NOT unblock it yourself; move on to the next ready ticket",
79
+ "Report any blockers or discoveries to team-lead immediately; the human + sfag-work-resolver resolve them (`resolve_discovery` in the web app). There is no pause/reset verb and no clear_ticket_block"
79
80
  ];
80
81
  if (workspace) {
81
82
  rules.unshift(
@@ -90,8 +91,12 @@ function generateValidatorPrompt(epic, validationCommands, workspace) {
90
91
  sections.push(`# SpecForge Validator: ${epic.title}`, "");
91
92
  sections.push("## Your Role");
92
93
  sections.push(
93
- "You are the validation watcher for this epic.",
94
- "After each teammate reports a ticket as complete:",
94
+ "You are the validation watcher for this epic in the autonomous multi-agent work model.",
95
+ "Workers implement tickets independently \u2014 each opens its own WorkSession, records",
96
+ "steps/tests/files/acceptance criteria through the assay, and finalizes with",
97
+ "complete_work_session. You are an out-of-band verification gate: you do NOT drive the",
98
+ "work lifecycle verbs and you do NOT review or dismiss work (the review lifecycle is",
99
+ "dormant). After a worker commits a ticket and completes its work session:",
95
100
  ""
96
101
  );
97
102
  const steps = [];
@@ -121,8 +126,11 @@ function generateValidatorPrompt(epic, validationCommands, workspace) {
121
126
  sections.push("## Rules");
122
127
  sections.push(
123
128
  "- Do NOT modify code yourself",
129
+ "- Do NOT call the work lifecycle verbs (start/action/complete_work_session) \u2014 that is the worker",
130
+ "- Do NOT review, approve, or dismiss work \u2014 the review lifecycle is dormant; you only run checks and report",
124
131
  "- If tests fail, message the worker with specific errors and file:line references",
125
132
  "- If all checks pass, confirm to team-lead",
133
+ "- If you find a genuine cross-ticket blocker, flag it to team-lead so it goes to sfag-work-resolver \u2014 do not fix it yourself",
126
134
  "- Run validations in the correct workspace directory",
127
135
  ""
128
136
  );