@generacy-ai/workflow-engine 0.0.0-preview-20260304013206

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 (347) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +265 -0
  3. package/dist/actions/base-action.d.ts +63 -0
  4. package/dist/actions/base-action.d.ts.map +1 -0
  5. package/dist/actions/base-action.js +130 -0
  6. package/dist/actions/base-action.js.map +1 -0
  7. package/dist/actions/builtin/agent-invoke.d.ts +16 -0
  8. package/dist/actions/builtin/agent-invoke.d.ts.map +1 -0
  9. package/dist/actions/builtin/agent-invoke.js +108 -0
  10. package/dist/actions/builtin/agent-invoke.js.map +1 -0
  11. package/dist/actions/builtin/humancy-api-handler.d.ts +191 -0
  12. package/dist/actions/builtin/humancy-api-handler.d.ts.map +1 -0
  13. package/dist/actions/builtin/humancy-api-handler.js +521 -0
  14. package/dist/actions/builtin/humancy-api-handler.js.map +1 -0
  15. package/dist/actions/builtin/humancy-review.d.ts +83 -0
  16. package/dist/actions/builtin/humancy-review.d.ts.map +1 -0
  17. package/dist/actions/builtin/humancy-review.js +250 -0
  18. package/dist/actions/builtin/humancy-review.js.map +1 -0
  19. package/dist/actions/builtin/pr-create.d.ts +16 -0
  20. package/dist/actions/builtin/pr-create.d.ts.map +1 -0
  21. package/dist/actions/builtin/pr-create.js +110 -0
  22. package/dist/actions/builtin/pr-create.js.map +1 -0
  23. package/dist/actions/builtin/shell.d.ts +16 -0
  24. package/dist/actions/builtin/shell.d.ts.map +1 -0
  25. package/dist/actions/builtin/shell.js +80 -0
  26. package/dist/actions/builtin/shell.js.map +1 -0
  27. package/dist/actions/builtin/speckit/index.d.ts +47 -0
  28. package/dist/actions/builtin/speckit/index.d.ts.map +1 -0
  29. package/dist/actions/builtin/speckit/index.js +347 -0
  30. package/dist/actions/builtin/speckit/index.js.map +1 -0
  31. package/dist/actions/builtin/speckit/lib/feature.d.ts +17 -0
  32. package/dist/actions/builtin/speckit/lib/feature.d.ts.map +1 -0
  33. package/dist/actions/builtin/speckit/lib/feature.js +430 -0
  34. package/dist/actions/builtin/speckit/lib/feature.js.map +1 -0
  35. package/dist/actions/builtin/speckit/lib/fs.d.ts +62 -0
  36. package/dist/actions/builtin/speckit/lib/fs.d.ts.map +1 -0
  37. package/dist/actions/builtin/speckit/lib/fs.js +181 -0
  38. package/dist/actions/builtin/speckit/lib/fs.js.map +1 -0
  39. package/dist/actions/builtin/speckit/lib/paths.d.ts +7 -0
  40. package/dist/actions/builtin/speckit/lib/paths.d.ts.map +1 -0
  41. package/dist/actions/builtin/speckit/lib/paths.js +161 -0
  42. package/dist/actions/builtin/speckit/lib/paths.js.map +1 -0
  43. package/dist/actions/builtin/speckit/lib/prereqs.d.ts +8 -0
  44. package/dist/actions/builtin/speckit/lib/prereqs.d.ts.map +1 -0
  45. package/dist/actions/builtin/speckit/lib/prereqs.js +194 -0
  46. package/dist/actions/builtin/speckit/lib/prereqs.js.map +1 -0
  47. package/dist/actions/builtin/speckit/lib/stream-batcher.d.ts +14 -0
  48. package/dist/actions/builtin/speckit/lib/stream-batcher.d.ts.map +1 -0
  49. package/dist/actions/builtin/speckit/lib/stream-batcher.js +31 -0
  50. package/dist/actions/builtin/speckit/lib/stream-batcher.js.map +1 -0
  51. package/dist/actions/builtin/speckit/lib/templates.d.ts +15 -0
  52. package/dist/actions/builtin/speckit/lib/templates.d.ts.map +1 -0
  53. package/dist/actions/builtin/speckit/lib/templates.js +176 -0
  54. package/dist/actions/builtin/speckit/lib/templates.js.map +1 -0
  55. package/dist/actions/builtin/speckit/operations/check-prereqs.d.ts +11 -0
  56. package/dist/actions/builtin/speckit/operations/check-prereqs.d.ts.map +1 -0
  57. package/dist/actions/builtin/speckit/operations/check-prereqs.js +22 -0
  58. package/dist/actions/builtin/speckit/operations/check-prereqs.js.map +1 -0
  59. package/dist/actions/builtin/speckit/operations/clarify.d.ts +7 -0
  60. package/dist/actions/builtin/speckit/operations/clarify.d.ts.map +1 -0
  61. package/dist/actions/builtin/speckit/operations/clarify.js +302 -0
  62. package/dist/actions/builtin/speckit/operations/clarify.js.map +1 -0
  63. package/dist/actions/builtin/speckit/operations/copy-template.d.ts +11 -0
  64. package/dist/actions/builtin/speckit/operations/copy-template.d.ts.map +1 -0
  65. package/dist/actions/builtin/speckit/operations/copy-template.js +23 -0
  66. package/dist/actions/builtin/speckit/operations/copy-template.js.map +1 -0
  67. package/dist/actions/builtin/speckit/operations/create-feature.d.ts +11 -0
  68. package/dist/actions/builtin/speckit/operations/create-feature.d.ts.map +1 -0
  69. package/dist/actions/builtin/speckit/operations/create-feature.js +25 -0
  70. package/dist/actions/builtin/speckit/operations/create-feature.js.map +1 -0
  71. package/dist/actions/builtin/speckit/operations/get-paths.d.ts +11 -0
  72. package/dist/actions/builtin/speckit/operations/get-paths.d.ts.map +1 -0
  73. package/dist/actions/builtin/speckit/operations/get-paths.js +17 -0
  74. package/dist/actions/builtin/speckit/operations/get-paths.js.map +1 -0
  75. package/dist/actions/builtin/speckit/operations/implement.d.ts +7 -0
  76. package/dist/actions/builtin/speckit/operations/implement.d.ts.map +1 -0
  77. package/dist/actions/builtin/speckit/operations/implement.js +246 -0
  78. package/dist/actions/builtin/speckit/operations/implement.js.map +1 -0
  79. package/dist/actions/builtin/speckit/operations/plan.d.ts +7 -0
  80. package/dist/actions/builtin/speckit/operations/plan.d.ts.map +1 -0
  81. package/dist/actions/builtin/speckit/operations/plan.js +253 -0
  82. package/dist/actions/builtin/speckit/operations/plan.js.map +1 -0
  83. package/dist/actions/builtin/speckit/operations/specify.d.ts +7 -0
  84. package/dist/actions/builtin/speckit/operations/specify.d.ts.map +1 -0
  85. package/dist/actions/builtin/speckit/operations/specify.js +178 -0
  86. package/dist/actions/builtin/speckit/operations/specify.js.map +1 -0
  87. package/dist/actions/builtin/speckit/operations/tasks-to-issues.d.ts +42 -0
  88. package/dist/actions/builtin/speckit/operations/tasks-to-issues.d.ts.map +1 -0
  89. package/dist/actions/builtin/speckit/operations/tasks-to-issues.js +386 -0
  90. package/dist/actions/builtin/speckit/operations/tasks-to-issues.js.map +1 -0
  91. package/dist/actions/builtin/speckit/operations/tasks.d.ts +7 -0
  92. package/dist/actions/builtin/speckit/operations/tasks.d.ts.map +1 -0
  93. package/dist/actions/builtin/speckit/operations/tasks.js +234 -0
  94. package/dist/actions/builtin/speckit/operations/tasks.js.map +1 -0
  95. package/dist/actions/builtin/speckit/types.d.ts +268 -0
  96. package/dist/actions/builtin/speckit/types.d.ts.map +1 -0
  97. package/dist/actions/builtin/speckit/types.js +11 -0
  98. package/dist/actions/builtin/speckit/types.js.map +1 -0
  99. package/dist/actions/builtin/verification-check.d.ts +16 -0
  100. package/dist/actions/builtin/verification-check.d.ts.map +1 -0
  101. package/dist/actions/builtin/verification-check.js +99 -0
  102. package/dist/actions/builtin/verification-check.js.map +1 -0
  103. package/dist/actions/builtin/workspace-prepare.d.ts +16 -0
  104. package/dist/actions/builtin/workspace-prepare.d.ts.map +1 -0
  105. package/dist/actions/builtin/workspace-prepare.js +108 -0
  106. package/dist/actions/builtin/workspace-prepare.js.map +1 -0
  107. package/dist/actions/cli-utils.d.ts +76 -0
  108. package/dist/actions/cli-utils.d.ts.map +1 -0
  109. package/dist/actions/cli-utils.js +278 -0
  110. package/dist/actions/cli-utils.js.map +1 -0
  111. package/dist/actions/epic/check-completion.d.ts +14 -0
  112. package/dist/actions/epic/check-completion.d.ts.map +1 -0
  113. package/dist/actions/epic/check-completion.js +57 -0
  114. package/dist/actions/epic/check-completion.js.map +1 -0
  115. package/dist/actions/epic/close.d.ts +18 -0
  116. package/dist/actions/epic/close.d.ts.map +1 -0
  117. package/dist/actions/epic/close.js +76 -0
  118. package/dist/actions/epic/close.js.map +1 -0
  119. package/dist/actions/epic/create-pr.d.ts +22 -0
  120. package/dist/actions/epic/create-pr.d.ts.map +1 -0
  121. package/dist/actions/epic/create-pr.js +140 -0
  122. package/dist/actions/epic/create-pr.js.map +1 -0
  123. package/dist/actions/epic/dispatch-children.d.ts +16 -0
  124. package/dist/actions/epic/dispatch-children.d.ts.map +1 -0
  125. package/dist/actions/epic/dispatch-children.js +95 -0
  126. package/dist/actions/epic/dispatch-children.js.map +1 -0
  127. package/dist/actions/epic/find-children.d.ts +16 -0
  128. package/dist/actions/epic/find-children.d.ts.map +1 -0
  129. package/dist/actions/epic/find-children.js +92 -0
  130. package/dist/actions/epic/find-children.js.map +1 -0
  131. package/dist/actions/epic/index.d.ts +20 -0
  132. package/dist/actions/epic/index.d.ts.map +1 -0
  133. package/dist/actions/epic/index.js +35 -0
  134. package/dist/actions/epic/index.js.map +1 -0
  135. package/dist/actions/epic/post-tasks-summary.d.ts +18 -0
  136. package/dist/actions/epic/post-tasks-summary.d.ts.map +1 -0
  137. package/dist/actions/epic/post-tasks-summary.js +123 -0
  138. package/dist/actions/epic/post-tasks-summary.js.map +1 -0
  139. package/dist/actions/epic/update-status.d.ts +22 -0
  140. package/dist/actions/epic/update-status.d.ts.map +1 -0
  141. package/dist/actions/epic/update-status.js +105 -0
  142. package/dist/actions/epic/update-status.js.map +1 -0
  143. package/dist/actions/github/add-comment.d.ts +14 -0
  144. package/dist/actions/github/add-comment.d.ts.map +1 -0
  145. package/dist/actions/github/add-comment.js +44 -0
  146. package/dist/actions/github/add-comment.js.map +1 -0
  147. package/dist/actions/github/client/gh-cli.d.ts +68 -0
  148. package/dist/actions/github/client/gh-cli.d.ts.map +1 -0
  149. package/dist/actions/github/client/gh-cli.js +781 -0
  150. package/dist/actions/github/client/gh-cli.js.map +1 -0
  151. package/dist/actions/github/client/index.d.ts +12 -0
  152. package/dist/actions/github/client/index.d.ts.map +1 -0
  153. package/dist/actions/github/client/index.js +10 -0
  154. package/dist/actions/github/client/index.js.map +1 -0
  155. package/dist/actions/github/client/interface.d.ts +270 -0
  156. package/dist/actions/github/client/interface.d.ts.map +1 -0
  157. package/dist/actions/github/client/interface.js +2 -0
  158. package/dist/actions/github/client/interface.js.map +1 -0
  159. package/dist/actions/github/commit-and-push.d.ts +19 -0
  160. package/dist/actions/github/commit-and-push.d.ts.map +1 -0
  161. package/dist/actions/github/commit-and-push.js +86 -0
  162. package/dist/actions/github/commit-and-push.js.map +1 -0
  163. package/dist/actions/github/create-draft-pr.d.ts +18 -0
  164. package/dist/actions/github/create-draft-pr.d.ts.map +1 -0
  165. package/dist/actions/github/create-draft-pr.js +76 -0
  166. package/dist/actions/github/create-draft-pr.js.map +1 -0
  167. package/dist/actions/github/get-context.d.ts +23 -0
  168. package/dist/actions/github/get-context.d.ts.map +1 -0
  169. package/dist/actions/github/get-context.js +109 -0
  170. package/dist/actions/github/get-context.js.map +1 -0
  171. package/dist/actions/github/index.d.ts +32 -0
  172. package/dist/actions/github/index.d.ts.map +1 -0
  173. package/dist/actions/github/index.js +67 -0
  174. package/dist/actions/github/index.js.map +1 -0
  175. package/dist/actions/github/label-definitions.d.ts +19 -0
  176. package/dist/actions/github/label-definitions.d.ts.map +1 -0
  177. package/dist/actions/github/label-definitions.js +71 -0
  178. package/dist/actions/github/label-definitions.js.map +1 -0
  179. package/dist/actions/github/mark-pr-ready.d.ts +14 -0
  180. package/dist/actions/github/mark-pr-ready.d.ts.map +1 -0
  181. package/dist/actions/github/mark-pr-ready.js +43 -0
  182. package/dist/actions/github/mark-pr-ready.js.map +1 -0
  183. package/dist/actions/github/merge-from-base.d.ts +15 -0
  184. package/dist/actions/github/merge-from-base.d.ts.map +1 -0
  185. package/dist/actions/github/merge-from-base.js +120 -0
  186. package/dist/actions/github/merge-from-base.js.map +1 -0
  187. package/dist/actions/github/preflight.d.ts +36 -0
  188. package/dist/actions/github/preflight.d.ts.map +1 -0
  189. package/dist/actions/github/preflight.js +292 -0
  190. package/dist/actions/github/preflight.js.map +1 -0
  191. package/dist/actions/github/read-pr-feedback.d.ts +14 -0
  192. package/dist/actions/github/read-pr-feedback.d.ts.map +1 -0
  193. package/dist/actions/github/read-pr-feedback.js +53 -0
  194. package/dist/actions/github/read-pr-feedback.js.map +1 -0
  195. package/dist/actions/github/respond-pr-feedback.d.ts +14 -0
  196. package/dist/actions/github/respond-pr-feedback.d.ts.map +1 -0
  197. package/dist/actions/github/respond-pr-feedback.js +58 -0
  198. package/dist/actions/github/respond-pr-feedback.js.map +1 -0
  199. package/dist/actions/github/review-changes.d.ts +19 -0
  200. package/dist/actions/github/review-changes.d.ts.map +1 -0
  201. package/dist/actions/github/review-changes.js +95 -0
  202. package/dist/actions/github/review-changes.js.map +1 -0
  203. package/dist/actions/github/sync-labels.d.ts +14 -0
  204. package/dist/actions/github/sync-labels.d.ts.map +1 -0
  205. package/dist/actions/github/sync-labels.js +81 -0
  206. package/dist/actions/github/sync-labels.js.map +1 -0
  207. package/dist/actions/github/update-pr.d.ts +14 -0
  208. package/dist/actions/github/update-pr.d.ts.map +1 -0
  209. package/dist/actions/github/update-pr.js +63 -0
  210. package/dist/actions/github/update-pr.js.map +1 -0
  211. package/dist/actions/index.d.ts +109 -0
  212. package/dist/actions/index.d.ts.map +1 -0
  213. package/dist/actions/index.js +233 -0
  214. package/dist/actions/index.js.map +1 -0
  215. package/dist/actions/workflow/check-gate.d.ts +15 -0
  216. package/dist/actions/workflow/check-gate.d.ts.map +1 -0
  217. package/dist/actions/workflow/check-gate.js +75 -0
  218. package/dist/actions/workflow/check-gate.js.map +1 -0
  219. package/dist/actions/workflow/index.d.ts +21 -0
  220. package/dist/actions/workflow/index.d.ts.map +1 -0
  221. package/dist/actions/workflow/index.js +31 -0
  222. package/dist/actions/workflow/index.js.map +1 -0
  223. package/dist/actions/workflow/update-phase.d.ts +15 -0
  224. package/dist/actions/workflow/update-phase.d.ts.map +1 -0
  225. package/dist/actions/workflow/update-phase.js +143 -0
  226. package/dist/actions/workflow/update-phase.js.map +1 -0
  227. package/dist/actions/workflow/update-stage.d.ts +19 -0
  228. package/dist/actions/workflow/update-stage.d.ts.map +1 -0
  229. package/dist/actions/workflow/update-stage.js +137 -0
  230. package/dist/actions/workflow/update-stage.js.map +1 -0
  231. package/dist/errors/base-workflow-not-found.d.ts +10 -0
  232. package/dist/errors/base-workflow-not-found.d.ts.map +1 -0
  233. package/dist/errors/base-workflow-not-found.js +18 -0
  234. package/dist/errors/base-workflow-not-found.js.map +1 -0
  235. package/dist/errors/circular-extends.d.ts +9 -0
  236. package/dist/errors/circular-extends.d.ts.map +1 -0
  237. package/dist/errors/circular-extends.js +13 -0
  238. package/dist/errors/circular-extends.js.map +1 -0
  239. package/dist/errors/correlation-timeout.d.ts +9 -0
  240. package/dist/errors/correlation-timeout.d.ts.map +1 -0
  241. package/dist/errors/correlation-timeout.js +13 -0
  242. package/dist/errors/correlation-timeout.js.map +1 -0
  243. package/dist/errors/workflow-override.d.ts +9 -0
  244. package/dist/errors/workflow-override.d.ts.map +1 -0
  245. package/dist/errors/workflow-override.js +12 -0
  246. package/dist/errors/workflow-override.js.map +1 -0
  247. package/dist/executor/events.d.ts +55 -0
  248. package/dist/executor/events.d.ts.map +1 -0
  249. package/dist/executor/events.js +72 -0
  250. package/dist/executor/events.js.map +1 -0
  251. package/dist/executor/gate-handler.d.ts +55 -0
  252. package/dist/executor/gate-handler.d.ts.map +1 -0
  253. package/dist/executor/gate-handler.js +139 -0
  254. package/dist/executor/gate-handler.js.map +1 -0
  255. package/dist/executor/index.d.ts +140 -0
  256. package/dist/executor/index.d.ts.map +1 -0
  257. package/dist/executor/index.js +681 -0
  258. package/dist/executor/index.js.map +1 -0
  259. package/dist/index.d.ts +24 -0
  260. package/dist/index.d.ts.map +1 -0
  261. package/dist/index.js +34 -0
  262. package/dist/index.js.map +1 -0
  263. package/dist/interpolation/context.d.ts +117 -0
  264. package/dist/interpolation/context.d.ts.map +1 -0
  265. package/dist/interpolation/context.js +256 -0
  266. package/dist/interpolation/context.js.map +1 -0
  267. package/dist/interpolation/index.d.ts +76 -0
  268. package/dist/interpolation/index.d.ts.map +1 -0
  269. package/dist/interpolation/index.js +264 -0
  270. package/dist/interpolation/index.js.map +1 -0
  271. package/dist/loader/extends.d.ts +48 -0
  272. package/dist/loader/extends.d.ts.map +1 -0
  273. package/dist/loader/extends.js +140 -0
  274. package/dist/loader/extends.js.map +1 -0
  275. package/dist/loader/index.d.ts +50 -0
  276. package/dist/loader/index.d.ts.map +1 -0
  277. package/dist/loader/index.js +190 -0
  278. package/dist/loader/index.js.map +1 -0
  279. package/dist/loader/schema.d.ts +506 -0
  280. package/dist/loader/schema.d.ts.map +1 -0
  281. package/dist/loader/schema.js +63 -0
  282. package/dist/loader/schema.js.map +1 -0
  283. package/dist/loader/validator.d.ts +33 -0
  284. package/dist/loader/validator.d.ts.map +1 -0
  285. package/dist/loader/validator.js +135 -0
  286. package/dist/loader/validator.js.map +1 -0
  287. package/dist/registry/index.d.ts +42 -0
  288. package/dist/registry/index.d.ts.map +1 -0
  289. package/dist/registry/index.js +77 -0
  290. package/dist/registry/index.js.map +1 -0
  291. package/dist/retry/index.d.ts +37 -0
  292. package/dist/retry/index.d.ts.map +1 -0
  293. package/dist/retry/index.js +225 -0
  294. package/dist/retry/index.js.map +1 -0
  295. package/dist/retry/strategies.d.ts +74 -0
  296. package/dist/retry/strategies.d.ts.map +1 -0
  297. package/dist/retry/strategies.js +136 -0
  298. package/dist/retry/strategies.js.map +1 -0
  299. package/dist/store/filesystem-store.d.ts +52 -0
  300. package/dist/store/filesystem-store.d.ts.map +1 -0
  301. package/dist/store/filesystem-store.js +230 -0
  302. package/dist/store/filesystem-store.js.map +1 -0
  303. package/dist/store/index.d.ts +7 -0
  304. package/dist/store/index.d.ts.map +1 -0
  305. package/dist/store/index.js +6 -0
  306. package/dist/store/index.js.map +1 -0
  307. package/dist/types/action.d.ts +358 -0
  308. package/dist/types/action.d.ts.map +1 -0
  309. package/dist/types/action.js +96 -0
  310. package/dist/types/action.js.map +1 -0
  311. package/dist/types/events.d.ts +25 -0
  312. package/dist/types/events.d.ts.map +1 -0
  313. package/dist/types/events.js +6 -0
  314. package/dist/types/events.js.map +1 -0
  315. package/dist/types/execution.d.ts +145 -0
  316. package/dist/types/execution.d.ts.map +1 -0
  317. package/dist/types/execution.js +2 -0
  318. package/dist/types/execution.js.map +1 -0
  319. package/dist/types/gate.d.ts +98 -0
  320. package/dist/types/gate.d.ts.map +1 -0
  321. package/dist/types/gate.js +41 -0
  322. package/dist/types/gate.js.map +1 -0
  323. package/dist/types/github.d.ts +706 -0
  324. package/dist/types/github.d.ts.map +1 -0
  325. package/dist/types/github.js +6 -0
  326. package/dist/types/github.js.map +1 -0
  327. package/dist/types/index.d.ts +17 -0
  328. package/dist/types/index.d.ts.map +1 -0
  329. package/dist/types/index.js +8 -0
  330. package/dist/types/index.js.map +1 -0
  331. package/dist/types/logger.d.ts +60 -0
  332. package/dist/types/logger.d.ts.map +1 -0
  333. package/dist/types/logger.js +66 -0
  334. package/dist/types/logger.js.map +1 -0
  335. package/dist/types/retry.d.ts +36 -0
  336. package/dist/types/retry.d.ts.map +1 -0
  337. package/dist/types/retry.js +6 -0
  338. package/dist/types/retry.js.map +1 -0
  339. package/dist/types/store.d.ts +88 -0
  340. package/dist/types/store.d.ts.map +1 -0
  341. package/dist/types/store.js +6 -0
  342. package/dist/types/store.js.map +1 -0
  343. package/dist/types/workflow.d.ts +105 -0
  344. package/dist/types/workflow.d.ts.map +1 -0
  345. package/dist/types/workflow.js +6 -0
  346. package/dist/types/workflow.js.map +1 -0
  347. package/package.json +69 -0
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Specify operation handler.
3
+ * Uses agent.invoke to generate feature specification from description.
4
+ */
5
+ import { join } from 'node:path';
6
+ import { executeCommand, extractJSON } from '../../../cli-utils.js';
7
+ import { exists, readFile } from '../lib/fs.js';
8
+ import { StreamBatcher } from '../lib/stream-batcher.js';
9
+ /**
10
+ * Build the prompt for spec generation
11
+ */
12
+ function buildSpecifyPrompt(featureDir, existingSpec, issueContext) {
13
+ let prompt = `Generate a comprehensive feature specification.
14
+
15
+ Feature directory: ${featureDir}
16
+ Spec file: ${join(featureDir, 'spec.md')}
17
+
18
+ `;
19
+ if (issueContext) {
20
+ prompt += `Issue context:
21
+ ${issueContext}
22
+
23
+ `;
24
+ }
25
+ if (existingSpec) {
26
+ prompt += `Existing spec (update and improve):
27
+ ${existingSpec}
28
+
29
+ `;
30
+ }
31
+ prompt += `Instructions:
32
+ 1. Analyze the feature description and any existing spec
33
+ 2. Generate clear user stories with acceptance criteria
34
+ 3. Define functional requirements in a table format
35
+ 4. Document assumptions and out-of-scope items
36
+ 5. Include success criteria with measurable targets
37
+ 6. Write the specification to spec.md in the feature directory
38
+
39
+ The spec should follow this structure:
40
+ - Summary: Brief description of the feature
41
+ - User Stories: With acceptance criteria
42
+ - Functional Requirements: Prioritized table
43
+ - Success Criteria: Measurable targets
44
+ - Assumptions: What we assume to be true
45
+ - Out of Scope: What this feature does NOT include
46
+
47
+ Write the specification directly to the file.`;
48
+ return prompt;
49
+ }
50
+ /**
51
+ * Count user stories in spec content
52
+ */
53
+ function countUserStories(content) {
54
+ const matches = content.match(/###\s*US\d+/g);
55
+ return matches ? matches.length : 0;
56
+ }
57
+ /**
58
+ * Count functional requirements in spec content
59
+ */
60
+ function countFunctionalRequirements(content) {
61
+ const matches = content.match(/FR-\d+/g);
62
+ return matches ? matches.length : 0;
63
+ }
64
+ /**
65
+ * Execute the specify operation using agent.invoke delegation
66
+ */
67
+ export async function executeSpecify(input, context) {
68
+ const specFile = join(input.feature_dir, 'spec.md');
69
+ context.logger.info(`Generating specification for: ${input.feature_dir}`);
70
+ // Check for existing spec
71
+ let existingSpec;
72
+ if (await exists(specFile)) {
73
+ try {
74
+ existingSpec = await readFile(specFile);
75
+ context.logger.info('Found existing spec, will update and improve');
76
+ }
77
+ catch {
78
+ // Ignore read errors
79
+ }
80
+ }
81
+ // Get issue context if URL provided
82
+ let issueContext;
83
+ if (input.issue_url) {
84
+ try {
85
+ // Use gh CLI to fetch issue details
86
+ const result = await executeCommand('gh', ['issue', 'view', input.issue_url, '--json', 'title,body'], {
87
+ cwd: context.workdir,
88
+ timeout: 30000,
89
+ });
90
+ if (result.exitCode === 0) {
91
+ const issueData = extractJSON(result.stdout);
92
+ if (issueData) {
93
+ issueContext = `Title: ${issueData.title || 'Unknown'}\n\n${issueData.body || ''}`;
94
+ }
95
+ }
96
+ }
97
+ catch {
98
+ context.logger.warn('Could not fetch issue context');
99
+ }
100
+ }
101
+ // Build prompt
102
+ const prompt = buildSpecifyPrompt(input.feature_dir, existingSpec, issueContext);
103
+ try {
104
+ // Invoke Claude agent (--dangerously-skip-permissions for automated workflows)
105
+ const args = ['-p', prompt, '--output-format', 'json', '--dangerously-skip-permissions'];
106
+ const timeout = (input.timeout ?? 300) * 1000;
107
+ // Set up streaming batchers for real-time log output
108
+ const stdoutBatcher = new StreamBatcher((content) => {
109
+ context.emitEvent?.({
110
+ type: 'log:append',
111
+ data: { stream: 'stdout', stepName: 'specify', content },
112
+ });
113
+ });
114
+ const stderrBatcher = new StreamBatcher((content) => {
115
+ context.emitEvent?.({
116
+ type: 'log:append',
117
+ data: { stream: 'stderr', stepName: 'specify', content },
118
+ });
119
+ });
120
+ const result = await executeCommand('claude', args, {
121
+ cwd: input.feature_dir,
122
+ timeout,
123
+ signal: context.signal,
124
+ onStdout: (chunk) => stdoutBatcher.append(chunk),
125
+ onStderr: (chunk) => stderrBatcher.append(chunk),
126
+ });
127
+ // Flush remaining batched content
128
+ stdoutBatcher.flush();
129
+ stderrBatcher.flush();
130
+ if (result.exitCode !== 0) {
131
+ return {
132
+ success: false,
133
+ spec_file: specFile,
134
+ summary: 'Agent execution failed',
135
+ user_stories_count: 0,
136
+ functional_requirements_count: 0,
137
+ };
138
+ }
139
+ // Read the generated spec to extract metrics
140
+ let userStoriesCount = 0;
141
+ let functionalRequirementsCount = 0;
142
+ let summary = 'Specification generated';
143
+ if (await exists(specFile)) {
144
+ try {
145
+ const specContent = await readFile(specFile);
146
+ userStoriesCount = countUserStories(specContent);
147
+ functionalRequirementsCount = countFunctionalRequirements(specContent);
148
+ // Extract summary from first paragraph after "## Summary"
149
+ const summaryMatch = specContent.match(/##\s*Summary\s*\n\s*(.+)/);
150
+ if (summaryMatch?.[1]) {
151
+ summary = summaryMatch[1].trim().substring(0, 200);
152
+ }
153
+ }
154
+ catch {
155
+ // Ignore read errors
156
+ }
157
+ }
158
+ context.logger.info(`Specification generated: ${userStoriesCount} user stories, ${functionalRequirementsCount} requirements`);
159
+ return {
160
+ success: true,
161
+ spec_file: specFile,
162
+ summary,
163
+ user_stories_count: userStoriesCount,
164
+ functional_requirements_count: functionalRequirementsCount,
165
+ };
166
+ }
167
+ catch (error) {
168
+ context.logger.error(`Specify operation failed: ${error instanceof Error ? error.message : String(error)}`);
169
+ return {
170
+ success: false,
171
+ spec_file: specFile,
172
+ summary: error instanceof Error ? error.message : String(error),
173
+ user_stories_count: 0,
174
+ functional_requirements_count: 0,
175
+ };
176
+ }
177
+ }
178
+ //# sourceMappingURL=specify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specify.js","sourceRoot":"","sources":["../../../../../src/actions/builtin/speckit/operations/specify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { ParsedTask, TasksToIssuesInput, TasksToIssuesOutput, ActionContext } from '../../../../types/index.js';
2
+ /**
3
+ * Parse structured tasks.md content into an array of ParsedTask objects.
4
+ *
5
+ * Supports two formats:
6
+ *
7
+ * 1. Structured format with YAML frontmatter:
8
+ * ## Task 1
9
+ * ---
10
+ * title: Implement user authentication
11
+ * type: feature
12
+ * labels: [auth, security]
13
+ * ---
14
+ * Description of the task...
15
+ *
16
+ * 2. Fallback format (no frontmatter):
17
+ * ## Task 1 Implement user authentication
18
+ * Description text becomes the description.
19
+ * ### T001 Implement user authentication
20
+ * Description text becomes the description.
21
+ *
22
+ * Parsing rules:
23
+ * - Task sections start with `## Task N` or `### TXXX` headings
24
+ * - YAML frontmatter between `---` delimiters provides metadata
25
+ * - `title` is required in frontmatter; `type` and `labels` are optional
26
+ * - Body text after second `---` until next heading = description
27
+ * - Fallback: if no frontmatter, heading text = title, section body = description
28
+ */
29
+ export declare function parseTasksFile(content: string): ParsedTask[];
30
+ /**
31
+ * Execute the tasks-to-issues operation.
32
+ *
33
+ * Reads tasks.md from the feature directory, parses it, and creates child GitHub issues
34
+ * for each task. Idempotent — if an issue already exists for a given epic-parent + task ID
35
+ * combination, it is skipped rather than duplicated.
36
+ *
37
+ * @param input - Operation input containing feature directory, epic info, and optional trigger label
38
+ * @param context - Action execution context providing workdir and logger
39
+ * @returns Summary of created, skipped, and failed issues
40
+ */
41
+ export declare function executeTasksToIssues(input: TasksToIssuesInput, context: ActionContext): Promise<TasksToIssuesOutput>;
42
+ //# sourceMappingURL=tasks-to-issues.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks-to-issues.d.ts","sourceRoot":"","sources":["../../../../../src/actions/builtin/speckit/operations/tasks-to-issues.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EAInB,aAAa,EACd,MAAM,4BAA4B,CAAC;AAIpC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAgB5D;AAkUD;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,mBAAmB,CAAC,CAmG9B"}
@@ -0,0 +1,386 @@
1
+ /**
2
+ * Tasks-to-issues operation handler.
3
+ * Parses structured tasks.md with optional YAML frontmatter and creates child GitHub issues.
4
+ */
5
+ import { join } from 'node:path';
6
+ import { parse as parseYaml } from 'yaml';
7
+ import { executeCommand, parseJSONSafe } from '../../../cli-utils.js';
8
+ import { readFile, exists } from '../lib/fs.js';
9
+ /**
10
+ * Parse structured tasks.md content into an array of ParsedTask objects.
11
+ *
12
+ * Supports two formats:
13
+ *
14
+ * 1. Structured format with YAML frontmatter:
15
+ * ## Task 1
16
+ * ---
17
+ * title: Implement user authentication
18
+ * type: feature
19
+ * labels: [auth, security]
20
+ * ---
21
+ * Description of the task...
22
+ *
23
+ * 2. Fallback format (no frontmatter):
24
+ * ## Task 1 Implement user authentication
25
+ * Description text becomes the description.
26
+ * ### T001 Implement user authentication
27
+ * Description text becomes the description.
28
+ *
29
+ * Parsing rules:
30
+ * - Task sections start with `## Task N` or `### TXXX` headings
31
+ * - YAML frontmatter between `---` delimiters provides metadata
32
+ * - `title` is required in frontmatter; `type` and `labels` are optional
33
+ * - Body text after second `---` until next heading = description
34
+ * - Fallback: if no frontmatter, heading text = title, section body = description
35
+ */
36
+ export function parseTasksFile(content) {
37
+ if (!content || !content.trim()) {
38
+ return [];
39
+ }
40
+ const tasks = [];
41
+ const sections = splitIntoTaskSections(content);
42
+ for (const section of sections) {
43
+ const parsed = parseTaskSection(section);
44
+ if (parsed) {
45
+ tasks.push(parsed);
46
+ }
47
+ }
48
+ return tasks;
49
+ }
50
+ /**
51
+ * Split markdown content into task sections based on headings.
52
+ * Each task starts with `## Task N` or `### TXXX` heading.
53
+ */
54
+ function splitIntoTaskSections(content) {
55
+ const sections = [];
56
+ const lines = content.split('\n');
57
+ // Pattern: ## Task N or ### TXXX (with optional trailing text)
58
+ const taskHeadingPattern = /^(?:#{2,3})\s+(?:Task\s+\d+|T\d{3,})\b/;
59
+ let currentHeading = null;
60
+ let currentBodyLines = [];
61
+ for (const line of lines) {
62
+ if (taskHeadingPattern.test(line)) {
63
+ // Flush previous section
64
+ if (currentHeading !== null) {
65
+ sections.push({
66
+ heading: currentHeading,
67
+ body: currentBodyLines.join('\n'),
68
+ });
69
+ }
70
+ currentHeading = line;
71
+ currentBodyLines = [];
72
+ }
73
+ else if (currentHeading !== null) {
74
+ currentBodyLines.push(line);
75
+ }
76
+ }
77
+ // Flush final section
78
+ if (currentHeading !== null) {
79
+ sections.push({
80
+ heading: currentHeading,
81
+ body: currentBodyLines.join('\n'),
82
+ });
83
+ }
84
+ return sections;
85
+ }
86
+ /**
87
+ * Extract a task ID from a heading line.
88
+ * Matches patterns like "## Task 1", "### T007", "### T001 Description".
89
+ */
90
+ function extractTaskId(heading) {
91
+ // Try explicit TXXX pattern first
92
+ const explicitMatch = heading.match(/\b(T\d{3,})\b/);
93
+ if (explicitMatch?.[1]) {
94
+ return explicitMatch[1];
95
+ }
96
+ // Fall back to "Task N" → "T00N" format
97
+ const taskNMatch = heading.match(/Task\s+(\d+)/);
98
+ if (taskNMatch?.[1]) {
99
+ const num = parseInt(taskNMatch[1], 10);
100
+ return `T${String(num).padStart(3, '0')}`;
101
+ }
102
+ return '';
103
+ }
104
+ /**
105
+ * Extract heading text after the task identifier.
106
+ * E.g., "### T007 [DONE] Implement task parser" → "Implement task parser"
107
+ */
108
+ function extractHeadingText(heading) {
109
+ // Remove markdown heading prefix
110
+ let text = heading.replace(/^#{2,3}\s+/, '');
111
+ // Remove Task N or TXXX prefix
112
+ text = text.replace(/^(?:Task\s+\d+|T\d{3,})\s*/, '');
113
+ // Remove markers like [DONE], [P]
114
+ text = text.replace(/\[(?:DONE|P)\]\s*/g, '');
115
+ return text.trim();
116
+ }
117
+ /**
118
+ * Parse YAML frontmatter from a section body.
119
+ * Frontmatter is delimited by lines that are exactly `---`.
120
+ * Returns the parsed YAML object and remaining body, or null if no frontmatter found.
121
+ */
122
+ function extractFrontmatter(body) {
123
+ const lines = body.split('\n');
124
+ // Find the first `---` delimiter (skip leading blank lines)
125
+ let firstDelimiter = -1;
126
+ for (let i = 0; i < lines.length; i++) {
127
+ const trimmed = lines[i].trim();
128
+ if (trimmed === '')
129
+ continue;
130
+ if (trimmed === '---') {
131
+ firstDelimiter = i;
132
+ break;
133
+ }
134
+ // Non-empty, non-delimiter line before first `---` means no frontmatter
135
+ return null;
136
+ }
137
+ if (firstDelimiter === -1)
138
+ return null;
139
+ // Find the closing `---` delimiter
140
+ let secondDelimiter = -1;
141
+ for (let i = firstDelimiter + 1; i < lines.length; i++) {
142
+ if (lines[i].trim() === '---') {
143
+ secondDelimiter = i;
144
+ break;
145
+ }
146
+ }
147
+ if (secondDelimiter === -1)
148
+ return null;
149
+ const yamlContent = lines.slice(firstDelimiter + 1, secondDelimiter).join('\n');
150
+ const remainder = lines.slice(secondDelimiter + 1).join('\n');
151
+ try {
152
+ const parsed = parseYaml(yamlContent);
153
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
154
+ return { frontmatter: parsed, remainder };
155
+ }
156
+ return null;
157
+ }
158
+ catch {
159
+ // Malformed YAML — fall back to no-frontmatter parsing
160
+ return null;
161
+ }
162
+ }
163
+ /**
164
+ * Parse a single task section into a ParsedTask.
165
+ */
166
+ function parseTaskSection(section) {
167
+ const taskId = extractTaskId(section.heading);
168
+ if (!taskId)
169
+ return null;
170
+ const frontmatterResult = extractFrontmatter(section.body);
171
+ if (frontmatterResult) {
172
+ const { frontmatter, remainder } = frontmatterResult;
173
+ const title = typeof frontmatter.title === 'string' ? frontmatter.title : '';
174
+ if (!title) {
175
+ // title is required in frontmatter — fall back to heading text
176
+ return buildFallbackTask(taskId, section);
177
+ }
178
+ const task = {
179
+ task_id: taskId,
180
+ title,
181
+ description: remainder.trim(),
182
+ };
183
+ if (typeof frontmatter.type === 'string' && frontmatter.type) {
184
+ task.type = frontmatter.type;
185
+ }
186
+ if (Array.isArray(frontmatter.labels)) {
187
+ const labels = frontmatter.labels
188
+ .filter((l) => typeof l === 'string' && l.length > 0);
189
+ if (labels.length > 0) {
190
+ task.labels = labels;
191
+ }
192
+ }
193
+ return task;
194
+ }
195
+ // No frontmatter — use fallback parsing
196
+ return buildFallbackTask(taskId, section);
197
+ }
198
+ /**
199
+ * Build a ParsedTask using fallback parsing (no frontmatter).
200
+ * Heading text becomes the title, section body becomes the description.
201
+ */
202
+ function buildFallbackTask(taskId, section) {
203
+ const headingText = extractHeadingText(section.heading);
204
+ const description = section.body.trim();
205
+ return {
206
+ task_id: taskId,
207
+ title: headingText || `Task ${taskId}`,
208
+ description,
209
+ };
210
+ }
211
+ // =============================================================================
212
+ // Issue Creation with Idempotency
213
+ // =============================================================================
214
+ /**
215
+ * Default trigger label applied to child issues if none specified.
216
+ */
217
+ const DEFAULT_TRIGGER_LABEL = 'process:speckit-feature';
218
+ /**
219
+ * Build the issue body for a child issue created from an epic task.
220
+ * Includes structured markers for idempotency detection and parent tracking.
221
+ */
222
+ function buildIssueBody(task, epicIssueNumber, epicBranch) {
223
+ const lines = [];
224
+ if (task.description) {
225
+ lines.push(task.description);
226
+ lines.push('');
227
+ }
228
+ lines.push('---');
229
+ lines.push('');
230
+ lines.push(`epic-parent: #${epicIssueNumber}`);
231
+ lines.push(`task: ${task.task_id}`);
232
+ lines.push(`epic-branch: ${epicBranch}`);
233
+ return lines.join('\n');
234
+ }
235
+ /**
236
+ * Build the labels array for a child issue.
237
+ */
238
+ function buildLabels(task, triggerLabel) {
239
+ const labels = ['epic-child', triggerLabel];
240
+ if (task.type) {
241
+ labels.push(`type:${task.type}`);
242
+ }
243
+ if (task.labels) {
244
+ for (const label of task.labels) {
245
+ if (!labels.includes(label)) {
246
+ labels.push(label);
247
+ }
248
+ }
249
+ }
250
+ return labels;
251
+ }
252
+ /**
253
+ * Search for an existing child issue by epic-parent and task ID markers in the body.
254
+ * Returns the issue number if found, or null if no match.
255
+ */
256
+ async function findExistingChildIssue(epicIssueNumber, taskId, cwd) {
257
+ const searchQuery = `"epic-parent: #${epicIssueNumber}" "task: ${taskId}" in:body`;
258
+ const result = await executeCommand('gh', [
259
+ 'issue', 'list',
260
+ '--search', searchQuery,
261
+ '--json', 'number,title',
262
+ '--limit', '10',
263
+ '--state', 'all',
264
+ ], { cwd, timeout: 30000 });
265
+ if (result.exitCode !== 0) {
266
+ return null;
267
+ }
268
+ const issues = parseJSONSafe(result.stdout);
269
+ if (!issues || issues.length === 0) {
270
+ return null;
271
+ }
272
+ return { number: issues[0].number, title: issues[0].title };
273
+ }
274
+ /**
275
+ * Create a single child issue on GitHub.
276
+ * Returns the created issue number.
277
+ */
278
+ async function createChildIssue(task, body, labels, cwd) {
279
+ const args = [
280
+ 'issue', 'create',
281
+ '--title', task.title,
282
+ '--body', body,
283
+ ];
284
+ for (const label of labels) {
285
+ args.push('--label', label);
286
+ }
287
+ const result = await executeCommand('gh', args, { cwd, timeout: 30000 });
288
+ if (result.exitCode !== 0) {
289
+ throw new Error(`gh issue create failed: ${result.stderr}`);
290
+ }
291
+ // gh issue create outputs the issue URL, extract the number from it
292
+ const urlMatch = result.stdout.match(/\/issues\/(\d+)/);
293
+ if (urlMatch?.[1]) {
294
+ return parseInt(urlMatch[1], 10);
295
+ }
296
+ // Try JSON output format as fallback
297
+ const parsed = parseJSONSafe(result.stdout);
298
+ if (parsed?.number) {
299
+ return parsed.number;
300
+ }
301
+ throw new Error(`Could not extract issue number from output: ${result.stdout}`);
302
+ }
303
+ /**
304
+ * Execute the tasks-to-issues operation.
305
+ *
306
+ * Reads tasks.md from the feature directory, parses it, and creates child GitHub issues
307
+ * for each task. Idempotent — if an issue already exists for a given epic-parent + task ID
308
+ * combination, it is skipped rather than duplicated.
309
+ *
310
+ * @param input - Operation input containing feature directory, epic info, and optional trigger label
311
+ * @param context - Action execution context providing workdir and logger
312
+ * @returns Summary of created, skipped, and failed issues
313
+ */
314
+ export async function executeTasksToIssues(input, context) {
315
+ const { feature_dir, epic_issue_number, epic_branch } = input;
316
+ const triggerLabel = input.trigger_label ?? DEFAULT_TRIGGER_LABEL;
317
+ // Read tasks.md
318
+ const tasksFile = join(feature_dir, 'tasks.md');
319
+ if (!(await exists(tasksFile))) {
320
+ context.logger.warn(`tasks.md not found at ${tasksFile}`);
321
+ return {
322
+ created_issues: [],
323
+ skipped_issues: [],
324
+ failed_tasks: [],
325
+ total_tasks: 0,
326
+ };
327
+ }
328
+ const content = await readFile(tasksFile);
329
+ const tasks = parseTasksFile(content);
330
+ if (tasks.length === 0) {
331
+ context.logger.info('No tasks found in tasks.md');
332
+ return {
333
+ created_issues: [],
334
+ skipped_issues: [],
335
+ failed_tasks: [],
336
+ total_tasks: 0,
337
+ };
338
+ }
339
+ context.logger.info(`Parsed ${tasks.length} tasks from tasks.md`);
340
+ const created_issues = [];
341
+ const skipped_issues = [];
342
+ const failed_tasks = [];
343
+ for (const task of tasks) {
344
+ try {
345
+ // Check for existing child issue (idempotency)
346
+ const existing = await findExistingChildIssue(epic_issue_number, task.task_id, context.workdir);
347
+ if (existing) {
348
+ context.logger.info(`Skipping ${task.task_id} — already exists as #${existing.number}`);
349
+ skipped_issues.push({
350
+ issue_number: existing.number,
351
+ title: existing.title,
352
+ task_id: task.task_id,
353
+ });
354
+ continue;
355
+ }
356
+ // Build issue content
357
+ const body = buildIssueBody(task, epic_issue_number, epic_branch);
358
+ const labels = buildLabels(task, triggerLabel);
359
+ // Create the issue
360
+ const issueNumber = await createChildIssue(task, body, labels, context.workdir);
361
+ context.logger.info(`Created issue #${issueNumber} for ${task.task_id}: ${task.title}`);
362
+ created_issues.push({
363
+ issue_number: issueNumber,
364
+ title: task.title,
365
+ task_id: task.task_id,
366
+ });
367
+ }
368
+ catch (error) {
369
+ const reason = error instanceof Error ? error.message : String(error);
370
+ context.logger.error(`Failed to create issue for ${task.task_id}: ${reason}`);
371
+ failed_tasks.push({
372
+ task_id: task.task_id,
373
+ title: task.title,
374
+ reason,
375
+ });
376
+ }
377
+ }
378
+ context.logger.info(`Tasks-to-issues complete: ${created_issues.length} created, ${skipped_issues.length} skipped, ${failed_tasks.length} failed`);
379
+ return {
380
+ created_issues,
381
+ skipped_issues,
382
+ failed_tasks,
383
+ total_tasks: tasks.length,
384
+ };
385
+ }
386
+ //# sourceMappingURL=tasks-to-issues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks-to-issues.js","sourceRoot":"","sources":["../../../../../src/actions/builtin/speckit/operations/tasks-to-issues.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ActionContext } from '../../../../types/index.js';
2
+ import type { TasksInput, TasksOutput } from '../types.js';
3
+ /**
4
+ * Execute the tasks operation using agent.invoke delegation
5
+ */
6
+ export declare function executeTasks(input: TasksInput, context: ActionContext): Promise<TasksOutput>;
7
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../../../src/actions/builtin/speckit/operations/tasks.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAiH3D;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,WAAW,CAAC,CA+HtB"}