@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,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* github.preflight action - validates environment before workflow execution.
|
|
3
|
+
* Parses issue URL, detects branch state, analyzes labels, and checks prerequisites.
|
|
4
|
+
*/
|
|
5
|
+
import { BaseAction } from '../base-action.js';
|
|
6
|
+
import { isNamespacedAction } from '../../types/action.js';
|
|
7
|
+
import { createGitHubClient } from './client/index.js';
|
|
8
|
+
import { existsSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
/**
|
|
11
|
+
* Parse a GitHub issue URL into owner, repo, and number
|
|
12
|
+
*/
|
|
13
|
+
export function parseGitHubIssueUrl(url) {
|
|
14
|
+
const match = url.match(/https?:\/\/github\.com\/([^/]+)\/([^/]+)\/issues\/(\d+)/);
|
|
15
|
+
if (!match) {
|
|
16
|
+
throw new Error(`Invalid GitHub issue URL: ${url}`);
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
owner: match[1],
|
|
20
|
+
repo: match[2],
|
|
21
|
+
number: parseInt(match[3], 10),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Analyze labels to determine workflow status
|
|
26
|
+
*/
|
|
27
|
+
function analyzeLabelStatus(labels) {
|
|
28
|
+
const waitingFor = [];
|
|
29
|
+
const completed = [];
|
|
30
|
+
const configuredGates = [];
|
|
31
|
+
for (const label of labels) {
|
|
32
|
+
if (label.startsWith('waiting-for:')) {
|
|
33
|
+
waitingFor.push(label.replace('waiting-for:', ''));
|
|
34
|
+
}
|
|
35
|
+
else if (label.startsWith('completed:')) {
|
|
36
|
+
completed.push(label.replace('completed:', ''));
|
|
37
|
+
}
|
|
38
|
+
else if (label.startsWith('needs:')) {
|
|
39
|
+
const gate = label.replace('needs:', '');
|
|
40
|
+
if (!configuredGates.includes(gate)) {
|
|
41
|
+
configuredGates.push(gate);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Check if blocked by any gate
|
|
46
|
+
let blockedByGate = false;
|
|
47
|
+
let blockingGate;
|
|
48
|
+
for (const gate of configuredGates) {
|
|
49
|
+
if (waitingFor.includes(gate) && !completed.includes(gate)) {
|
|
50
|
+
blockedByGate = true;
|
|
51
|
+
blockingGate = gate;
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
currentLabels: labels,
|
|
57
|
+
configuredGates,
|
|
58
|
+
waitingFor,
|
|
59
|
+
completed,
|
|
60
|
+
blockedByGate,
|
|
61
|
+
blockingGate,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Detect issue type from labels
|
|
66
|
+
*/
|
|
67
|
+
function detectIssueType(labels) {
|
|
68
|
+
for (const label of labels) {
|
|
69
|
+
if (label === 'type:epic' || label === 'epic')
|
|
70
|
+
return 'epic';
|
|
71
|
+
if (label === 'type:bug' || label === 'bug')
|
|
72
|
+
return 'bug';
|
|
73
|
+
if (label === 'type:feature' || label === 'feature' || label === 'enhancement')
|
|
74
|
+
return 'feature';
|
|
75
|
+
}
|
|
76
|
+
return 'unknown';
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Determine the current phase from labels
|
|
80
|
+
*/
|
|
81
|
+
function getCurrentPhase(labels) {
|
|
82
|
+
for (const label of labels) {
|
|
83
|
+
if (label.startsWith('phase:')) {
|
|
84
|
+
return label.replace('phase:', '');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Determine the next command based on completed phases and artifacts
|
|
91
|
+
*/
|
|
92
|
+
function determineNextCommand(labelStatus, speckitStatus, currentPhase) {
|
|
93
|
+
// Check if blocked by gate
|
|
94
|
+
if (labelStatus.blockedByGate) {
|
|
95
|
+
return undefined; // Blocked, no next command
|
|
96
|
+
}
|
|
97
|
+
// Determine based on what exists
|
|
98
|
+
if (!speckitStatus.spec_exists) {
|
|
99
|
+
return '/speckit:specify';
|
|
100
|
+
}
|
|
101
|
+
// Check if clarify is needed (based on labels)
|
|
102
|
+
if (!labelStatus.completed.includes('clarification') &&
|
|
103
|
+
!labelStatus.completed.includes('clarify')) {
|
|
104
|
+
// Check if clarifications exist
|
|
105
|
+
return '/speckit:clarify';
|
|
106
|
+
}
|
|
107
|
+
if (!speckitStatus.plan_exists) {
|
|
108
|
+
return '/speckit:plan';
|
|
109
|
+
}
|
|
110
|
+
if (!speckitStatus.tasks_exists) {
|
|
111
|
+
return '/speckit:tasks';
|
|
112
|
+
}
|
|
113
|
+
// If all artifacts exist, implement
|
|
114
|
+
if (currentPhase === 'implement' || currentPhase === 'tasks') {
|
|
115
|
+
return '/speckit:implement';
|
|
116
|
+
}
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* github.preflight action handler
|
|
121
|
+
*/
|
|
122
|
+
export class PreflightAction extends BaseAction {
|
|
123
|
+
type = 'github.preflight';
|
|
124
|
+
client;
|
|
125
|
+
canHandle(step) {
|
|
126
|
+
const uses = step.uses ?? step.action;
|
|
127
|
+
if (!uses)
|
|
128
|
+
return false;
|
|
129
|
+
return uses === 'github.preflight' ||
|
|
130
|
+
(isNamespacedAction(uses) && uses === this.type);
|
|
131
|
+
}
|
|
132
|
+
async executeInternal(step, context) {
|
|
133
|
+
// Get input
|
|
134
|
+
const issueUrl = this.getRequiredInput(step, context, 'issue_url');
|
|
135
|
+
const expectedBranchOverride = this.getInput(step, context, 'expected_branch');
|
|
136
|
+
context.logger.info(`Preflight check for: ${issueUrl}`);
|
|
137
|
+
try {
|
|
138
|
+
// Parse issue URL
|
|
139
|
+
const { owner, repo, number } = parseGitHubIssueUrl(issueUrl);
|
|
140
|
+
// Get GitHub client
|
|
141
|
+
this.client = createGitHubClient(context.workdir);
|
|
142
|
+
// Fetch issue details
|
|
143
|
+
const issue = await this.client.getIssue(owner, repo, number);
|
|
144
|
+
const labelNames = issue.labels.map(l => l.name);
|
|
145
|
+
// Detect issue type
|
|
146
|
+
const issueType = detectIssueType(labelNames);
|
|
147
|
+
// Get current branch and expected branch
|
|
148
|
+
const currentBranch = await this.client.getCurrentBranch();
|
|
149
|
+
const expectedBranch = expectedBranchOverride ?? this.generateExpectedBranch(number, issue.title);
|
|
150
|
+
// Check if branch exists
|
|
151
|
+
const branchExists = await this.client.branchExists(expectedBranch) ||
|
|
152
|
+
await this.client.branchExists(expectedBranch, true);
|
|
153
|
+
// Check if on correct branch
|
|
154
|
+
const onCorrectBranch = currentBranch === expectedBranch ||
|
|
155
|
+
currentBranch.startsWith(`${number}-`);
|
|
156
|
+
// Check for existing PR
|
|
157
|
+
const existingPR = await this.client.findPRForBranch(owner, repo, currentBranch);
|
|
158
|
+
const prExists = existingPR !== null;
|
|
159
|
+
const prNumber = existingPR?.number;
|
|
160
|
+
// Get unresolved comments count
|
|
161
|
+
let unresolvedComments = 0;
|
|
162
|
+
if (prNumber) {
|
|
163
|
+
try {
|
|
164
|
+
const comments = await this.client.getPRComments(owner, repo, prNumber);
|
|
165
|
+
unresolvedComments = comments.filter(c => c.resolved === false).length;
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// Ignore errors fetching comments
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Check for uncommitted changes
|
|
172
|
+
const status = await this.client.getStatus();
|
|
173
|
+
const uncommittedChanges = status.has_changes;
|
|
174
|
+
// Check speckit artifact status
|
|
175
|
+
const speckitStatus = await this.checkSpeckitStatus(number, context.workdir);
|
|
176
|
+
// Analyze labels
|
|
177
|
+
const labelStatus = analyzeLabelStatus(labelNames);
|
|
178
|
+
// Check epic context
|
|
179
|
+
const epicContext = this.detectEpicContext(issue.body, labelNames);
|
|
180
|
+
// Find existing branches for this issue
|
|
181
|
+
const existingBranches = await this.findExistingBranches(number);
|
|
182
|
+
// Get current phase
|
|
183
|
+
const currentPhase = getCurrentPhase(labelNames);
|
|
184
|
+
// Determine next command
|
|
185
|
+
const nextCommand = determineNextCommand(labelStatus, speckitStatus, currentPhase);
|
|
186
|
+
// Build output
|
|
187
|
+
const output = {
|
|
188
|
+
issue_number: number,
|
|
189
|
+
issue_title: issue.title,
|
|
190
|
+
issue_body: issue.body,
|
|
191
|
+
issue_type: issueType,
|
|
192
|
+
issue_labels: labelNames,
|
|
193
|
+
current_branch: currentBranch,
|
|
194
|
+
expected_branch: expectedBranch,
|
|
195
|
+
branch_exists: branchExists,
|
|
196
|
+
on_correct_branch: onCorrectBranch,
|
|
197
|
+
pr_exists: prExists,
|
|
198
|
+
pr_number: prNumber,
|
|
199
|
+
uncommitted_changes: uncommittedChanges,
|
|
200
|
+
unresolved_comments: unresolvedComments,
|
|
201
|
+
speckit_status: speckitStatus,
|
|
202
|
+
label_status: labelStatus,
|
|
203
|
+
existing_branches: existingBranches,
|
|
204
|
+
epic_context: epicContext,
|
|
205
|
+
next_command: nextCommand,
|
|
206
|
+
artifact_warnings: [],
|
|
207
|
+
};
|
|
208
|
+
return this.successResult(output);
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
return this.failureResult(error instanceof Error ? error.message : String(error));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Generate expected branch name from issue number and title
|
|
216
|
+
*/
|
|
217
|
+
generateExpectedBranch(number, title) {
|
|
218
|
+
// Slugify the title
|
|
219
|
+
const slug = title
|
|
220
|
+
.toLowerCase()
|
|
221
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
222
|
+
.replace(/^-|-$/g, '')
|
|
223
|
+
.substring(0, 40);
|
|
224
|
+
return `${number}-${slug}`;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Check speckit artifact status
|
|
228
|
+
*/
|
|
229
|
+
async checkSpeckitStatus(issueNumber, workdir) {
|
|
230
|
+
// Look for specs directory
|
|
231
|
+
const specsDir = join(workdir, 'specs');
|
|
232
|
+
if (!existsSync(specsDir)) {
|
|
233
|
+
return { spec_exists: false, plan_exists: false, tasks_exists: false };
|
|
234
|
+
}
|
|
235
|
+
// Find the feature directory
|
|
236
|
+
const { readdirSync } = await import('node:fs');
|
|
237
|
+
const dirs = readdirSync(specsDir);
|
|
238
|
+
const featureDir = dirs.find(d => d.startsWith(`${issueNumber}-`));
|
|
239
|
+
if (!featureDir) {
|
|
240
|
+
return { spec_exists: false, plan_exists: false, tasks_exists: false };
|
|
241
|
+
}
|
|
242
|
+
const featurePath = join(specsDir, featureDir);
|
|
243
|
+
return {
|
|
244
|
+
spec_exists: existsSync(join(featurePath, 'spec.md')),
|
|
245
|
+
plan_exists: existsSync(join(featurePath, 'plan.md')),
|
|
246
|
+
tasks_exists: existsSync(join(featurePath, 'tasks.md')),
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Detect epic context from issue body and labels
|
|
251
|
+
*/
|
|
252
|
+
detectEpicContext(body, labels) {
|
|
253
|
+
const isEpic = labels.includes('type:epic') || labels.includes('epic');
|
|
254
|
+
// Check for epic parent marker
|
|
255
|
+
const parentMatch = body.match(/<!--\s*epic-parent:\s*(\d+)\s*-->/);
|
|
256
|
+
const isEpicChild = parentMatch !== null;
|
|
257
|
+
const parentEpicNumber = parentMatch ? parseInt(parentMatch[1], 10) : undefined;
|
|
258
|
+
// Extract parent epic branch if present
|
|
259
|
+
const branchMatch = body.match(/<!--\s*epic-branch:\s*([^\s]+)\s*-->/);
|
|
260
|
+
const parentEpicBranch = branchMatch ? branchMatch[1] : undefined;
|
|
261
|
+
return {
|
|
262
|
+
is_epic: isEpic,
|
|
263
|
+
is_epic_child: isEpicChild,
|
|
264
|
+
parent_epic_number: parentEpicNumber,
|
|
265
|
+
parent_epic_branch: parentEpicBranch,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Find existing branches for an issue number
|
|
270
|
+
*/
|
|
271
|
+
async findExistingBranches(issueNumber) {
|
|
272
|
+
// This is a simplified implementation
|
|
273
|
+
// In practice, you'd use git branch -a and filter
|
|
274
|
+
const currentBranch = await this.client.getCurrentBranch();
|
|
275
|
+
const branches = [];
|
|
276
|
+
if (currentBranch.startsWith(`${issueNumber}-`)) {
|
|
277
|
+
branches.push({
|
|
278
|
+
name: currentBranch,
|
|
279
|
+
issueNumber: String(issueNumber),
|
|
280
|
+
shortName: currentBranch.replace(`${issueNumber}-`, ''),
|
|
281
|
+
isRemote: false,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
return {
|
|
285
|
+
found: branches.length > 0,
|
|
286
|
+
branches,
|
|
287
|
+
recommended: branches[0],
|
|
288
|
+
has_multiple: branches.length > 1,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../../src/actions/github/preflight.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* github.read_pr_feedback action - gets unresolved PR comments.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseAction } from '../base-action.js';
|
|
5
|
+
import type { ActionContext, ActionResult, ActionIdentifier, StepDefinition } from '../../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* github.read_pr_feedback action handler
|
|
8
|
+
*/
|
|
9
|
+
export declare class ReadPRFeedbackAction extends BaseAction {
|
|
10
|
+
readonly type: ActionIdentifier;
|
|
11
|
+
canHandle(step: StepDefinition): boolean;
|
|
12
|
+
protected executeInternal(step: StepDefinition, context: ActionContext): Promise<Omit<ActionResult, 'duration'>>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=read-pr-feedback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-pr-feedback.d.ts","sourceRoot":"","sources":["../../../src/actions/github/read-pr-feedback.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,oBAAqB,SAAQ,UAAU;IAClD,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;CA0C3C"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* github.read_pr_feedback action - gets unresolved PR comments.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseAction } from '../base-action.js';
|
|
5
|
+
import { isNamespacedAction } from '../../types/action.js';
|
|
6
|
+
import { createGitHubClient } from './client/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* github.read_pr_feedback action handler
|
|
9
|
+
*/
|
|
10
|
+
export class ReadPRFeedbackAction extends BaseAction {
|
|
11
|
+
type = 'github.read_pr_feedback';
|
|
12
|
+
canHandle(step) {
|
|
13
|
+
const uses = step.uses ?? step.action;
|
|
14
|
+
if (!uses)
|
|
15
|
+
return false;
|
|
16
|
+
return uses === 'github.read_pr_feedback' ||
|
|
17
|
+
(isNamespacedAction(uses) && uses === this.type);
|
|
18
|
+
}
|
|
19
|
+
async executeInternal(step, context) {
|
|
20
|
+
// Get inputs
|
|
21
|
+
const prNumber = this.getRequiredInput(step, context, 'pr_number');
|
|
22
|
+
const includeResolved = this.getInput(step, context, 'include_resolved', false);
|
|
23
|
+
context.logger.info(`Reading feedback for PR #${prNumber}`);
|
|
24
|
+
try {
|
|
25
|
+
// Get GitHub client
|
|
26
|
+
const client = createGitHubClient(context.workdir);
|
|
27
|
+
// Get repo info
|
|
28
|
+
const repoInfo = await client.getRepoInfo();
|
|
29
|
+
// Get PR comments
|
|
30
|
+
const allComments = await client.getPRComments(repoInfo.owner, repoInfo.repo, prNumber);
|
|
31
|
+
// Filter based on resolved status
|
|
32
|
+
let comments;
|
|
33
|
+
if (includeResolved) {
|
|
34
|
+
comments = allComments;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
comments = allComments.filter(c => c.resolved !== true);
|
|
38
|
+
}
|
|
39
|
+
const unresolvedCount = comments.filter(c => c.resolved === false).length;
|
|
40
|
+
const output = {
|
|
41
|
+
comments,
|
|
42
|
+
has_unresolved: unresolvedCount > 0,
|
|
43
|
+
unresolved_count: unresolvedCount,
|
|
44
|
+
};
|
|
45
|
+
context.logger.info(`Found ${comments.length} comments (${unresolvedCount} unresolved)`);
|
|
46
|
+
return this.successResult(output);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
return this.failureResult(error instanceof Error ? error.message : String(error));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=read-pr-feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-pr-feedback.js","sourceRoot":"","sources":["../../../src/actions/github/read-pr-feedback.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAU/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IACzC,IAAI,GAAqB,yBAAyB,CAAC;IAE5D,SAAS,CAAC,IAAoB;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,OAAO,IAAI,KAAK,yBAAyB;YAClC,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;IAES,KAAK,CAAC,eAAe,CAC7B,IAAoB,EACpB,OAAsB;QAEtB,aAAa;QACb,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAS,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAC3E,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAU,IAAI,EAAE,OAAO,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAEzF,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC;YACH,oBAAoB;YACpB,MAAM,MAAM,GAAiB,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAEjE,gBAAgB;YAChB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YAE5C,kBAAkB;YAClB,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAExF,kCAAkC;YAClC,IAAI,QAAmB,CAAC;YACxB,IAAI,eAAe,EAAE,CAAC;gBACpB,QAAQ,GAAG,WAAW,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC;YAE1E,MAAM,MAAM,GAAyB;gBACnC,QAAQ;gBACR,cAAc,EAAE,eAAe,GAAG,CAAC;gBACnC,gBAAgB,EAAE,eAAe;aAClC,CAAC;YAEF,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,MAAM,cAAc,eAAe,cAAc,CAAC,CAAC;YAEzF,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,aAAa,CACvB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* github.respond_pr_feedback action - posts responses to PR comments.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseAction } from '../base-action.js';
|
|
5
|
+
import type { ActionContext, ActionResult, ActionIdentifier, StepDefinition } from '../../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* github.respond_pr_feedback action handler
|
|
8
|
+
*/
|
|
9
|
+
export declare class RespondPRFeedbackAction extends BaseAction {
|
|
10
|
+
readonly type: ActionIdentifier;
|
|
11
|
+
canHandle(step: StepDefinition): boolean;
|
|
12
|
+
protected executeInternal(step: StepDefinition, context: ActionContext): Promise<Omit<ActionResult, 'duration'>>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=respond-pr-feedback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"respond-pr-feedback.d.ts","sourceRoot":"","sources":["../../../src/actions/github/respond-pr-feedback.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,EAKf,MAAM,sBAAsB,CAAC;AAK9B;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,UAAU;IACrD,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAgC;IAE/D,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;CAuD3C"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* github.respond_pr_feedback action - posts responses to PR comments.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseAction } from '../base-action.js';
|
|
5
|
+
import { isNamespacedAction } from '../../types/action.js';
|
|
6
|
+
import { createGitHubClient } from './client/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* github.respond_pr_feedback action handler
|
|
9
|
+
*/
|
|
10
|
+
export class RespondPRFeedbackAction extends BaseAction {
|
|
11
|
+
type = 'github.respond_pr_feedback';
|
|
12
|
+
canHandle(step) {
|
|
13
|
+
const uses = step.uses ?? step.action;
|
|
14
|
+
if (!uses)
|
|
15
|
+
return false;
|
|
16
|
+
return uses === 'github.respond_pr_feedback' ||
|
|
17
|
+
(isNamespacedAction(uses) && uses === this.type);
|
|
18
|
+
}
|
|
19
|
+
async executeInternal(step, context) {
|
|
20
|
+
// Get inputs
|
|
21
|
+
const prNumber = this.getRequiredInput(step, context, 'pr_number');
|
|
22
|
+
const responses = this.getRequiredInput(step, context, 'responses');
|
|
23
|
+
context.logger.info(`Responding to ${responses.length} comments on PR #${prNumber}`);
|
|
24
|
+
try {
|
|
25
|
+
// Get GitHub client
|
|
26
|
+
const client = createGitHubClient(context.workdir);
|
|
27
|
+
// Get repo info
|
|
28
|
+
const repoInfo = await client.getRepoInfo();
|
|
29
|
+
const posted = [];
|
|
30
|
+
const failed = [];
|
|
31
|
+
// Post each response
|
|
32
|
+
for (const response of responses) {
|
|
33
|
+
try {
|
|
34
|
+
const reply = await client.replyToPRComment(repoInfo.owner, repoInfo.repo, prNumber, response.comment_id, response.body);
|
|
35
|
+
posted.push({
|
|
36
|
+
comment_id: response.comment_id,
|
|
37
|
+
reply_id: reply.id,
|
|
38
|
+
success: true,
|
|
39
|
+
});
|
|
40
|
+
context.logger.info(`Posted reply to comment ${response.comment_id}`);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
failed.push(response.comment_id);
|
|
44
|
+
context.logger.warn(`Failed to reply to comment ${response.comment_id}: ${error instanceof Error ? error.message : String(error)}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const output = {
|
|
48
|
+
posted,
|
|
49
|
+
failed,
|
|
50
|
+
};
|
|
51
|
+
return this.successResult(output);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
return this.failureResult(error instanceof Error ? error.message : String(error));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=respond-pr-feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"respond-pr-feedback.js","sourceRoot":"","sources":["../../../src/actions/github/respond-pr-feedback.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAW/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;GAEG;AACH,MAAM,OAAO,uBAAwB,SAAQ,UAAU;IAC5C,IAAI,GAAqB,4BAA4B,CAAC;IAE/D,SAAS,CAAC,IAAoB;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,OAAO,IAAI,KAAK,4BAA4B;YACrC,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;IAES,KAAK,CAAC,eAAe,CAC7B,IAAoB,EACpB,OAAsB;QAEtB,aAAa;QACb,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAS,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAqB,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAExF,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,SAAS,CAAC,MAAM,oBAAoB,QAAQ,EAAE,CAAC,CAAC;QAErF,IAAI,CAAC;YACH,oBAAoB;YACpB,MAAM,MAAM,GAAiB,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAEjE,gBAAgB;YAChB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YAE5C,MAAM,MAAM,GAAqB,EAAE,CAAC;YACpC,MAAM,MAAM,GAAa,EAAE,CAAC;YAE5B,qBAAqB;YACrB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,gBAAgB,CACzC,QAAQ,CAAC,KAAK,EACd,QAAQ,CAAC,IAAI,EACb,QAAQ,EACR,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,IAAI,CACd,CAAC;oBAEF,MAAM,CAAC,IAAI,CAAC;wBACV,UAAU,EAAE,QAAQ,CAAC,UAAU;wBAC/B,QAAQ,EAAE,KAAK,CAAC,EAAE;wBAClB,OAAO,EAAE,IAAI;qBACd,CAAC,CAAC;oBAEH,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;gBACxE,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;oBACjC,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,8BAA8B,QAAQ,CAAC,UAAU,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC/G,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAA4B;gBACtC,MAAM;gBACN,MAAM;aACP,CAAC;YAEF,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,aAAa,CACvB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* github.review_changes action - reviews uncommitted changes.
|
|
3
|
+
* Lists modified, added, deleted, and untracked files.
|
|
4
|
+
*/
|
|
5
|
+
import { BaseAction } from '../base-action.js';
|
|
6
|
+
import type { ActionContext, ActionResult, ActionIdentifier, StepDefinition } from '../../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* github.review_changes action handler
|
|
9
|
+
*/
|
|
10
|
+
export declare class ReviewChangesAction extends BaseAction {
|
|
11
|
+
readonly type: ActionIdentifier;
|
|
12
|
+
canHandle(step: StepDefinition): boolean;
|
|
13
|
+
protected executeInternal(step: StepDefinition, context: ActionContext): Promise<Omit<ActionResult, 'duration'>>;
|
|
14
|
+
/**
|
|
15
|
+
* Build a human-readable summary of changes
|
|
16
|
+
*/
|
|
17
|
+
private buildSummary;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=review-changes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-changes.d.ts","sourceRoot":"","sources":["../../../src/actions/github/review-changes.ts"],"names":[],"mappings":"AAAA;;;GAGG;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,mBAAoB,SAAQ,UAAU;IACjD,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAA2B;IAE1D,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;IAmE1C;;OAEG;IACH,OAAO,CAAC,YAAY;CAsBrB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* github.review_changes action - reviews uncommitted changes.
|
|
3
|
+
* Lists modified, added, deleted, and untracked files.
|
|
4
|
+
*/
|
|
5
|
+
import { BaseAction } from '../base-action.js';
|
|
6
|
+
import { isNamespacedAction } from '../../types/action.js';
|
|
7
|
+
import { createGitHubClient } from './client/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* github.review_changes action handler
|
|
10
|
+
*/
|
|
11
|
+
export class ReviewChangesAction extends BaseAction {
|
|
12
|
+
type = 'github.review_changes';
|
|
13
|
+
canHandle(step) {
|
|
14
|
+
const uses = step.uses ?? step.action;
|
|
15
|
+
if (!uses)
|
|
16
|
+
return false;
|
|
17
|
+
return uses === 'github.review_changes' ||
|
|
18
|
+
(isNamespacedAction(uses) && uses === this.type);
|
|
19
|
+
}
|
|
20
|
+
async executeInternal(step, context) {
|
|
21
|
+
// Get inputs
|
|
22
|
+
const includeUntracked = this.getInput(step, context, 'include_untracked', true);
|
|
23
|
+
context.logger.info('Reviewing pending changes');
|
|
24
|
+
try {
|
|
25
|
+
// Get GitHub client for git operations
|
|
26
|
+
const client = createGitHubClient(context.workdir);
|
|
27
|
+
// Get git status
|
|
28
|
+
const status = await client.getStatus();
|
|
29
|
+
const files = [];
|
|
30
|
+
// Add staged files
|
|
31
|
+
for (const file of status.staged) {
|
|
32
|
+
files.push({
|
|
33
|
+
path: file,
|
|
34
|
+
status: 'modified', // Simplified - could be added/modified/deleted
|
|
35
|
+
staged: true,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
// Add unstaged files
|
|
39
|
+
for (const file of status.unstaged) {
|
|
40
|
+
// Check if already added as staged
|
|
41
|
+
const existing = files.find(f => f.path === file);
|
|
42
|
+
if (existing) {
|
|
43
|
+
// File has both staged and unstaged changes
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
files.push({
|
|
47
|
+
path: file,
|
|
48
|
+
status: 'modified',
|
|
49
|
+
staged: false,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
// Add untracked files if requested
|
|
53
|
+
if (includeUntracked) {
|
|
54
|
+
for (const file of status.untracked) {
|
|
55
|
+
files.push({
|
|
56
|
+
path: file,
|
|
57
|
+
status: 'untracked',
|
|
58
|
+
staged: false,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Build summary
|
|
63
|
+
const summary = this.buildSummary(status, includeUntracked ?? true);
|
|
64
|
+
const output = {
|
|
65
|
+
has_changes: status.has_changes,
|
|
66
|
+
files,
|
|
67
|
+
summary,
|
|
68
|
+
};
|
|
69
|
+
return this.successResult(output);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
return this.failureResult(error instanceof Error ? error.message : String(error));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Build a human-readable summary of changes
|
|
77
|
+
*/
|
|
78
|
+
buildSummary(status, includeUntracked) {
|
|
79
|
+
if (!status.has_changes) {
|
|
80
|
+
return 'No uncommitted changes';
|
|
81
|
+
}
|
|
82
|
+
const parts = [];
|
|
83
|
+
if (status.staged.length > 0) {
|
|
84
|
+
parts.push(`${status.staged.length} staged`);
|
|
85
|
+
}
|
|
86
|
+
if (status.unstaged.length > 0) {
|
|
87
|
+
parts.push(`${status.unstaged.length} modified`);
|
|
88
|
+
}
|
|
89
|
+
if (includeUntracked && status.untracked.length > 0) {
|
|
90
|
+
parts.push(`${status.untracked.length} untracked`);
|
|
91
|
+
}
|
|
92
|
+
return `Changes: ${parts.join(', ')}`;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=review-changes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-changes.js","sourceRoot":"","sources":["../../../src/actions/github/review-changes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* github.sync_labels action - creates/updates GitHub labels from configuration.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseAction } from '../base-action.js';
|
|
5
|
+
import type { ActionContext, ActionResult, ActionIdentifier, StepDefinition } from '../../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* github.sync_labels action handler
|
|
8
|
+
*/
|
|
9
|
+
export declare class SyncLabelsAction extends BaseAction {
|
|
10
|
+
readonly type: ActionIdentifier;
|
|
11
|
+
canHandle(step: StepDefinition): boolean;
|
|
12
|
+
protected executeInternal(step: StepDefinition, context: ActionContext): Promise<Omit<ActionResult, 'duration'>>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=sync-labels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-labels.d.ts","sourceRoot":"","sources":["../../../src/actions/github/sync-labels.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;AAM9B;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAwB;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;CAoF3C"}
|