edsger 0.50.0 → 0.52.0
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/.claude/settings.local.json +23 -3
- package/.env.local +12 -0
- package/README.md +25 -25
- package/dist/api/chat.d.ts +7 -7
- package/dist/api/chat.js +13 -13
- package/dist/api/cross-product.d.ts +10 -10
- package/dist/api/cross-product.js +30 -30
- package/dist/api/github.d.ts +5 -5
- package/dist/api/github.js +10 -10
- package/dist/api/intelligence.d.ts +3 -3
- package/dist/api/issues/approval-checker.d.ts +20 -0
- package/dist/api/{features → issues}/approval-checker.js +16 -16
- package/dist/api/issues/get-issue.d.ts +5 -0
- package/dist/api/issues/get-issue.js +21 -0
- package/dist/api/issues/index.d.ts +8 -0
- package/dist/api/issues/index.js +10 -0
- package/dist/api/issues/issue-utils.d.ts +23 -0
- package/dist/api/issues/issue-utils.js +80 -0
- package/dist/api/issues/status-updater.d.ts +41 -0
- package/dist/api/{features → issues}/status-updater.js +23 -23
- package/dist/api/{features → issues}/test-cases.d.ts +7 -7
- package/dist/api/{features → issues}/test-cases.js +12 -12
- package/dist/api/issues/update-issue.d.ts +20 -0
- package/dist/api/{features/update-feature.js → issues/update-issue.js} +22 -22
- package/dist/api/{features → issues}/user-stories.d.ts +5 -5
- package/dist/api/{features → issues}/user-stories.js +8 -8
- package/dist/api/products.d.ts +1 -1
- package/dist/api/tasks.d.ts +1 -1
- package/dist/api/test-reports.d.ts +2 -2
- package/dist/api/test-reports.js +4 -4
- package/dist/auth/login.js +1 -1
- package/dist/commands/agent-workflow/chat-worker.d.ts +7 -7
- package/dist/commands/agent-workflow/chat-worker.js +50 -50
- package/dist/commands/agent-workflow/index.d.ts +2 -2
- package/dist/commands/agent-workflow/index.js +3 -3
- package/dist/commands/agent-workflow/{feature-worker.d.ts → issue-worker.d.ts} +4 -4
- package/dist/commands/agent-workflow/{feature-worker.js → issue-worker.js} +12 -12
- package/dist/commands/agent-workflow/processor.d.ts +9 -9
- package/dist/commands/agent-workflow/processor.js +90 -90
- package/dist/commands/build/index.js +2 -2
- package/dist/commands/find-bugs/index.d.ts +11 -0
- package/dist/commands/find-bugs/index.js +39 -0
- package/dist/commands/find-features/index.d.ts +14 -0
- package/dist/commands/find-features/index.js +42 -0
- package/dist/commands/find-smells/index.d.ts +21 -0
- package/dist/commands/find-smells/index.js +65 -0
- package/dist/commands/init/prompts.js +1 -1
- package/dist/commands/init/templates.d.ts +1 -1
- package/dist/commands/init/templates.js +4 -4
- package/dist/commands/workflow/config/phase-configs.js +17 -17
- package/dist/commands/workflow/core/index.d.ts +1 -1
- package/dist/commands/workflow/core/index.js +2 -2
- package/dist/commands/workflow/core/issue-filter.d.ts +16 -0
- package/dist/commands/workflow/core/issue-filter.js +47 -0
- package/dist/commands/workflow/core/state-manager.d.ts +10 -10
- package/dist/commands/workflow/core/state-manager.js +10 -10
- package/dist/commands/workflow/core/workflow-logger.d.ts +9 -9
- package/dist/commands/workflow/core/workflow-logger.js +21 -21
- package/dist/commands/workflow/executors/phase-executor.d.ts +2 -2
- package/dist/commands/workflow/executors/phase-executor.js +32 -32
- package/dist/commands/workflow/issue-coordinator.d.ts +18 -0
- package/dist/commands/workflow/{feature-coordinator.js → issue-coordinator.js} +29 -29
- package/dist/commands/workflow/phase-orchestrator.d.ts +2 -2
- package/dist/commands/workflow/phase-orchestrator.js +82 -82
- package/dist/commands/workflow/processor.d.ts +7 -7
- package/dist/commands/workflow/processor.js +44 -44
- package/dist/config/{feature-status.d.ts → issue-status.d.ts} +14 -14
- package/dist/config/{feature-status.js → issue-status.js} +14 -14
- package/dist/errors/index.d.ts +6 -6
- package/dist/errors/index.js +11 -11
- package/dist/index.js +90 -1
- package/dist/phases/app-store-generation/context.js +6 -6
- package/dist/phases/app-store-generation/index.js +2 -2
- package/dist/phases/app-store-generation/prompts.js +2 -2
- package/dist/phases/autonomous/index.d.ts +3 -3
- package/dist/phases/autonomous/index.js +37 -37
- package/dist/phases/autonomous/prompts.d.ts +2 -2
- package/dist/phases/autonomous/prompts.js +4 -4
- package/dist/phases/branch-planning/context.d.ts +3 -3
- package/dist/phases/branch-planning/context.js +12 -12
- package/dist/phases/branch-planning/index.d.ts +3 -3
- package/dist/phases/branch-planning/index.js +32 -32
- package/dist/phases/branch-planning/outcome.d.ts +5 -5
- package/dist/phases/branch-planning/outcome.js +12 -12
- package/dist/phases/branch-planning/prompts.d.ts +3 -3
- package/dist/phases/branch-planning/prompts.js +13 -13
- package/dist/phases/bug-fixing/analyzer.d.ts +2 -2
- package/dist/phases/bug-fixing/analyzer.js +13 -13
- package/dist/phases/bug-fixing/context-fetcher.d.ts +3 -3
- package/dist/phases/bug-fixing/context-fetcher.js +18 -18
- package/dist/phases/bug-fixing/mcp-server.js +17 -18
- package/dist/phases/chat-processor/context.d.ts +5 -5
- package/dist/phases/chat-processor/context.js +17 -17
- package/dist/phases/chat-processor/index.d.ts +4 -4
- package/dist/phases/chat-processor/index.js +17 -17
- package/dist/phases/chat-processor/product-context.d.ts +3 -3
- package/dist/phases/chat-processor/product-context.js +16 -16
- package/dist/phases/chat-processor/product-prompts.d.ts +1 -1
- package/dist/phases/chat-processor/product-prompts.js +10 -10
- package/dist/phases/chat-processor/product-tools.d.ts +2 -2
- package/dist/phases/chat-processor/product-tools.js +33 -33
- package/dist/phases/chat-processor/prompts.d.ts +3 -3
- package/dist/phases/chat-processor/prompts.js +22 -22
- package/dist/phases/chat-processor/tools.js +46 -46
- package/dist/phases/code-implementation/branch-pr-creator.d.ts +3 -3
- package/dist/phases/code-implementation/branch-pr-creator.js +5 -5
- package/dist/phases/code-implementation/context.d.ts +3 -3
- package/dist/phases/code-implementation/context.js +18 -18
- package/dist/phases/code-implementation/index.d.ts +4 -4
- package/dist/phases/code-implementation/index.js +88 -88
- package/dist/phases/code-implementation/outcome.d.ts +3 -3
- package/dist/phases/code-implementation/outcome.js +6 -6
- package/dist/phases/code-implementation/prompts.d.ts +1 -1
- package/dist/phases/code-implementation/prompts.js +6 -6
- package/dist/phases/code-implementation-verification/agent.d.ts +3 -3
- package/dist/phases/code-implementation-verification/agent.js +5 -5
- package/dist/phases/code-implementation-verification/index.d.ts +3 -3
- package/dist/phases/code-implementation-verification/index.js +11 -11
- package/dist/phases/code-implementation-verification/prompts.d.ts +3 -3
- package/dist/phases/code-implementation-verification/prompts.js +7 -7
- package/dist/phases/code-refine/context.d.ts +8 -8
- package/dist/phases/code-refine/context.js +29 -29
- package/dist/phases/code-refine/index.d.ts +2 -2
- package/dist/phases/code-refine/index.js +20 -20
- package/dist/phases/code-refine/prompts.d.ts +1 -1
- package/dist/phases/code-refine/prompts.js +3 -3
- package/dist/phases/code-refine/refine-iteration.d.ts +1 -1
- package/dist/phases/code-refine/refine-iteration.js +4 -4
- package/dist/phases/code-refine/retry-handler.js +2 -2
- package/dist/phases/code-refine-verification/index.js +10 -10
- package/dist/phases/code-refine-verification/types.d.ts +2 -2
- package/dist/phases/code-review/context.d.ts +8 -8
- package/dist/phases/code-review/context.js +25 -25
- package/dist/phases/code-review/diff-utils.d.ts +1 -1
- package/dist/phases/code-review/diff-utils.js +1 -1
- package/dist/phases/code-review/index.d.ts +2 -2
- package/dist/phases/code-review/index.js +26 -26
- package/dist/phases/code-testing/analyzer.d.ts +2 -2
- package/dist/phases/code-testing/analyzer.js +18 -18
- package/dist/phases/code-testing/context-fetcher.d.ts +3 -3
- package/dist/phases/code-testing/context-fetcher.js +16 -16
- package/dist/phases/code-testing/prompts.d.ts +1 -1
- package/dist/phases/code-testing/prompts.js +5 -5
- package/dist/phases/find-bugs/index.d.ts +30 -0
- package/dist/phases/find-bugs/index.js +216 -0
- package/dist/phases/find-bugs/prompts.d.ts +22 -0
- package/dist/phases/find-bugs/prompts.js +101 -0
- package/dist/phases/find-bugs/state.d.ts +19 -0
- package/dist/phases/find-bugs/state.js +13 -0
- package/dist/phases/find-bugs/types.d.ts +21 -0
- package/dist/phases/find-bugs/types.js +16 -0
- package/dist/phases/find-features/index.d.ts +40 -0
- package/dist/phases/find-features/index.js +279 -0
- package/dist/phases/find-features/prompts.d.ts +43 -0
- package/dist/phases/find-features/prompts.js +138 -0
- package/dist/phases/find-features/state.d.ts +25 -0
- package/dist/phases/find-features/state.js +22 -0
- package/dist/phases/find-features/types.d.ts +27 -0
- package/dist/phases/find-features/types.js +16 -0
- package/dist/phases/find-shared/git.d.ts +24 -0
- package/dist/phases/find-shared/git.js +60 -0
- package/dist/phases/find-shared/mcp.d.ts +33 -0
- package/dist/phases/find-shared/mcp.js +69 -0
- package/dist/phases/find-shared/scan-state.d.ts +33 -0
- package/dist/phases/find-shared/scan-state.js +112 -0
- package/dist/phases/find-smells/index.d.ts +47 -0
- package/dist/phases/find-smells/index.js +278 -0
- package/dist/phases/find-smells/prompts.d.ts +30 -0
- package/dist/phases/find-smells/prompts.js +129 -0
- package/dist/phases/find-smells/state.d.ts +21 -0
- package/dist/phases/find-smells/state.js +17 -0
- package/dist/phases/find-smells/types.d.ts +51 -0
- package/dist/phases/find-smells/types.js +64 -0
- package/dist/phases/functional-testing/analyzer.d.ts +2 -2
- package/dist/phases/functional-testing/analyzer.js +40 -40
- package/dist/phases/functional-testing/context-fetcher.d.ts +3 -3
- package/dist/phases/functional-testing/context-fetcher.js +16 -16
- package/dist/phases/functional-testing/http-fallback.d.ts +2 -2
- package/dist/phases/functional-testing/http-fallback.js +9 -9
- package/dist/phases/functional-testing/mcp-server.js +23 -24
- package/dist/phases/functional-testing/prompts.d.ts +1 -1
- package/dist/phases/functional-testing/prompts.js +4 -4
- package/dist/phases/functional-testing/test-report-creator.d.ts +2 -2
- package/dist/phases/functional-testing/test-report-creator.js +10 -10
- package/dist/phases/functional-testing/test-retry-handler.js +3 -3
- package/dist/phases/growth-analysis/context.js +6 -6
- package/dist/phases/growth-analysis/index.js +2 -2
- package/dist/phases/growth-analysis/prompts.js +2 -2
- package/dist/phases/intelligence-analysis/context.js +7 -7
- package/dist/phases/intelligence-analysis/index.js +3 -3
- package/dist/phases/{feature-analysis → issue-analysis}/agent.js +1 -1
- package/dist/phases/issue-analysis/context.d.ts +24 -0
- package/dist/phases/{feature-analysis → issue-analysis}/context.js +30 -30
- package/dist/phases/issue-analysis/index.d.ts +8 -0
- package/dist/phases/{feature-analysis → issue-analysis}/index.js +29 -29
- package/dist/phases/issue-analysis/outcome.d.ts +40 -0
- package/dist/phases/{feature-analysis → issue-analysis}/outcome.js +17 -17
- package/dist/phases/{feature-analysis → issue-analysis}/prompts.d.ts +3 -3
- package/dist/phases/{feature-analysis → issue-analysis}/prompts.js +12 -12
- package/dist/phases/{feature-analysis-verification → issue-analysis-verification}/agent.d.ts +2 -2
- package/dist/phases/{feature-analysis-verification → issue-analysis-verification}/agent.js +1 -1
- package/dist/phases/{feature-analysis-verification → issue-analysis-verification}/index.d.ts +5 -5
- package/dist/phases/{feature-analysis-verification → issue-analysis-verification}/index.js +9 -9
- package/dist/phases/{feature-analysis-verification → issue-analysis-verification}/prompts.d.ts +2 -2
- package/dist/phases/{feature-analysis-verification → issue-analysis-verification}/prompts.js +7 -7
- package/dist/phases/output-contracts.js +37 -37
- package/dist/phases/pr-execution/context.d.ts +3 -3
- package/dist/phases/pr-execution/context.js +14 -14
- package/dist/phases/pr-execution/index.d.ts +2 -2
- package/dist/phases/pr-execution/index.js +22 -22
- package/dist/phases/pr-execution/outcome.d.ts +4 -4
- package/dist/phases/pr-execution/outcome.js +6 -6
- package/dist/phases/pr-execution/prompts.d.ts +4 -4
- package/dist/phases/pr-execution/prompts.js +6 -6
- package/dist/phases/pr-resolve/checklist-learner.js +2 -2
- package/dist/phases/pr-review/index.d.ts +1 -1
- package/dist/phases/pr-review/index.js +1 -1
- package/dist/phases/pr-review/prompts.d.ts +1 -1
- package/dist/phases/pr-review/prompts.js +1 -1
- package/dist/phases/pr-shared/context.d.ts +3 -3
- package/dist/phases/pr-shared/context.js +3 -3
- package/dist/phases/pr-splitting/context.d.ts +3 -3
- package/dist/phases/pr-splitting/context.js +16 -16
- package/dist/phases/pr-splitting/index.d.ts +4 -4
- package/dist/phases/pr-splitting/index.js +29 -29
- package/dist/phases/pr-splitting/outcome.d.ts +3 -3
- package/dist/phases/pr-splitting/outcome.js +7 -7
- package/dist/phases/pr-splitting/prompts.d.ts +3 -3
- package/dist/phases/pr-splitting/prompts.js +11 -11
- package/dist/phases/pull-request/creator.d.ts +4 -4
- package/dist/phases/pull-request/creator.js +25 -25
- package/dist/phases/pull-request/handler.d.ts +3 -3
- package/dist/phases/pull-request/handler.js +16 -16
- package/dist/phases/release-sync/index.js +2 -2
- package/dist/phases/run-sheet/agent.js +1 -2
- package/dist/phases/run-sheet/index.js +3 -3
- package/dist/phases/smoke-test/index.js +2 -2
- package/dist/phases/technical-design/context.d.ts +3 -3
- package/dist/phases/technical-design/context.js +11 -11
- package/dist/phases/technical-design/index.d.ts +2 -2
- package/dist/phases/technical-design/index.js +27 -27
- package/dist/phases/technical-design/outcome.d.ts +4 -4
- package/dist/phases/technical-design/outcome.js +6 -6
- package/dist/phases/technical-design/prompts.d.ts +2 -2
- package/dist/phases/technical-design/prompts.js +10 -10
- package/dist/phases/technical-design-verification/agent.d.ts +3 -3
- package/dist/phases/technical-design-verification/agent.js +4 -4
- package/dist/phases/technical-design-verification/index.d.ts +4 -4
- package/dist/phases/technical-design-verification/index.js +12 -12
- package/dist/phases/technical-design-verification/prompts.d.ts +3 -3
- package/dist/phases/technical-design-verification/prompts.js +6 -6
- package/dist/phases/test-cases-analysis/context.d.ts +5 -5
- package/dist/phases/test-cases-analysis/context.js +18 -18
- package/dist/phases/test-cases-analysis/formatters.js +7 -7
- package/dist/phases/test-cases-analysis/index.d.ts +1 -1
- package/dist/phases/test-cases-analysis/index.js +21 -21
- package/dist/phases/test-cases-analysis/outcome.d.ts +7 -7
- package/dist/phases/test-cases-analysis/outcome.js +13 -13
- package/dist/phases/test-cases-analysis/prompts.d.ts +3 -3
- package/dist/phases/test-cases-analysis/prompts.js +6 -6
- package/dist/phases/user-stories-analysis/context.d.ts +5 -5
- package/dist/phases/user-stories-analysis/context.js +18 -18
- package/dist/phases/user-stories-analysis/formatters.js +7 -7
- package/dist/phases/user-stories-analysis/index.d.ts +1 -1
- package/dist/phases/user-stories-analysis/index.js +21 -21
- package/dist/phases/user-stories-analysis/outcome.d.ts +7 -7
- package/dist/phases/user-stories-analysis/outcome.js +13 -13
- package/dist/phases/user-stories-analysis/prompts.d.ts +3 -3
- package/dist/phases/user-stories-analysis/prompts.js +10 -10
- package/dist/services/audit-logs.d.ts +10 -10
- package/dist/services/audit-logs.js +12 -12
- package/dist/services/branches.d.ts +6 -6
- package/dist/services/branches.js +16 -16
- package/dist/services/checklist.d.ts +3 -3
- package/dist/services/checklist.js +11 -11
- package/dist/services/coaching/coaching-agent.js +2 -2
- package/dist/services/coaching/coaching-loop.d.ts +1 -1
- package/dist/services/coaching/coaching-loop.js +2 -2
- package/dist/services/coaching/phase-coaching.d.ts +2 -2
- package/dist/services/coaching/phase-coaching.js +3 -3
- package/dist/services/coaching/self-rating.js +1 -1
- package/dist/services/feedbacks.d.ts +4 -4
- package/dist/services/feedbacks.js +8 -8
- package/dist/services/phase-hooks/bindings-fetcher.d.ts +4 -4
- package/dist/services/phase-hooks/bindings-fetcher.js +8 -8
- package/dist/services/phase-hooks/hook-executor.js +1 -1
- package/dist/services/phase-hooks/hook-logging.d.ts +2 -2
- package/dist/services/phase-hooks/hook-logging.js +4 -4
- package/dist/services/phase-hooks/hook-runner.d.ts +1 -1
- package/dist/services/phase-hooks/hook-runner.js +4 -4
- package/dist/services/phase-hooks/types.d.ts +3 -3
- package/dist/services/phase-ratings.d.ts +7 -7
- package/dist/services/phase-ratings.js +8 -8
- package/dist/services/pull-requests.d.ts +4 -4
- package/dist/services/pull-requests.js +11 -11
- package/dist/services/skill-resolver.d.ts +1 -1
- package/dist/services/skill-resolver.js +1 -1
- package/dist/skills/phase/app-store-generation/SKILL.md +9 -9
- package/dist/skills/phase/autonomous/SKILL.md +2 -2
- package/dist/skills/phase/branch-planning/SKILL.md +12 -12
- package/dist/skills/phase/bug-fixing/SKILL.md +1 -1
- package/dist/skills/phase/code-implementation/SKILL.md +6 -6
- package/dist/skills/phase/code-implementation-verification/SKILL.md +3 -3
- package/dist/skills/phase/code-testing/SKILL.md +5 -5
- package/dist/skills/phase/functional-testing/SKILL.md +3 -3
- package/dist/skills/phase/growth-analysis/SKILL.md +8 -8
- package/dist/skills/phase/incremental-sync/SKILL.md +6 -6
- package/dist/skills/phase/intelligence-analysis/SKILL.md +7 -7
- package/dist/skills/phase/{feature-analysis → issue-analysis}/SKILL.md +8 -8
- package/dist/skills/phase/pr-execution/SKILL.md +7 -7
- package/dist/skills/phase/pr-splitting/SKILL.md +14 -14
- package/dist/skills/phase/smoke-test/SKILL.md +1 -1
- package/dist/skills/phase/technical-design/SKILL.md +5 -5
- package/dist/skills/phase/test-cases-analysis/SKILL.md +4 -4
- package/dist/skills/phase/user-stories-analysis/SKILL.md +13 -13
- package/dist/system/session-manager.d.ts +3 -3
- package/dist/system/session-manager.js +3 -3
- package/dist/system/sleep-notification.js +2 -2
- package/dist/system/sleep-prevention.js +1 -1
- package/dist/types/index.d.ts +21 -21
- package/dist/types/{features.d.ts → issues.d.ts} +3 -3
- package/dist/types/pipeline.d.ts +4 -4
- package/dist/updater/auto-updater.d.ts +2 -2
- package/dist/updater/auto-updater.js +3 -3
- package/dist/utils/conflict-resolver.d.ts +1 -1
- package/dist/utils/conflict-resolver.js +5 -5
- package/dist/utils/formatters.d.ts +4 -4
- package/dist/utils/formatters.js +29 -29
- package/dist/utils/git-branch-manager-async.d.ts +6 -6
- package/dist/utils/git-branch-manager-async.js +41 -41
- package/dist/utils/git-branch-manager.d.ts +11 -11
- package/dist/utils/git-branch-manager.js +42 -42
- package/dist/utils/image-downloader.d.ts +4 -4
- package/dist/utils/image-downloader.js +17 -17
- package/dist/utils/pipeline-logger.d.ts +1 -1
- package/dist/utils/pipeline-logger.js +5 -5
- package/dist/workspace/workspace-manager.d.ts +17 -17
- package/dist/workspace/workspace-manager.js +21 -21
- package/package.json +1 -1
- package/vitest.config.ts +4 -0
- package/dist/api/__tests__/app-store.test.d.ts +0 -7
- package/dist/api/__tests__/app-store.test.js +0 -60
- package/dist/api/__tests__/intelligence.test.d.ts +0 -11
- package/dist/api/__tests__/intelligence.test.js +0 -315
- package/dist/api/features/__tests__/feature-utils.test.d.ts +0 -4
- package/dist/api/features/__tests__/feature-utils.test.js +0 -370
- package/dist/api/features/__tests__/status-updater.test.d.ts +0 -4
- package/dist/api/features/__tests__/status-updater.test.js +0 -88
- package/dist/api/features/approval-checker.d.ts +0 -20
- package/dist/api/features/feature-utils.d.ts +0 -23
- package/dist/api/features/feature-utils.js +0 -80
- package/dist/api/features/get-feature.d.ts +0 -5
- package/dist/api/features/get-feature.js +0 -21
- package/dist/api/features/index.d.ts +0 -8
- package/dist/api/features/index.js +0 -10
- package/dist/api/features/status-updater.d.ts +0 -41
- package/dist/api/features/update-feature.d.ts +0 -20
- package/dist/commands/build/__tests__/build.test.d.ts +0 -5
- package/dist/commands/build/__tests__/build.test.js +0 -206
- package/dist/commands/build/__tests__/detect-project.test.d.ts +0 -6
- package/dist/commands/build/__tests__/detect-project.test.js +0 -160
- package/dist/commands/build/__tests__/run-build.test.d.ts +0 -6
- package/dist/commands/build/__tests__/run-build.test.js +0 -433
- package/dist/commands/intelligence/__tests__/command.test.d.ts +0 -4
- package/dist/commands/intelligence/__tests__/command.test.js +0 -48
- package/dist/commands/workflow/core/__tests__/feature-filter.test.d.ts +0 -5
- package/dist/commands/workflow/core/__tests__/feature-filter.test.js +0 -316
- package/dist/commands/workflow/core/__tests__/pipeline-evaluator.test.d.ts +0 -4
- package/dist/commands/workflow/core/__tests__/pipeline-evaluator.test.js +0 -397
- package/dist/commands/workflow/core/__tests__/state-manager.test.d.ts +0 -4
- package/dist/commands/workflow/core/__tests__/state-manager.test.js +0 -384
- package/dist/commands/workflow/core/feature-filter.d.ts +0 -16
- package/dist/commands/workflow/core/feature-filter.js +0 -47
- package/dist/commands/workflow/feature-coordinator.d.ts +0 -18
- package/dist/config/__tests__/config.test.d.ts +0 -4
- package/dist/config/__tests__/config.test.js +0 -286
- package/dist/config/__tests__/feature-status.test.d.ts +0 -4
- package/dist/config/__tests__/feature-status.test.js +0 -111
- package/dist/errors/__tests__/index.test.d.ts +0 -4
- package/dist/errors/__tests__/index.test.js +0 -349
- package/dist/phases/app-store-generation/__tests__/agent.test.d.ts +0 -5
- package/dist/phases/app-store-generation/__tests__/agent.test.js +0 -142
- package/dist/phases/app-store-generation/__tests__/context.test.d.ts +0 -4
- package/dist/phases/app-store-generation/__tests__/context.test.js +0 -284
- package/dist/phases/app-store-generation/__tests__/prompts.test.d.ts +0 -4
- package/dist/phases/app-store-generation/__tests__/prompts.test.js +0 -122
- package/dist/phases/app-store-generation/__tests__/screenshot-composer.test.d.ts +0 -5
- package/dist/phases/app-store-generation/__tests__/screenshot-composer.test.js +0 -826
- package/dist/phases/code-review/__tests__/diff-utils.test.js +0 -101
- package/dist/phases/feature-analysis/context.d.ts +0 -24
- package/dist/phases/feature-analysis/index.d.ts +0 -8
- package/dist/phases/feature-analysis/outcome.d.ts +0 -40
- package/dist/phases/intelligence-analysis/__tests__/context.test.d.ts +0 -4
- package/dist/phases/intelligence-analysis/__tests__/context.test.js +0 -192
- package/dist/phases/intelligence-analysis/__tests__/matching.test.d.ts +0 -13
- package/dist/phases/intelligence-analysis/__tests__/matching.test.js +0 -154
- package/dist/phases/intelligence-analysis/__tests__/orchestration.test.d.ts +0 -5
- package/dist/phases/intelligence-analysis/__tests__/orchestration.test.js +0 -378
- package/dist/phases/intelligence-analysis/__tests__/prompts.test.d.ts +0 -4
- package/dist/phases/intelligence-analysis/__tests__/prompts.test.js +0 -33
- package/dist/phases/pr-execution/__tests__/file-assigner.test.d.ts +0 -1
- package/dist/phases/pr-execution/__tests__/file-assigner.test.js +0 -303
- package/dist/phases/pr-resolve/__tests__/checklist-learner.test.d.ts +0 -1
- package/dist/phases/pr-resolve/__tests__/checklist-learner.test.js +0 -157
- package/dist/phases/pr-resolve/__tests__/prompts.test.d.ts +0 -1
- package/dist/phases/pr-resolve/__tests__/prompts.test.js +0 -116
- package/dist/phases/pr-resolve/__tests__/resolve-mapping.test.d.ts +0 -1
- package/dist/phases/pr-resolve/__tests__/resolve-mapping.test.js +0 -138
- package/dist/phases/pr-resolve/__tests__/types.test.d.ts +0 -1
- package/dist/phases/pr-resolve/__tests__/types.test.js +0 -43
- package/dist/phases/pr-resolve/__tests__/workspace.test.d.ts +0 -1
- package/dist/phases/pr-resolve/__tests__/workspace.test.js +0 -111
- package/dist/phases/pr-review/__tests__/prompts.test.d.ts +0 -1
- package/dist/phases/pr-review/__tests__/prompts.test.js +0 -49
- package/dist/phases/pr-review/__tests__/review-comments.test.d.ts +0 -1
- package/dist/phases/pr-review/__tests__/review-comments.test.js +0 -110
- package/dist/phases/pr-shared/__tests__/agent-utils.test.d.ts +0 -1
- package/dist/phases/pr-shared/__tests__/agent-utils.test.js +0 -91
- package/dist/phases/pr-shared/__tests__/context.test.d.ts +0 -1
- package/dist/phases/pr-shared/__tests__/context.test.js +0 -94
- package/dist/phases/pr-splitting/__tests__/import-dep-validator.test.d.ts +0 -1
- package/dist/phases/pr-splitting/__tests__/import-dep-validator.test.js +0 -331
- package/dist/phases/run-sheet/render.d.ts +0 -60
- package/dist/phases/run-sheet/render.js +0 -297
- package/dist/phases/smoke-test/__tests__/agent.test.d.ts +0 -4
- package/dist/phases/smoke-test/__tests__/agent.test.js +0 -84
- package/dist/phases/smoke-test/__tests__/github.test.d.ts +0 -9
- package/dist/phases/smoke-test/__tests__/github.test.js +0 -120
- package/dist/phases/smoke-test/__tests__/snapshot.test.d.ts +0 -8
- package/dist/phases/smoke-test/__tests__/snapshot.test.js +0 -93
- package/dist/phases/smoke-test/github.d.ts +0 -54
- package/dist/phases/smoke-test/github.js +0 -101
- package/dist/phases/smoke-test/snapshot.d.ts +0 -27
- package/dist/phases/smoke-test/snapshot.js +0 -157
- package/dist/services/coaching/__tests__/coaching-agent.test.d.ts +0 -1
- package/dist/services/coaching/__tests__/coaching-agent.test.js +0 -74
- package/dist/services/coaching/__tests__/coaching-loop.test.d.ts +0 -1
- package/dist/services/coaching/__tests__/coaching-loop.test.js +0 -59
- package/dist/services/coaching/__tests__/self-rating.test.d.ts +0 -1
- package/dist/services/coaching/__tests__/self-rating.test.js +0 -188
- package/dist/services/lifecycle-agent/__tests__/phase-criteria.test.d.ts +0 -4
- package/dist/services/lifecycle-agent/__tests__/phase-criteria.test.js +0 -133
- package/dist/services/lifecycle-agent/__tests__/transition-rules.test.d.ts +0 -4
- package/dist/services/lifecycle-agent/__tests__/transition-rules.test.js +0 -336
- package/dist/services/lifecycle-agent/index.d.ts +0 -24
- package/dist/services/lifecycle-agent/index.js +0 -25
- package/dist/services/lifecycle-agent/phase-criteria.d.ts +0 -57
- package/dist/services/lifecycle-agent/phase-criteria.js +0 -335
- package/dist/services/lifecycle-agent/transition-rules.d.ts +0 -60
- package/dist/services/lifecycle-agent/transition-rules.js +0 -184
- package/dist/services/lifecycle-agent/types.d.ts +0 -190
- package/dist/services/lifecycle-agent/types.js +0 -12
- package/dist/services/phase-hooks/__tests__/bindings-fetcher.test.d.ts +0 -1
- package/dist/services/phase-hooks/__tests__/bindings-fetcher.test.js +0 -122
- package/dist/services/phase-hooks/__tests__/hook-executor.test.d.ts +0 -1
- package/dist/services/phase-hooks/__tests__/hook-executor.test.js +0 -321
- package/dist/services/phase-hooks/__tests__/hook-runner.test.d.ts +0 -1
- package/dist/services/phase-hooks/__tests__/hook-runner.test.js +0 -261
- package/dist/services/phase-hooks/__tests__/plugin-loader.test.d.ts +0 -1
- package/dist/services/phase-hooks/__tests__/plugin-loader.test.js +0 -158
- package/dist/services/video/__tests__/video-pipeline.test.d.ts +0 -6
- package/dist/services/video/__tests__/video-pipeline.test.js +0 -249
- package/dist/types/features.js +0 -1
- package/dist/workspace/__tests__/workspace-manager.test.d.ts +0 -7
- package/dist/workspace/__tests__/workspace-manager.test.js +0 -52
- /package/dist/api/{features → issues}/batch-operations.d.ts +0 -0
- /package/dist/api/{features → issues}/batch-operations.js +0 -0
- /package/dist/phases/{feature-analysis → issue-analysis}/agent.d.ts +0 -0
- /package/dist/skills/phase/{feature-analysis-verification → issue-analysis-verification}/SKILL.md +0 -0
- /package/dist/{phases/code-review/__tests__/diff-utils.test.d.ts → types/issues.js} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getMcpServerUrl, getMcpToken } from '../../auth/auth-store.js';
|
|
2
2
|
import { logError, logInfo } from '../../utils/logger.js';
|
|
3
3
|
export async function saveFunctionalTestResultsViaHttp(options) {
|
|
4
|
-
const {
|
|
4
|
+
const { issueId, testStatus, testResults: _testResults, verbose } = options;
|
|
5
5
|
try {
|
|
6
6
|
if (verbose) {
|
|
7
7
|
logInfo('🔄 Attempting to save functional test results via HTTP fallback...');
|
|
@@ -16,9 +16,9 @@ export async function saveFunctionalTestResultsViaHttp(options) {
|
|
|
16
16
|
},
|
|
17
17
|
body: JSON.stringify({
|
|
18
18
|
jsonrpc: '2.0',
|
|
19
|
-
method: '
|
|
19
|
+
method: 'issues/update',
|
|
20
20
|
params: {
|
|
21
|
-
|
|
21
|
+
issue_id: issueId,
|
|
22
22
|
status: testStatus,
|
|
23
23
|
},
|
|
24
24
|
id: Math.random().toString(36).substring(7),
|
|
@@ -43,7 +43,7 @@ export async function saveFunctionalTestResultsViaHttp(options) {
|
|
|
43
43
|
return false;
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
-
export async function verifyTestStatusSaved(
|
|
46
|
+
export async function verifyTestStatusSaved(issueId, verbose, expectedStatus) {
|
|
47
47
|
try {
|
|
48
48
|
if (verbose) {
|
|
49
49
|
logInfo('🔍 Verifying test status was saved...');
|
|
@@ -58,9 +58,9 @@ export async function verifyTestStatusSaved(featureId, verbose, expectedStatus)
|
|
|
58
58
|
},
|
|
59
59
|
body: JSON.stringify({
|
|
60
60
|
jsonrpc: '2.0',
|
|
61
|
-
method: '
|
|
61
|
+
method: 'issues/get',
|
|
62
62
|
params: {
|
|
63
|
-
|
|
63
|
+
issue_id: issueId,
|
|
64
64
|
},
|
|
65
65
|
id: Math.random().toString(36).substring(7),
|
|
66
66
|
}),
|
|
@@ -72,8 +72,8 @@ export async function verifyTestStatusSaved(featureId, verbose, expectedStatus)
|
|
|
72
72
|
if (data.error) {
|
|
73
73
|
throw new Error(data.error.message || 'Verification failed');
|
|
74
74
|
}
|
|
75
|
-
const
|
|
76
|
-
const actualTestStatus =
|
|
75
|
+
const issue = data.result?.issues?.[0];
|
|
76
|
+
const actualTestStatus = issue?.status;
|
|
77
77
|
if (expectedStatus && actualTestStatus) {
|
|
78
78
|
const statusMatches = actualTestStatus === expectedStatus;
|
|
79
79
|
if (verbose) {
|
|
@@ -112,7 +112,7 @@ export async function saveFunctionalTestResultsWithRetry(options, maxRetries = 3
|
|
|
112
112
|
}
|
|
113
113
|
const saved = await saveFunctionalTestResultsViaHttp(options);
|
|
114
114
|
if (saved) {
|
|
115
|
-
const verified = await verifyTestStatusSaved(options.
|
|
115
|
+
const verified = await verifyTestStatusSaved(options.issueId, verbose, options.testStatus);
|
|
116
116
|
if (verified) {
|
|
117
117
|
if (verbose) {
|
|
118
118
|
logInfo(`✅ Functional test results successfully saved and verified (attempt ${attempt})`);
|
|
@@ -8,24 +8,23 @@ export const createFunctionalTestingMcpServer = () => {
|
|
|
8
8
|
name: 'edsger-functional-testing-mcp',
|
|
9
9
|
version: '1.0.0',
|
|
10
10
|
tools: [
|
|
11
|
-
tool('
|
|
12
|
-
|
|
11
|
+
tool('get_issue_testing_info', 'Get comprehensive issue information for functional testing including product, user stories, test cases, and technical design', {
|
|
12
|
+
issue_id: z
|
|
13
13
|
.string()
|
|
14
|
-
.describe('
|
|
14
|
+
.describe('Issue ID to get testing information for'),
|
|
15
15
|
}, async (args) => {
|
|
16
16
|
try {
|
|
17
|
-
// Get
|
|
18
|
-
const
|
|
19
|
-
|
|
17
|
+
// Get issue details
|
|
18
|
+
const issueResult = (await callMcpEndpoint('issues/get', {
|
|
19
|
+
issue_id: args.issue_id,
|
|
20
20
|
}));
|
|
21
|
-
if (!
|
|
22
|
-
|
|
23
|
-
throw new Error('Feature not found');
|
|
21
|
+
if (!issueResult.issues || issueResult.issues.length === 0) {
|
|
22
|
+
throw new Error('Issue not found');
|
|
24
23
|
}
|
|
25
|
-
const
|
|
24
|
+
const issue = issueResult.issues[0];
|
|
26
25
|
// Get product details
|
|
27
26
|
const productResult = (await callMcpEndpoint('resources/read', {
|
|
28
|
-
uri: `product://${
|
|
27
|
+
uri: `product://${issue.product_id}`,
|
|
29
28
|
}));
|
|
30
29
|
const productText = productResult.contents?.[0]?.text || '{}';
|
|
31
30
|
let productInfo;
|
|
@@ -34,23 +33,23 @@ export const createFunctionalTestingMcpServer = () => {
|
|
|
34
33
|
}
|
|
35
34
|
catch {
|
|
36
35
|
productInfo = {
|
|
37
|
-
id:
|
|
36
|
+
id: issue.product_id,
|
|
38
37
|
name: 'Unknown Product',
|
|
39
38
|
};
|
|
40
39
|
}
|
|
41
40
|
// Get user stories
|
|
42
|
-
const userStoriesResult = (await callMcpEndpoint('user_stories/list', {
|
|
41
|
+
const userStoriesResult = (await callMcpEndpoint('user_stories/list', { issue_id: args.issue_id }));
|
|
43
42
|
// Get test cases
|
|
44
43
|
const testCasesResult = (await callMcpEndpoint('test_cases/list', {
|
|
45
|
-
|
|
44
|
+
issue_id: args.issue_id,
|
|
46
45
|
}));
|
|
47
46
|
const testingInfo = {
|
|
48
|
-
|
|
47
|
+
issue,
|
|
49
48
|
product: productInfo,
|
|
50
49
|
user_stories: userStoriesResult.user_stories || [],
|
|
51
50
|
test_cases: testCasesResult.test_cases || [],
|
|
52
|
-
technical_design:
|
|
53
|
-
current_test_status:
|
|
51
|
+
technical_design: issue.technical_design || null,
|
|
52
|
+
current_test_status: issue.status || 'backlog',
|
|
54
53
|
};
|
|
55
54
|
return {
|
|
56
55
|
content: [
|
|
@@ -62,12 +61,12 @@ export const createFunctionalTestingMcpServer = () => {
|
|
|
62
61
|
};
|
|
63
62
|
}
|
|
64
63
|
catch (error) {
|
|
65
|
-
logError(`Error in
|
|
64
|
+
logError(`Error in get_issue_testing_info: ${error}`);
|
|
66
65
|
throw error;
|
|
67
66
|
}
|
|
68
67
|
}),
|
|
69
|
-
tool('update_test_status', 'Update the functional test status of
|
|
70
|
-
|
|
68
|
+
tool('update_test_status', 'Update the functional test status of an issue', {
|
|
69
|
+
issue_id: z.string().describe('Issue ID to update'),
|
|
71
70
|
test_status: z
|
|
72
71
|
.enum(['testing_in_progress', 'testing_passed', 'testing_failed'])
|
|
73
72
|
.describe('New test status'),
|
|
@@ -77,8 +76,8 @@ export const createFunctionalTestingMcpServer = () => {
|
|
|
77
76
|
.describe('Optional test results or error details'),
|
|
78
77
|
}, async (args) => {
|
|
79
78
|
try {
|
|
80
|
-
const result = await callMcpEndpoint('
|
|
81
|
-
|
|
79
|
+
const result = await callMcpEndpoint('issues/update', {
|
|
80
|
+
issue_id: args.issue_id,
|
|
82
81
|
status: args.test_status,
|
|
83
82
|
});
|
|
84
83
|
return {
|
|
@@ -87,10 +86,10 @@ export const createFunctionalTestingMcpServer = () => {
|
|
|
87
86
|
type: 'text',
|
|
88
87
|
text: JSON.stringify({
|
|
89
88
|
success: true,
|
|
90
|
-
|
|
89
|
+
issue_id: args.issue_id,
|
|
91
90
|
test_status: args.test_status,
|
|
92
91
|
test_results: args.test_results || null,
|
|
93
|
-
message: `
|
|
92
|
+
message: `Issue test status updated to: ${args.test_status}`,
|
|
94
93
|
result,
|
|
95
94
|
}, null, 2),
|
|
96
95
|
},
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare const createFunctionalTestingSystemPrompt: (projectDir?: string) => Promise<string>;
|
|
2
|
-
export declare const createFunctionalTestingPromptWithContext: (
|
|
2
|
+
export declare const createFunctionalTestingPromptWithContext: (issueId: string, contextInfo: string) => string;
|
|
@@ -9,8 +9,8 @@ export const createFunctionalTestingSystemPrompt = async (projectDir) => {
|
|
|
9
9
|
|
|
10
10
|
${OUTPUT_CONTRACTS['functional-testing']}`;
|
|
11
11
|
};
|
|
12
|
-
export const createFunctionalTestingPromptWithContext = (
|
|
13
|
-
return `Execute comprehensive functional testing for
|
|
12
|
+
export const createFunctionalTestingPromptWithContext = (issueId, contextInfo) => {
|
|
13
|
+
return `Execute comprehensive functional testing for issue ID: ${issueId}
|
|
14
14
|
|
|
15
15
|
${contextInfo}
|
|
16
16
|
|
|
@@ -42,12 +42,12 @@ Follow this systematic approach:
|
|
|
42
42
|
- Test edge cases and boundary conditions
|
|
43
43
|
|
|
44
44
|
5. **Integration Testing**:
|
|
45
|
-
- Test interactions between different parts of the
|
|
45
|
+
- Test interactions between different parts of the issue
|
|
46
46
|
- Verify API calls and data flow
|
|
47
47
|
- Test any third-party integrations
|
|
48
48
|
|
|
49
49
|
## Important Testing Notes:
|
|
50
|
-
- The
|
|
50
|
+
- The issue has already been implemented - you're testing existing functionality
|
|
51
51
|
- Use HEADLESS browser mode for better performance and CI/CD compatibility
|
|
52
52
|
- Test ALL critical functionality described in the user stories
|
|
53
53
|
- Mark as 'passed' only if ALL critical tests pass
|
|
@@ -6,7 +6,7 @@ export interface TestReportData {
|
|
|
6
6
|
}
|
|
7
7
|
export interface TestReport {
|
|
8
8
|
id: string;
|
|
9
|
-
|
|
9
|
+
issue_id: string;
|
|
10
10
|
title: string;
|
|
11
11
|
status: 'draft' | 'submitted' | 'approved' | 'rejected';
|
|
12
12
|
summary: string;
|
|
@@ -27,7 +27,7 @@ export interface StructuredTestReport {
|
|
|
27
27
|
timestamp: string;
|
|
28
28
|
}
|
|
29
29
|
export interface TestReportCreateOptions {
|
|
30
|
-
|
|
30
|
+
issueId: string;
|
|
31
31
|
testReportData: TestReportData;
|
|
32
32
|
testResults?: TestResultInput[];
|
|
33
33
|
verbose?: boolean;
|
|
@@ -23,9 +23,9 @@ testResults, verbose) {
|
|
|
23
23
|
* Uses structured data generated by Claude Code
|
|
24
24
|
*/
|
|
25
25
|
export async function createTestReport(options) {
|
|
26
|
-
const {
|
|
26
|
+
const { issueId, testReportData, testResults, verbose } = options;
|
|
27
27
|
if (verbose) {
|
|
28
|
-
logInfo(`Creating test report for
|
|
28
|
+
logInfo(`Creating test report for issue: ${issueId}`);
|
|
29
29
|
}
|
|
30
30
|
// Parse test results to extract statistics
|
|
31
31
|
const stats = parseTestResults(testReportData.testResults);
|
|
@@ -56,7 +56,7 @@ export async function createTestReport(options) {
|
|
|
56
56
|
jsonrpc: '2.0',
|
|
57
57
|
method: 'test_reports/create',
|
|
58
58
|
params: {
|
|
59
|
-
|
|
59
|
+
issue_id: issueId,
|
|
60
60
|
title: structuredReport.title,
|
|
61
61
|
status: structuredReport.status,
|
|
62
62
|
summary: structuredReport.summary,
|
|
@@ -86,7 +86,7 @@ export async function createTestReport(options) {
|
|
|
86
86
|
logInfo('Claude Code MCP call may have failed, manually calling MCP endpoint...');
|
|
87
87
|
}
|
|
88
88
|
// Manual fallback: Call MCP endpoint with the structured data
|
|
89
|
-
const fallbackResult = await manualMcpTestReportCreation(
|
|
89
|
+
const fallbackResult = await manualMcpTestReportCreation(issueId, structuredReport, testResults, verbose);
|
|
90
90
|
return fallbackResult;
|
|
91
91
|
}
|
|
92
92
|
catch (error) {
|
|
@@ -95,7 +95,7 @@ export async function createTestReport(options) {
|
|
|
95
95
|
logError(`Test report creation failed: ${errorMessage}`);
|
|
96
96
|
}
|
|
97
97
|
// Manual fallback on any error
|
|
98
|
-
return manualMcpTestReportCreation(
|
|
98
|
+
return manualMcpTestReportCreation(issueId, structuredReport, testResults, verbose);
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
101
|
/**
|
|
@@ -160,7 +160,7 @@ export async function createTestReportResults(options) {
|
|
|
160
160
|
};
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
|
-
async function manualMcpTestReportCreation(
|
|
163
|
+
async function manualMcpTestReportCreation(issueId, structuredReport, testResults, verbose) {
|
|
164
164
|
if (verbose) {
|
|
165
165
|
logInfo('Manually calling MCP test_reports/create endpoint with structured data');
|
|
166
166
|
}
|
|
@@ -178,7 +178,7 @@ async function manualMcpTestReportCreation(featureId, structuredReport, testResu
|
|
|
178
178
|
jsonrpc: '2.0',
|
|
179
179
|
method: 'test_reports/create',
|
|
180
180
|
params: {
|
|
181
|
-
|
|
181
|
+
issue_id: issueId,
|
|
182
182
|
title: structuredReport.title,
|
|
183
183
|
status: structuredReport.status,
|
|
184
184
|
summary: structuredReport.summary,
|
|
@@ -218,8 +218,8 @@ async function manualMcpTestReportCreation(featureId, structuredReport, testResu
|
|
|
218
218
|
}
|
|
219
219
|
// Create a mock test report object for consistency
|
|
220
220
|
const mockTestReport = {
|
|
221
|
-
id:
|
|
222
|
-
|
|
221
|
+
id: issueId, // Use issue ID for URL generation
|
|
222
|
+
issue_id: issueId,
|
|
223
223
|
title: structuredReport.title,
|
|
224
224
|
status: structuredReport.status,
|
|
225
225
|
summary: structuredReport.summary,
|
|
@@ -232,7 +232,7 @@ async function manualMcpTestReportCreation(featureId, structuredReport, testResu
|
|
|
232
232
|
return {
|
|
233
233
|
success: true,
|
|
234
234
|
testReport: mockTestReport,
|
|
235
|
-
testReportUrl: generateTestReportUrl(
|
|
235
|
+
testReportUrl: generateTestReportUrl(issueId),
|
|
236
236
|
};
|
|
237
237
|
}
|
|
238
238
|
catch (error) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Test retry and bug fixing handler for pipeline execution
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { updateIssueStatusForPhase } from '../../api/issues/index.js';
|
|
5
5
|
import { runFunctionalTestingPhase } from '../../commands/workflow/executors/phase-executor.js';
|
|
6
6
|
import { logDebug, logWarning } from '../../utils/logger.js';
|
|
7
7
|
import { logPhaseResult } from '../../utils/pipeline-logger.js';
|
|
@@ -33,7 +33,7 @@ export async function handleTestFailuresWithRetry({ options, config, results, ve
|
|
|
33
33
|
testingResult.data?.testResult || testingResult.message;
|
|
34
34
|
// Run bug fixing
|
|
35
35
|
const fixResult = await fixTestFailures({
|
|
36
|
-
|
|
36
|
+
issueId: options.issueId,
|
|
37
37
|
testErrors,
|
|
38
38
|
attemptNumber: fixAttempt,
|
|
39
39
|
verbose,
|
|
@@ -48,7 +48,7 @@ export async function handleTestFailuresWithRetry({ options, config, results, ve
|
|
|
48
48
|
// Remove the previous failed test result from results
|
|
49
49
|
results.pop();
|
|
50
50
|
// Update status to indicate we're retrying tests
|
|
51
|
-
await
|
|
51
|
+
await updateIssueStatusForPhase(options.issueId, 'functional-testing', verbose);
|
|
52
52
|
}
|
|
53
53
|
else {
|
|
54
54
|
logDebug(`Bug fixing failed: ${fixResult.message}`, verbose);
|
|
@@ -40,11 +40,11 @@ export function formatContextForPrompt(context, guidance) {
|
|
|
40
40
|
Created: ${c.created_at}`)
|
|
41
41
|
.join('\n\n')
|
|
42
42
|
: 'No previous campaigns.';
|
|
43
|
-
const
|
|
44
|
-
? product.
|
|
43
|
+
const issuesList = product.issues && product.issues.length > 0
|
|
44
|
+
? product.issues
|
|
45
45
|
.map((f) => `- **${f.name}**: ${f.description || 'No description'} (Status: ${f.status || 'unknown'})`)
|
|
46
46
|
.join('\n')
|
|
47
|
-
: 'No
|
|
47
|
+
: 'No issues listed.';
|
|
48
48
|
const guidanceSection = guidance
|
|
49
49
|
? `
|
|
50
50
|
|
|
@@ -62,8 +62,8 @@ ${guidance}
|
|
|
62
62
|
- **Product ID**: ${product.id}
|
|
63
63
|
- **Description**: ${product.description || 'No description provided'}
|
|
64
64
|
|
|
65
|
-
## Product
|
|
66
|
-
${
|
|
65
|
+
## Product Issues (${product.issues?.length || 0})
|
|
66
|
+
${issuesList}
|
|
67
67
|
${guidanceSection}
|
|
68
68
|
|
|
69
69
|
## Previous Growth Campaigns (${previousCampaigns.length})
|
|
@@ -71,7 +71,7 @@ ${campaignsList}
|
|
|
71
71
|
|
|
72
72
|
---
|
|
73
73
|
|
|
74
|
-
**Important**: Analyze the product above and create a growth strategy.${guidance ? ' Follow the human growth guidance provided above for direction, themes, and tone.' : ''} Each content suggestion must be DIFFERENT from all previous campaigns listed above. Use the product name, description, and
|
|
74
|
+
**Important**: Analyze the product above and create a growth strategy.${guidance ? ' Follow the human growth guidance provided above for direction, themes, and tone.' : ''} Each content suggestion must be DIFFERENT from all previous campaigns listed above. Use the product name, description, and issues to write specific, concrete content — never use placeholder text.`;
|
|
75
75
|
}
|
|
76
76
|
/**
|
|
77
77
|
* Prepare the full analysis prompt with all context
|
|
@@ -2,7 +2,7 @@ import { getGitHubConfigByProduct } from '../../api/github.js';
|
|
|
2
2
|
import { saveGrowthAnalysis, updateGrowthAnalysis } from '../../api/growth.js';
|
|
3
3
|
import { generateGrowthVideo, } from '../../services/video/index.js';
|
|
4
4
|
import { logError, logInfo, logSuccess, logWarning, } from '../../utils/logger.js';
|
|
5
|
-
import {
|
|
5
|
+
import { cloneIssueRepo, ensureWorkspaceDir, } from '../../workspace/workspace-manager.js';
|
|
6
6
|
import { executeGrowthAnalysisQuery } from './agent.js';
|
|
7
7
|
import { prepareGrowthAnalysisContext } from './context.js';
|
|
8
8
|
import { createGrowthAnalysisSystemPrompt } from './prompts.js';
|
|
@@ -65,7 +65,7 @@ export const analyseGrowth = async (options, config) => {
|
|
|
65
65
|
githubConfig.owner &&
|
|
66
66
|
githubConfig.repo) {
|
|
67
67
|
const workspaceRoot = ensureWorkspaceDir();
|
|
68
|
-
const { repoPath } =
|
|
68
|
+
const { repoPath } = cloneIssueRepo(workspaceRoot, `growth-${productId}`, githubConfig.owner, githubConfig.repo, githubConfig.token);
|
|
69
69
|
repoCwd = repoPath;
|
|
70
70
|
logInfo(`Repository cloned to: ${repoCwd}`);
|
|
71
71
|
}
|
|
@@ -34,10 +34,10 @@ ${codebaseInstructions}
|
|
|
34
34
|
1. Understand the product's real value proposition, target users, and competitive advantages
|
|
35
35
|
2. Study the previous campaigns listed above - DO NOT suggest content that overlaps with what has already been published
|
|
36
36
|
3. Identify the most effective channels for reaching this product's target audience
|
|
37
|
-
4. Generate specific, ready-to-publish content pieces using REAL details${hasCodebase ? ' from the codebase (actual
|
|
37
|
+
4. Generate specific, ready-to-publish content pieces using REAL details${hasCodebase ? ' from the codebase (actual issue names, real technical details, concrete benefits)' : ' from the product context above'}
|
|
38
38
|
5. For content that would benefit from visual demonstration, create detailed video scene plans with HTML templates and narration scripts
|
|
39
39
|
|
|
40
|
-
**VIDEO CONTENT**: Decide for each suggestion whether it needs a video. Include a video_plan object in every content_suggestions entry. When video adds value (demos, tutorials,
|
|
40
|
+
**VIDEO CONTENT**: Decide for each suggestion whether it needs a video. Include a video_plan object in every content_suggestions entry. When video adds value (demos, tutorials, issue showcases), provide complete scene plans with HTML templates featuring realistic mock data. When text is sufficient, set should_generate_video to false with a brief explanation.
|
|
41
41
|
|
|
42
42
|
**CRITICAL**: Every content piece must be ready to copy-paste and publish. Use actual product details, not placeholders.
|
|
43
43
|
|
|
@@ -48,11 +48,11 @@ export async function fetchIntelligenceContext(productId, verbose) {
|
|
|
48
48
|
*/
|
|
49
49
|
export function formatContextForPrompt(context, guidance) {
|
|
50
50
|
const { product, confirmedCompetitors, previousSnapshots } = context;
|
|
51
|
-
const
|
|
52
|
-
? product.
|
|
51
|
+
const issuesList = product.issues && product.issues.length > 0
|
|
52
|
+
? product.issues
|
|
53
53
|
.map((f) => `- **${f.name}**: ${f.description || 'No description'} (Status: ${f.status || 'unknown'})`)
|
|
54
54
|
.join('\n')
|
|
55
|
-
: 'No
|
|
55
|
+
: 'No issues listed.';
|
|
56
56
|
let competitorsSection = '';
|
|
57
57
|
if (confirmedCompetitors.length > 0) {
|
|
58
58
|
const competitorEntries = confirmedCompetitors.map((c) => {
|
|
@@ -70,8 +70,8 @@ export function formatContextForPrompt(context, guidance) {
|
|
|
70
70
|
if (latestSnapshot.app_version) {
|
|
71
71
|
parts.push(`Version: ${latestSnapshot.app_version}`);
|
|
72
72
|
}
|
|
73
|
-
if (latestSnapshot.
|
|
74
|
-
parts.push(`Known
|
|
73
|
+
if (latestSnapshot.issues?.length) {
|
|
74
|
+
parts.push(`Known issues: ${latestSnapshot.issues.length}`);
|
|
75
75
|
}
|
|
76
76
|
if (latestSnapshot.pricing?.model) {
|
|
77
77
|
parts.push(`Pricing model: ${latestSnapshot.pricing.model}`);
|
|
@@ -115,8 +115,8 @@ ${guidance}
|
|
|
115
115
|
- **Product ID**: ${product.id}
|
|
116
116
|
- **Description**: ${product.description || 'No description provided'}
|
|
117
117
|
|
|
118
|
-
## Product
|
|
119
|
-
${
|
|
118
|
+
## Product Issues (${product.issues?.length || 0})
|
|
119
|
+
${issuesList}
|
|
120
120
|
${guidanceSection}
|
|
121
121
|
|
|
122
122
|
${competitorsSection}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getGitHubConfigByProduct } from '../../api/github.js';
|
|
2
2
|
import { batchCreateCompetitors, saveReport, saveSnapshot, updateReport, } from '../../api/intelligence.js';
|
|
3
3
|
import { logError, logInfo, logSuccess, logWarning, } from '../../utils/logger.js';
|
|
4
|
-
import {
|
|
4
|
+
import { cloneIssueRepo, ensureWorkspaceDir, } from '../../workspace/workspace-manager.js';
|
|
5
5
|
import { executeIntelligenceQuery } from './agent.js';
|
|
6
6
|
import { prepareIntelligenceContext } from './context.js';
|
|
7
7
|
import { createIntelligenceSystemPrompt } from './prompts.js';
|
|
@@ -87,7 +87,7 @@ export async function analyseIntelligence(options, config, deps = defaultDeps) {
|
|
|
87
87
|
githubConfig.owner &&
|
|
88
88
|
githubConfig.repo) {
|
|
89
89
|
const workspaceRoot = ensureWorkspaceDir();
|
|
90
|
-
const { repoPath } =
|
|
90
|
+
const { repoPath } = cloneIssueRepo(workspaceRoot, `intel-${productId}`, githubConfig.owner, githubConfig.repo, githubConfig.token);
|
|
91
91
|
repoCwd = repoPath;
|
|
92
92
|
logInfo(`Repository cloned to: ${repoCwd}`);
|
|
93
93
|
}
|
|
@@ -163,7 +163,7 @@ export async function analyseIntelligence(options, config, deps = defaultDeps) {
|
|
|
163
163
|
const saved = await deps.saveSnap({
|
|
164
164
|
competitor_id: competitorId,
|
|
165
165
|
product_id: productId,
|
|
166
|
-
|
|
166
|
+
issues: snap.issues,
|
|
167
167
|
pricing: snap.pricing,
|
|
168
168
|
tech_stack: snap.tech_stack,
|
|
169
169
|
app_rating: snap.app_rating,
|
|
@@ -73,7 +73,7 @@ export async function executeAnalysisQuery(currentPrompt, systemPrompt, config,
|
|
|
73
73
|
if (message.type === 'result') {
|
|
74
74
|
executionSessionId = message.session_id || executionSessionId;
|
|
75
75
|
if (message.subtype === 'success') {
|
|
76
|
-
logInfo('\n📊
|
|
76
|
+
logInfo('\n📊 Issue analysis completed, parsing results...');
|
|
77
77
|
const responseText = message.result || lastAssistantResponse;
|
|
78
78
|
const parsed = parseAnalysisResult(responseText);
|
|
79
79
|
if (parsed.error) {
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type ProductInfo } from '../../api/products.js';
|
|
2
|
+
import { type ChecklistPhaseContext } from '../../services/checklist.js';
|
|
3
|
+
import type { IssueInfo, TestCase, UserStory } from '../../types/issues.js';
|
|
4
|
+
export interface IssueAnalysisContext {
|
|
5
|
+
issue: IssueInfo;
|
|
6
|
+
product: ProductInfo;
|
|
7
|
+
existing_user_stories: UserStory[];
|
|
8
|
+
existing_test_cases: TestCase[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Fetch all issue analysis context information via MCP endpoints
|
|
12
|
+
*/
|
|
13
|
+
export declare function fetchIssueAnalysisContext(issueId: string, verbose?: boolean): Promise<IssueAnalysisContext>;
|
|
14
|
+
/**
|
|
15
|
+
* Format the context into a readable string for Claude Code
|
|
16
|
+
*/
|
|
17
|
+
export declare function formatContextForPrompt(context: IssueAnalysisContext): string;
|
|
18
|
+
/**
|
|
19
|
+
* Prepare all context information needed for analysis
|
|
20
|
+
*/
|
|
21
|
+
export declare function prepareAnalysisContext(issueId: string, checklistContext: ChecklistPhaseContext | null | undefined, verbose?: boolean): Promise<{
|
|
22
|
+
issueContext: IssueAnalysisContext;
|
|
23
|
+
analysisPrompt: string;
|
|
24
|
+
}>;
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getIssue, getTestCases, getUserStories, } from '../../api/issues/index.js';
|
|
2
2
|
import { getProduct } from '../../api/products.js';
|
|
3
3
|
import { formatChecklistsForContext, } from '../../services/checklist.js';
|
|
4
4
|
import { formatFeedbacksForContext, getFeedbacksForPhase, } from '../../services/feedbacks.js';
|
|
5
|
-
import {
|
|
5
|
+
import { formatIssueAnalysisContext } from '../../utils/formatters.js';
|
|
6
6
|
import { logError, logInfo } from '../../utils/logger.js';
|
|
7
|
-
import {
|
|
7
|
+
import { createIssueAnalysisPromptWithContext } from './prompts.js';
|
|
8
8
|
/**
|
|
9
|
-
* Fetch all
|
|
9
|
+
* Fetch all issue analysis context information via MCP endpoints
|
|
10
10
|
*/
|
|
11
|
-
export async function
|
|
11
|
+
export async function fetchIssueAnalysisContext(issueId, verbose) {
|
|
12
12
|
try {
|
|
13
13
|
if (verbose) {
|
|
14
|
-
logInfo(`Fetching complete
|
|
14
|
+
logInfo(`Fetching complete issue analysis context for issue: ${issueId}`);
|
|
15
15
|
}
|
|
16
16
|
// Fetch all required data in parallel for better performance
|
|
17
|
-
const [
|
|
18
|
-
|
|
19
|
-
getUserStories(
|
|
20
|
-
getTestCases(
|
|
17
|
+
const [issue, existingUserStories, existingTestCases] = await Promise.all([
|
|
18
|
+
getIssue(issueId, verbose),
|
|
19
|
+
getUserStories(issueId, verbose),
|
|
20
|
+
getTestCases(issueId, verbose),
|
|
21
21
|
]);
|
|
22
|
-
const product = await getProduct(
|
|
22
|
+
const product = await getProduct(issue.product_id, verbose);
|
|
23
23
|
if (verbose) {
|
|
24
|
-
logInfo(`✅
|
|
25
|
-
logInfo(`
|
|
24
|
+
logInfo(`✅ Issue analysis context fetched successfully:`);
|
|
25
|
+
logInfo(` Issue: ${issue.name}`);
|
|
26
26
|
logInfo(` Product: ${product.name}`);
|
|
27
27
|
logInfo(` Existing User Stories: ${existingUserStories.length}`);
|
|
28
28
|
logInfo(` Existing Test Cases: ${existingTestCases.length}`);
|
|
29
29
|
}
|
|
30
30
|
return {
|
|
31
|
-
|
|
31
|
+
issue,
|
|
32
32
|
product,
|
|
33
33
|
existing_user_stories: existingUserStories,
|
|
34
34
|
existing_test_cases: existingTestCases,
|
|
@@ -36,7 +36,7 @@ export async function fetchFeatureAnalysisContext(featureId, verbose) {
|
|
|
36
36
|
}
|
|
37
37
|
catch (error) {
|
|
38
38
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
39
|
-
logError(`Failed to fetch
|
|
39
|
+
logError(`Failed to fetch issue analysis context: ${errorMessage}`);
|
|
40
40
|
throw new Error(`Context fetch failed: ${errorMessage}`);
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -66,13 +66,13 @@ export function formatContextForPrompt(context) {
|
|
|
66
66
|
})
|
|
67
67
|
.join('\n\n');
|
|
68
68
|
};
|
|
69
|
-
return `#
|
|
69
|
+
return `# Issue Analysis Context
|
|
70
70
|
|
|
71
|
-
##
|
|
72
|
-
- **ID**: ${context.
|
|
73
|
-
- **Name**: ${context.
|
|
74
|
-
- **Description**: ${context.
|
|
75
|
-
- **Current Status**: ${context.
|
|
71
|
+
## Issue Information
|
|
72
|
+
- **ID**: ${context.issue.id}
|
|
73
|
+
- **Name**: ${context.issue.name}
|
|
74
|
+
- **Description**: ${context.issue.description || 'No description provided'}
|
|
75
|
+
- **Current Status**: ${context.issue.status}
|
|
76
76
|
|
|
77
77
|
## Product Information
|
|
78
78
|
- **Product**: ${context.product.name}
|
|
@@ -86,21 +86,21 @@ ${formatUserStories(context.existing_user_stories)}
|
|
|
86
86
|
${formatTestCases(context.existing_test_cases)}
|
|
87
87
|
|
|
88
88
|
## Current Technical Design
|
|
89
|
-
${context.
|
|
89
|
+
${context.issue.technical_design || 'No technical design available yet'}
|
|
90
90
|
|
|
91
91
|
---
|
|
92
92
|
|
|
93
|
-
**Analysis Instructions**: Based on the above
|
|
93
|
+
**Analysis Instructions**: Based on the above issue information and existing user stories/test cases, conduct comprehensive business analysis to identify gaps and create additional user stories and test cases that add business value.`;
|
|
94
94
|
}
|
|
95
95
|
/**
|
|
96
96
|
* Prepare all context information needed for analysis
|
|
97
97
|
*/
|
|
98
|
-
export async function prepareAnalysisContext(
|
|
98
|
+
export async function prepareAnalysisContext(issueId, checklistContext, verbose) {
|
|
99
99
|
if (verbose) {
|
|
100
|
-
logInfo('Fetching
|
|
100
|
+
logInfo('Fetching issue analysis context via MCP endpoints...');
|
|
101
101
|
}
|
|
102
|
-
const
|
|
103
|
-
const { content: contextInfo, downloadedImages } = await
|
|
102
|
+
const issueContext = await fetchIssueAnalysisContext(issueId, verbose);
|
|
103
|
+
const { content: contextInfo, downloadedImages } = await formatIssueAnalysisContext(issueContext);
|
|
104
104
|
if (verbose && downloadedImages.length > 0) {
|
|
105
105
|
logInfo(`Downloaded ${downloadedImages.length} images for Claude Code:`);
|
|
106
106
|
downloadedImages.forEach((img) => {
|
|
@@ -110,7 +110,7 @@ export async function prepareAnalysisContext(featureId, checklistContext, verbos
|
|
|
110
110
|
let finalContextInfo = contextInfo;
|
|
111
111
|
// Add feedbacks context to the analysis prompt
|
|
112
112
|
try {
|
|
113
|
-
const feedbacksContext = await getFeedbacksForPhase({
|
|
113
|
+
const feedbacksContext = await getFeedbacksForPhase({ issueId, verbose }, 'issue-analysis');
|
|
114
114
|
if (feedbacksContext.feedbacks.length > 0) {
|
|
115
115
|
const feedbacksInfo = await formatFeedbacksForContext(feedbacksContext);
|
|
116
116
|
finalContextInfo = `${finalContextInfo}\n\n${feedbacksInfo}`;
|
|
@@ -133,6 +133,6 @@ export async function prepareAnalysisContext(featureId, checklistContext, verbos
|
|
|
133
133
|
logInfo(`Added ${checklistContext.checklists.length} checklists to analysis context`);
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
|
-
const analysisPrompt =
|
|
137
|
-
return {
|
|
136
|
+
const analysisPrompt = createIssueAnalysisPromptWithContext(issueId, finalContextInfo);
|
|
137
|
+
return { issueContext, analysisPrompt };
|
|
138
138
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ChecklistPhaseContext } from '../../services/checklist.js';
|
|
2
|
+
import { type EdsgerConfig, type IssueAnalysisResult } from '../../types/index.js';
|
|
3
|
+
export interface IssueAnalysisOptions {
|
|
4
|
+
issueId: string;
|
|
5
|
+
verbose?: boolean;
|
|
6
|
+
maxVerificationIterations?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare const analyseIssue: (options: IssueAnalysisOptions, config: EdsgerConfig, checklistContext?: ChecklistPhaseContext | null) => Promise<IssueAnalysisResult>;
|