edsger 0.50.0 → 0.51.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/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/issues/approval-checker.js +152 -0
- package/dist/api/issues/batch-operations.d.ts +17 -0
- package/dist/api/issues/batch-operations.js +100 -0
- 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/issues/status-updater.js +122 -0
- package/dist/api/issues/test-cases.d.ts +29 -0
- package/dist/api/issues/test-cases.js +110 -0
- package/dist/api/issues/update-issue.d.ts +20 -0
- package/dist/api/issues/update-issue.js +83 -0
- package/dist/api/issues/user-stories.d.ts +21 -0
- package/dist/api/issues/user-stories.js +88 -0
- 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/issue-worker.d.ts +14 -0
- package/dist/commands/agent-workflow/issue-worker.js +65 -0
- 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/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/issue-coordinator.js +161 -0
- 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/issue-status.d.ts +56 -0
- package/dist/config/issue-status.js +130 -0
- package/dist/errors/index.d.ts +6 -6
- package/dist/errors/index.js +11 -11
- package/dist/index.js +61 -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 +301 -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 +44 -0
- package/dist/phases/find-bugs/state.js +121 -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 +346 -0
- package/dist/phases/find-features/prompts.d.ts +37 -0
- package/dist/phases/find-features/prompts.js +118 -0
- package/dist/phases/find-features/state.d.ts +29 -0
- package/dist/phases/find-features/state.js +94 -0
- package/dist/phases/find-features/types.d.ts +27 -0
- package/dist/phases/find-features/types.js +16 -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/issue-analysis/agent.d.ts +13 -0
- package/dist/phases/issue-analysis/agent.js +112 -0
- package/dist/phases/issue-analysis/context.d.ts +24 -0
- package/dist/phases/issue-analysis/context.js +138 -0
- package/dist/phases/issue-analysis/index.d.ts +8 -0
- package/dist/phases/issue-analysis/index.js +199 -0
- package/dist/phases/issue-analysis/outcome.d.ts +40 -0
- package/dist/phases/issue-analysis/outcome.js +280 -0
- package/dist/phases/issue-analysis/prompts.d.ts +10 -0
- package/dist/phases/issue-analysis/prompts.js +212 -0
- package/dist/phases/issue-analysis-verification/agent.d.ts +33 -0
- package/dist/phases/issue-analysis-verification/agent.js +124 -0
- package/dist/phases/issue-analysis-verification/index.d.ts +25 -0
- package/dist/phases/issue-analysis-verification/index.js +92 -0
- package/dist/phases/issue-analysis-verification/prompts.d.ts +10 -0
- package/dist/phases/issue-analysis-verification/prompts.js +100 -0
- 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/issues.d.ts +35 -0
- package/dist/types/issues.js +1 -0
- 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 +2 -0
- /package/dist/skills/phase/{feature-analysis-verification → issue-analysis-verification}/SKILL.md +0 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Edsger
|
|
2
2
|
|
|
3
|
-
AI-powered software development CLI tool with comprehensive
|
|
3
|
+
AI-powered software development CLI tool with comprehensive issue management, code review, and testing capabilities using Claude Code SDK and MCP integration.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
@@ -26,36 +26,36 @@ AI-powered software development CLI tool with comprehensive feature management,
|
|
|
26
26
|
- **Improvement Suggestions**: Provides prioritized recommendations for code improvement
|
|
27
27
|
- **Interactive Mode**: Ask for confirmation before applying refactoring changes
|
|
28
28
|
|
|
29
|
-
### 🎯
|
|
29
|
+
### 🎯 Issue Analysis
|
|
30
30
|
|
|
31
|
-
- **MCP Integration**: Analyze
|
|
32
|
-
- **User Story Generation**: Create comprehensive user stories for
|
|
31
|
+
- **MCP Integration**: Analyze issues using Model Context Protocol
|
|
32
|
+
- **User Story Generation**: Create comprehensive user stories for issues
|
|
33
33
|
- **Test Case Creation**: Generate detailed test cases with criticality levels
|
|
34
34
|
- **Deduplication**: Avoid creating similar existing user stories and test cases
|
|
35
35
|
- **Real-time Streaming**: Live analysis feedback with Claude Code SDK
|
|
36
36
|
|
|
37
37
|
### 🎨 Technical Design
|
|
38
38
|
|
|
39
|
-
- **Design Generation**: Create technical specifications for
|
|
39
|
+
- **Design Generation**: Create technical specifications for issues
|
|
40
40
|
- **Architecture Planning**: Generate implementation roadmaps and technical details
|
|
41
41
|
- **Integration Support**: Works with MCP for structured design output
|
|
42
42
|
|
|
43
43
|
### 💻 Code Implementation
|
|
44
44
|
|
|
45
|
-
- **
|
|
45
|
+
- **Issue Implementation**: Automatically implement issues based on specifications
|
|
46
46
|
- **Branch Management**: Creates feature branches and manages git workflow
|
|
47
47
|
- **Code Generation**: AI-powered code writing with proper git integration
|
|
48
48
|
|
|
49
49
|
### 🎭 Functional Testing
|
|
50
50
|
|
|
51
|
-
- **Automated Testing**: Run Playwright-based functional tests for
|
|
51
|
+
- **Automated Testing**: Run Playwright-based functional tests for issues
|
|
52
52
|
- **Test Execution**: Execute test cases with detailed reporting
|
|
53
53
|
- **Status Tracking**: Monitor test results with pass/fail statistics
|
|
54
54
|
|
|
55
55
|
### 🚀 Workflow Management
|
|
56
56
|
|
|
57
|
-
- **Continuous Processing**: Monitor and process
|
|
58
|
-
- **End-to-End Automation**: Complete
|
|
57
|
+
- **Continuous Processing**: Monitor and process issues ready for development
|
|
58
|
+
- **End-to-End Automation**: Complete issue lifecycle from analysis to testing
|
|
59
59
|
- **Real-time Monitoring**: Live workflow processing with statistics and graceful shutdown
|
|
60
60
|
|
|
61
61
|
## Installation
|
|
@@ -120,44 +120,44 @@ edsger --refactor
|
|
|
120
120
|
edsger --refactor --verbose
|
|
121
121
|
```
|
|
122
122
|
|
|
123
|
-
###
|
|
123
|
+
### Issue Analysis
|
|
124
124
|
|
|
125
125
|
```bash
|
|
126
|
-
# Analyze
|
|
127
|
-
edsger --
|
|
126
|
+
# Analyze an issue and generate user stories/test cases
|
|
127
|
+
edsger --issue-analysis <issue-id>
|
|
128
128
|
|
|
129
129
|
# Verbose analysis output
|
|
130
|
-
edsger --
|
|
130
|
+
edsger --issue-analysis <issue-id> --verbose
|
|
131
131
|
```
|
|
132
132
|
|
|
133
133
|
### Technical Design
|
|
134
134
|
|
|
135
135
|
```bash
|
|
136
|
-
# Generate technical design for
|
|
137
|
-
edsger --technical-design <
|
|
136
|
+
# Generate technical design for an issue
|
|
137
|
+
edsger --technical-design <issue-id>
|
|
138
138
|
|
|
139
139
|
# Verbose design output
|
|
140
|
-
edsger --technical-design <
|
|
140
|
+
edsger --technical-design <issue-id> --verbose
|
|
141
141
|
```
|
|
142
142
|
|
|
143
143
|
### Code Implementation
|
|
144
144
|
|
|
145
145
|
```bash
|
|
146
|
-
# Implement
|
|
147
|
-
edsger --implement <
|
|
146
|
+
# Implement issue code based on specifications
|
|
147
|
+
edsger --implement <issue-id>
|
|
148
148
|
|
|
149
149
|
# Verbose implementation output
|
|
150
|
-
edsger --implement <
|
|
150
|
+
edsger --implement <issue-id> --verbose
|
|
151
151
|
```
|
|
152
152
|
|
|
153
153
|
### Functional Testing
|
|
154
154
|
|
|
155
155
|
```bash
|
|
156
|
-
# Run functional tests for
|
|
157
|
-
edsger --test <
|
|
156
|
+
# Run functional tests for an issue
|
|
157
|
+
edsger --test <issue-id>
|
|
158
158
|
|
|
159
159
|
# Verbose test output
|
|
160
|
-
edsger --test <
|
|
160
|
+
edsger --test <issue-id> --verbose
|
|
161
161
|
```
|
|
162
162
|
|
|
163
163
|
### Workflow Management
|
|
@@ -198,9 +198,9 @@ Create a configuration file (`.edsgerrc.json`, `edsger.config.js`, etc.):
|
|
|
198
198
|
|
|
199
199
|
## Environment Variables
|
|
200
200
|
|
|
201
|
-
### Required for Advanced Features (
|
|
201
|
+
### Required for Advanced Features (Issue Analysis, Technical Design, Implementation, Testing, Workflow)
|
|
202
202
|
|
|
203
|
-
- `EDSGER_MCP_SERVER_URL`: MCP server URL for
|
|
203
|
+
- `EDSGER_MCP_SERVER_URL`: MCP server URL for issue operations
|
|
204
204
|
- `EDSGER_MCP_TOKEN`: Required authentication token for MCP server
|
|
205
205
|
- `EDSGER_PRODUCT_ID`: Product ID for workflow management (optional for workflow mode)
|
|
206
206
|
|
|
@@ -226,7 +226,7 @@ npx edsger --review --staged
|
|
|
226
226
|
|
|
227
227
|
- Node.js >= 18.0.0
|
|
228
228
|
- `@anthropic-ai/claude-code` SDK
|
|
229
|
-
- MCP server for advanced
|
|
229
|
+
- MCP server for advanced issue operations (analysis, design, implementation, testing)
|
|
230
230
|
- Playwright for functional testing (when using `--test` flag)
|
|
231
231
|
|
|
232
232
|
## License
|
package/dist/api/chat.d.ts
CHANGED
|
@@ -52,20 +52,20 @@ export declare function sendProductAiMessage(productId: string, content: string,
|
|
|
52
52
|
parentMessageId?: string;
|
|
53
53
|
}, verbose?: boolean): Promise<ChatMessage>;
|
|
54
54
|
/**
|
|
55
|
-
* Get or create the group chat channel for
|
|
56
|
-
* This is the most common operation — every
|
|
55
|
+
* Get or create the group chat channel for an issue.
|
|
56
|
+
* This is the most common operation — every issue has one group channel.
|
|
57
57
|
*/
|
|
58
|
-
export declare function
|
|
58
|
+
export declare function getIssueChannel(issueId: string, verbose?: boolean): Promise<ChatChannel>;
|
|
59
59
|
/**
|
|
60
|
-
* Send a system message to
|
|
60
|
+
* Send a system message to an issue's group channel.
|
|
61
61
|
* Creates the channel if it doesn't exist.
|
|
62
62
|
*/
|
|
63
|
-
export declare function
|
|
63
|
+
export declare function sendIssueSystemMessage(issueId: string, content: string, metadata?: Record<string, unknown>, verbose?: boolean): Promise<ChatMessage>;
|
|
64
64
|
/**
|
|
65
|
-
* Send an AI message to
|
|
65
|
+
* Send an AI message to an issue's group channel.
|
|
66
66
|
* Creates the channel if it doesn't exist.
|
|
67
67
|
*/
|
|
68
|
-
export declare function
|
|
68
|
+
export declare function sendIssueAiMessage(issueId: string, content: string, metadata?: Record<string, unknown>, options?: {
|
|
69
69
|
messageType?: ChatMessageType;
|
|
70
70
|
parentMessageId?: string;
|
|
71
71
|
}, verbose?: boolean): Promise<ChatMessage>;
|
package/dist/api/chat.js
CHANGED
|
@@ -176,43 +176,43 @@ export async function sendProductAiMessage(productId, content, metadata = {}, op
|
|
|
176
176
|
}
|
|
177
177
|
}
|
|
178
178
|
// ============================================================
|
|
179
|
-
// Convenience:
|
|
179
|
+
// Convenience: Issue Channel
|
|
180
180
|
// ============================================================
|
|
181
181
|
/**
|
|
182
|
-
* Get or create the group chat channel for
|
|
183
|
-
* This is the most common operation — every
|
|
182
|
+
* Get or create the group chat channel for an issue.
|
|
183
|
+
* This is the most common operation — every issue has one group channel.
|
|
184
184
|
*/
|
|
185
|
-
export async function
|
|
186
|
-
const { channel } = await getOrCreateChannel('
|
|
185
|
+
export async function getIssueChannel(issueId, verbose) {
|
|
186
|
+
const { channel } = await getOrCreateChannel('issue', issueId, 'group', undefined, verbose);
|
|
187
187
|
return channel;
|
|
188
188
|
}
|
|
189
189
|
/**
|
|
190
|
-
* Send a system message to
|
|
190
|
+
* Send a system message to an issue's group channel.
|
|
191
191
|
* Creates the channel if it doesn't exist.
|
|
192
192
|
*/
|
|
193
|
-
export async function
|
|
193
|
+
export async function sendIssueSystemMessage(issueId, content, metadata = {}, verbose) {
|
|
194
194
|
try {
|
|
195
|
-
const channel = await
|
|
195
|
+
const channel = await getIssueChannel(issueId, verbose);
|
|
196
196
|
return await sendSystemMessage(channel.id, content, metadata, verbose);
|
|
197
197
|
}
|
|
198
198
|
catch (error) {
|
|
199
199
|
const msg = error instanceof Error ? error.message : String(error);
|
|
200
|
-
logError(`Failed to send system message for
|
|
200
|
+
logError(`Failed to send system message for issue ${issueId}: ${msg}`);
|
|
201
201
|
throw error;
|
|
202
202
|
}
|
|
203
203
|
}
|
|
204
204
|
/**
|
|
205
|
-
* Send an AI message to
|
|
205
|
+
* Send an AI message to an issue's group channel.
|
|
206
206
|
* Creates the channel if it doesn't exist.
|
|
207
207
|
*/
|
|
208
|
-
export async function
|
|
208
|
+
export async function sendIssueAiMessage(issueId, content, metadata = {}, options = {}, verbose) {
|
|
209
209
|
try {
|
|
210
|
-
const channel = await
|
|
210
|
+
const channel = await getIssueChannel(issueId, verbose);
|
|
211
211
|
return await sendAiMessage(channel.id, content, metadata, options, verbose);
|
|
212
212
|
}
|
|
213
213
|
catch (error) {
|
|
214
214
|
const msg = error instanceof Error ? error.message : String(error);
|
|
215
|
-
logError(`Failed to send AI message for
|
|
215
|
+
logError(`Failed to send AI message for issue ${issueId}: ${msg}`);
|
|
216
216
|
throw error;
|
|
217
217
|
}
|
|
218
218
|
}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cross-product API - Fetch
|
|
2
|
+
* Cross-product API - Fetch issues across all products
|
|
3
3
|
*
|
|
4
4
|
* Used in the new default mode (agent workflow) where the CLI
|
|
5
|
-
* processes
|
|
5
|
+
* processes issues from all products the user has access to,
|
|
6
6
|
* not just a single product.
|
|
7
7
|
*/
|
|
8
|
-
import { type
|
|
8
|
+
import { type IssueInfo } from '../types/issues.js';
|
|
9
9
|
export interface ProductSummary {
|
|
10
10
|
id: string;
|
|
11
11
|
name: string;
|
|
12
12
|
description?: string;
|
|
13
13
|
status?: string;
|
|
14
14
|
}
|
|
15
|
-
export interface
|
|
15
|
+
export interface IssueWithProduct extends IssueInfo {
|
|
16
16
|
product_name?: string;
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
@@ -20,12 +20,12 @@ export interface FeatureWithProduct extends FeatureInfo {
|
|
|
20
20
|
*/
|
|
21
21
|
export declare function listProducts(verbose?: boolean): Promise<ProductSummary[]>;
|
|
22
22
|
/**
|
|
23
|
-
* List all ready_for_ai
|
|
24
|
-
* Iterates through all accessible products and collects their
|
|
23
|
+
* List all ready_for_ai issues across all products
|
|
24
|
+
* Iterates through all accessible products and collects their issues
|
|
25
25
|
*/
|
|
26
|
-
export declare function
|
|
26
|
+
export declare function listAllReadyIssues(verbose?: boolean): Promise<IssueWithProduct[]>;
|
|
27
27
|
/**
|
|
28
|
-
* Claim a specific
|
|
29
|
-
* Unlike the product-level claim, this claims a specific
|
|
28
|
+
* Claim a specific issue for processing
|
|
29
|
+
* Unlike the product-level claim, this claims a specific issue by ID
|
|
30
30
|
*/
|
|
31
|
-
export declare function
|
|
31
|
+
export declare function claimIssueById(issueId: string, productId: string, verbose?: boolean): Promise<IssueInfo | null>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cross-product API - Fetch
|
|
2
|
+
* Cross-product API - Fetch issues across all products
|
|
3
3
|
*
|
|
4
4
|
* Used in the new default mode (agent workflow) where the CLI
|
|
5
|
-
* processes
|
|
5
|
+
* processes issues from all products the user has access to,
|
|
6
6
|
* not just a single product.
|
|
7
7
|
*/
|
|
8
8
|
import { logError, logInfo } from '../utils/logger.js';
|
|
@@ -28,12 +28,12 @@ export async function listProducts(verbose) {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
|
-
* List all ready_for_ai
|
|
32
|
-
* Iterates through all accessible products and collects their
|
|
31
|
+
* List all ready_for_ai issues across all products
|
|
32
|
+
* Iterates through all accessible products and collects their issues
|
|
33
33
|
*/
|
|
34
|
-
export async function
|
|
34
|
+
export async function listAllReadyIssues(verbose) {
|
|
35
35
|
if (verbose) {
|
|
36
|
-
logInfo('Fetching ready_for_ai
|
|
36
|
+
logInfo('Fetching ready_for_ai issues across all products...');
|
|
37
37
|
}
|
|
38
38
|
try {
|
|
39
39
|
// First, get all products
|
|
@@ -44,68 +44,68 @@ export async function listAllReadyFeatures(verbose) {
|
|
|
44
44
|
}
|
|
45
45
|
return [];
|
|
46
46
|
}
|
|
47
|
-
// Fetch ready_for_ai
|
|
48
|
-
const
|
|
49
|
-
const result = (await callMcpEndpoint('
|
|
47
|
+
// Fetch ready_for_ai issues for all products in parallel
|
|
48
|
+
const issueResults = await Promise.allSettled(products.map(async (product) => {
|
|
49
|
+
const result = (await callMcpEndpoint('issues/list', {
|
|
50
50
|
product_id: product.id,
|
|
51
51
|
status: 'ready_for_ai',
|
|
52
52
|
}));
|
|
53
|
-
return (result.
|
|
54
|
-
...
|
|
53
|
+
return (result.issues || []).map((issue) => ({
|
|
54
|
+
...issue,
|
|
55
55
|
product_name: product.name,
|
|
56
56
|
}));
|
|
57
57
|
}));
|
|
58
|
-
const
|
|
59
|
-
|
|
58
|
+
const allIssues = [];
|
|
59
|
+
issueResults.forEach((result, i) => {
|
|
60
60
|
if (result.status === 'fulfilled') {
|
|
61
|
-
|
|
61
|
+
allIssues.push(...result.value);
|
|
62
62
|
}
|
|
63
63
|
else if (verbose) {
|
|
64
|
-
logInfo(`Could not fetch
|
|
64
|
+
logInfo(`Could not fetch issues for product: ${products[i].name}`);
|
|
65
65
|
}
|
|
66
66
|
});
|
|
67
67
|
// Sort by updated_at (oldest first)
|
|
68
|
-
|
|
68
|
+
allIssues.sort((a, b) => {
|
|
69
69
|
const dateA = new Date(a.updated_at || 0).getTime();
|
|
70
70
|
const dateB = new Date(b.updated_at || 0).getTime();
|
|
71
71
|
return dateA - dateB;
|
|
72
72
|
});
|
|
73
73
|
if (verbose) {
|
|
74
|
-
logInfo(`Found ${
|
|
75
|
-
|
|
74
|
+
logInfo(`Found ${allIssues.length} ready_for_ai issue(s) across ${products.length} product(s)`);
|
|
75
|
+
allIssues.forEach((f, i) => {
|
|
76
76
|
logInfo(` ${i + 1}. [${f.product_name}] ${f.name}`);
|
|
77
77
|
});
|
|
78
78
|
}
|
|
79
|
-
return
|
|
79
|
+
return allIssues;
|
|
80
80
|
}
|
|
81
81
|
catch (error) {
|
|
82
|
-
logError(`Failed to list
|
|
82
|
+
logError(`Failed to list issues: ${error instanceof Error ? error.message : String(error)}`);
|
|
83
83
|
throw error;
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
/**
|
|
87
|
-
* Claim a specific
|
|
88
|
-
* Unlike the product-level claim, this claims a specific
|
|
87
|
+
* Claim a specific issue for processing
|
|
88
|
+
* Unlike the product-level claim, this claims a specific issue by ID
|
|
89
89
|
*/
|
|
90
|
-
export async function
|
|
90
|
+
export async function claimIssueById(issueId, productId, verbose) {
|
|
91
91
|
if (verbose) {
|
|
92
|
-
logInfo(`Claiming
|
|
92
|
+
logInfo(`Claiming issue: ${issueId}`);
|
|
93
93
|
}
|
|
94
94
|
try {
|
|
95
|
-
const result = (await callMcpEndpoint('
|
|
95
|
+
const result = (await callMcpEndpoint('issues/claim', {
|
|
96
96
|
product_id: productId,
|
|
97
|
-
|
|
97
|
+
issue_id: issueId,
|
|
98
98
|
}));
|
|
99
|
-
if (result.
|
|
99
|
+
if (result.issue) {
|
|
100
100
|
if (verbose) {
|
|
101
|
-
logInfo(`Claimed
|
|
101
|
+
logInfo(`Claimed issue: ${result.issue.name}`);
|
|
102
102
|
}
|
|
103
|
-
return result.
|
|
103
|
+
return result.issue;
|
|
104
104
|
}
|
|
105
105
|
return null;
|
|
106
106
|
}
|
|
107
107
|
catch (error) {
|
|
108
|
-
logError(`Failed to claim
|
|
108
|
+
logError(`Failed to claim issue: ${error instanceof Error ? error.message : String(error)}`);
|
|
109
109
|
return null;
|
|
110
110
|
}
|
|
111
111
|
}
|
package/dist/api/github.d.ts
CHANGED
|
@@ -31,16 +31,16 @@ export interface GitHubConfigAndToken {
|
|
|
31
31
|
expires_at?: string;
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
|
-
* Get GitHub developer configuration for
|
|
34
|
+
* Get GitHub developer configuration for an issue
|
|
35
35
|
* Returns installation_id, repository info from product_developers
|
|
36
36
|
*/
|
|
37
|
-
export declare function getGitHubDeveloperConfig(
|
|
37
|
+
export declare function getGitHubDeveloperConfig(issueId: string, verbose?: boolean): Promise<GitHubDeveloperConfig>;
|
|
38
38
|
/**
|
|
39
39
|
* Get installation access token for GitHub API operations
|
|
40
40
|
*/
|
|
41
|
-
export declare function getGitHubInstallationToken(installationId: number,
|
|
41
|
+
export declare function getGitHubInstallationToken(installationId: number, issueId: string, verbose?: boolean): Promise<GitHubInstallationToken | null>;
|
|
42
42
|
/**
|
|
43
|
-
* Get GitHub config and token by product ID (no
|
|
43
|
+
* Get GitHub config and token by product ID (no issue required).
|
|
44
44
|
* Used for product-level operations like growth analysis.
|
|
45
45
|
*/
|
|
46
46
|
export declare function getGitHubConfigByProduct(productId: string, verbose?: boolean): Promise<{
|
|
@@ -54,7 +54,7 @@ export declare function getGitHubConfigByProduct(productId: string, verbose?: bo
|
|
|
54
54
|
* Get GitHub config and token in one call
|
|
55
55
|
* This is the main entry point for getting GitHub config
|
|
56
56
|
*/
|
|
57
|
-
export declare function getGitHubConfig(
|
|
57
|
+
export declare function getGitHubConfig(issueId: string, verbose?: boolean): Promise<{
|
|
58
58
|
configured: boolean;
|
|
59
59
|
token?: string;
|
|
60
60
|
owner?: string;
|
package/dist/api/github.js
CHANGED
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
import { logDebug, logError, logSuccess, logWarning } from '../utils/logger.js';
|
|
6
6
|
import { callMcpEndpoint } from './mcp-client.js';
|
|
7
7
|
/**
|
|
8
|
-
* Get GitHub developer configuration for
|
|
8
|
+
* Get GitHub developer configuration for an issue
|
|
9
9
|
* Returns installation_id, repository info from product_developers
|
|
10
10
|
*/
|
|
11
|
-
export async function getGitHubDeveloperConfig(
|
|
12
|
-
logDebug(`Fetching GitHub developer config for
|
|
11
|
+
export async function getGitHubDeveloperConfig(issueId, verbose) {
|
|
12
|
+
logDebug(`Fetching GitHub developer config for issue: ${issueId}`, verbose);
|
|
13
13
|
try {
|
|
14
14
|
const result = (await callMcpEndpoint('github/developer_config', {
|
|
15
|
-
|
|
15
|
+
issue_id: issueId,
|
|
16
16
|
}));
|
|
17
17
|
if (verbose) {
|
|
18
18
|
if (result.configured) {
|
|
@@ -37,12 +37,12 @@ export async function getGitHubDeveloperConfig(featureId, verbose) {
|
|
|
37
37
|
/**
|
|
38
38
|
* Get installation access token for GitHub API operations
|
|
39
39
|
*/
|
|
40
|
-
export async function getGitHubInstallationToken(installationId,
|
|
40
|
+
export async function getGitHubInstallationToken(installationId, issueId, verbose) {
|
|
41
41
|
logDebug(`Fetching GitHub installation token for: ${installationId}`, verbose);
|
|
42
42
|
try {
|
|
43
43
|
const result = (await callMcpEndpoint('github/installation_token', {
|
|
44
44
|
installation_id: installationId,
|
|
45
|
-
|
|
45
|
+
issue_id: issueId,
|
|
46
46
|
}));
|
|
47
47
|
if (verbose) {
|
|
48
48
|
logSuccess(`GitHub token obtained, expires: ${result.expires_at}`);
|
|
@@ -57,7 +57,7 @@ export async function getGitHubInstallationToken(installationId, featureId, verb
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
/**
|
|
60
|
-
* Get GitHub config and token by product ID (no
|
|
60
|
+
* Get GitHub config and token by product ID (no issue required).
|
|
61
61
|
* Used for product-level operations like growth analysis.
|
|
62
62
|
*/
|
|
63
63
|
export async function getGitHubConfigByProduct(productId, verbose) {
|
|
@@ -102,11 +102,11 @@ export async function getGitHubConfigByProduct(productId, verbose) {
|
|
|
102
102
|
* Get GitHub config and token in one call
|
|
103
103
|
* This is the main entry point for getting GitHub config
|
|
104
104
|
*/
|
|
105
|
-
export async function getGitHubConfig(
|
|
106
|
-
logDebug(`Fetching GitHub config for
|
|
105
|
+
export async function getGitHubConfig(issueId, verbose) {
|
|
106
|
+
logDebug(`Fetching GitHub config for issue: ${issueId}`, verbose);
|
|
107
107
|
try {
|
|
108
108
|
const result = (await callMcpEndpoint('github/config_and_token', {
|
|
109
|
-
|
|
109
|
+
issue_id: issueId,
|
|
110
110
|
}));
|
|
111
111
|
if (verbose) {
|
|
112
112
|
if (result.configured) {
|
|
@@ -19,7 +19,7 @@ export interface CompetitorSnapshot {
|
|
|
19
19
|
id: string;
|
|
20
20
|
competitor_id: string;
|
|
21
21
|
product_id: string;
|
|
22
|
-
|
|
22
|
+
issues: {
|
|
23
23
|
name: string;
|
|
24
24
|
description: string;
|
|
25
25
|
is_new?: boolean;
|
|
@@ -28,7 +28,7 @@ export interface CompetitorSnapshot {
|
|
|
28
28
|
tiers?: {
|
|
29
29
|
name: string;
|
|
30
30
|
price: string;
|
|
31
|
-
|
|
31
|
+
issues: string[];
|
|
32
32
|
}[];
|
|
33
33
|
model?: string;
|
|
34
34
|
};
|
|
@@ -133,7 +133,7 @@ export declare function getSnapshots(opts: {
|
|
|
133
133
|
export declare function saveSnapshot(snapshot: {
|
|
134
134
|
competitor_id: string;
|
|
135
135
|
product_id: string;
|
|
136
|
-
|
|
136
|
+
issues?: unknown[];
|
|
137
137
|
pricing?: unknown;
|
|
138
138
|
tech_stack?: unknown[];
|
|
139
139
|
app_rating?: number;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Approval workflow integration for issue phases
|
|
3
|
+
* Checks if current issue status has been approved before executing next phase
|
|
4
|
+
*/
|
|
5
|
+
interface ApprovalCheckResult {
|
|
6
|
+
canProceed: boolean;
|
|
7
|
+
requiresApproval: boolean;
|
|
8
|
+
approvalId?: string;
|
|
9
|
+
message?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Check if current issue status has been approved before executing next phase
|
|
13
|
+
* This should be called BEFORE executing a phase, not after
|
|
14
|
+
*
|
|
15
|
+
* @param issueId - Issue ID
|
|
16
|
+
* @param verbose - Verbose logging
|
|
17
|
+
* @returns Promise<ApprovalCheckResult> - Whether the phase can proceed
|
|
18
|
+
*/
|
|
19
|
+
export declare function checkApprovalBeforePhaseExecution(issueId: string, verbose?: boolean): Promise<ApprovalCheckResult>;
|
|
20
|
+
export {};
|