@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,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template copying library for speckit operations.
|
|
3
|
+
* Ported from speckit MCP server for direct library access.
|
|
4
|
+
*/
|
|
5
|
+
import { join, dirname } from 'node:path';
|
|
6
|
+
import { exists, mkdir, copyFile, findRepoRoot, resolveTemplatesPath, } from './fs.js';
|
|
7
|
+
/**
|
|
8
|
+
* Template configuration mapping
|
|
9
|
+
*/
|
|
10
|
+
const TEMPLATES = {
|
|
11
|
+
spec: {
|
|
12
|
+
name: 'spec',
|
|
13
|
+
sourceFilename: 'spec-template.md',
|
|
14
|
+
destFilename: 'spec.md',
|
|
15
|
+
},
|
|
16
|
+
plan: {
|
|
17
|
+
name: 'plan',
|
|
18
|
+
sourceFilename: 'plan-template.md',
|
|
19
|
+
destFilename: 'plan.md',
|
|
20
|
+
},
|
|
21
|
+
tasks: {
|
|
22
|
+
name: 'tasks',
|
|
23
|
+
sourceFilename: 'tasks-template.md',
|
|
24
|
+
destFilename: 'tasks.md',
|
|
25
|
+
},
|
|
26
|
+
checklist: {
|
|
27
|
+
name: 'checklist',
|
|
28
|
+
sourceFilename: 'checklist-template.md',
|
|
29
|
+
destFilename: 'checklist.md',
|
|
30
|
+
},
|
|
31
|
+
'agent-file': {
|
|
32
|
+
name: 'agent-file',
|
|
33
|
+
sourceFilename: 'agent-file-template.md',
|
|
34
|
+
destFilename: 'CLAUDE.md',
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Get all valid template names
|
|
39
|
+
*/
|
|
40
|
+
export function getTemplateNames() {
|
|
41
|
+
return Object.keys(TEMPLATES);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check if a string is a valid template name
|
|
45
|
+
*/
|
|
46
|
+
export function isValidTemplateName(name) {
|
|
47
|
+
return name in TEMPLATES;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Copy one or more templates to the feature directory.
|
|
51
|
+
* Ported from speckit MCP copy_template tool.
|
|
52
|
+
*/
|
|
53
|
+
export async function copyTemplates(input) {
|
|
54
|
+
const workDir = input.cwd || process.cwd();
|
|
55
|
+
// Validate custom filename only with single template
|
|
56
|
+
if (input.dest_filename && input.templates.length > 1) {
|
|
57
|
+
return {
|
|
58
|
+
success: false,
|
|
59
|
+
copied: [],
|
|
60
|
+
errors: [
|
|
61
|
+
{
|
|
62
|
+
template: 'all',
|
|
63
|
+
error: {
|
|
64
|
+
code: 'INVALID_INPUT',
|
|
65
|
+
message: 'dest_filename can only be used when copying a single template',
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// Find repo root
|
|
72
|
+
const repoRoot = await findRepoRoot(workDir);
|
|
73
|
+
if (!repoRoot) {
|
|
74
|
+
return {
|
|
75
|
+
success: false,
|
|
76
|
+
copied: [],
|
|
77
|
+
errors: [
|
|
78
|
+
{
|
|
79
|
+
template: 'all',
|
|
80
|
+
error: {
|
|
81
|
+
code: 'FEATURE_DIR_NOT_FOUND',
|
|
82
|
+
message: 'Could not find repository root',
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// Validate feature directory
|
|
89
|
+
if (!input.feature_dir) {
|
|
90
|
+
return {
|
|
91
|
+
success: false,
|
|
92
|
+
copied: [],
|
|
93
|
+
errors: [
|
|
94
|
+
{
|
|
95
|
+
template: 'all',
|
|
96
|
+
error: {
|
|
97
|
+
code: 'FEATURE_DIR_NOT_FOUND',
|
|
98
|
+
message: 'feature_dir is required',
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// Ensure feature directory exists
|
|
105
|
+
await mkdir(input.feature_dir);
|
|
106
|
+
// Get configured templates path
|
|
107
|
+
const templatesDir = await resolveTemplatesPath(workDir);
|
|
108
|
+
const copied = [];
|
|
109
|
+
const errors = [];
|
|
110
|
+
for (const templateName of input.templates) {
|
|
111
|
+
if (!isValidTemplateName(templateName)) {
|
|
112
|
+
errors.push({
|
|
113
|
+
template: templateName,
|
|
114
|
+
error: {
|
|
115
|
+
code: 'TEMPLATE_NOT_FOUND',
|
|
116
|
+
message: `Unknown template: ${templateName}. Valid templates: ${getTemplateNames().join(', ')}`,
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const template = TEMPLATES[templateName];
|
|
122
|
+
// Use configured templates path if available
|
|
123
|
+
const sourcePath = templatesDir
|
|
124
|
+
? join(templatesDir, template.sourceFilename)
|
|
125
|
+
: join(repoRoot, '.specify', 'templates', template.sourceFilename);
|
|
126
|
+
// Check if template exists
|
|
127
|
+
if (!(await exists(sourcePath))) {
|
|
128
|
+
errors.push({
|
|
129
|
+
template: templateName,
|
|
130
|
+
error: {
|
|
131
|
+
code: 'TEMPLATE_NOT_FOUND',
|
|
132
|
+
message: `Template file not found: ${sourcePath}`,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
// Determine destination path
|
|
138
|
+
let destPath;
|
|
139
|
+
if (input.dest_filename && input.templates.length === 1) {
|
|
140
|
+
destPath = join(input.feature_dir, input.dest_filename);
|
|
141
|
+
}
|
|
142
|
+
else if (templateName === 'checklist') {
|
|
143
|
+
// Checklists go in checklists/ subdirectory
|
|
144
|
+
const checklistsDir = join(input.feature_dir, 'checklists');
|
|
145
|
+
await mkdir(checklistsDir);
|
|
146
|
+
destPath = join(checklistsDir, template.destFilename);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
destPath = join(input.feature_dir, template.destFilename);
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
// Ensure parent directory exists
|
|
153
|
+
await mkdir(dirname(destPath));
|
|
154
|
+
await copyFile(sourcePath, destPath);
|
|
155
|
+
copied.push({ template: templateName, destPath });
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
errors.push({
|
|
159
|
+
template: templateName,
|
|
160
|
+
error: {
|
|
161
|
+
code: 'FILE_WRITE_FAILED',
|
|
162
|
+
message: error instanceof Error ? error.message : String(error),
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const result = {
|
|
168
|
+
success: errors.length === 0,
|
|
169
|
+
copied,
|
|
170
|
+
};
|
|
171
|
+
if (errors.length > 0) {
|
|
172
|
+
result.errors = errors;
|
|
173
|
+
}
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../../../src/actions/builtin/speckit/lib/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check prerequisites operation handler.
|
|
3
|
+
* Wraps the prereqs library for workflow execution.
|
|
4
|
+
*/
|
|
5
|
+
import type { Logger } from '../../../../types/logger.js';
|
|
6
|
+
import type { CheckPrereqsInput, CheckPrereqsOutput } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Execute the check_prereqs operation
|
|
9
|
+
*/
|
|
10
|
+
export declare function executeCheckPrereqs(input: CheckPrereqsInput, logger: Logger): Promise<CheckPrereqsOutput>;
|
|
11
|
+
//# sourceMappingURL=check-prereqs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-prereqs.d.ts","sourceRoot":"","sources":["../../../../../src/actions/builtin/speckit/operations/check-prereqs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGzE;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,kBAAkB,CAAC,CAkB7B"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { checkPrereqs } from '../lib/prereqs.js';
|
|
2
|
+
/**
|
|
3
|
+
* Execute the check_prereqs operation
|
|
4
|
+
*/
|
|
5
|
+
export async function executeCheckPrereqs(input, logger) {
|
|
6
|
+
logger.info('Checking prerequisites...');
|
|
7
|
+
const result = await checkPrereqs(input);
|
|
8
|
+
if (result.valid) {
|
|
9
|
+
logger.info(`Prerequisites valid. Feature directory: ${result.featureDir}`);
|
|
10
|
+
if (result.availableDocs.length > 0) {
|
|
11
|
+
logger.info(`Available docs: ${result.availableDocs.join(', ')}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
logger.warn(`Prerequisites check failed: ${result.error}`);
|
|
16
|
+
if (result.missingRequired) {
|
|
17
|
+
logger.warn(`Missing required: ${result.missingRequired.join(', ')}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=check-prereqs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-prereqs.js","sourceRoot":"","sources":["../../../../../src/actions/builtin/speckit/operations/check-prereqs.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAwB,EACxB,MAAc;IAEd,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;IAEzC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,2CAA2C,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5E,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,+BAA+B,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ActionContext } from '../../../../types/index.js';
|
|
2
|
+
import type { ClarifyInput, ClarifyOutput } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Execute the clarify operation using agent.invoke delegation
|
|
5
|
+
*/
|
|
6
|
+
export declare function executeClarify(input: ClarifyInput, context: ActionContext): Promise<ClarifyOutput>;
|
|
7
|
+
//# sourceMappingURL=clarify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clarify.d.ts","sourceRoot":"","sources":["../../../../../src/actions/builtin/speckit/operations/clarify.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAyB,MAAM,aAAa,CAAC;AA8ItF;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,aAAa,CAAC,CAkLxB"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clarify operation handler.
|
|
3
|
+
* Uses agent.invoke to identify underspecified areas and generate clarification questions.
|
|
4
|
+
*/
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { executeCommand } 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 initial clarification question generation
|
|
11
|
+
*/
|
|
12
|
+
function buildClarifyPrompt(featureDir, specContent) {
|
|
13
|
+
return `Analyze the feature specification and identify underspecified areas that need clarification.
|
|
14
|
+
|
|
15
|
+
Feature directory: ${featureDir}
|
|
16
|
+
Clarifications file: ${join(featureDir, 'clarifications.md')}
|
|
17
|
+
|
|
18
|
+
Current spec content:
|
|
19
|
+
${specContent}
|
|
20
|
+
|
|
21
|
+
Instructions:
|
|
22
|
+
1. Read and analyze the specification carefully
|
|
23
|
+
2. Identify ambiguous or incomplete requirements
|
|
24
|
+
3. Consider technical implementation decisions that need input
|
|
25
|
+
4. Look for user experience decisions that need stakeholder input
|
|
26
|
+
5. Check for missing edge cases or error handling requirements
|
|
27
|
+
|
|
28
|
+
For each area needing clarification, generate a question with:
|
|
29
|
+
- Topic: Short identifier (e.g., "Authentication Method", "Error Handling")
|
|
30
|
+
- Context: Why this question matters (1-2 sentences)
|
|
31
|
+
- Question: The specific question to ask
|
|
32
|
+
- Options (if applicable): 2-4 concrete choices with descriptions
|
|
33
|
+
|
|
34
|
+
Format the clarifications file as markdown with this structure:
|
|
35
|
+
# Clarification Questions
|
|
36
|
+
|
|
37
|
+
## Status: Pending
|
|
38
|
+
|
|
39
|
+
## Questions
|
|
40
|
+
|
|
41
|
+
### Q1: [Topic]
|
|
42
|
+
**Context**: [Why this matters]
|
|
43
|
+
**Question**: [The specific question]
|
|
44
|
+
**Options**:
|
|
45
|
+
- A) [Option label]: [Description]
|
|
46
|
+
- B) [Option label]: [Description]
|
|
47
|
+
**Answer**: [Leave empty for now]
|
|
48
|
+
|
|
49
|
+
Write the clarifications to the file directly.
|
|
50
|
+
Return the count of questions generated.`;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Build the prompt for resuming after developer answers.
|
|
54
|
+
* Instructs the agent to fetch answers from the issue, consolidate,
|
|
55
|
+
* and determine if follow-up questions are needed.
|
|
56
|
+
*/
|
|
57
|
+
function buildResumePrompt(featureDir, specContent, existingClarifications, issueNumber) {
|
|
58
|
+
return `You are resuming a clarification round for a feature specification.
|
|
59
|
+
Previously, clarification questions were posted to GitHub issue #${issueNumber}.
|
|
60
|
+
The developer has answered the questions and signaled that answers are ready.
|
|
61
|
+
|
|
62
|
+
Feature directory: ${featureDir}
|
|
63
|
+
Clarifications file: ${join(featureDir, 'clarifications.md')}
|
|
64
|
+
|
|
65
|
+
Current spec content:
|
|
66
|
+
${specContent}
|
|
67
|
+
|
|
68
|
+
Previous clarification questions:
|
|
69
|
+
${existingClarifications}
|
|
70
|
+
|
|
71
|
+
Instructions:
|
|
72
|
+
1. Run \`gh issue view ${issueNumber} --comments\` to read the developer's answers from the issue comments
|
|
73
|
+
2. Read the existing clarifications.md file
|
|
74
|
+
3. For each question, find the developer's answer in the issue comments and fill in the **Answer** field
|
|
75
|
+
4. Update the clarifications.md file with the consolidated answers
|
|
76
|
+
5. Evaluate whether the answers are sufficient or if follow-up questions are needed
|
|
77
|
+
6. If all questions are adequately answered:
|
|
78
|
+
- Update ## Status to "Resolved"
|
|
79
|
+
- Do NOT add any new questions
|
|
80
|
+
- Return 0 for the count of NEW questions
|
|
81
|
+
7. If follow-up questions are needed (answers are ambiguous, incomplete, or raise new concerns):
|
|
82
|
+
- Keep the answered questions with their answers
|
|
83
|
+
- Add NEW follow-up questions at the end using the same format (### Q{N+1}: [Topic] etc.)
|
|
84
|
+
- Update ## Status to "Follow-up Required"
|
|
85
|
+
- Return ONLY the count of NEW follow-up questions (not the total)
|
|
86
|
+
|
|
87
|
+
IMPORTANT: Only generate follow-up questions if genuinely necessary. If the developer's answers
|
|
88
|
+
are clear and sufficient, resolve the clarifications and return 0 new questions so the workflow
|
|
89
|
+
can proceed.
|
|
90
|
+
|
|
91
|
+
Write updates to the clarifications file directly.
|
|
92
|
+
Return the count of NEW questions generated (0 if all resolved).`;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Parse questions from clarifications file content
|
|
96
|
+
*/
|
|
97
|
+
function parseQuestions(content) {
|
|
98
|
+
const questions = [];
|
|
99
|
+
const questionBlocks = content.split(/###\s*Q\d+:/);
|
|
100
|
+
for (const block of questionBlocks.slice(1)) {
|
|
101
|
+
const topicMatch = block.match(/^\s*([^\n]+)/);
|
|
102
|
+
const contextMatch = block.match(/\*\*Context\*\*:\s*([^\n]+)/);
|
|
103
|
+
const questionMatch = block.match(/\*\*Question\*\*:\s*([^\n]+)/);
|
|
104
|
+
if (topicMatch?.[1] && questionMatch?.[1]) {
|
|
105
|
+
const question = {
|
|
106
|
+
topic: topicMatch[1].trim(),
|
|
107
|
+
context: contextMatch?.[1]?.trim() ?? '',
|
|
108
|
+
question: questionMatch[1].trim(),
|
|
109
|
+
};
|
|
110
|
+
// Parse options if present
|
|
111
|
+
const optionsMatch = block.match(/\*\*Options\*\*:\s*\n([\s\S]*?)(?=\*\*Answer|$)/);
|
|
112
|
+
if (optionsMatch?.[1]) {
|
|
113
|
+
const optionsText = optionsMatch[1];
|
|
114
|
+
const optionMatches = optionsText.matchAll(/-\s*([A-Z])\)\s*([^:]+):\s*([^\n]+)/g);
|
|
115
|
+
const options = [];
|
|
116
|
+
for (const match of optionMatches) {
|
|
117
|
+
if (match[1] && match[2] && match[3]) {
|
|
118
|
+
options.push({
|
|
119
|
+
label: match[1],
|
|
120
|
+
description: `${match[2].trim()}: ${match[3].trim()}`,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (options.length > 0) {
|
|
125
|
+
question.options = options;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
questions.push(question);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return questions;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Execute the clarify operation using agent.invoke delegation
|
|
135
|
+
*/
|
|
136
|
+
export async function executeClarify(input, context) {
|
|
137
|
+
const specFile = join(input.feature_dir, 'spec.md');
|
|
138
|
+
const clarificationsFile = join(input.feature_dir, 'clarifications.md');
|
|
139
|
+
// Detect resume: if clarifications.md already exists, this is a follow-up round
|
|
140
|
+
const isResume = await exists(clarificationsFile);
|
|
141
|
+
context.logger.info(isResume
|
|
142
|
+
? `Resuming clarification (answers received) for: ${input.feature_dir}`
|
|
143
|
+
: `Generating clarification questions for: ${input.feature_dir}`);
|
|
144
|
+
// Read the spec file
|
|
145
|
+
if (!(await exists(specFile))) {
|
|
146
|
+
return {
|
|
147
|
+
success: false,
|
|
148
|
+
questions_count: 0,
|
|
149
|
+
questions: [],
|
|
150
|
+
clarifications_file: clarificationsFile,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
let specContent;
|
|
154
|
+
try {
|
|
155
|
+
specContent = await readFile(specFile);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
context.logger.error(`Failed to read spec file: ${error instanceof Error ? error.message : String(error)}`);
|
|
159
|
+
return {
|
|
160
|
+
success: false,
|
|
161
|
+
questions_count: 0,
|
|
162
|
+
questions: [],
|
|
163
|
+
clarifications_file: clarificationsFile,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
// Build prompt — use resume prompt if clarifications already exist and we have an issue number
|
|
167
|
+
let prompt;
|
|
168
|
+
if (isResume && input.issue_number) {
|
|
169
|
+
let existingClarifications = '';
|
|
170
|
+
try {
|
|
171
|
+
existingClarifications = await readFile(clarificationsFile);
|
|
172
|
+
}
|
|
173
|
+
catch { /* will proceed with empty */ }
|
|
174
|
+
prompt = buildResumePrompt(input.feature_dir, specContent, existingClarifications, input.issue_number);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
prompt = buildClarifyPrompt(input.feature_dir, specContent);
|
|
178
|
+
}
|
|
179
|
+
// Track how many questions exist before the agent runs (for resume: detect new follow-ups)
|
|
180
|
+
let previousQuestionCount = 0;
|
|
181
|
+
if (isResume && (await exists(clarificationsFile))) {
|
|
182
|
+
try {
|
|
183
|
+
const existing = await readFile(clarificationsFile);
|
|
184
|
+
previousQuestionCount = parseQuestions(existing).length;
|
|
185
|
+
}
|
|
186
|
+
catch { /* use 0 */ }
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
// Invoke Claude agent (--dangerously-skip-permissions for automated workflows)
|
|
190
|
+
const args = ['-p', prompt, '--output-format', 'json', '--dangerously-skip-permissions'];
|
|
191
|
+
const timeout = (input.timeout ?? 300) * 1000;
|
|
192
|
+
// Set up streaming batchers for real-time log output
|
|
193
|
+
const stdoutBatcher = new StreamBatcher((content) => {
|
|
194
|
+
context.emitEvent?.({
|
|
195
|
+
type: 'log:append',
|
|
196
|
+
data: { stream: 'stdout', stepName: 'clarify', content },
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
const stderrBatcher = new StreamBatcher((content) => {
|
|
200
|
+
context.emitEvent?.({
|
|
201
|
+
type: 'log:append',
|
|
202
|
+
data: { stream: 'stderr', stepName: 'clarify', content },
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
const result = await executeCommand('claude', args, {
|
|
206
|
+
cwd: input.feature_dir,
|
|
207
|
+
timeout,
|
|
208
|
+
signal: context.signal,
|
|
209
|
+
onStdout: (chunk) => stdoutBatcher.append(chunk),
|
|
210
|
+
onStderr: (chunk) => stderrBatcher.append(chunk),
|
|
211
|
+
});
|
|
212
|
+
// Flush remaining batched content
|
|
213
|
+
stdoutBatcher.flush();
|
|
214
|
+
stderrBatcher.flush();
|
|
215
|
+
if (result.exitCode !== 0) {
|
|
216
|
+
return {
|
|
217
|
+
success: false,
|
|
218
|
+
questions_count: 0,
|
|
219
|
+
questions: [],
|
|
220
|
+
clarifications_file: clarificationsFile,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
// Parse the generated clarifications
|
|
224
|
+
let questions = [];
|
|
225
|
+
if (await exists(clarificationsFile)) {
|
|
226
|
+
try {
|
|
227
|
+
const clarificationsContent = await readFile(clarificationsFile);
|
|
228
|
+
questions = parseQuestions(clarificationsContent);
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
// Ignore read errors
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// On resume: only count NEW questions (beyond what existed before the agent ran).
|
|
235
|
+
// On initial run: all questions are new.
|
|
236
|
+
const newQuestions = isResume
|
|
237
|
+
? questions.slice(previousQuestionCount)
|
|
238
|
+
: questions;
|
|
239
|
+
// Post NEW questions to GitHub issue
|
|
240
|
+
let postedToIssue = false;
|
|
241
|
+
if (input.issue_number && newQuestions.length > 0) {
|
|
242
|
+
try {
|
|
243
|
+
const header = isResume
|
|
244
|
+
? '## Follow-up Clarification Questions\n\nAfter reviewing your answers, the following additional questions need clarification:\n\n'
|
|
245
|
+
: '## Clarification Questions\n\nThe following areas need clarification before proceeding:\n\n';
|
|
246
|
+
let comment = header;
|
|
247
|
+
for (let i = 0; i < newQuestions.length; i++) {
|
|
248
|
+
const q = newQuestions[i];
|
|
249
|
+
if (q) {
|
|
250
|
+
comment += `### Q${i + 1}: ${q.topic}\n`;
|
|
251
|
+
comment += `**Context**: ${q.context}\n\n`;
|
|
252
|
+
comment += `**Question**: ${q.question}\n`;
|
|
253
|
+
if (q.options) {
|
|
254
|
+
comment += '\n**Options**:\n';
|
|
255
|
+
for (const opt of q.options) {
|
|
256
|
+
comment += `- ${opt.label}) ${opt.description}\n`;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
comment += '\n---\n\n';
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
await executeCommand('gh', [
|
|
263
|
+
'issue', 'comment', String(input.issue_number),
|
|
264
|
+
'--body', comment,
|
|
265
|
+
], {
|
|
266
|
+
cwd: context.workdir,
|
|
267
|
+
timeout: 30000,
|
|
268
|
+
});
|
|
269
|
+
postedToIssue = true;
|
|
270
|
+
context.logger.info(`Posted ${newQuestions.length} ${isResume ? 'follow-up ' : ''}questions to issue #${input.issue_number}`);
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
context.logger.warn(`Failed to post to issue: ${error instanceof Error ? error.message : String(error)}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
if (isResume) {
|
|
277
|
+
context.logger.info(newQuestions.length > 0
|
|
278
|
+
? `Generated ${newQuestions.length} follow-up questions`
|
|
279
|
+
: `All clarifications resolved, proceeding`);
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
context.logger.info(`Generated ${questions.length} clarification questions`);
|
|
283
|
+
}
|
|
284
|
+
return {
|
|
285
|
+
success: true,
|
|
286
|
+
questions_count: newQuestions.length,
|
|
287
|
+
questions: newQuestions,
|
|
288
|
+
posted_to_issue: postedToIssue,
|
|
289
|
+
clarifications_file: clarificationsFile,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
context.logger.error(`Clarify operation failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
294
|
+
return {
|
|
295
|
+
success: false,
|
|
296
|
+
questions_count: 0,
|
|
297
|
+
questions: [],
|
|
298
|
+
clarifications_file: clarificationsFile,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=clarify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clarify.js","sourceRoot":"","sources":["../../../../../src/actions/builtin/speckit/operations/clarify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copy template operation handler.
|
|
3
|
+
* Wraps the templates library for workflow execution.
|
|
4
|
+
*/
|
|
5
|
+
import type { Logger } from '../../../../types/logger.js';
|
|
6
|
+
import type { CopyTemplateInput, CopyTemplateOutput } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Execute the copy_template operation
|
|
9
|
+
*/
|
|
10
|
+
export declare function executeCopyTemplate(input: CopyTemplateInput, logger: Logger): Promise<CopyTemplateOutput>;
|
|
11
|
+
//# sourceMappingURL=copy-template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy-template.d.ts","sourceRoot":"","sources":["../../../../../src/actions/builtin/speckit/operations/copy-template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGzE;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,kBAAkB,CAAC,CAmB7B"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { copyTemplates } from '../lib/templates.js';
|
|
2
|
+
/**
|
|
3
|
+
* Execute the copy_template operation
|
|
4
|
+
*/
|
|
5
|
+
export async function executeCopyTemplate(input, logger) {
|
|
6
|
+
logger.info(`Copying templates: ${input.templates.join(', ')}`);
|
|
7
|
+
const result = await copyTemplates(input);
|
|
8
|
+
if (result.success) {
|
|
9
|
+
for (const copied of result.copied) {
|
|
10
|
+
logger.info(`Copied ${copied.template} to ${copied.destPath}`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
logger.error('Template copy failed');
|
|
15
|
+
if (result.errors) {
|
|
16
|
+
for (const error of result.errors) {
|
|
17
|
+
logger.error(`${error.template}: ${error.error.message}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=copy-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy-template.js","sourceRoot":"","sources":["../../../../../src/actions/builtin/speckit/operations/copy-template.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAwB,EACxB,MAAc;IAEd,MAAM,CAAC,IAAI,CAAC,sBAAsB,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,QAAQ,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACrC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create feature operation handler.
|
|
3
|
+
* Wraps the feature library for workflow execution.
|
|
4
|
+
*/
|
|
5
|
+
import type { Logger } from '../../../../types/logger.js';
|
|
6
|
+
import type { CreateFeatureInput, CreateFeatureOutput } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Execute the create_feature operation
|
|
9
|
+
*/
|
|
10
|
+
export declare function executeCreateFeature(input: CreateFeatureInput, logger: Logger): Promise<CreateFeatureOutput>;
|
|
11
|
+
//# sourceMappingURL=create-feature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-feature.d.ts","sourceRoot":"","sources":["../../../../../src/actions/builtin/speckit/operations/create-feature.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAG3E;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,mBAAmB,CAAC,CAqB9B"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createFeature } from '../lib/feature.js';
|
|
2
|
+
/**
|
|
3
|
+
* Execute the create_feature operation
|
|
4
|
+
*/
|
|
5
|
+
export async function executeCreateFeature(input, logger) {
|
|
6
|
+
logger.info(`Creating feature from description: ${input.description.substring(0, 50)}...`);
|
|
7
|
+
const result = await createFeature(input);
|
|
8
|
+
if (result.success) {
|
|
9
|
+
logger.info(`Feature created: ${result.branch_name}`);
|
|
10
|
+
logger.info(`Feature directory: ${result.feature_dir}`);
|
|
11
|
+
if (result.git_branch_created) {
|
|
12
|
+
logger.info(`Git branch created: ${result.branch_name}`);
|
|
13
|
+
}
|
|
14
|
+
if (result.branched_from_epic) {
|
|
15
|
+
logger.info(`Branched from epic: ${result.parent_epic_branch}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
logger.error(`Failed to create feature: branch=${result.branch_name || '(empty)'}, ` +
|
|
20
|
+
`featureDir=${result.feature_dir || '(empty)'}, num=${result.feature_num || '(empty)'}, ` +
|
|
21
|
+
`cwd=${input.cwd || '(default)'}`);
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=create-feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-feature.js","sourceRoot":"","sources":["../../../../../src/actions/builtin/speckit/operations/create-feature.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAyB,EACzB,MAAc;IAEd,MAAM,CAAC,IAAI,CAAC,sCAAsC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAE3F,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,oCAAoC,MAAM,CAAC,WAAW,IAAI,SAAS,IAAI;YAClF,cAAc,MAAM,CAAC,WAAW,IAAI,SAAS,SAAS,MAAM,CAAC,WAAW,IAAI,SAAS,IAAI;YACzF,OAAO,KAAK,CAAC,GAAG,IAAI,WAAW,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|