edsger 0.30.0 → 0.30.2

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.
Files changed (116) hide show
  1. package/.claude/settings.local.json +28 -0
  2. package/.env.local +12 -0
  3. package/dist/api/features/__tests__/regression-prevention.test.d.ts +5 -0
  4. package/dist/api/features/__tests__/regression-prevention.test.js +338 -0
  5. package/dist/api/features/__tests__/status-updater.integration.test.d.ts +5 -0
  6. package/dist/api/features/__tests__/status-updater.integration.test.js +497 -0
  7. package/dist/commands/workflow/pipeline-runner.d.ts +17 -0
  8. package/dist/commands/workflow/pipeline-runner.js +393 -0
  9. package/dist/commands/workflow/runner.d.ts +26 -0
  10. package/dist/commands/workflow/runner.js +119 -0
  11. package/dist/commands/workflow/workflow-runner.d.ts +26 -0
  12. package/dist/commands/workflow/workflow-runner.js +119 -0
  13. package/dist/index.js +0 -0
  14. package/dist/phases/autonomous/index.js +9 -56
  15. package/dist/phases/code-implementation/analyzer-helpers.d.ts +28 -0
  16. package/dist/phases/code-implementation/analyzer-helpers.js +177 -0
  17. package/dist/phases/code-implementation/analyzer.d.ts +32 -0
  18. package/dist/phases/code-implementation/analyzer.js +629 -0
  19. package/dist/phases/code-implementation/branch-pr-creator.js +2 -58
  20. package/dist/phases/code-implementation/context-fetcher.d.ts +17 -0
  21. package/dist/phases/code-implementation/context-fetcher.js +86 -0
  22. package/dist/phases/code-implementation/index.js +9 -67
  23. package/dist/phases/code-implementation/mcp-server.d.ts +1 -0
  24. package/dist/phases/code-implementation/mcp-server.js +93 -0
  25. package/dist/phases/code-implementation/prompts-improvement.d.ts +5 -0
  26. package/dist/phases/code-implementation/prompts-improvement.js +108 -0
  27. package/dist/phases/code-implementation-verification/verifier.d.ts +31 -0
  28. package/dist/phases/code-implementation-verification/verifier.js +196 -0
  29. package/dist/phases/code-refine/analyzer.d.ts +41 -0
  30. package/dist/phases/code-refine/analyzer.js +561 -0
  31. package/dist/phases/code-refine/context-fetcher.d.ts +94 -0
  32. package/dist/phases/code-refine/context-fetcher.js +423 -0
  33. package/dist/phases/code-refine/index.js +6 -37
  34. package/dist/phases/code-refine-verification/analysis/llm-analyzer.d.ts +22 -0
  35. package/dist/phases/code-refine-verification/analysis/llm-analyzer.js +134 -0
  36. package/dist/phases/code-refine-verification/verifier.d.ts +47 -0
  37. package/dist/phases/code-refine-verification/verifier.js +597 -0
  38. package/dist/phases/code-review/analyzer.d.ts +29 -0
  39. package/dist/phases/code-review/analyzer.js +363 -0
  40. package/dist/phases/code-review/context-fetcher.d.ts +92 -0
  41. package/dist/phases/code-review/context-fetcher.js +296 -0
  42. package/dist/phases/code-review/index.js +1 -0
  43. package/dist/phases/feature-analysis/analyzer-helpers.d.ts +10 -0
  44. package/dist/phases/feature-analysis/analyzer-helpers.js +47 -0
  45. package/dist/phases/feature-analysis/analyzer.d.ts +11 -0
  46. package/dist/phases/feature-analysis/analyzer.js +208 -0
  47. package/dist/phases/feature-analysis/context-fetcher.d.ts +26 -0
  48. package/dist/phases/feature-analysis/context-fetcher.js +134 -0
  49. package/dist/phases/feature-analysis/http-fallback.d.ts +20 -0
  50. package/dist/phases/feature-analysis/http-fallback.js +95 -0
  51. package/dist/phases/feature-analysis/mcp-server.d.ts +1 -0
  52. package/dist/phases/feature-analysis/mcp-server.js +144 -0
  53. package/dist/phases/feature-analysis/prompts-improvement.d.ts +8 -0
  54. package/dist/phases/feature-analysis/prompts-improvement.js +109 -0
  55. package/dist/phases/feature-analysis-verification/verifier.d.ts +37 -0
  56. package/dist/phases/feature-analysis-verification/verifier.js +147 -0
  57. package/dist/phases/pr-execution/index.js +1 -0
  58. package/dist/phases/pr-execution/pr-executor.d.ts +2 -1
  59. package/dist/phases/pr-execution/pr-executor.js +9 -38
  60. package/dist/phases/pull-request/creator.js +9 -35
  61. package/dist/phases/technical-design/analyzer-helpers.d.ts +25 -0
  62. package/dist/phases/technical-design/analyzer-helpers.js +39 -0
  63. package/dist/phases/technical-design/analyzer.d.ts +21 -0
  64. package/dist/phases/technical-design/analyzer.js +461 -0
  65. package/dist/phases/technical-design/context-fetcher.d.ts +12 -0
  66. package/dist/phases/technical-design/context-fetcher.js +39 -0
  67. package/dist/phases/technical-design/http-fallback.d.ts +17 -0
  68. package/dist/phases/technical-design/http-fallback.js +151 -0
  69. package/dist/phases/technical-design/mcp-server.d.ts +1 -0
  70. package/dist/phases/technical-design/mcp-server.js +157 -0
  71. package/dist/phases/technical-design/prompts-improvement.d.ts +5 -0
  72. package/dist/phases/technical-design/prompts-improvement.js +93 -0
  73. package/dist/phases/technical-design-verification/verifier.d.ts +53 -0
  74. package/dist/phases/technical-design-verification/verifier.js +170 -0
  75. package/dist/services/feature-branches.d.ts +77 -0
  76. package/dist/services/feature-branches.js +205 -0
  77. package/dist/utils/git-branch-manager.d.ts +2 -0
  78. package/dist/utils/git-branch-manager.js +8 -35
  79. package/dist/utils/git-push.d.ts +43 -0
  80. package/dist/utils/git-push.js +127 -0
  81. package/dist/workflow-runner/config/phase-configs.d.ts +5 -0
  82. package/dist/workflow-runner/config/phase-configs.js +120 -0
  83. package/dist/workflow-runner/core/feature-filter.d.ts +16 -0
  84. package/dist/workflow-runner/core/feature-filter.js +46 -0
  85. package/dist/workflow-runner/core/index.d.ts +8 -0
  86. package/dist/workflow-runner/core/index.js +12 -0
  87. package/dist/workflow-runner/core/pipeline-evaluator.d.ts +24 -0
  88. package/dist/workflow-runner/core/pipeline-evaluator.js +32 -0
  89. package/dist/workflow-runner/core/state-manager.d.ts +24 -0
  90. package/dist/workflow-runner/core/state-manager.js +42 -0
  91. package/dist/workflow-runner/core/workflow-logger.d.ts +20 -0
  92. package/dist/workflow-runner/core/workflow-logger.js +65 -0
  93. package/dist/workflow-runner/executors/phase-executor.d.ts +8 -0
  94. package/dist/workflow-runner/executors/phase-executor.js +248 -0
  95. package/dist/workflow-runner/feature-workflow-runner.d.ts +26 -0
  96. package/dist/workflow-runner/feature-workflow-runner.js +119 -0
  97. package/dist/workflow-runner/index.d.ts +2 -0
  98. package/dist/workflow-runner/index.js +2 -0
  99. package/dist/workflow-runner/pipeline-runner.d.ts +17 -0
  100. package/dist/workflow-runner/pipeline-runner.js +393 -0
  101. package/dist/workflow-runner/workflow-processor.d.ts +54 -0
  102. package/dist/workflow-runner/workflow-processor.js +170 -0
  103. package/dist/workspace/workspace-manager.js +5 -3
  104. package/package.json +1 -1
  105. package/dist/services/lifecycle-agent/__tests__/phase-criteria.test.d.ts +0 -4
  106. package/dist/services/lifecycle-agent/__tests__/phase-criteria.test.js +0 -133
  107. package/dist/services/lifecycle-agent/__tests__/transition-rules.test.d.ts +0 -4
  108. package/dist/services/lifecycle-agent/__tests__/transition-rules.test.js +0 -336
  109. package/dist/services/lifecycle-agent/index.d.ts +0 -24
  110. package/dist/services/lifecycle-agent/index.js +0 -25
  111. package/dist/services/lifecycle-agent/phase-criteria.d.ts +0 -57
  112. package/dist/services/lifecycle-agent/phase-criteria.js +0 -335
  113. package/dist/services/lifecycle-agent/transition-rules.d.ts +0 -60
  114. package/dist/services/lifecycle-agent/transition-rules.js +0 -184
  115. package/dist/services/lifecycle-agent/types.d.ts +0 -190
  116. package/dist/services/lifecycle-agent/types.js +0 -12
@@ -14,6 +14,7 @@ import { createBranches, getCurrentBranch, updateBranch, } from '../../services/
14
14
  import { prepareCustomBranchGitEnvironmentAsync, resetUncommittedChanges, } from '../../utils/git-branch-manager.js';
15
15
  import { createBranchPullRequest, } from '../code-implementation/branch-pr-creator.js';
16
16
  import { getGitHubConfig } from '../../api/github.js';
17
+ import { gitPush } from '../../utils/git-push.js';
17
18
  import { logFeaturePhaseEvent } from '../../services/audit-logs.js';
18
19
  import { createAutonomousSystemPrompt, createAutonomousUserPrompt, } from './prompts.js';
19
20
  /**
@@ -35,59 +36,6 @@ async function* prompt(userPrompt) {
35
36
  yield userMessage(userPrompt);
36
37
  await new Promise((res) => setTimeout(res, 10000));
37
38
  }
38
- /**
39
- * Push branch to remote repository
40
- */
41
- async function pushToRemote(branchName, verbose) {
42
- try {
43
- const { execSync } = await import('child_process');
44
- if (verbose) {
45
- logInfo(`šŸ“¤ Pushing branch ${branchName} to remote...`);
46
- }
47
- try {
48
- execSync(`git push -u origin ${branchName}`, {
49
- encoding: 'utf-8',
50
- stdio: verbose ? 'inherit' : 'pipe',
51
- });
52
- return { success: true };
53
- }
54
- catch {
55
- try {
56
- execSync(`git push origin ${branchName}`, {
57
- encoding: 'utf-8',
58
- stdio: verbose ? 'inherit' : 'pipe',
59
- });
60
- return { success: true };
61
- }
62
- catch {
63
- if (verbose) {
64
- logInfo(`āš ļø Push rejected, attempting force push with lease...`);
65
- }
66
- try {
67
- execSync(`git push --force-with-lease origin ${branchName}`, {
68
- encoding: 'utf-8',
69
- stdio: verbose ? 'inherit' : 'pipe',
70
- });
71
- return { success: true };
72
- }
73
- catch (forceError) {
74
- return {
75
- success: false,
76
- error: forceError instanceof Error
77
- ? forceError.message
78
- : String(forceError),
79
- };
80
- }
81
- }
82
- }
83
- }
84
- catch (error) {
85
- return {
86
- success: false,
87
- error: error instanceof Error ? error.message : String(error),
88
- };
89
- }
90
- }
91
39
  /**
92
40
  * Run a single autonomous iteration using Claude Code SDK
93
41
  */
@@ -265,14 +213,19 @@ export async function runAutonomousDevelopment(options, config, _checklistContex
265
213
  logInfo(`ā±ļø Iteration ${totalIterations} took ${(iterationDuration / 1000).toFixed(0)}s`);
266
214
  if (iterationResult.success) {
267
215
  logInfo(`āœ… Iteration ${totalIterations}: ${iterationResult.summary || 'completed'}`);
268
- // Push to remote
269
- const pushResult = await pushToRemote(devBranchName, verbose);
216
+ // Get GitHub config for push authentication and PR creation
217
+ const githubConfig = await getGitHubConfig(featureId, verbose);
218
+ // Push to remote with authentication
219
+ const pushResult = gitPush({
220
+ branchName: devBranchName,
221
+ token: githubConfig.configured ? githubConfig.token : undefined,
222
+ verbose,
223
+ });
270
224
  if (!pushResult.success && verbose) {
271
225
  logError(`āš ļø Failed to push: ${pushResult.error}`);
272
226
  }
273
227
  // Create PR after first successful iteration
274
228
  if (!prUrl) {
275
- const githubConfig = await getGitHubConfig(featureId, verbose);
276
229
  if (githubConfig.configured &&
277
230
  githubConfig.token &&
278
231
  githubConfig.owner &&
@@ -0,0 +1,28 @@
1
+ import { EdsgerConfig } from '../../types/index.js';
2
+ import { ChecklistPhaseContext } from '../../services/checklist.js';
3
+ import { ChecklistVerificationResult } from '../code-implementation-verification/agent.js';
4
+ import { CodeImplementationResult } from './index.js';
5
+ export interface VerificationCycleResult {
6
+ passed: boolean;
7
+ verificationResult: ChecklistVerificationResult | null;
8
+ nextPrompt: string | null;
9
+ }
10
+ /**
11
+ * Perform a complete verification cycle:
12
+ * 1. Verify code implementation against checklist
13
+ * 2. Log results to audit logs
14
+ * 3. Create improvement prompt if verification failed
15
+ */
16
+ export declare function performVerificationCycle(branchName: string, baseBranch: string, checklistContext: ChecklistPhaseContext | null, featureId: string, featureName: string, featureDescription: string | undefined, config: EdsgerConfig, currentIteration: number, maxIterations: number, verbose?: boolean): Promise<VerificationCycleResult>;
17
+ /**
18
+ * Build successful implementation result
19
+ */
20
+ export declare function buildImplementationResult(featureId: string, branchName: string, implementationSummary: string, filesModified: string[], commitHash: string, iterations: number, checklistResults?: any[], checklistItemResults?: any[]): CodeImplementationResult;
21
+ /**
22
+ * Build verification failure result
23
+ */
24
+ export declare function buildVerificationFailureResult(featureId: string, branchName: string, implementationSummary: string, filesModified: string[], commitHash: string, verificationResult: ChecklistVerificationResult, iterations: number): CodeImplementationResult;
25
+ /**
26
+ * Build error result for no implementation
27
+ */
28
+ export declare function buildNoResultsError(featureId: string, branchName: string): CodeImplementationResult;
@@ -0,0 +1,177 @@
1
+ import { logInfo, logError } from '../../utils/logger.js';
2
+ import { logFeatureVerificationEvent } from '../../services/audit-logs.js';
3
+ import { formatChecklistsForContext, processChecklistItemResultsFromResponse, } from '../../services/checklist.js';
4
+ import { verifyCodeImplementationCompliance, } from '../code-implementation-verification/agent.js';
5
+ import { createCodeImplementationImprovementPrompt } from './prompts.js';
6
+ /**
7
+ * Perform a complete verification cycle:
8
+ * 1. Verify code implementation against checklist
9
+ * 2. Log results to audit logs
10
+ * 3. Create improvement prompt if verification failed
11
+ */
12
+ export async function performVerificationCycle(branchName, baseBranch, checklistContext, featureId, featureName, featureDescription, config, currentIteration, maxIterations, verbose) {
13
+ // If no checklist, verification passes automatically
14
+ if (!checklistContext || checklistContext.checklists.length === 0) {
15
+ if (verbose) {
16
+ logInfo('ā„¹ļø No checklists to verify - skipping verification');
17
+ }
18
+ return {
19
+ passed: true,
20
+ verificationResult: null,
21
+ nextPrompt: null,
22
+ };
23
+ }
24
+ if (verbose) {
25
+ logInfo(`\nšŸ” Verifying code implementation (iteration ${currentIteration}/${maxIterations})...`);
26
+ }
27
+ // Format checklist context for verification
28
+ const checklistInfo = formatChecklistsForContext(checklistContext);
29
+ // Perform verification
30
+ const verificationResult = await verifyCodeImplementationCompliance({
31
+ featureId,
32
+ branchName,
33
+ baseBranch,
34
+ featureName,
35
+ featureDescription,
36
+ checklistContext: checklistInfo,
37
+ verbose,
38
+ }, config);
39
+ // Determine if verification passed
40
+ const verificationPassed = verificationResult.rejected_count === 0;
41
+ // Log verification result
42
+ if (verificationPassed) {
43
+ if (verbose) {
44
+ logInfo(`āœ… Code verification passed: ${verificationResult.confirmed_count} confirmed, ${verificationResult.uncertain_count} uncertain`);
45
+ }
46
+ await logFeatureVerificationEvent({
47
+ featureId,
48
+ phase: 'code_implementation',
49
+ iteration: currentIteration,
50
+ result: 'success',
51
+ verificationData: {
52
+ confirmed_count: verificationResult.confirmed_count,
53
+ rejected_count: verificationResult.rejected_count,
54
+ uncertain_count: verificationResult.uncertain_count,
55
+ summary: verificationResult.summary,
56
+ },
57
+ }, verbose);
58
+ // Create checklist results based on verification result
59
+ const checklistItemResults = verificationResult.item_verifications.map((item) => ({
60
+ checklist_item_id: item.checklist_item_id,
61
+ is_passed: item.is_satisfied && item.verification_status === 'confirmed',
62
+ value: item.verification_status,
63
+ notes: item.verification_reason || undefined,
64
+ }));
65
+ await processChecklistItemResultsFromResponse({ featureId }, 'code_implementation', checklistItemResults, verbose);
66
+ }
67
+ else {
68
+ logError(`āŒ Iteration ${currentIteration}: Code verification FAILED - ${verificationResult.rejected_count} items rejected, ${verificationResult.uncertain_count} uncertain`);
69
+ await logFeatureVerificationEvent({
70
+ featureId,
71
+ phase: 'code_implementation',
72
+ iteration: currentIteration,
73
+ result: 'error',
74
+ verificationData: {
75
+ confirmed_count: verificationResult.confirmed_count,
76
+ rejected_count: verificationResult.rejected_count,
77
+ uncertain_count: verificationResult.uncertain_count,
78
+ rejected_items: verificationResult.item_verifications
79
+ .filter((item) => item.verification_status === 'rejected')
80
+ .map((item) => ({
81
+ checklist_item_id: item.checklist_item_id,
82
+ reason: item.verification_reason || 'No reason provided',
83
+ concerns: item.concerns || [],
84
+ improvement_suggestions: item.improvement_suggestions || [],
85
+ })),
86
+ uncertain_items: verificationResult.item_verifications
87
+ .filter((item) => item.verification_status === 'uncertain')
88
+ .map((item) => ({
89
+ checklist_item_id: item.checklist_item_id,
90
+ reason: item.verification_reason || 'No reason provided',
91
+ concerns: item.concerns || [],
92
+ improvement_suggestions: item.improvement_suggestions || [],
93
+ })),
94
+ summary: verificationResult.summary,
95
+ overall_suggestions: verificationResult.overall_suggestions || [],
96
+ },
97
+ }, verbose);
98
+ }
99
+ // If verification failed and we have iterations left, create improvement prompt
100
+ let nextPrompt = null;
101
+ if (!verificationPassed && currentIteration < maxIterations) {
102
+ nextPrompt = createCodeImplementationImprovementPrompt(verificationResult, branchName, baseBranch);
103
+ if (verbose) {
104
+ logInfo(`\nšŸ“ Created improvement prompt for next iteration (${maxIterations - currentIteration} attempts remaining)`);
105
+ }
106
+ }
107
+ else if (!verificationPassed) {
108
+ // Max iterations reached - create checklist results based on final verification
109
+ if (verbose) {
110
+ logInfo(`\nšŸ“‹ Creating checklist results for final iteration (max iterations reached)`);
111
+ }
112
+ // Create checklist results for all items (both passed and failed)
113
+ const checklistItemResults = verificationResult.item_verifications.map((item) => ({
114
+ checklist_item_id: item.checklist_item_id,
115
+ is_passed: item.is_satisfied && item.verification_status === 'confirmed',
116
+ value: item.verification_status,
117
+ notes: item.verification_reason || undefined,
118
+ }));
119
+ await processChecklistItemResultsFromResponse({ featureId }, 'code_implementation', checklistItemResults, verbose);
120
+ }
121
+ return {
122
+ passed: verificationPassed,
123
+ verificationResult,
124
+ nextPrompt,
125
+ };
126
+ }
127
+ /**
128
+ * Build successful implementation result
129
+ */
130
+ export function buildImplementationResult(featureId, branchName, implementationSummary, filesModified, commitHash, iterations, checklistResults, checklistItemResults) {
131
+ return {
132
+ featureId,
133
+ branchName,
134
+ implementationSummary,
135
+ status: 'success',
136
+ message: 'Code implementation completed successfully',
137
+ filesModified,
138
+ commitHash,
139
+ data: {
140
+ checklist_results: checklistResults,
141
+ checklist_item_results: checklistItemResults,
142
+ },
143
+ };
144
+ }
145
+ /**
146
+ * Build verification failure result
147
+ */
148
+ export function buildVerificationFailureResult(featureId, branchName, implementationSummary, filesModified, commitHash, verificationResult, iterations) {
149
+ return {
150
+ featureId,
151
+ branchName,
152
+ implementationSummary,
153
+ status: 'error',
154
+ message: `Code implementation verification failed after ${iterations} iterations. Code committed for manual review.`,
155
+ filesModified,
156
+ commitHash,
157
+ data: {
158
+ verification_failed: true,
159
+ verification_summary: verificationResult.summary,
160
+ rejected_count: verificationResult.rejected_count,
161
+ uncertain_count: verificationResult.uncertain_count,
162
+ improvement_suggestions: verificationResult.overall_suggestions || [],
163
+ },
164
+ };
165
+ }
166
+ /**
167
+ * Build error result for no implementation
168
+ */
169
+ export function buildNoResultsError(featureId, branchName) {
170
+ return {
171
+ featureId,
172
+ branchName,
173
+ implementationSummary: null,
174
+ status: 'error',
175
+ message: 'Code implementation failed - no results produced',
176
+ };
177
+ }
@@ -0,0 +1,32 @@
1
+ import { EdsgerConfig } from '../../types/index.js';
2
+ import { ChecklistPhaseContext } from '../../services/checklist.js';
3
+ export interface CodeImplementationOptions {
4
+ featureId: string;
5
+ verbose?: boolean;
6
+ baseBranch?: string;
7
+ maxVerificationIterations?: number;
8
+ }
9
+ export interface CodeImplementationResult {
10
+ featureId: string;
11
+ branchName: string;
12
+ implementationSummary: string | null;
13
+ status: 'success' | 'error';
14
+ message: string;
15
+ filesModified?: string[];
16
+ commitHash?: string;
17
+ data?: {
18
+ checklist_results?: Array<{
19
+ checklist_id: string;
20
+ satisfied: boolean;
21
+ notes?: string;
22
+ }>;
23
+ checklist_item_results?: Array<{
24
+ checklist_item_id: string;
25
+ is_passed: boolean;
26
+ value?: any;
27
+ notes?: string;
28
+ }>;
29
+ [key: string]: any;
30
+ };
31
+ }
32
+ export declare const implementFeatureCode: (options: CodeImplementationOptions, config: EdsgerConfig, checklistContext?: ChecklistPhaseContext | null) => Promise<CodeImplementationResult>;