@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
@@ -1,3 +1,4 @@
1
+ import { appendFileSync } from "node:fs";
1
2
  import {
2
3
  ValidationError,
3
4
  ApiError,
@@ -6,6 +7,8 @@ import {
6
7
  transformError
7
8
  } from "../validation/index.js";
8
9
  import { injectContext, injectContextRequired } from "./core/context-helper.js";
10
+ import { probeExistingFiles } from "./core/file-existence-injection.js";
11
+ import { readWorktreeGitEvidence, readHeadCommitSha } from "./core/git-injection.js";
9
12
  import { tryLoadProjectConfig, saveProjectConfig } from "../cli/config/index.js";
10
13
  import {
11
14
  appendPlanningSessionRegistry,
@@ -24,19 +27,15 @@ function getTools() {
24
27
  properties: {
25
28
  type: {
26
29
  type: "string",
27
- enum: ["project", "specification", "epic", "ticket", "implementation_session"],
30
+ enum: ["project", "specification", "epic", "ticket", "blueprint"],
28
31
  description: "Entity type to retrieve"
29
32
  },
30
33
  id: {
31
34
  type: "string",
32
- description: "Entity ID (for project, specification, epic, ticket)"
33
- },
34
- specificationId: {
35
- type: "string",
36
- description: "Specification ID (for implementation_session)"
35
+ description: "Entity ID"
37
36
  }
38
37
  },
39
- required: ["type"]
38
+ required: ["type", "id"]
40
39
  }
41
40
  },
42
41
  {
@@ -47,7 +46,7 @@ function getTools() {
47
46
  properties: {
48
47
  type: {
49
48
  type: "string",
50
- enum: ["projects", "specifications", "epics", "tickets"],
49
+ enum: ["projects", "specifications", "epics", "tickets", "blueprints"],
51
50
  description: "Entity type to list"
52
51
  },
53
52
  projectId: {
@@ -108,7 +107,7 @@ At least one scope filter (projectId, specificationId, or epicId) is required.`,
108
107
  type: "array",
109
108
  items: {
110
109
  type: "string",
111
- enum: ["pending", "ready", "active", "done"]
110
+ enum: ["pending", "ready", "active", "done", "blocked"]
112
111
  },
113
112
  description: "Filter by status"
114
113
  },
@@ -120,14 +119,6 @@ At least one scope filter (projectId, specificationId, or epicId) is required.`,
120
119
  },
121
120
  description: "Filter by complexity"
122
121
  },
123
- priority: {
124
- type: "array",
125
- items: {
126
- type: "string",
127
- enum: ["low", "medium", "high", "critical"]
128
- },
129
- description: "Filter by priority"
130
- },
131
122
  projectId: {
132
123
  type: "string",
133
124
  description: "Limit search to project"
@@ -168,7 +159,6 @@ At least one scope filter (projectId, specificationId, or epicId) is required.`,
168
159
  "technicalDetails",
169
160
  "notes",
170
161
  "tags",
171
- "blockReason",
172
162
  "progress",
173
163
  "testsPassed",
174
164
  "order",
@@ -206,7 +196,7 @@ At least one scope filter (projectId, specificationId, or epicId) is required.`,
206
196
  },
207
197
  {
208
198
  name: "get_blocked_tickets",
209
- description: 'Get tickets with status "pending" and their statusReason explaining why they are blocked (unsatisfied dependencies or external block)',
199
+ description: 'Get tickets with status "pending", each with the `blockedBy` list of unsatisfied dependency tickets computed from the dependency tree.',
210
200
  inputSchema: {
211
201
  type: "object",
212
202
  properties: {
@@ -227,7 +217,6 @@ Report types:
227
217
  - 'time': Estimated vs actual hours (replaces get_time_report)
228
218
  - 'blockers': Blocked tickets with reasons (replaces get_blockers_report)
229
219
  - 'work': Completed work summary from WorkSession records (replaces get_work_summary)
230
- - 'implementation_analysis': Deeper implementation insights
231
220
  - 'sessions': Live planning/work/review sessions for a project (requires scope='project')
232
221
 
233
222
  Format options:
@@ -238,7 +227,7 @@ Format options:
238
227
  properties: {
239
228
  type: {
240
229
  type: "string",
241
- enum: ["implementation", "time", "blockers", "work", "implementation_analysis", "sessions"],
230
+ enum: ["implementation", "time", "blockers", "work", "sessions"],
242
231
  description: "Type of report to generate"
243
232
  },
244
233
  scope: {
@@ -257,6 +246,11 @@ Format options:
257
246
  endDate: {
258
247
  type: "string",
259
248
  description: "End date for work report (ISO 8601)"
249
+ },
250
+ format: {
251
+ type: "string",
252
+ enum: ["json", "summary"],
253
+ description: "Response format: 'json' (default) or 'summary'."
260
254
  }
261
255
  },
262
256
  required: ["type", "scope", "scopeId"]
@@ -267,23 +261,27 @@ Format options:
267
261
  // ========================================================================
268
262
  {
269
263
  name: "start_planning_session",
270
- description: "Start or resume a guided planning session for a specification. Project-scoped lock: only one active planning session per project (the project is derived from the spec \u2014 you do not pass it). Calling with the same spec resumes the existing session (idempotent). Calling with a different spec while one is active returns a rejection with the active session details. Planning is independent of implementation and review \u2014 they can run concurrently.",
264
+ description: "Start or resume a guided planning session for a specification. Project-scoped lock: only one active planning session per project. Calling with the same spec resumes the existing session (idempotent). Calling with a different spec while one is active returns a rejection with the active session details. Planning is independent of implementation and review \u2014 they can run concurrently.",
271
265
  inputSchema: {
272
266
  type: "object",
273
267
  properties: {
274
268
  specificationId: {
275
269
  type: "string",
276
- description: "The specification to plan. Optional \u2014 defaults to the active spec in the local config (.specforge/config.json), so you normally omit it. Do NOT pass projectId; it is derived from the spec."
270
+ description: "The specification to plan. Optional \u2014 defaults to the active spec in the local config (.specforge/config.json), so you normally omit it."
271
+ },
272
+ projectId: {
273
+ type: "string",
274
+ description: "The owning project. Optional \u2014 defaults to the active project in the local config (.specforge/config.json); injected automatically, so you normally omit it."
277
275
  }
278
276
  },
279
- // Nothing is required: specificationId falls back to local config, and the
280
- // returned sessionId is persisted + injected into subsequent calls.
277
+ // Nothing is required: specificationId/projectId fall back to local config, and
278
+ // the returned sessionId is persisted + injected into subsequent calls.
281
279
  required: []
282
280
  }
283
281
  },
284
282
  {
285
283
  name: "action_planning_session",
286
- description: "Execute a planning action within an active session. Wraps all planning operations (create/update epics, tickets, dependencies, blueprints) and read operations (get_ticket for inspecting details, gps for full readiness X-ray worst-first) with automatic status tracking. The spec status advances or regresses automatically based on the action type and gate checks. Returns updated progress, blockers, and next suggested actions after every call. Use responseDetail to control verbosity: 'minimal' (~80 tokens) for rapid iteration, 'standard' (~200 tokens, default) for normal work, 'full' (~500 tokens) for debugging.",
284
+ description: "Execute a planning action within an active session. Wraps the planning write operations (create/update/delete for epics, tickets and blueprints; plus the dependency, blueprint-link, step-link, justify and creator-election operations) and the read operation get_planning_status. The operation.type IS the backend PlanningOperationName; the remaining fields are the operation payload. To read a single ticket, use the `get` tool (type:'ticket').",
287
285
  inputSchema: {
288
286
  type: "object",
289
287
  properties: {
@@ -294,104 +292,188 @@ Format options:
294
292
  type: {
295
293
  type: "string",
296
294
  enum: [
297
- "set_metadata",
295
+ "update_spec",
298
296
  "create_epic",
299
297
  "update_epic",
300
- "create_ticket",
301
- "update_ticket",
302
298
  "delete_epic",
299
+ "create_ticket",
300
+ "ticket_general_actions",
301
+ "ticket_step_actions",
302
+ "ticket_criteria_actions",
303
+ "ticket_test_actions",
303
304
  "delete_ticket",
304
- "add_dependencies",
305
- "remove_dependency",
306
305
  "create_blueprint",
307
- "link_blueprint",
308
306
  "update_blueprint",
309
307
  "delete_blueprint",
310
- "unlink_blueprint",
311
- "get_ticket",
312
- "get_status",
313
- "gps"
308
+ "link_blueprint_to_tickets",
309
+ "unlink_blueprint_to_tickets",
310
+ "link_step_file",
311
+ "unlink_step_file",
312
+ "link_step_snippet",
313
+ "unlink_step_snippet",
314
+ "create_dependencies",
315
+ "delete_dependencies",
316
+ "apply_creator_election",
317
+ "justify",
318
+ "unjustify",
319
+ "get_planning_status"
314
320
  ],
315
- description: "The type of planning operation to perform"
321
+ description: "The planning operation to perform (lifecycle vocabulary). The type IS the backend PlanningOperationName; remaining fields are the operation payload."
316
322
  }
317
323
  },
318
324
  required: ["type"],
319
325
  oneOf: [
320
326
  {
321
- properties: { type: { const: "set_metadata" } },
322
- required: ["type"]
327
+ properties: {
328
+ type: { const: "update_spec" },
329
+ fields: { type: "object", description: "Partial spec update \u2014 only the keys you send are changed (e.g. background, goals, nonGoals, constraints, successCriteria). Fields that do not apply are declared with the `justify` op (undo with `unjustify`), never by writing values here." }
330
+ },
331
+ required: ["type", "fields"]
323
332
  },
333
+ // create_epic — SHELL only (epic_decomposition). Body fields are authored
334
+ // by update_epic in epic_expansion; only title/description/objective are
335
+ // persisted on create, so only those are advertised.
324
336
  {
325
337
  properties: {
326
338
  type: { const: "create_epic" },
327
339
  title: { type: "string", minLength: 1, description: "Epic title (non-empty)" },
328
- description: { type: "string", minLength: 1, description: "What this epic delivers" },
329
- objective: { type: "string", minLength: 1, description: "Goal achieved for the user" },
330
- goals: { type: "array", items: { type: "string" } },
331
- acceptanceCriteria: { type: "array", items: { type: "string" } },
332
- tickets: { type: "array", description: "Optional bulk-create tickets within the epic" }
340
+ description: { type: "string", description: "What this epic delivers" },
341
+ objective: { type: "string", description: "Goal achieved for the user" }
333
342
  },
334
- required: ["type", "title", "description", "objective"]
343
+ required: ["type", "title"]
335
344
  },
336
345
  {
337
346
  properties: {
338
347
  type: { const: "update_epic" },
339
- epicId: { type: "string", description: "Epic id; use list_epics or lookup_epic to find" }
348
+ id: { type: "string", description: "Epic id (use list_epics / lookup_epic to find)." },
349
+ fields: {
350
+ type: "object",
351
+ description: "Partial epic update \u2014 only the keys you send are changed. Fields that do not apply are declared with the `justify` op (undo with `unjustify`), never by writing values here.",
352
+ properties: {
353
+ title: { type: "string" },
354
+ description: { type: "string" },
355
+ objective: { type: "string", description: "Goal achieved for the user." },
356
+ architecture: { type: "string", description: "Structural approach specific to this epic." },
357
+ scope: { type: "object", description: "Epic scope.", properties: { inScope: { type: "array", items: { type: "string" } }, outOfScope: { type: "array", items: { type: "string" } }, assumptions: { type: "array", items: { type: "string" } }, externalDependencies: { type: "array", items: { type: "string" } } } },
358
+ goals: { type: "array", description: "Epic goals as objects (Epic.goals is a json object[], not string[]).", items: { type: "object", properties: { title: { type: "string" }, description: { type: "string" }, type: { type: "string", enum: ["business", "technical", "user", "operational"] }, successCriteria: { type: "array", items: { type: "string" } } }, required: ["title", "description"] } },
359
+ acceptanceCriteria: { type: "array", description: "BDD criteria objects (Epic.acceptanceCriteria is a json object[], not string[]).", items: { type: "object", properties: { given: { type: "string" }, when: { type: "string" }, then: { type: "string" } }, required: ["given", "when", "then"] } },
360
+ validationCommands: { type: "array", items: { type: "string" }, description: "Commands that verify this epic end-to-end." },
361
+ apiContracts: { type: "array", description: "API contracts this epic exposes.", items: { type: "object", properties: { id: { type: "string" }, name: { type: "string" }, type: { type: "string" }, description: { type: "string" } } } },
362
+ sharedPatterns: { type: "array", description: "Reusable patterns the epic's tickets should follow.", items: { type: "object" } },
363
+ fileStructures: { type: "array", description: "Concrete files this epic creates/modifies.", items: { type: "object", properties: { id: { type: "string" }, scope: { type: "string" }, description: { type: "string" }, content: { type: "string" } } } },
364
+ requirementsCovered: { type: "array", items: { type: "string" }, description: "Spec requirement ids this epic covers." },
365
+ nfrsCovered: { type: "array", items: { type: "string" }, description: "Spec NFR ids this epic covers." },
366
+ goalsCovered: { type: "array", items: { type: "string" }, description: "Spec goal ids this epic advances." }
367
+ }
368
+ }
340
369
  },
341
- required: ["type", "epicId"]
370
+ required: ["type", "id", "fields"]
342
371
  },
372
+ // create_ticket — SHELL (ticket_decomposition): epicId/title/description
373
+ // + ticketType (the impl/verification decision, set HERE). The remaining body
374
+ // fields are authored by the ticket node verbs in ticket_expansion;
375
+ // dependencies via create_dependencies in cross_validation.
343
376
  {
344
377
  properties: {
345
378
  type: { const: "create_ticket" },
346
379
  epicId: { type: "string", description: "Parent epic id" },
347
380
  title: { type: "string", minLength: 1, description: "Ticket title (non-empty)" },
348
381
  description: { type: "string" },
349
- ticketType: { type: "string", enum: ["implementation", "verification"], description: "Ticket type \u2014 implementation (default) or verification (tests/QA). Drives which fields the readiness rubric expects." },
350
- priority: { type: "string", enum: ["high", "medium", "low"] },
351
- complexity: { type: "string", enum: ["small", "medium", "large", "xlarge"] },
352
- acceptanceCriteria: { type: "array", items: { type: "string" } },
353
- implementationSteps: { type: "array", items: { type: "string" }, description: "Implementation steps; persisted as TicketImplementationStep rows" },
354
- dependsOn: { type: "array", items: { type: "string" }, description: "Other ticket ids this depends on; created post-insert" }
382
+ ticketType: { type: "string", enum: ["implementation", "verification"], description: "Ticket type \u2014 set here (decomposition); defaults to implementation. Editing it later via ticket_general_actions rolls the session back to ticket_decomposition." }
355
383
  },
356
384
  required: ["type", "epicId", "title"]
357
385
  },
386
+ // ME.19.1 (D8/D20) — the four ticket NODE VERBS replace the retired free-form
387
+ // `update_ticket`. Each targets ONE scope with a TYPED payload (no `fields`
388
+ // bag); complexity/planningType/ticketType are enums, so an out-of-enum value
389
+ // is denied at the schema gate before persistence. `status` is NOT settable
390
+ // (system/event-driven). Blueprint links are NOT settable here — use
391
+ // link_blueprint_to_tickets.
392
+ // ticket_general_actions — shell/general fields (partial edit).
358
393
  {
394
+ description: "Edit a ticket's shell/general fields. Only the keys you send are changed. Fields that do not apply are declared with the `justify` op (undo with `unjustify`), never by writing values here.",
359
395
  properties: {
360
- type: { const: "update_ticket" },
361
- ticketId: { type: "string", description: "Ticket id; use list_tickets or lookup_ticket to find" }
396
+ type: { const: "ticket_general_actions" },
397
+ ticketId: { type: "string", description: "Ticket id (use list_tickets / lookup_ticket to find)." },
398
+ title: { type: "string", description: "Concise imperative title." },
399
+ description: { type: "string", description: "What this ticket delivers and why." },
400
+ complexity: { type: "string", enum: ["small", "medium", "large", "xlarge"] },
401
+ planningType: { type: "string", enum: ["planning", "on_flight"], description: "Changing this rolls the session back to ticket_decomposition to re-score." },
402
+ ticketType: { type: "string", enum: ["implementation", "verification"], description: "Changing this rolls the session back to ticket_decomposition to re-score." },
403
+ epicId: { type: "string", description: "Re-parent the ticket to another epic." },
404
+ order: { type: "integer", description: "Rank hint within the epic." },
405
+ guardrails: { type: "array", items: { type: "string" }, description: "Per-ticket guardrail ids or descriptions." },
406
+ estimatedMinutes: { type: "integer", minimum: 0 }
362
407
  },
363
408
  required: ["type", "ticketId"]
364
409
  },
410
+ // ticket_step_actions — batch add/edit/remove/reorder of implementation steps.
411
+ {
412
+ description: "Batch-edit a ticket's implementation steps (add/edit/remove/reorder in one call). A step is a unit of FUNCTIONAL WORK \u2014 describe the functions/components/adjustments it makes AND what each does, never a bare filename. Declare the file(s) each step touches INLINE via `files: [{path, role}]`, role one of creates|modifies|deletes|imports|reads (imports couples to a build/run dependency; reads is a context-only glance). Fields that do not apply are declared with the `justify` op, never by writing empty values here.",
413
+ properties: {
414
+ type: { const: "ticket_step_actions" },
415
+ ticketId: { type: "string", description: "Ticket id (use list_tickets / lookup_ticket to find)." },
416
+ add: { type: "array", description: "New steps to append.", items: { type: "object", properties: { text: { type: "string" }, files: { type: "array", description: "Files this step touches, by role \u2014 derives the step\u2194file link + the TicketFileChange row.", items: { type: "object", properties: { path: { type: "string" }, role: { type: "string", enum: ["creates", "modifies", "deletes", "imports", "reads"] }, symbol: { type: "string" }, why: { type: "string" } }, required: ["path", "role"] } } }, required: ["text"] } },
417
+ edit: { type: "array", description: "Existing steps to edit (by stepId).", items: { type: "object", properties: { stepId: { type: "string" }, text: { type: "string" }, files: { type: "array", items: { type: "object", properties: { path: { type: "string" }, role: { type: "string", enum: ["creates", "modifies", "deletes", "imports", "reads"] }, symbol: { type: "string" }, why: { type: "string" } }, required: ["path", "role"] } } }, required: ["stepId"] } },
418
+ remove: { type: "array", items: { type: "string" }, description: "Step ids to remove." },
419
+ reorder: { type: "array", items: { type: "string" }, description: "Step ids in the desired order." }
420
+ },
421
+ required: ["type", "ticketId"]
422
+ },
423
+ // ticket_criteria_actions — batch add/edit/remove/reorder of acceptance criteria.
424
+ {
425
+ description: "Batch-edit a ticket's acceptance criteria (given/when/then; add/edit/remove/reorder in one call). Fields that do not apply are declared with the `justify` op, never by writing empty values here.",
426
+ properties: {
427
+ type: { const: "ticket_criteria_actions" },
428
+ ticketId: { type: "string", description: "Ticket id (use list_tickets / lookup_ticket to find)." },
429
+ add: { type: "array", description: "New acceptance criteria to append.", items: { type: "object", properties: { given: { type: "string" }, when: { type: "string" }, then: { type: "string" } }, required: ["given", "when", "then"] } },
430
+ edit: { type: "array", description: "Existing criteria to edit (by criterionId).", items: { type: "object", properties: { criterionId: { type: "string" }, given: { type: "string" }, when: { type: "string" }, then: { type: "string" } }, required: ["criterionId"] } },
431
+ remove: { type: "array", items: { type: "string" }, description: "Criterion ids to remove." },
432
+ reorder: { type: "array", items: { type: "string" }, description: "Criterion ids in the desired order." }
433
+ },
434
+ required: ["type", "ticketId"]
435
+ },
436
+ // ticket_test_actions — author the existing single-object testSpecification.
437
+ {
438
+ description: "Author a ticket's testSpecification (testTypes, qualityGates, testCommands, coverageTarget). Fields that do not apply are declared with the `justify` op, never by writing empty values here.",
439
+ properties: {
440
+ type: { const: "ticket_test_actions" },
441
+ ticketId: { type: "string", description: "Ticket id (use list_tickets / lookup_ticket to find)." },
442
+ testSpecification: { type: "object", properties: { testTypes: { type: "array", items: { type: "string", enum: ["unit", "integration", "e2e", "typecheck", "lint", "build", "contract", "structural", "layout", "a11y", "performance"] } }, qualityGates: { type: "array", items: { type: "string" } }, testCommands: { type: "array", items: { type: "string" } }, coverageTarget: { type: "integer", minimum: 0, maximum: 100 } } }
443
+ },
444
+ required: ["type", "ticketId", "testSpecification"]
445
+ },
365
446
  {
366
447
  properties: {
367
448
  type: { const: "delete_epic" },
368
- epicId: { type: "string", description: "Epic id; cascades to all tickets in the epic" }
449
+ id: { type: "string", description: "Epic id; cascades to all tickets in the epic." },
450
+ cascadeRemoveDependencies: { type: "boolean", description: "Confirm removing dependency edges pointing at this epic's tickets from outside the epic. Required (true) when such referrers exist, else the delete is denied." }
369
451
  },
370
- required: ["type", "epicId"]
452
+ required: ["type", "id"]
371
453
  },
372
454
  {
373
455
  properties: {
374
456
  type: { const: "delete_ticket" },
375
- ticketId: { type: "string" }
457
+ id: { type: "string", description: "Ticket id (use list_tickets / lookup_ticket to find)." },
458
+ cascadeRemoveDependencies: { type: "boolean", description: "Confirm removing dependency edges from other tickets that point at this ticket. Required (true) when such referrers exist, else the delete is denied." }
376
459
  },
377
- required: ["type", "ticketId"]
460
+ required: ["type", "id"]
378
461
  },
379
462
  {
380
463
  properties: {
381
- type: { const: "add_dependencies" },
464
+ type: { const: "create_dependencies" },
382
465
  dependencies: {
383
466
  type: "array",
384
467
  minItems: 1,
385
- maxItems: 100,
386
- description: "Up to 100 dependency pairs. Valid pairs commit; malformed pairs come back in failed[] with a per-entry reason.",
468
+ maxItems: 5e3,
469
+ description: 'Up to 5000 dependency pairs, each a "requires" edge (fromTicketId depends on toTicketId). The batch is validated atomically: a cycle or an all-duplicate batch is rejected with guidance; already-existing edges are skipped.',
387
470
  items: {
388
471
  type: "object",
389
472
  properties: {
390
- ticketId: { type: "string", description: "The dependent ticket" },
391
- dependsOnId: { type: "string", description: "The blocker ticket" },
392
- type: { type: "string", enum: ["requires", "blocks"], description: 'Defaults to "requires"' }
473
+ fromTicketId: { type: "string", description: "The dependent ticket (this one depends on the other)." },
474
+ toTicketId: { type: "string", description: "The blocker ticket it depends on." }
393
475
  },
394
- required: ["ticketId", "dependsOnId"]
476
+ required: ["fromTicketId", "toTicketId"]
395
477
  }
396
478
  }
397
479
  },
@@ -399,95 +481,178 @@ Format options:
399
481
  },
400
482
  {
401
483
  properties: {
402
- type: { const: "remove_dependency" },
403
- dependencyId: { type: "string" }
484
+ type: { const: "delete_dependencies" },
485
+ dependencyIds: { type: "array", minItems: 1, items: { type: "string" }, description: "TicketDependency ids to remove (use lookup/list to find)." }
404
486
  },
405
- required: ["type", "dependencyId"]
487
+ required: ["type", "dependencyIds"]
406
488
  },
489
+ // apply_creator_election (MB.16.1) — the atomic creator-election batch: file
490
+ // moves + producing steps + ordering deps in ONE cross-phase op. Only the
491
+ // status:'clean' partition is applied; conflicts are excluded + surfaced to
492
+ // get_ticket. `dependencies` may be empty (single-toucher flips).
407
493
  {
408
494
  properties: {
409
- type: { const: "remove_dependency" },
410
- ticketId: { type: "string" },
411
- dependsOnId: { type: "string" }
495
+ type: { const: "apply_creator_election" },
496
+ elections: {
497
+ type: "array",
498
+ minItems: 1,
499
+ maxItems: 5e3,
500
+ description: "The per-file creator elections. Each moves an orphan shared file to filesToBeCreated on its elected creator ticket + declares the producing step so the moved file is not a new orphan.",
501
+ items: {
502
+ type: "object",
503
+ properties: {
504
+ path: { type: "string", description: "The orphan shared file path to resolve." },
505
+ kind: { type: "string", enum: ["creates", "modifies", "deletes", "imports", "reads"], description: "The step-file role the elected ticket takes for this path (normally creates)." },
506
+ creatorTicketId: { type: "string", description: "The elected creator ticket (topologically-earliest toucher)." },
507
+ producingStep: {
508
+ type: "object",
509
+ description: "The step that produces the moved file: pass an existing step id to link it, OR text to create-and-link a new step.",
510
+ properties: {
511
+ text: { type: "string", description: "Text of a NEW producing step to create + link." },
512
+ stepId: { type: "string", description: "Id of an EXISTING step to link to the moved file." }
513
+ }
514
+ }
515
+ },
516
+ required: ["path", "kind", "creatorTicketId", "producingStep"]
517
+ }
518
+ },
519
+ dependencies: {
520
+ type: "array",
521
+ maxItems: 5e3,
522
+ description: `The ordering deps (each a "requires" edge). May be empty. Only the CLEAN partition's deps are persisted (recomputed + cycle-checked server-side).`,
523
+ items: {
524
+ type: "object",
525
+ properties: {
526
+ fromTicketId: { type: "string", description: "The dependent ticket (a non-elected toucher)." },
527
+ toTicketId: { type: "string", description: "The elected creator it depends on." }
528
+ },
529
+ required: ["fromTicketId", "toTicketId"]
530
+ }
531
+ }
412
532
  },
413
- required: ["type", "ticketId", "dependsOnId"]
533
+ required: ["type", "elections", "dependencies"]
414
534
  },
415
535
  {
416
536
  properties: {
417
537
  type: { const: "create_blueprint" },
418
538
  title: { type: "string", minLength: 1, description: "Blueprint title (non-empty)" },
419
- content: { type: "string", description: "Body. Mermaid format extracts ```mermaid``` fences automatically." },
420
- format: { type: "string", description: 'Defaults to "mermaid"' },
421
- category: { type: "string" },
539
+ content: { type: "string", description: "Body \u2014 diagram source or markdown, persisted as-is on create." },
540
+ format: { type: "string", enum: ["markdown", "mermaid", "ascii", "mixed", "html", "svg", "image"], description: 'Defaults to "mermaid"' },
541
+ category: { type: "string", enum: ["flowchart", "architecture", "state", "sequence", "erd", "mockup", "adr", "component", "deployment", "api", "algorithm", "protocol", "glossary", "design_system"], description: "Blueprint category (SpecificationBlueprint.category model enum)." },
422
542
  description: { type: "string" },
423
543
  tags: { type: "array", items: { type: "string" } }
424
544
  },
425
- required: ["type", "title"]
545
+ required: ["type", "title", "category"]
426
546
  },
427
547
  {
428
548
  properties: {
429
549
  type: { const: "update_blueprint" },
430
- blueprintId: { type: "string" }
550
+ id: { type: "string", description: "Blueprint id." },
551
+ fields: {
552
+ type: "object",
553
+ description: "Partial blueprint update \u2014 only the keys you send are changed.",
554
+ properties: {
555
+ title: { type: "string" },
556
+ content: { type: "string" },
557
+ category: { type: "string" },
558
+ description: { type: "string" },
559
+ tags: { type: "array", items: { type: "string" } }
560
+ }
561
+ }
431
562
  },
432
- required: ["type", "blueprintId"]
563
+ required: ["type", "id", "fields"]
433
564
  },
434
565
  {
435
566
  properties: {
436
567
  type: { const: "delete_blueprint" },
437
- blueprintId: { type: "string" }
568
+ id: { type: "string", description: "Blueprint id." }
438
569
  },
439
- required: ["type", "blueprintId"]
570
+ required: ["type", "id"]
440
571
  },
441
572
  {
442
573
  properties: {
443
- type: { const: "link_blueprint" },
444
- ticketId: { type: "string" },
445
- blueprintId: { type: "string" },
446
- context: { type: "string", description: "Optional context annotation" },
447
- section: { type: "string", description: "Optional section reference" }
574
+ type: { const: "link_blueprint_to_tickets" },
575
+ blueprintId: { type: "string", description: "Blueprint to link." },
576
+ ticketIds: { type: "array", minItems: 1, items: { type: "string" }, description: "Tickets to link the blueprint to." }
448
577
  },
449
- required: ["type", "ticketId", "blueprintId"]
578
+ required: ["type", "blueprintId", "ticketIds"]
450
579
  },
451
580
  {
452
581
  properties: {
453
- type: { const: "unlink_blueprint" },
454
- referenceId: { type: "string" }
582
+ type: { const: "unlink_blueprint_to_tickets" },
583
+ blueprintId: { type: "string", description: "Blueprint to unlink." },
584
+ ticketIds: { type: "array", minItems: 1, items: { type: "string" }, description: "Tickets to unlink the blueprint from." }
455
585
  },
456
- required: ["type", "referenceId"]
586
+ required: ["type", "blueprintId", "ticketIds"]
457
587
  },
588
+ // MB.14.1 — step↔artifact link verbs (create/delete a join row keyed on
589
+ // stepId + fileChangeId/snippetId). Get the ids from the ticket read-shape.
458
590
  {
459
591
  properties: {
460
- type: { const: "unlink_blueprint" },
461
- ticketId: { type: "string" },
462
- blueprintId: { type: "string" }
592
+ type: { const: "link_step_file" },
593
+ stepId: { type: "string", description: "Implementation step id (the functional unit of work)." },
594
+ fileChangeId: { type: "string", description: "Declared file-change id the step produces (from the ticket read-shape)." }
463
595
  },
464
- required: ["type", "ticketId", "blueprintId"]
596
+ required: ["type", "stepId", "fileChangeId"]
465
597
  },
466
598
  {
467
599
  properties: {
468
- type: { const: "get_ticket" },
469
- ticketId: { type: "string" },
470
- include: { type: "array", items: { type: "string", enum: ["dependencies", "testStatus", "statusReason"] } }
600
+ type: { const: "unlink_step_file" },
601
+ stepId: { type: "string", description: "Implementation step id." },
602
+ fileChangeId: { type: "string", description: "Declared file-change id to unlink from the step." }
471
603
  },
472
- required: ["type", "ticketId"]
604
+ required: ["type", "stepId", "fileChangeId"]
473
605
  },
474
606
  {
475
- properties: { type: { const: "get_status" } },
476
- required: ["type"]
607
+ properties: {
608
+ type: { const: "link_step_snippet" },
609
+ stepId: { type: "string", description: "Implementation step id." },
610
+ snippetType: { type: "string", enum: ["code", "type"], description: "'code' \u2192 TicketCodeSnippet, 'type' \u2192 TicketTypeSnippet." },
611
+ snippetId: { type: "string", description: "Code/type snippet id the step follows (recommended, not required per step \u2014 but a snippet linking NO step is dangling and blocks the ticket; link or drop it)." }
612
+ },
613
+ required: ["type", "stepId", "snippetType", "snippetId"]
614
+ },
615
+ {
616
+ properties: {
617
+ type: { const: "unlink_step_snippet" },
618
+ stepId: { type: "string", description: "Implementation step id." },
619
+ snippetType: { type: "string", enum: ["code", "type"], description: "Which snippet table to unlink from." },
620
+ snippetId: { type: "string", description: "Code/type snippet id to unlink from the step." }
621
+ },
622
+ required: ["type", "stepId", "snippetType", "snippetId"]
623
+ },
624
+ // justify — declare a field N/A (the paired declare op; unjustify removes it).
625
+ // Structural-neutral: it writes only the fieldDeclarations[scope] declaration,
626
+ // so it is native in EVERY planning phase and never rolls back. `scope` is the
627
+ // canonical field name the checks read (e.g. dependencies, codeReferences,
628
+ // apiContracts) — NOT a `fieldDeclarations`-shaped payload on update_*.
629
+ {
630
+ properties: {
631
+ type: { const: "justify" },
632
+ scope: { type: "string", description: "Canonical field name to mark not-applicable (e.g. 'dependencies', 'codeReferences', 'apiContracts')." },
633
+ entityId: { type: "string", description: "The spec/epic/ticket id the field belongs to (resolved server-side; ids are unique across the spec)." },
634
+ reason: { type: "string", description: "Why the field does not apply (must be at least 20 characters)." }
635
+ },
636
+ required: ["type", "scope", "entityId", "reason"]
477
637
  },
638
+ // unjustify — remove a previously declared N/A (clears fieldDeclarations[scope]).
639
+ // A no-op if the scope was never justified. No reason (a delete is unconditional).
478
640
  {
479
641
  properties: {
480
- type: { const: "gps" },
481
- responseDetail: { type: "string", enum: ["minimal", "standard", "full"] }
642
+ type: { const: "unjustify" },
643
+ scope: { type: "string", description: "Canonical field name whose not-applicable declaration to remove." },
644
+ entityId: { type: "string", description: "The spec/epic/ticket id the field belongs to." }
645
+ },
646
+ required: ["type", "scope", "entityId"]
647
+ },
648
+ {
649
+ // Read-only poll/resume. To read a single ticket, use the `get` tool (type:'ticket').
650
+ properties: {
651
+ type: { const: "get_planning_status" }
482
652
  },
483
653
  required: ["type"]
484
654
  }
485
655
  ]
486
- },
487
- responseDetail: {
488
- type: "string",
489
- enum: ["minimal", "standard", "full"],
490
- description: "Response detail level: minimal (~80 tokens), standard (~200, default), full (~500)"
491
656
  }
492
657
  },
493
658
  required: ["operation"]
@@ -506,7 +671,7 @@ Format options:
506
671
  },
507
672
  {
508
673
  name: "start_work_session",
509
- description: "Start working on a ticket. Returns full ticket details (description, implementation steps, AC, technicalDetails, codeReferences, typeReferences, tags, notes, complexity, priority) alongside checklistState and workSessionId. No need to call get_ticket separately. Returns error with statusReason if ticket is pending.",
674
+ description: "Start working on a ticket. Returns full ticket details (description, implementation steps, AC, technicalDetails, codeReferences, typeReferences, tags, notes, complexity, priority) alongside checklistState and workSessionId. No need to call the `get` tool (type:'ticket') separately. Returns error with statusReason if ticket is pending.",
510
675
  inputSchema: {
511
676
  type: "object",
512
677
  properties: {
@@ -522,9 +687,9 @@ Format options:
522
687
  name: "action_work_session",
523
688
  description: `Update checklist state during an active WorkSession. Combines step completion, AC validation, test result reporting, file tracking, reference review confirmation, and discovery reporting into a single atomic operation. All state changes are recorded on the WorkSession and its related validation/completion records.
524
689
 
525
- Use this instead of calling update_ticket for checklist changes. Provides:
526
- - Step completion (individual or bulk via WorkSessionStepCompletion)
527
- - Acceptance criteria validation (individual or bulk via WorkSessionACValidation)
690
+ Use this instead of reopening the planning session for checklist changes. Provides:
691
+ - Step completion (individual or bulk via WorkSessionImplStepCompletion)
692
+ - Acceptance criteria validation (individual or bulk via WorkSessionAcceptanceCheck)
528
693
  - Test result reporting (merged by test type via WorkSessionTestResult)
529
694
  - File tracking (created, modified, deleted on WorkSession)
530
695
  - Discovery reporting (create discoveries for blockers, bugs, tech debt)
@@ -545,124 +710,32 @@ Set getTicket: true to fetch full ticket details in the response \u2014 useful f
545
710
  type: "string",
546
711
  description: "The ID of the ticket being worked on (must be in active status)"
547
712
  },
548
- steps: {
549
- type: "array",
550
- description: "Individual step completion updates",
551
- items: {
552
- type: "object",
553
- properties: {
554
- index: {
555
- type: "number",
556
- description: "Zero-based index of the step in the implementation.steps array"
557
- },
558
- completed: {
559
- type: "boolean",
560
- description: "Whether the step is completed"
561
- },
562
- notes: {
563
- type: "string",
564
- description: "Optional note about this step"
565
- }
566
- },
567
- required: ["index", "completed"]
568
- }
569
- },
570
- allStepsDone: {
571
- type: "boolean",
572
- description: "Shortcut: mark all steps as completed"
573
- },
574
- acceptanceCriteria: {
575
- type: "array",
576
- description: "Individual AC validation updates",
577
- items: {
578
- type: "object",
579
- properties: {
580
- index: {
581
- type: "number",
582
- description: "Zero-based index of the AC in the acceptanceCriteria array"
583
- },
584
- validated: {
585
- type: "boolean",
586
- description: "Whether the AC is validated"
587
- },
588
- notes: {
589
- type: "string",
590
- description: "Optional note about this AC"
591
- }
592
- },
593
- required: ["index", "validated"]
594
- }
595
- },
596
- allACValidated: {
597
- type: "boolean",
598
- description: "Shortcut: mark all acceptance criteria as validated"
599
- },
600
- testResults: {
601
- type: "array",
602
- description: "Test result reports to append (merged by testType)",
603
- items: {
604
- type: "object",
605
- properties: {
606
- testType: {
607
- type: "string",
608
- description: 'Type of test (e.g., "unit", "integration", "e2e", "lint", "typeCheck")'
609
- },
610
- passed: {
611
- type: "number",
612
- description: "Number of tests that passed"
613
- },
614
- failed: {
615
- type: "number",
616
- description: "Number of tests that failed"
617
- },
618
- skipped: {
619
- type: "number",
620
- description: "Number of tests skipped"
621
- },
622
- command: {
623
- type: "string",
624
- description: "Command used to run the tests"
625
- },
626
- output: {
627
- type: "string",
628
- description: "Test output (truncated if needed)"
629
- },
630
- duration: {
631
- type: "number",
632
- description: "Duration in milliseconds"
633
- },
634
- suites: {
635
- type: "array",
636
- description: "Optional suite-level breakdown",
637
- items: {
638
- type: "object",
639
- properties: {
640
- name: { type: "string", description: "Suite name" },
641
- passed: { type: "number", description: "Passed tests in suite" },
642
- failed: { type: "number", description: "Failed tests in suite" },
643
- skipped: { type: "number", description: "Skipped tests in suite" },
644
- duration: { type: "number", description: "Suite duration in ms" }
645
- },
646
- required: ["name", "passed", "failed"]
647
- }
648
- },
649
- tests: {
650
- type: "array",
651
- description: "Optional individual test breakdown",
652
- items: {
653
- type: "object",
654
- properties: {
655
- name: { type: "string", description: "Test name" },
656
- suite: { type: "string", description: "Parent suite name" },
657
- status: { type: "string", enum: ["passed", "failed", "skipped"], description: "Test result" },
658
- duration: { type: "number", description: "Test duration in ms" }
659
- },
660
- required: ["name", "status"]
661
- }
662
- }
713
+ action: {
714
+ type: "object",
715
+ description: "The assay action to record \u2014 the AWS action vocabulary. `action` (the discriminator) is one of: mark_implementation_step_completion, mark_acceptance_check, record_test_result, add_skip_justification, amend_skip_justification, add_failure_justification, amend_failure_justification, record_file_change, add_file_change_justification, amend_file_change_justification, create_discovery (with `blocking`), update_discovery, set_discovery_resolved. Include `workSessionId` and the per-action fields. Forwarded verbatim as the lifecycle inner payload.",
716
+ properties: {
717
+ action: {
718
+ type: "string",
719
+ enum: [
720
+ "mark_implementation_step_completion",
721
+ "mark_acceptance_check",
722
+ "record_test_result",
723
+ "add_skip_justification",
724
+ "amend_skip_justification",
725
+ "add_failure_justification",
726
+ "amend_failure_justification",
727
+ "record_file_change",
728
+ "add_file_change_justification",
729
+ "amend_file_change_justification",
730
+ "create_discovery",
731
+ "update_discovery",
732
+ "set_discovery_resolved"
733
+ ],
734
+ description: "The AWS action discriminator."
663
735
  },
664
- required: ["testType", "passed", "failed"]
665
- }
736
+ workSessionId: { type: "string", description: "The active WorkSession id (from start_work_session)." }
737
+ },
738
+ required: ["action"]
666
739
  },
667
740
  notes: {
668
741
  type: "string",
@@ -760,22 +833,22 @@ Set getTicket: true to fetch full ticket details in the response \u2014 useful f
760
833
  properties: {
761
834
  tests: {
762
835
  type: "string",
763
- enum: ["passed", "failed", "skipped", "na"],
836
+ enum: ["passed", "failed", "partial", "pending"],
764
837
  description: "Unit/integration test results"
765
838
  },
766
839
  lint: {
767
840
  type: "string",
768
- enum: ["passed", "failed", "skipped", "na"],
841
+ enum: ["passed", "failed", "partial", "pending"],
769
842
  description: "Linting results"
770
843
  },
771
844
  typeCheck: {
772
845
  type: "string",
773
- enum: ["passed", "failed", "skipped", "na"],
846
+ enum: ["passed", "failed", "partial", "pending"],
774
847
  description: "TypeScript type checking results"
775
848
  },
776
849
  build: {
777
850
  type: "string",
778
- enum: ["passed", "failed", "skipped", "na"],
851
+ enum: ["passed", "failed", "partial", "pending"],
779
852
  description: "Build/compilation results"
780
853
  },
781
854
  notes: {
@@ -788,111 +861,9 @@ Set getTicket: true to fetch full ticket details in the response \u2014 useful f
788
861
  required: ["ticketId", "summary"]
789
862
  }
790
863
  },
791
- {
792
- name: "start_review_session",
793
- description: 'Start the implementation review lifecycle. Runs the implementation gate and either auto-transitions to "reviewed" (on pass) or transitions to "in_review" with an active ReviewSession (on fail). Creates correction tickets via action_review_session, then call complete_review_session.',
794
- inputSchema: {
795
- type: "object",
796
- properties: {
797
- specificationId: {
798
- type: "string",
799
- description: "The ID of the specification to review (must be in ready_for_review status)"
800
- }
801
- },
802
- required: ["specificationId"]
803
- }
804
- },
805
- {
806
- name: "action_review_session",
807
- description: 'Address findings in an active review session. Create correction tickets inline or dismiss findings with justification. Only available when specification is in "in_review" status.',
808
- inputSchema: {
809
- type: "object",
810
- properties: {
811
- specificationId: {
812
- type: "string",
813
- description: "The ID of the specification"
814
- },
815
- reviewSessionId: {
816
- type: "string",
817
- description: "The review session ID (auto-detected if omitted)"
818
- },
819
- findingsAddressed: {
820
- type: "array",
821
- description: "Findings to address in this action",
822
- items: {
823
- type: "object",
824
- properties: {
825
- findingId: {
826
- type: "string",
827
- description: "The finding ID to address"
828
- },
829
- action: {
830
- type: "string",
831
- enum: ["correction_ticket", "dismissed"],
832
- description: "How to address the finding"
833
- },
834
- correctionTicket: {
835
- type: "object",
836
- description: "Inline ticket creation params (required for correction_ticket action)",
837
- properties: {
838
- epicId: { type: "string", description: "Epic to add the correction ticket to" },
839
- title: { type: "string", description: "Ticket title" },
840
- description: { type: "string", description: "Ticket description" },
841
- ticketType: { type: "string", enum: ["implementation", "verification"], description: "Ticket type \u2014 defaults to implementation." },
842
- priority: { type: "string", enum: ["low", "medium", "high", "critical"] },
843
- complexity: { type: "string", enum: ["small", "medium", "large", "xlarge"] },
844
- estimatedHours: { type: "number" },
845
- acceptanceCriteria: { type: "array", items: { type: "string" } },
846
- implementationSteps: { type: "array", items: { type: "string" }, description: "Implementation steps; persisted as TicketImplementationStep rows" },
847
- tags: { type: "array", items: { type: "string" } }
848
- },
849
- required: ["epicId", "title"]
850
- },
851
- justification: {
852
- type: "string",
853
- description: 'Required justification when action is "dismissed"'
854
- }
855
- },
856
- required: ["findingId", "action"]
857
- }
858
- },
859
- notes: {
860
- type: "string",
861
- description: "Optional notes for this review action"
862
- }
863
- },
864
- required: ["specificationId"]
865
- }
866
- },
867
- {
868
- name: "complete_review_session",
869
- description: 'Complete an active review session. All error-severity findings must be addressed. If correction tickets exist, transitions to "in_progress". If all findings dismissed, triggers user confirmation flow.',
870
- inputSchema: {
871
- type: "object",
872
- properties: {
873
- specificationId: {
874
- type: "string",
875
- description: "The ID of the specification"
876
- },
877
- reviewSessionId: {
878
- type: "string",
879
- description: "The review session ID (auto-detected if omitted)"
880
- },
881
- summary: {
882
- type: "string",
883
- description: "Optional completion summary"
884
- },
885
- confirmAllDismissed: {
886
- type: "boolean",
887
- description: "Set to true when all findings were dismissed to trigger user confirmation flow"
888
- }
889
- },
890
- required: ["specificationId"]
891
- }
892
- },
893
864
  {
894
865
  name: "reopen_specification",
895
- description: 'Reopen a specification in "ready" status, regressing to "planning". After reopening, call start_planning_session to begin a new planning session.',
866
+ description: 'Reopen a specification in "ready" status, regressing to "planning". Use when action_planning_session reports the spec is no longer in planning. After reopening, call start_planning_session to begin a new planning session.',
896
867
  inputSchema: {
897
868
  type: "object",
898
869
  properties: {
@@ -989,53 +960,6 @@ Set getTicket: true to fetch full ticket details in the response \u2014 useful f
989
960
  required: ["operation"]
990
961
  }
991
962
  },
992
- {
993
- name: "reset_work_session",
994
- description: "Reset tickets to pending/ready status (calculated from dependencies). Returns statusCalculation showing how many became pending vs ready.",
995
- inputSchema: {
996
- type: "object",
997
- properties: {
998
- specificationId: {
999
- type: "string",
1000
- description: "The specification containing the tickets"
1001
- },
1002
- ticketIds: {
1003
- type: "array",
1004
- items: { type: "string" },
1005
- description: "Specific ticket IDs to reset"
1006
- },
1007
- fromTicketId: {
1008
- type: "string",
1009
- description: "Reset this ticket and all its dependents"
1010
- },
1011
- epicId: {
1012
- type: "string",
1013
- description: "Reset all tickets in this epic"
1014
- },
1015
- allTickets: {
1016
- type: "boolean",
1017
- description: "Reset all tickets in the specification"
1018
- },
1019
- resetDependents: {
1020
- type: "boolean",
1021
- description: "Also reset tickets that depend on the specified tickets (default: false)"
1022
- },
1023
- includeCompleted: {
1024
- type: "boolean",
1025
- description: "Include tickets with done status in the reset (default: false)"
1026
- },
1027
- preserveNotes: {
1028
- type: "boolean",
1029
- description: "Keep existing notes on tickets (default: true)"
1030
- },
1031
- clearTestResults: {
1032
- type: "boolean",
1033
- description: "Clear test result history (default: false)"
1034
- }
1035
- },
1036
- required: ["specificationId"]
1037
- }
1038
- },
1039
963
  {
1040
964
  name: "link_pull_request",
1041
965
  description: "Associate a pull request with a ticket",
@@ -1102,6 +1026,19 @@ Set getTicket: true to fetch full ticket details in the response \u2014 useful f
1102
1026
  }
1103
1027
  }
1104
1028
  ];
1029
+ const IN_DEVELOPMENT_PLANNED_FOR = {
1030
+ start_work_session: "0.2.0",
1031
+ action_work_session: "0.2.0",
1032
+ complete_work_session: "0.2.0"
1033
+ };
1034
+ for (const t of tools) {
1035
+ const plannedFor = IN_DEVELOPMENT_PLANNED_FOR[t.name];
1036
+ if (plannedFor) {
1037
+ t.description = `**In development \u2014 ships with ${plannedFor}.** Calling returns a typed stub response the client should render as a "coming soon" affordance.
1038
+
1039
+ ${t.description}`;
1040
+ }
1041
+ }
1105
1042
  return tools;
1106
1043
  }
1107
1044
  const RETRY_CONFIG = {
@@ -1155,7 +1092,22 @@ async function withRetry(fn, toolName, debug) {
1155
1092
  }
1156
1093
  function createToolHandlers(apiClient) {
1157
1094
  const callLocal = async (op, args) => {
1095
+ const debug = process.env.SPECFORGE_DEBUG === "true";
1096
+ const debugFile = process.env.SPECFORGE_DEBUG_FILE;
1097
+ const trace = (line) => {
1098
+ if (!debug) return;
1099
+ if (debugFile) {
1100
+ try {
1101
+ appendFileSync(debugFile, line + "\n");
1102
+ return;
1103
+ } catch {
1104
+ }
1105
+ }
1106
+ process.stderr.write(line + "\n");
1107
+ };
1108
+ trace(`[cli:wire \u2192] ${op} ${JSON.stringify(args)}`);
1158
1109
  const body = await apiClient.getTransport().execute(op, args);
1110
+ trace(`[cli:wire \u2190] ${op} ${JSON.stringify(body).slice(0, 800)}`);
1159
1111
  if (body && typeof body === "object") {
1160
1112
  if (body.kind === "standard_error") {
1161
1113
  const guidance = body.guidance;
@@ -1239,9 +1191,13 @@ function createToolHandlers(apiClient) {
1239
1191
  if (!specificationId) {
1240
1192
  throw new Error("No active specification. Run `specforge switch <spec-id>` or pass specificationId.");
1241
1193
  }
1194
+ const projectId = args.projectId ?? cfg?.projectId;
1195
+ if (!projectId) {
1196
+ throw new Error("No active project. Run `specforge switch <spec-id>` or pass projectId.");
1197
+ }
1242
1198
  const agentResponse = await callLocal(
1243
1199
  "start_planning_session",
1244
- { specificationId }
1200
+ { projectId, specificationId }
1245
1201
  );
1246
1202
  if (agentResponse?.sessionId) {
1247
1203
  saveProjectConfig({ planningSessionId: agentResponse.sessionId });
@@ -1281,37 +1237,37 @@ function createToolHandlers(apiClient) {
1281
1237
  if (!sessionId) {
1282
1238
  throw new Error("No active planning session. Call start_planning_session first.");
1283
1239
  }
1284
- return await callLocal("complete_planning_session", { sessionId });
1240
+ const first = await callLocal(
1241
+ "complete_planning_session",
1242
+ { sessionId }
1243
+ );
1244
+ if (first?.outcome !== "evidence_required") {
1245
+ return first;
1246
+ }
1247
+ const requested = Array.isArray(first.grepRequest?.paths) ? first.grepRequest.paths : [];
1248
+ const existingFiles = probeExistingFiles(requested);
1249
+ return await callLocal("complete_planning_session", { sessionId, existingFiles });
1285
1250
  },
1286
1251
  start_work_session: async (_client, args) => {
1287
1252
  validateRequired(args, "ticketId");
1253
+ const git = readWorktreeGitEvidence();
1288
1254
  return await callLocal("start_work_session", {
1289
- ticketId: args.ticketId
1255
+ ticketId: args.ticketId,
1256
+ gitClean: git.gitClean,
1257
+ worktreePath: git.worktreePath,
1258
+ branch: git.branch
1290
1259
  });
1291
1260
  },
1292
1261
  action_work_session: async (_client, args) => {
1293
1262
  validateRequired(args, "ticketId");
1294
1263
  return await callLocal("action_work_session", {
1295
1264
  ticketId: args.ticketId,
1296
- steps: args.steps,
1297
- allStepsDone: args.allStepsDone,
1298
- acceptanceCriteria: args.acceptanceCriteria,
1299
- allACValidated: args.allACValidated,
1300
- testResults: args.testResults,
1301
- notes: args.notes,
1302
- filesCreated: args.filesCreated,
1303
- filesModified: args.filesModified,
1304
- filesDeleted: args.filesDeleted,
1305
- discovery: args.discovery,
1306
- blockReason: args.blockReason,
1307
- getTicket: args.getTicket,
1308
- includeFullContext: args.includeFullContext,
1309
- codeSnippetsReviewed: args.codeSnippetsReviewed,
1310
- typeReferencesReviewed: args.typeReferencesReviewed
1265
+ payload: args.action ?? args.payload
1311
1266
  });
1312
1267
  },
1313
1268
  complete_work_session: async (_client, args) => {
1314
1269
  validateRequired(args, "ticketId", "summary");
1270
+ const commitSha = readHeadCommitSha();
1315
1271
  return await callLocal("complete_work_session", {
1316
1272
  ticketId: args.ticketId,
1317
1273
  summary: args.summary,
@@ -1319,31 +1275,8 @@ function createToolHandlers(apiClient) {
1319
1275
  filesCreated: args.filesCreated,
1320
1276
  filesDeleted: args.filesDeleted,
1321
1277
  actualHours: args.actualHours,
1322
- validation: args.validation
1323
- });
1324
- },
1325
- start_review_session: async (_client, args) => {
1326
- const argsWithContext = injectContextRequired(args, ["specificationId"]);
1327
- return await callLocal("start_review_session", {
1328
- specificationId: argsWithContext.specificationId
1329
- });
1330
- },
1331
- action_review_session: async (_client, args) => {
1332
- const argsWithContext = injectContextRequired(args, ["specificationId"]);
1333
- return await callLocal("action_review_session", {
1334
- specificationId: argsWithContext.specificationId,
1335
- reviewSessionId: args.reviewSessionId,
1336
- findingsAddressed: args.findingsAddressed,
1337
- notes: args.notes
1338
- });
1339
- },
1340
- complete_review_session: async (_client, args) => {
1341
- const argsWithContext = injectContextRequired(args, ["specificationId"]);
1342
- return await callLocal("complete_review_session", {
1343
- specificationId: argsWithContext.specificationId,
1344
- reviewSessionId: args.reviewSessionId,
1345
- summary: args.summary,
1346
- confirmAllDismissed: args.confirmAllDismissed
1278
+ validation: args.validation,
1279
+ ...commitSha !== null && { commitSha }
1347
1280
  });
1348
1281
  },
1349
1282
  reopen_specification: async (_client, args) => {
@@ -1361,21 +1294,6 @@ function createToolHandlers(apiClient) {
1361
1294
  feedback: async (_client, args) => {
1362
1295
  return await callLocal("feedback", args);
1363
1296
  },
1364
- reset_work_session: async (_client, args) => {
1365
- validateRequired(args, "specificationId");
1366
- return await callLocal("reset_work_session", {
1367
- specificationId: args.specificationId,
1368
- ticketIds: args.ticketIds,
1369
- fromTicketId: args.fromTicketId,
1370
- epicId: args.epicId,
1371
- allTickets: args.allTickets,
1372
- targetStatus: args.targetStatus,
1373
- resetDependents: args.resetDependents,
1374
- includeCompleted: args.includeCompleted,
1375
- preserveNotes: args.preserveNotes,
1376
- clearTestResults: args.clearTestResults
1377
- });
1378
- },
1379
1297
  link_pull_request: async (_client, args) => {
1380
1298
  validateRequired(args, "ticketId");
1381
1299
  if (!args.prNumber && !args.prUrl) {