@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.
- package/LICENSE +191 -0
- package/README.md +265 -0
- package/dist/actions/base-action.d.ts +63 -0
- package/dist/actions/base-action.d.ts.map +1 -0
- package/dist/actions/base-action.js +130 -0
- package/dist/actions/base-action.js.map +1 -0
- package/dist/actions/builtin/agent-invoke.d.ts +16 -0
- package/dist/actions/builtin/agent-invoke.d.ts.map +1 -0
- package/dist/actions/builtin/agent-invoke.js +108 -0
- package/dist/actions/builtin/agent-invoke.js.map +1 -0
- package/dist/actions/builtin/humancy-api-handler.d.ts +191 -0
- package/dist/actions/builtin/humancy-api-handler.d.ts.map +1 -0
- package/dist/actions/builtin/humancy-api-handler.js +521 -0
- package/dist/actions/builtin/humancy-api-handler.js.map +1 -0
- package/dist/actions/builtin/humancy-review.d.ts +83 -0
- package/dist/actions/builtin/humancy-review.d.ts.map +1 -0
- package/dist/actions/builtin/humancy-review.js +250 -0
- package/dist/actions/builtin/humancy-review.js.map +1 -0
- package/dist/actions/builtin/pr-create.d.ts +16 -0
- package/dist/actions/builtin/pr-create.d.ts.map +1 -0
- package/dist/actions/builtin/pr-create.js +110 -0
- package/dist/actions/builtin/pr-create.js.map +1 -0
- package/dist/actions/builtin/shell.d.ts +16 -0
- package/dist/actions/builtin/shell.d.ts.map +1 -0
- package/dist/actions/builtin/shell.js +80 -0
- package/dist/actions/builtin/shell.js.map +1 -0
- package/dist/actions/builtin/speckit/index.d.ts +47 -0
- package/dist/actions/builtin/speckit/index.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/index.js +347 -0
- package/dist/actions/builtin/speckit/index.js.map +1 -0
- package/dist/actions/builtin/speckit/lib/feature.d.ts +17 -0
- package/dist/actions/builtin/speckit/lib/feature.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/lib/feature.js +430 -0
- package/dist/actions/builtin/speckit/lib/feature.js.map +1 -0
- package/dist/actions/builtin/speckit/lib/fs.d.ts +62 -0
- package/dist/actions/builtin/speckit/lib/fs.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/lib/fs.js +181 -0
- package/dist/actions/builtin/speckit/lib/fs.js.map +1 -0
- package/dist/actions/builtin/speckit/lib/paths.d.ts +7 -0
- package/dist/actions/builtin/speckit/lib/paths.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/lib/paths.js +161 -0
- package/dist/actions/builtin/speckit/lib/paths.js.map +1 -0
- package/dist/actions/builtin/speckit/lib/prereqs.d.ts +8 -0
- package/dist/actions/builtin/speckit/lib/prereqs.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/lib/prereqs.js +194 -0
- package/dist/actions/builtin/speckit/lib/prereqs.js.map +1 -0
- package/dist/actions/builtin/speckit/lib/stream-batcher.d.ts +14 -0
- package/dist/actions/builtin/speckit/lib/stream-batcher.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/lib/stream-batcher.js +31 -0
- package/dist/actions/builtin/speckit/lib/stream-batcher.js.map +1 -0
- package/dist/actions/builtin/speckit/lib/templates.d.ts +15 -0
- package/dist/actions/builtin/speckit/lib/templates.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/lib/templates.js +176 -0
- package/dist/actions/builtin/speckit/lib/templates.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/check-prereqs.d.ts +11 -0
- package/dist/actions/builtin/speckit/operations/check-prereqs.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/check-prereqs.js +22 -0
- package/dist/actions/builtin/speckit/operations/check-prereqs.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/clarify.d.ts +7 -0
- package/dist/actions/builtin/speckit/operations/clarify.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/clarify.js +302 -0
- package/dist/actions/builtin/speckit/operations/clarify.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/copy-template.d.ts +11 -0
- package/dist/actions/builtin/speckit/operations/copy-template.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/copy-template.js +23 -0
- package/dist/actions/builtin/speckit/operations/copy-template.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/create-feature.d.ts +11 -0
- package/dist/actions/builtin/speckit/operations/create-feature.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/create-feature.js +25 -0
- package/dist/actions/builtin/speckit/operations/create-feature.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/get-paths.d.ts +11 -0
- package/dist/actions/builtin/speckit/operations/get-paths.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/get-paths.js +17 -0
- package/dist/actions/builtin/speckit/operations/get-paths.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/implement.d.ts +7 -0
- package/dist/actions/builtin/speckit/operations/implement.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/implement.js +246 -0
- package/dist/actions/builtin/speckit/operations/implement.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/plan.d.ts +7 -0
- package/dist/actions/builtin/speckit/operations/plan.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/plan.js +253 -0
- package/dist/actions/builtin/speckit/operations/plan.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/specify.d.ts +7 -0
- package/dist/actions/builtin/speckit/operations/specify.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/specify.js +178 -0
- package/dist/actions/builtin/speckit/operations/specify.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/tasks-to-issues.d.ts +42 -0
- package/dist/actions/builtin/speckit/operations/tasks-to-issues.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/tasks-to-issues.js +386 -0
- package/dist/actions/builtin/speckit/operations/tasks-to-issues.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/tasks.d.ts +7 -0
- package/dist/actions/builtin/speckit/operations/tasks.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/tasks.js +234 -0
- package/dist/actions/builtin/speckit/operations/tasks.js.map +1 -0
- package/dist/actions/builtin/speckit/types.d.ts +268 -0
- package/dist/actions/builtin/speckit/types.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/types.js +11 -0
- package/dist/actions/builtin/speckit/types.js.map +1 -0
- package/dist/actions/builtin/verification-check.d.ts +16 -0
- package/dist/actions/builtin/verification-check.d.ts.map +1 -0
- package/dist/actions/builtin/verification-check.js +99 -0
- package/dist/actions/builtin/verification-check.js.map +1 -0
- package/dist/actions/builtin/workspace-prepare.d.ts +16 -0
- package/dist/actions/builtin/workspace-prepare.d.ts.map +1 -0
- package/dist/actions/builtin/workspace-prepare.js +108 -0
- package/dist/actions/builtin/workspace-prepare.js.map +1 -0
- package/dist/actions/cli-utils.d.ts +76 -0
- package/dist/actions/cli-utils.d.ts.map +1 -0
- package/dist/actions/cli-utils.js +278 -0
- package/dist/actions/cli-utils.js.map +1 -0
- package/dist/actions/epic/check-completion.d.ts +14 -0
- package/dist/actions/epic/check-completion.d.ts.map +1 -0
- package/dist/actions/epic/check-completion.js +57 -0
- package/dist/actions/epic/check-completion.js.map +1 -0
- package/dist/actions/epic/close.d.ts +18 -0
- package/dist/actions/epic/close.d.ts.map +1 -0
- package/dist/actions/epic/close.js +76 -0
- package/dist/actions/epic/close.js.map +1 -0
- package/dist/actions/epic/create-pr.d.ts +22 -0
- package/dist/actions/epic/create-pr.d.ts.map +1 -0
- package/dist/actions/epic/create-pr.js +140 -0
- package/dist/actions/epic/create-pr.js.map +1 -0
- package/dist/actions/epic/dispatch-children.d.ts +16 -0
- package/dist/actions/epic/dispatch-children.d.ts.map +1 -0
- package/dist/actions/epic/dispatch-children.js +95 -0
- package/dist/actions/epic/dispatch-children.js.map +1 -0
- package/dist/actions/epic/find-children.d.ts +16 -0
- package/dist/actions/epic/find-children.d.ts.map +1 -0
- package/dist/actions/epic/find-children.js +92 -0
- package/dist/actions/epic/find-children.js.map +1 -0
- package/dist/actions/epic/index.d.ts +20 -0
- package/dist/actions/epic/index.d.ts.map +1 -0
- package/dist/actions/epic/index.js +35 -0
- package/dist/actions/epic/index.js.map +1 -0
- package/dist/actions/epic/post-tasks-summary.d.ts +18 -0
- package/dist/actions/epic/post-tasks-summary.d.ts.map +1 -0
- package/dist/actions/epic/post-tasks-summary.js +123 -0
- package/dist/actions/epic/post-tasks-summary.js.map +1 -0
- package/dist/actions/epic/update-status.d.ts +22 -0
- package/dist/actions/epic/update-status.d.ts.map +1 -0
- package/dist/actions/epic/update-status.js +105 -0
- package/dist/actions/epic/update-status.js.map +1 -0
- package/dist/actions/github/add-comment.d.ts +14 -0
- package/dist/actions/github/add-comment.d.ts.map +1 -0
- package/dist/actions/github/add-comment.js +44 -0
- package/dist/actions/github/add-comment.js.map +1 -0
- package/dist/actions/github/client/gh-cli.d.ts +68 -0
- package/dist/actions/github/client/gh-cli.d.ts.map +1 -0
- package/dist/actions/github/client/gh-cli.js +781 -0
- package/dist/actions/github/client/gh-cli.js.map +1 -0
- package/dist/actions/github/client/index.d.ts +12 -0
- package/dist/actions/github/client/index.d.ts.map +1 -0
- package/dist/actions/github/client/index.js +10 -0
- package/dist/actions/github/client/index.js.map +1 -0
- package/dist/actions/github/client/interface.d.ts +270 -0
- package/dist/actions/github/client/interface.d.ts.map +1 -0
- package/dist/actions/github/client/interface.js +2 -0
- package/dist/actions/github/client/interface.js.map +1 -0
- package/dist/actions/github/commit-and-push.d.ts +19 -0
- package/dist/actions/github/commit-and-push.d.ts.map +1 -0
- package/dist/actions/github/commit-and-push.js +86 -0
- package/dist/actions/github/commit-and-push.js.map +1 -0
- package/dist/actions/github/create-draft-pr.d.ts +18 -0
- package/dist/actions/github/create-draft-pr.d.ts.map +1 -0
- package/dist/actions/github/create-draft-pr.js +76 -0
- package/dist/actions/github/create-draft-pr.js.map +1 -0
- package/dist/actions/github/get-context.d.ts +23 -0
- package/dist/actions/github/get-context.d.ts.map +1 -0
- package/dist/actions/github/get-context.js +109 -0
- package/dist/actions/github/get-context.js.map +1 -0
- package/dist/actions/github/index.d.ts +32 -0
- package/dist/actions/github/index.d.ts.map +1 -0
- package/dist/actions/github/index.js +67 -0
- package/dist/actions/github/index.js.map +1 -0
- package/dist/actions/github/label-definitions.d.ts +19 -0
- package/dist/actions/github/label-definitions.d.ts.map +1 -0
- package/dist/actions/github/label-definitions.js +71 -0
- package/dist/actions/github/label-definitions.js.map +1 -0
- package/dist/actions/github/mark-pr-ready.d.ts +14 -0
- package/dist/actions/github/mark-pr-ready.d.ts.map +1 -0
- package/dist/actions/github/mark-pr-ready.js +43 -0
- package/dist/actions/github/mark-pr-ready.js.map +1 -0
- package/dist/actions/github/merge-from-base.d.ts +15 -0
- package/dist/actions/github/merge-from-base.d.ts.map +1 -0
- package/dist/actions/github/merge-from-base.js +120 -0
- package/dist/actions/github/merge-from-base.js.map +1 -0
- package/dist/actions/github/preflight.d.ts +36 -0
- package/dist/actions/github/preflight.d.ts.map +1 -0
- package/dist/actions/github/preflight.js +292 -0
- package/dist/actions/github/preflight.js.map +1 -0
- package/dist/actions/github/read-pr-feedback.d.ts +14 -0
- package/dist/actions/github/read-pr-feedback.d.ts.map +1 -0
- package/dist/actions/github/read-pr-feedback.js +53 -0
- package/dist/actions/github/read-pr-feedback.js.map +1 -0
- package/dist/actions/github/respond-pr-feedback.d.ts +14 -0
- package/dist/actions/github/respond-pr-feedback.d.ts.map +1 -0
- package/dist/actions/github/respond-pr-feedback.js +58 -0
- package/dist/actions/github/respond-pr-feedback.js.map +1 -0
- package/dist/actions/github/review-changes.d.ts +19 -0
- package/dist/actions/github/review-changes.d.ts.map +1 -0
- package/dist/actions/github/review-changes.js +95 -0
- package/dist/actions/github/review-changes.js.map +1 -0
- package/dist/actions/github/sync-labels.d.ts +14 -0
- package/dist/actions/github/sync-labels.d.ts.map +1 -0
- package/dist/actions/github/sync-labels.js +81 -0
- package/dist/actions/github/sync-labels.js.map +1 -0
- package/dist/actions/github/update-pr.d.ts +14 -0
- package/dist/actions/github/update-pr.d.ts.map +1 -0
- package/dist/actions/github/update-pr.js +63 -0
- package/dist/actions/github/update-pr.js.map +1 -0
- package/dist/actions/index.d.ts +109 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +233 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/workflow/check-gate.d.ts +15 -0
- package/dist/actions/workflow/check-gate.d.ts.map +1 -0
- package/dist/actions/workflow/check-gate.js +75 -0
- package/dist/actions/workflow/check-gate.js.map +1 -0
- package/dist/actions/workflow/index.d.ts +21 -0
- package/dist/actions/workflow/index.d.ts.map +1 -0
- package/dist/actions/workflow/index.js +31 -0
- package/dist/actions/workflow/index.js.map +1 -0
- package/dist/actions/workflow/update-phase.d.ts +15 -0
- package/dist/actions/workflow/update-phase.d.ts.map +1 -0
- package/dist/actions/workflow/update-phase.js +143 -0
- package/dist/actions/workflow/update-phase.js.map +1 -0
- package/dist/actions/workflow/update-stage.d.ts +19 -0
- package/dist/actions/workflow/update-stage.d.ts.map +1 -0
- package/dist/actions/workflow/update-stage.js +137 -0
- package/dist/actions/workflow/update-stage.js.map +1 -0
- package/dist/errors/base-workflow-not-found.d.ts +10 -0
- package/dist/errors/base-workflow-not-found.d.ts.map +1 -0
- package/dist/errors/base-workflow-not-found.js +18 -0
- package/dist/errors/base-workflow-not-found.js.map +1 -0
- package/dist/errors/circular-extends.d.ts +9 -0
- package/dist/errors/circular-extends.d.ts.map +1 -0
- package/dist/errors/circular-extends.js +13 -0
- package/dist/errors/circular-extends.js.map +1 -0
- package/dist/errors/correlation-timeout.d.ts +9 -0
- package/dist/errors/correlation-timeout.d.ts.map +1 -0
- package/dist/errors/correlation-timeout.js +13 -0
- package/dist/errors/correlation-timeout.js.map +1 -0
- package/dist/errors/workflow-override.d.ts +9 -0
- package/dist/errors/workflow-override.d.ts.map +1 -0
- package/dist/errors/workflow-override.js +12 -0
- package/dist/errors/workflow-override.js.map +1 -0
- package/dist/executor/events.d.ts +55 -0
- package/dist/executor/events.d.ts.map +1 -0
- package/dist/executor/events.js +72 -0
- package/dist/executor/events.js.map +1 -0
- package/dist/executor/gate-handler.d.ts +55 -0
- package/dist/executor/gate-handler.d.ts.map +1 -0
- package/dist/executor/gate-handler.js +139 -0
- package/dist/executor/gate-handler.js.map +1 -0
- package/dist/executor/index.d.ts +140 -0
- package/dist/executor/index.d.ts.map +1 -0
- package/dist/executor/index.js +681 -0
- package/dist/executor/index.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/interpolation/context.d.ts +117 -0
- package/dist/interpolation/context.d.ts.map +1 -0
- package/dist/interpolation/context.js +256 -0
- package/dist/interpolation/context.js.map +1 -0
- package/dist/interpolation/index.d.ts +76 -0
- package/dist/interpolation/index.d.ts.map +1 -0
- package/dist/interpolation/index.js +264 -0
- package/dist/interpolation/index.js.map +1 -0
- package/dist/loader/extends.d.ts +48 -0
- package/dist/loader/extends.d.ts.map +1 -0
- package/dist/loader/extends.js +140 -0
- package/dist/loader/extends.js.map +1 -0
- package/dist/loader/index.d.ts +50 -0
- package/dist/loader/index.d.ts.map +1 -0
- package/dist/loader/index.js +190 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/loader/schema.d.ts +506 -0
- package/dist/loader/schema.d.ts.map +1 -0
- package/dist/loader/schema.js +63 -0
- package/dist/loader/schema.js.map +1 -0
- package/dist/loader/validator.d.ts +33 -0
- package/dist/loader/validator.d.ts.map +1 -0
- package/dist/loader/validator.js +135 -0
- package/dist/loader/validator.js.map +1 -0
- package/dist/registry/index.d.ts +42 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +77 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/retry/index.d.ts +37 -0
- package/dist/retry/index.d.ts.map +1 -0
- package/dist/retry/index.js +225 -0
- package/dist/retry/index.js.map +1 -0
- package/dist/retry/strategies.d.ts +74 -0
- package/dist/retry/strategies.d.ts.map +1 -0
- package/dist/retry/strategies.js +136 -0
- package/dist/retry/strategies.js.map +1 -0
- package/dist/store/filesystem-store.d.ts +52 -0
- package/dist/store/filesystem-store.d.ts.map +1 -0
- package/dist/store/filesystem-store.js +230 -0
- package/dist/store/filesystem-store.js.map +1 -0
- package/dist/store/index.d.ts +7 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +6 -0
- package/dist/store/index.js.map +1 -0
- package/dist/types/action.d.ts +358 -0
- package/dist/types/action.d.ts.map +1 -0
- package/dist/types/action.js +96 -0
- package/dist/types/action.js.map +1 -0
- package/dist/types/events.d.ts +25 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +6 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/execution.d.ts +145 -0
- package/dist/types/execution.d.ts.map +1 -0
- package/dist/types/execution.js +2 -0
- package/dist/types/execution.js.map +1 -0
- package/dist/types/gate.d.ts +98 -0
- package/dist/types/gate.d.ts.map +1 -0
- package/dist/types/gate.js +41 -0
- package/dist/types/gate.js.map +1 -0
- package/dist/types/github.d.ts +706 -0
- package/dist/types/github.d.ts.map +1 -0
- package/dist/types/github.js +6 -0
- package/dist/types/github.js.map +1 -0
- package/dist/types/index.d.ts +17 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/logger.d.ts +60 -0
- package/dist/types/logger.d.ts.map +1 -0
- package/dist/types/logger.js +66 -0
- package/dist/types/logger.js.map +1 -0
- package/dist/types/retry.d.ts +36 -0
- package/dist/types/retry.d.ts.map +1 -0
- package/dist/types/retry.js +6 -0
- package/dist/types/retry.js.map +1 -0
- package/dist/types/store.d.ts +88 -0
- package/dist/types/store.d.ts.map +1 -0
- package/dist/types/store.js +6 -0
- package/dist/types/store.js.map +1 -0
- package/dist/types/workflow.d.ts +105 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +6 -0
- package/dist/types/workflow.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* epic.close action - closes epic issue after PR merge.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseAction } from '../base-action.js';
|
|
5
|
+
import { isNamespacedAction } from '../../types/action.js';
|
|
6
|
+
import { createGitHubClient } from '../github/client/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* epic.close action handler
|
|
9
|
+
*/
|
|
10
|
+
export class CloseEpicAction extends BaseAction {
|
|
11
|
+
type = 'epic.close';
|
|
12
|
+
canHandle(step) {
|
|
13
|
+
const uses = step.uses ?? step.action;
|
|
14
|
+
if (!uses)
|
|
15
|
+
return false;
|
|
16
|
+
return uses === 'epic.close' ||
|
|
17
|
+
(isNamespacedAction(uses) && uses === this.type);
|
|
18
|
+
}
|
|
19
|
+
async executeInternal(step, context) {
|
|
20
|
+
// Get inputs
|
|
21
|
+
const epicIssueNumber = this.getRequiredInput(step, context, 'epic_issue_number');
|
|
22
|
+
const prNumber = this.getInput(step, context, 'pr_number');
|
|
23
|
+
context.logger.info(`Closing epic #${epicIssueNumber}`);
|
|
24
|
+
try {
|
|
25
|
+
// Get GitHub client
|
|
26
|
+
const client = createGitHubClient(context.workdir);
|
|
27
|
+
// Get repo info
|
|
28
|
+
const repoInfo = await client.getRepoInfo();
|
|
29
|
+
// If PR number not provided, try to find it
|
|
30
|
+
let mergedPR = prNumber;
|
|
31
|
+
if (!mergedPR) {
|
|
32
|
+
// Look for epic branch PR
|
|
33
|
+
const epicBranch = `${epicIssueNumber}-`;
|
|
34
|
+
const branches = await client.listBranches(repoInfo.owner, repoInfo.repo);
|
|
35
|
+
const matchingBranch = branches.find(b => b.startsWith(epicBranch));
|
|
36
|
+
if (matchingBranch) {
|
|
37
|
+
const pr = await client.getPRForBranch(repoInfo.owner, repoInfo.repo, matchingBranch);
|
|
38
|
+
if (pr && pr.state === 'merged') {
|
|
39
|
+
mergedPR = pr.number;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Generate completion comment
|
|
44
|
+
const commentBody = this.generateCompletionComment(epicIssueNumber, mergedPR);
|
|
45
|
+
// Add completion comment
|
|
46
|
+
await client.addIssueComment(repoInfo.owner, repoInfo.repo, epicIssueNumber, commentBody);
|
|
47
|
+
// Close the issue
|
|
48
|
+
await client.updateIssue(repoInfo.owner, repoInfo.repo, epicIssueNumber, {
|
|
49
|
+
state: 'closed',
|
|
50
|
+
});
|
|
51
|
+
context.logger.info(`Closed epic #${epicIssueNumber}`);
|
|
52
|
+
const output = {
|
|
53
|
+
closed: true,
|
|
54
|
+
issue_url: `https://github.com/${repoInfo.owner}/${repoInfo.repo}/issues/${epicIssueNumber}`,
|
|
55
|
+
};
|
|
56
|
+
return this.successResult(output);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return this.failureResult(error instanceof Error ? error.message : String(error));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Generate completion comment for epic
|
|
64
|
+
*/
|
|
65
|
+
generateCompletionComment(epicNumber, prNumber) {
|
|
66
|
+
let body = `## ✅ Epic Completed\n\n`;
|
|
67
|
+
body += `This epic has been successfully completed and closed.\n\n`;
|
|
68
|
+
if (prNumber) {
|
|
69
|
+
body += `**Merged via:** #${prNumber}\n\n`;
|
|
70
|
+
}
|
|
71
|
+
body += `---\n`;
|
|
72
|
+
body += `*Closed by Generacy workflow engine at ${new Date().toISOString()}*\n`;
|
|
73
|
+
return body;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=close.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close.js","sourceRoot":"","sources":["../../../src/actions/epic/close.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* epic.create_pr action - creates rollup PR from epic branch.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseAction } from '../base-action.js';
|
|
5
|
+
import type { ActionContext, ActionResult, ActionIdentifier, StepDefinition } from '../../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* epic.create_pr action handler
|
|
8
|
+
*/
|
|
9
|
+
export declare class CreateEpicPRAction extends BaseAction {
|
|
10
|
+
readonly type: ActionIdentifier;
|
|
11
|
+
canHandle(step: StepDefinition): boolean;
|
|
12
|
+
protected executeInternal(step: StepDefinition, context: ActionContext): Promise<Omit<ActionResult, 'duration'>>;
|
|
13
|
+
/**
|
|
14
|
+
* Count commits between branches
|
|
15
|
+
*/
|
|
16
|
+
private countCommits;
|
|
17
|
+
/**
|
|
18
|
+
* Generate PR body for epic rollup
|
|
19
|
+
*/
|
|
20
|
+
private generatePRBody;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=create-pr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-pr.d.ts","sourceRoot":"","sources":["../../../src/actions/epic/create-pr.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,cAAc,EAGf,MAAM,sBAAsB,CAAC;AAM9B;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,UAAU;IAChD,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAoB;IAEnD,SAAS,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;cAOxB,eAAe,CAC7B,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAwH1C;;OAEG;YACW,YAAY;IAkB1B;;OAEG;IACH,OAAO,CAAC,cAAc;CAgBvB"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* epic.create_pr action - creates rollup PR from epic branch.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseAction } from '../base-action.js';
|
|
5
|
+
import { isNamespacedAction } from '../../types/action.js';
|
|
6
|
+
import { createGitHubClient } from '../github/client/index.js';
|
|
7
|
+
import { CheckCompletionAction } from './check-completion.js';
|
|
8
|
+
/**
|
|
9
|
+
* epic.create_pr action handler
|
|
10
|
+
*/
|
|
11
|
+
export class CreateEpicPRAction extends BaseAction {
|
|
12
|
+
type = 'epic.create_pr';
|
|
13
|
+
canHandle(step) {
|
|
14
|
+
const uses = step.uses ?? step.action;
|
|
15
|
+
if (!uses)
|
|
16
|
+
return false;
|
|
17
|
+
return uses === 'epic.create_pr' ||
|
|
18
|
+
(isNamespacedAction(uses) && uses === this.type);
|
|
19
|
+
}
|
|
20
|
+
async executeInternal(step, context) {
|
|
21
|
+
// Get inputs
|
|
22
|
+
const epicIssueNumber = this.getRequiredInput(step, context, 'epic_issue_number');
|
|
23
|
+
const customTitle = this.getInput(step, context, 'title');
|
|
24
|
+
const skipApprovalLabel = this.getInput(step, context, 'skip_approval_label', false);
|
|
25
|
+
context.logger.info(`Creating rollup PR for epic #${epicIssueNumber}`);
|
|
26
|
+
try {
|
|
27
|
+
// Get GitHub client
|
|
28
|
+
const client = createGitHubClient(context.workdir);
|
|
29
|
+
// Get repo info
|
|
30
|
+
const repoInfo = await client.getRepoInfo();
|
|
31
|
+
// Check completion status
|
|
32
|
+
const checkAction = new CheckCompletionAction();
|
|
33
|
+
const checkResult = await checkAction.execute({
|
|
34
|
+
...step,
|
|
35
|
+
with: { epic_issue_number: epicIssueNumber },
|
|
36
|
+
}, context);
|
|
37
|
+
if (!checkResult.success) {
|
|
38
|
+
return this.failureResult(`Failed to check completion: ${checkResult.error}`);
|
|
39
|
+
}
|
|
40
|
+
const status = checkResult.output;
|
|
41
|
+
if (!status.ready_for_pr) {
|
|
42
|
+
return this.failureResult(`Epic is not ready for PR (${status.percentage}% complete). All children must be completed.`);
|
|
43
|
+
}
|
|
44
|
+
// Get epic issue for title
|
|
45
|
+
const epicIssue = await client.getIssue(repoInfo.owner, repoInfo.repo, epicIssueNumber);
|
|
46
|
+
const title = customTitle ?? `[Epic] ${epicIssue.title}`;
|
|
47
|
+
// Determine epic branch name
|
|
48
|
+
const epicBranch = `${epicIssueNumber}-`;
|
|
49
|
+
const branches = await client.listBranches(repoInfo.owner, repoInfo.repo);
|
|
50
|
+
const matchingBranch = branches.find(b => b.startsWith(epicBranch));
|
|
51
|
+
if (!matchingBranch) {
|
|
52
|
+
return this.failureResult(`Could not find epic branch starting with ${epicBranch}`);
|
|
53
|
+
}
|
|
54
|
+
// Determine base branch (develop if exists, otherwise main/master)
|
|
55
|
+
let baseBranch = repoInfo.default_branch;
|
|
56
|
+
if (branches.includes('develop')) {
|
|
57
|
+
baseBranch = 'develop';
|
|
58
|
+
}
|
|
59
|
+
// Count commits that will be included
|
|
60
|
+
const commitsIncluded = await this.countCommits(client, matchingBranch, baseBranch);
|
|
61
|
+
// Generate PR body
|
|
62
|
+
const body = this.generatePRBody(epicIssueNumber, status.completed_children);
|
|
63
|
+
// Check if PR already exists
|
|
64
|
+
const existingPR = await client.getPRForBranch(repoInfo.owner, repoInfo.repo, matchingBranch);
|
|
65
|
+
let prNumber;
|
|
66
|
+
let prUrl;
|
|
67
|
+
if (existingPR) {
|
|
68
|
+
// Update existing PR
|
|
69
|
+
await client.updatePR(repoInfo.owner, repoInfo.repo, existingPR.number, {
|
|
70
|
+
title,
|
|
71
|
+
body,
|
|
72
|
+
});
|
|
73
|
+
prNumber = existingPR.number;
|
|
74
|
+
prUrl = `https://github.com/${repoInfo.owner}/${repoInfo.repo}/pull/${prNumber}`;
|
|
75
|
+
context.logger.info(`Updated existing PR #${prNumber}`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// Create new PR
|
|
79
|
+
const pr = await client.createPR(repoInfo.owner, repoInfo.repo, {
|
|
80
|
+
title,
|
|
81
|
+
body,
|
|
82
|
+
head: matchingBranch,
|
|
83
|
+
base: baseBranch,
|
|
84
|
+
draft: false,
|
|
85
|
+
});
|
|
86
|
+
prNumber = pr.number;
|
|
87
|
+
prUrl = `https://github.com/${repoInfo.owner}/${repoInfo.repo}/pull/${prNumber}`;
|
|
88
|
+
context.logger.info(`Created PR #${prNumber}`);
|
|
89
|
+
}
|
|
90
|
+
// Add approval label if not skipped
|
|
91
|
+
if (!skipApprovalLabel) {
|
|
92
|
+
await client.addLabels(repoInfo.owner, repoInfo.repo, prNumber, ['needs:epic-approval']);
|
|
93
|
+
context.logger.info('Added needs:epic-approval label');
|
|
94
|
+
}
|
|
95
|
+
const output = {
|
|
96
|
+
pr_number: prNumber,
|
|
97
|
+
pr_url: prUrl,
|
|
98
|
+
commits_included: commitsIncluded,
|
|
99
|
+
children_merged: status.completed_children,
|
|
100
|
+
};
|
|
101
|
+
return this.successResult(output);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
return this.failureResult(error instanceof Error ? error.message : String(error));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Count commits between branches
|
|
109
|
+
*/
|
|
110
|
+
async countCommits(client, headBranch, baseBranch) {
|
|
111
|
+
try {
|
|
112
|
+
// Use git rev-list to count commits
|
|
113
|
+
const { execSync } = await import('child_process');
|
|
114
|
+
const result = execSync(`git rev-list --count ${baseBranch}..${headBranch}`, { encoding: 'utf-8' }).trim();
|
|
115
|
+
return parseInt(result, 10) || 0;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return 0;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Generate PR body for epic rollup
|
|
123
|
+
*/
|
|
124
|
+
generatePRBody(epicNumber, childrenMerged) {
|
|
125
|
+
let body = `## Epic Rollup PR\n\n`;
|
|
126
|
+
body += `Closes #${epicNumber}\n\n`;
|
|
127
|
+
body += `### Summary\n\n`;
|
|
128
|
+
body += `This PR merges all completed work from epic #${epicNumber}.\n\n`;
|
|
129
|
+
body += `**Children merged:** ${childrenMerged}\n\n`;
|
|
130
|
+
body += `### Checklist\n\n`;
|
|
131
|
+
body += `- [ ] All child issues are closed with merged PRs\n`;
|
|
132
|
+
body += `- [ ] Integration tests pass\n`;
|
|
133
|
+
body += `- [ ] Documentation is updated\n`;
|
|
134
|
+
body += `- [ ] Ready for final review\n\n`;
|
|
135
|
+
body += `---\n`;
|
|
136
|
+
body += `*Created by Generacy workflow engine*\n`;
|
|
137
|
+
return body;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=create-pr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-pr.js","sourceRoot":"","sources":["../../../src/actions/epic/create-pr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* epic.dispatch_children action - sends child issues to orchestrator queue.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseAction } from '../base-action.js';
|
|
5
|
+
import type { ActionContext, ActionResult, ActionIdentifier, StepDefinition } from '../../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* epic.dispatch_children action handler
|
|
8
|
+
*/
|
|
9
|
+
export declare class DispatchChildrenAction extends BaseAction {
|
|
10
|
+
readonly type: ActionIdentifier;
|
|
11
|
+
private readonly AGENT_ACCOUNT;
|
|
12
|
+
private readonly DISPATCHED_LABEL;
|
|
13
|
+
canHandle(step: StepDefinition): boolean;
|
|
14
|
+
protected executeInternal(step: StepDefinition, context: ActionContext): Promise<Omit<ActionResult, 'duration'>>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=dispatch-children.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-children.d.ts","sourceRoot":"","sources":["../../../src/actions/epic/dispatch-children.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,cAAc,EAIf,MAAM,sBAAsB,CAAC;AAK9B;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,UAAU;IACpD,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAA4B;IAG3D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkB;IAChD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsB;IAEvD,SAAS,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;cAOxB,eAAe,CAC7B,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;CA6F3C"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* epic.dispatch_children action - sends child issues to orchestrator queue.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseAction } from '../base-action.js';
|
|
5
|
+
import { isNamespacedAction } from '../../types/action.js';
|
|
6
|
+
import { createGitHubClient } from '../github/client/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* epic.dispatch_children action handler
|
|
9
|
+
*/
|
|
10
|
+
export class DispatchChildrenAction extends BaseAction {
|
|
11
|
+
type = 'epic.dispatch_children';
|
|
12
|
+
// Default agent account to assign dispatched issues to
|
|
13
|
+
AGENT_ACCOUNT = 'generacy-bot';
|
|
14
|
+
DISPATCHED_LABEL = 'agent:dispatched';
|
|
15
|
+
canHandle(step) {
|
|
16
|
+
const uses = step.uses ?? step.action;
|
|
17
|
+
if (!uses)
|
|
18
|
+
return false;
|
|
19
|
+
return uses === 'epic.dispatch_children' ||
|
|
20
|
+
(isNamespacedAction(uses) && uses === this.type);
|
|
21
|
+
}
|
|
22
|
+
async executeInternal(step, context) {
|
|
23
|
+
// Get inputs
|
|
24
|
+
const epicIssueNumber = this.getRequiredInput(step, context, 'epic_issue_number');
|
|
25
|
+
const childIssues = this.getRequiredInput(step, context, 'child_issues');
|
|
26
|
+
if (!Array.isArray(childIssues) || childIssues.length === 0) {
|
|
27
|
+
return this.failureResult('child_issues must be a non-empty array of issue numbers');
|
|
28
|
+
}
|
|
29
|
+
context.logger.info(`Dispatching ${childIssues.length} children from epic #${epicIssueNumber}`);
|
|
30
|
+
try {
|
|
31
|
+
// Get GitHub client
|
|
32
|
+
const client = createGitHubClient(context.workdir);
|
|
33
|
+
// Get repo info
|
|
34
|
+
const repoInfo = await client.getRepoInfo();
|
|
35
|
+
// Get agent account from environment or use default
|
|
36
|
+
const agentAccount = process.env.GENERACY_AGENT_ACCOUNT ?? this.AGENT_ACCOUNT;
|
|
37
|
+
const dispatched = [];
|
|
38
|
+
const failed = [];
|
|
39
|
+
// Process each child issue
|
|
40
|
+
for (const issueNumber of childIssues) {
|
|
41
|
+
try {
|
|
42
|
+
// Verify the issue exists and is open
|
|
43
|
+
const issue = await client.getIssue(repoInfo.owner, repoInfo.repo, issueNumber);
|
|
44
|
+
if (issue.state !== 'open') {
|
|
45
|
+
failed.push({
|
|
46
|
+
issue_number: issueNumber,
|
|
47
|
+
reason: `Issue is ${issue.state}, not open`,
|
|
48
|
+
});
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
// Check if already dispatched
|
|
52
|
+
const labels = issue.labels.map(l => l.name);
|
|
53
|
+
if (labels.includes(this.DISPATCHED_LABEL)) {
|
|
54
|
+
failed.push({
|
|
55
|
+
issue_number: issueNumber,
|
|
56
|
+
reason: 'Already dispatched',
|
|
57
|
+
});
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
// Assign to agent account
|
|
61
|
+
await client.updateIssue(repoInfo.owner, repoInfo.repo, issueNumber, {
|
|
62
|
+
assignees: [agentAccount],
|
|
63
|
+
});
|
|
64
|
+
// Add dispatched label
|
|
65
|
+
await client.addLabels(repoInfo.owner, repoInfo.repo, issueNumber, [this.DISPATCHED_LABEL]);
|
|
66
|
+
dispatched.push(issueNumber);
|
|
67
|
+
context.logger.info(`Dispatched #${issueNumber}`);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
failed.push({
|
|
71
|
+
issue_number: issueNumber,
|
|
72
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const output = {
|
|
77
|
+
dispatched,
|
|
78
|
+
failed,
|
|
79
|
+
agent_account: agentAccount,
|
|
80
|
+
};
|
|
81
|
+
// Consider success if at least one was dispatched
|
|
82
|
+
if (dispatched.length > 0) {
|
|
83
|
+
return this.successResult(output);
|
|
84
|
+
}
|
|
85
|
+
else if (failed.length > 0) {
|
|
86
|
+
return this.failureResult(`Failed to dispatch any children: ${failed.map(f => `#${f.issue_number}: ${f.reason}`).join(', ')}`);
|
|
87
|
+
}
|
|
88
|
+
return this.successResult(output);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
return this.failureResult(error instanceof Error ? error.message : String(error));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=dispatch-children.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-children.js","sourceRoot":"","sources":["../../../src/actions/epic/dispatch-children.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { EpicChild } from '../../types/index.js';
|
|
2
|
+
export interface EpicChildWithPr extends EpicChild {
|
|
3
|
+
pr_number: number | null;
|
|
4
|
+
}
|
|
5
|
+
export interface FindChildIssuesOptions {
|
|
6
|
+
/** Issue state filter. Defaults to 'all'. */
|
|
7
|
+
state?: 'open' | 'closed' | 'all';
|
|
8
|
+
/** Whether to check merged-PR status for each child. Defaults to true. */
|
|
9
|
+
includePrStatus?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Find child issues that reference the given epic via `epic-parent: #N` in
|
|
13
|
+
* their body. Uses the GitHub search API via `gh issue list --search`.
|
|
14
|
+
*/
|
|
15
|
+
export declare function findChildIssues(owner: string, repo: string, epicNumber: number, options?: FindChildIssuesOptions): Promise<EpicChildWithPr[]>;
|
|
16
|
+
//# sourceMappingURL=find-children.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-children.d.ts","sourceRoot":"","sources":["../../../src/actions/epic/find-children.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAMtD,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAMD,MAAM,WAAW,sBAAsB;IACrC,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,0EAA0E;IAC1E,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAMD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,eAAe,EAAE,CAAC,CA0D5B"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utility for finding child issues of an epic.
|
|
3
|
+
*
|
|
4
|
+
* Searches for issues whose body contains `epic-parent: #N` using `gh issue list --search`.
|
|
5
|
+
* Optionally checks whether each child has a merged PR.
|
|
6
|
+
*
|
|
7
|
+
* Used by:
|
|
8
|
+
* - `epic.check_completion` action (workflow-engine)
|
|
9
|
+
* - `EpicCompletionMonitorService` (orchestrator)
|
|
10
|
+
*/
|
|
11
|
+
import { executeCommand } from '../cli-utils.js';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Public API
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/**
|
|
16
|
+
* Find child issues that reference the given epic via `epic-parent: #N` in
|
|
17
|
+
* their body. Uses the GitHub search API via `gh issue list --search`.
|
|
18
|
+
*/
|
|
19
|
+
export async function findChildIssues(owner, repo, epicNumber, options = {}) {
|
|
20
|
+
const { state = 'all', includePrStatus = true } = options;
|
|
21
|
+
const args = [
|
|
22
|
+
'issue', 'list',
|
|
23
|
+
'-R', `${owner}/${repo}`,
|
|
24
|
+
'--search', `"epic-parent: ${epicNumber}" in:body`,
|
|
25
|
+
'--json', 'number,title,state,labels',
|
|
26
|
+
'--limit', '100',
|
|
27
|
+
];
|
|
28
|
+
if (state !== 'open') {
|
|
29
|
+
// gh defaults to open; add --state for 'all' or 'closed'
|
|
30
|
+
args.push('--state', state);
|
|
31
|
+
}
|
|
32
|
+
const result = await executeCommand('gh', args);
|
|
33
|
+
if (result.exitCode !== 0) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
let issues;
|
|
37
|
+
try {
|
|
38
|
+
issues = JSON.parse(result.stdout);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
const children = [];
|
|
44
|
+
for (const issue of issues) {
|
|
45
|
+
let prMerged = false;
|
|
46
|
+
let prNumber = null;
|
|
47
|
+
if (includePrStatus) {
|
|
48
|
+
const prStatus = await checkPrMerged(owner, repo, issue.number);
|
|
49
|
+
prMerged = prStatus.merged;
|
|
50
|
+
prNumber = prStatus.prNumber;
|
|
51
|
+
}
|
|
52
|
+
children.push({
|
|
53
|
+
issue_number: issue.number,
|
|
54
|
+
title: issue.title,
|
|
55
|
+
state: issue.state.toLowerCase(),
|
|
56
|
+
pr_merged: prMerged,
|
|
57
|
+
pr_number: prNumber,
|
|
58
|
+
labels: issue.labels.map(l => l.name),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return children;
|
|
62
|
+
}
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
// Internal helpers
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
/**
|
|
67
|
+
* Check whether a merged PR exists that closes the given issue.
|
|
68
|
+
*/
|
|
69
|
+
async function checkPrMerged(owner, repo, issueNumber) {
|
|
70
|
+
const result = await executeCommand('gh', [
|
|
71
|
+
'pr', 'list',
|
|
72
|
+
'-R', `${owner}/${repo}`,
|
|
73
|
+
'--search', `closes:#${issueNumber}`,
|
|
74
|
+
'--state', 'merged',
|
|
75
|
+
'--json', 'number',
|
|
76
|
+
'--limit', '1',
|
|
77
|
+
]);
|
|
78
|
+
if (result.exitCode !== 0 || result.stdout.trim() === '[]') {
|
|
79
|
+
return { merged: false, prNumber: null };
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const prs = JSON.parse(result.stdout);
|
|
83
|
+
if (prs.length > 0 && prs[0]) {
|
|
84
|
+
return { merged: true, prNumber: prs[0].number };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Fall through
|
|
89
|
+
}
|
|
90
|
+
return { merged: false, prNumber: null };
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=find-children.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-children.js","sourceRoot":"","sources":["../../../src/actions/epic/find-children.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Epic namespace actions - manages epic workflows and child issues.
|
|
3
|
+
*/
|
|
4
|
+
import type { ActionNamespace, ActionHandler } from '../../types/action.js';
|
|
5
|
+
/**
|
|
6
|
+
* All epic action handlers
|
|
7
|
+
*/
|
|
8
|
+
export declare const epicActionHandlers: ActionHandler[];
|
|
9
|
+
/**
|
|
10
|
+
* Epic namespace definition
|
|
11
|
+
*/
|
|
12
|
+
export declare const epicNamespace: ActionNamespace;
|
|
13
|
+
export { PostTasksSummaryAction } from './post-tasks-summary.js';
|
|
14
|
+
export { CheckCompletionAction } from './check-completion.js';
|
|
15
|
+
export { UpdateStatusAction } from './update-status.js';
|
|
16
|
+
export { CreateEpicPRAction } from './create-pr.js';
|
|
17
|
+
export { CloseEpicAction } from './close.js';
|
|
18
|
+
export { DispatchChildrenAction } from './dispatch-children.js';
|
|
19
|
+
export { findChildIssues, type EpicChildWithPr, type FindChildIssuesOptions } from './find-children.js';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/actions/epic/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAQ5E;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,aAAa,EAO7C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,eAI3B,CAAC;AAGF,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { PostTasksSummaryAction } from './post-tasks-summary.js';
|
|
2
|
+
import { CheckCompletionAction } from './check-completion.js';
|
|
3
|
+
import { UpdateStatusAction } from './update-status.js';
|
|
4
|
+
import { CreateEpicPRAction } from './create-pr.js';
|
|
5
|
+
import { CloseEpicAction } from './close.js';
|
|
6
|
+
import { DispatchChildrenAction } from './dispatch-children.js';
|
|
7
|
+
/**
|
|
8
|
+
* All epic action handlers
|
|
9
|
+
*/
|
|
10
|
+
export const epicActionHandlers = [
|
|
11
|
+
new PostTasksSummaryAction(),
|
|
12
|
+
new CheckCompletionAction(),
|
|
13
|
+
new UpdateStatusAction(),
|
|
14
|
+
new CreateEpicPRAction(),
|
|
15
|
+
new CloseEpicAction(),
|
|
16
|
+
new DispatchChildrenAction(),
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Epic namespace definition
|
|
20
|
+
*/
|
|
21
|
+
export const epicNamespace = {
|
|
22
|
+
namespace: 'epic',
|
|
23
|
+
description: 'Epic management actions for parent/child issue workflows',
|
|
24
|
+
handlers: epicActionHandlers,
|
|
25
|
+
};
|
|
26
|
+
// Export individual actions for direct use
|
|
27
|
+
export { PostTasksSummaryAction } from './post-tasks-summary.js';
|
|
28
|
+
export { CheckCompletionAction } from './check-completion.js';
|
|
29
|
+
export { UpdateStatusAction } from './update-status.js';
|
|
30
|
+
export { CreateEpicPRAction } from './create-pr.js';
|
|
31
|
+
export { CloseEpicAction } from './close.js';
|
|
32
|
+
export { DispatchChildrenAction } from './dispatch-children.js';
|
|
33
|
+
// Shared utilities
|
|
34
|
+
export { findChildIssues } from './find-children.js';
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/actions/epic/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAoB;IACjD,IAAI,sBAAsB,EAAE;IAC5B,IAAI,qBAAqB,EAAE;IAC3B,IAAI,kBAAkB,EAAE;IACxB,IAAI,kBAAkB,EAAE;IACxB,IAAI,eAAe,EAAE;IACrB,IAAI,sBAAsB,EAAE;CAC7B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAoB;IAC5C,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,0DAA0D;IACvE,QAAQ,EAAE,kBAAkB;CAC7B,CAAC;AAEF,2CAA2C;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAqD,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* epic.post_tasks_summary action - posts task summary for epic review.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseAction } from '../base-action.js';
|
|
5
|
+
import type { ActionContext, ActionResult, ActionIdentifier, StepDefinition } from '../../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* epic.post_tasks_summary action handler
|
|
8
|
+
*/
|
|
9
|
+
export declare class PostTasksSummaryAction extends BaseAction {
|
|
10
|
+
readonly type: ActionIdentifier;
|
|
11
|
+
canHandle(step: StepDefinition): boolean;
|
|
12
|
+
protected executeInternal(step: StepDefinition, context: ActionContext): Promise<Omit<ActionResult, 'duration'>>;
|
|
13
|
+
/**
|
|
14
|
+
* Generate tasks summary based on grouping strategy
|
|
15
|
+
*/
|
|
16
|
+
private generateTasksSummary;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=post-tasks-summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-tasks-summary.d.ts","sourceRoot":"","sources":["../../../src/actions/epic/post-tasks-summary.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,cAAc,EAGf,MAAM,sBAAsB,CAAC;AAO9B;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,UAAU;IACpD,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAA6B;IAE5D,SAAS,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;cAOxB,eAAe,CAC7B,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAoE1C;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAyD7B"}
|