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