@howlil/ez-agents 2.0.0 → 3.0.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/LICENSE +21 -21
- package/README.md +157 -110
- package/README.zh-CN.md +84 -84
- package/agents/ez-plan-checker.md +2 -2
- package/agents/ez-research-synthesizer.md +1 -1
- package/agents/ez-ui-auditor.md +0 -2
- package/agents/ez-ui-checker.md +2 -4
- package/agents/ez-ui-researcher.md +0 -2
- package/agents/ez-verifier.md +1 -1
- package/bin/install.js +211 -211
- package/commands/ez/debug.md +1 -1
- package/commands/ez/map-codebase.md +1 -1
- package/commands/ez/reapply-patches.md +3 -3
- package/commands/ez/research-phase.md +1 -1
- package/{get-shit-done → ez-agents}/bin/ez-tools.cjs +1 -1
- package/{get-shit-done → ez-agents}/bin/lib/assistant-adapter.cjs +205 -205
- package/{get-shit-done → ez-agents}/bin/lib/audit-exec.cjs +150 -150
- package/{get-shit-done → ez-agents}/bin/lib/auth.cjs +175 -175
- package/{get-shit-done → ez-agents}/bin/lib/circuit-breaker.cjs +118 -118
- package/{get-shit-done → ez-agents}/bin/lib/commands.cjs +666 -666
- package/{get-shit-done → ez-agents}/bin/lib/config.cjs +183 -183
- package/{get-shit-done → ez-agents}/bin/lib/core.cjs +495 -495
- package/{get-shit-done → ez-agents}/bin/lib/file-lock.cjs +236 -236
- package/{get-shit-done → ez-agents}/bin/lib/frontmatter.cjs +299 -299
- package/{get-shit-done → ez-agents}/bin/lib/fs-utils.cjs +153 -153
- package/{get-shit-done → ez-agents}/bin/lib/git-utils.cjs +203 -203
- package/{get-shit-done → ez-agents}/bin/lib/health-check.cjs +163 -163
- package/{get-shit-done → ez-agents}/bin/lib/index.cjs +113 -113
- package/{get-shit-done → ez-agents}/bin/lib/init.cjs +710 -710
- package/{get-shit-done → ez-agents}/bin/lib/logger.cjs +117 -117
- package/{get-shit-done → ez-agents}/bin/lib/milestone.cjs +241 -241
- package/{get-shit-done → ez-agents}/bin/lib/model-provider.cjs +146 -146
- package/{get-shit-done → ez-agents}/bin/lib/phase.cjs +908 -908
- package/{get-shit-done → ez-agents}/bin/lib/retry.cjs +119 -119
- package/{get-shit-done → ez-agents}/bin/lib/roadmap.cjs +305 -305
- package/{get-shit-done → ez-agents}/bin/lib/safe-exec.cjs +128 -128
- package/{get-shit-done → ez-agents}/bin/lib/safe-path.cjs +130 -130
- package/{get-shit-done → ez-agents}/bin/lib/state.cjs +721 -721
- package/{get-shit-done → ez-agents}/bin/lib/temp-file.cjs +239 -239
- package/{get-shit-done → ez-agents}/bin/lib/template.cjs +222 -222
- package/{get-shit-done → ez-agents}/bin/lib/test-file-lock.cjs +112 -112
- package/{get-shit-done → ez-agents}/bin/lib/test-graceful.cjs +93 -93
- package/{get-shit-done → ez-agents}/bin/lib/test-logger.cjs +60 -60
- package/{get-shit-done → ez-agents}/bin/lib/test-safe-exec.cjs +38 -38
- package/{get-shit-done → ez-agents}/bin/lib/test-safe-path.cjs +33 -33
- package/{get-shit-done → ez-agents}/bin/lib/test-temp-file.cjs +125 -125
- package/{get-shit-done → ez-agents}/bin/lib/timeout-exec.cjs +62 -62
- package/{get-shit-done → ez-agents}/bin/lib/verify.cjs +820 -820
- package/{get-shit-done → ez-agents}/references/checkpoints.md +776 -776
- package/{get-shit-done → ez-agents}/references/questioning.md +162 -162
- package/{get-shit-done → ez-agents}/references/tdd.md +263 -263
- package/{get-shit-done → ez-agents}/templates/codebase/concerns.md +310 -310
- package/{get-shit-done → ez-agents}/templates/codebase/conventions.md +307 -307
- package/{get-shit-done → ez-agents}/templates/codebase/integrations.md +280 -280
- package/{get-shit-done → ez-agents}/templates/codebase/stack.md +186 -186
- package/{get-shit-done → ez-agents}/templates/codebase/testing.md +480 -480
- package/{get-shit-done → ez-agents}/templates/config.json +37 -37
- package/{get-shit-done → ez-agents}/templates/continue-here.md +78 -78
- package/{get-shit-done → ez-agents}/templates/milestone-archive.md +123 -123
- package/{get-shit-done → ez-agents}/templates/milestone.md +115 -115
- package/{get-shit-done → ez-agents}/templates/requirements.md +231 -231
- package/{get-shit-done → ez-agents}/templates/research-project/ARCHITECTURE.md +204 -204
- package/{get-shit-done → ez-agents}/templates/research-project/FEATURES.md +147 -147
- package/{get-shit-done → ez-agents}/templates/research-project/PITFALLS.md +200 -200
- package/{get-shit-done → ez-agents}/templates/research-project/STACK.md +120 -120
- package/{get-shit-done → ez-agents}/templates/research-project/SUMMARY.md +170 -170
- package/{get-shit-done → ez-agents}/templates/retrospective.md +54 -54
- package/{get-shit-done → ez-agents}/templates/roadmap.md +202 -202
- package/{get-shit-done → ez-agents}/templates/summary-minimal.md +41 -41
- package/{get-shit-done → ez-agents}/templates/summary-standard.md +48 -48
- package/{get-shit-done → ez-agents}/templates/summary.md +248 -248
- package/{get-shit-done → ez-agents}/templates/user-setup.md +311 -311
- package/{get-shit-done → ez-agents}/templates/verification-report.md +322 -322
- package/{get-shit-done → ez-agents}/workflows/add-phase.md +112 -112
- package/{get-shit-done → ez-agents}/workflows/add-tests.md +351 -351
- package/{get-shit-done → ez-agents}/workflows/add-todo.md +158 -158
- package/{get-shit-done → ez-agents}/workflows/audit-milestone.md +332 -332
- package/{get-shit-done → ez-agents}/workflows/autonomous.md +743 -743
- package/{get-shit-done → ez-agents}/workflows/check-todos.md +177 -177
- package/{get-shit-done → ez-agents}/workflows/cleanup.md +152 -152
- package/{get-shit-done → ez-agents}/workflows/complete-milestone.md +766 -766
- package/ez-agents/workflows/debug.md +0 -0
- package/{get-shit-done → ez-agents}/workflows/diagnose-issues.md +219 -219
- package/{get-shit-done → ez-agents}/workflows/discovery-phase.md +289 -289
- package/{get-shit-done → ez-agents}/workflows/discuss-phase.md +762 -762
- package/{get-shit-done → ez-agents}/workflows/execute-phase.md +468 -468
- package/{get-shit-done → ez-agents}/workflows/execute-plan.md +483 -483
- package/{get-shit-done → ez-agents}/workflows/health.md +159 -159
- package/{get-shit-done → ez-agents}/workflows/help.md +492 -492
- package/{get-shit-done → ez-agents}/workflows/insert-phase.md +130 -130
- package/{get-shit-done → ez-agents}/workflows/list-phase-assumptions.md +178 -178
- package/{get-shit-done → ez-agents}/workflows/map-codebase.md +316 -316
- package/{get-shit-done → ez-agents}/workflows/new-milestone.md +384 -384
- package/{get-shit-done → ez-agents}/workflows/new-project.md +1111 -1111
- package/{get-shit-done → ez-agents}/workflows/node-repair.md +92 -92
- package/{get-shit-done → ez-agents}/workflows/pause-work.md +122 -122
- package/{get-shit-done → ez-agents}/workflows/plan-milestone-gaps.md +274 -274
- package/{get-shit-done → ez-agents}/workflows/plan-phase.md +651 -651
- package/{get-shit-done → ez-agents}/workflows/progress.md +382 -382
- package/{get-shit-done → ez-agents}/workflows/quick.md +610 -610
- package/{get-shit-done → ez-agents}/workflows/remove-phase.md +155 -155
- package/{get-shit-done → ez-agents}/workflows/research-phase.md +74 -74
- package/{get-shit-done → ez-agents}/workflows/resume-project.md +307 -307
- package/{get-shit-done → ez-agents}/workflows/set-profile.md +81 -81
- package/{get-shit-done → ez-agents}/workflows/settings.md +242 -242
- package/{get-shit-done → ez-agents}/workflows/stats.md +57 -57
- package/{get-shit-done → ez-agents}/workflows/transition.md +544 -544
- package/{get-shit-done → ez-agents}/workflows/ui-phase.md +290 -290
- package/{get-shit-done → ez-agents}/workflows/ui-review.md +157 -157
- package/{get-shit-done → ez-agents}/workflows/update.md +320 -320
- package/{get-shit-done → ez-agents}/workflows/validate-phase.md +167 -167
- package/{get-shit-done → ez-agents}/workflows/verify-phase.md +243 -243
- package/{get-shit-done → ez-agents}/workflows/verify-work.md +5 -5
- package/hooks/dist/ez-check-update.js +81 -0
- package/hooks/dist/ez-context-monitor.js +141 -0
- package/hooks/dist/ez-statusline.js +115 -0
- package/package.json +13 -3
- package/scripts/build-hooks.js +43 -43
- package/scripts/run-tests.cjs +29 -29
- /package/{get-shit-done → ez-agents}/references/continuation-format.md +0 -0
- /package/{get-shit-done → ez-agents}/references/decimal-phase-calculation.md +0 -0
- /package/{get-shit-done → ez-agents}/references/git-integration.md +0 -0
- /package/{get-shit-done → ez-agents}/references/git-planning-commit.md +0 -0
- /package/{get-shit-done → ez-agents}/references/model-profile-resolution.md +0 -0
- /package/{get-shit-done → ez-agents}/references/model-profiles.md +0 -0
- /package/{get-shit-done → ez-agents}/references/phase-argument-parsing.md +0 -0
- /package/{get-shit-done → ez-agents}/references/planning-config.md +0 -0
- /package/{get-shit-done → ez-agents}/references/ui-brand.md +0 -0
- /package/{get-shit-done → ez-agents}/references/verification-patterns.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/DEBUG.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/UAT.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/UI-SPEC.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/VALIDATION.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/codebase/architecture.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/codebase/structure.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/context.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/copilot-instructions.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/debug-subagent-prompt.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/discovery.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/phase-prompt.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/planner-subagent-prompt.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/project.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/research.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/state.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/summary-complex.md +0 -0
|
@@ -1,119 +1,119 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* GSD Retry — Retry utility with exponential backoff
|
|
5
|
-
*
|
|
6
|
-
* Features:
|
|
7
|
-
* - Configurable max retries, base delay, max delay
|
|
8
|
-
* - Jitter to prevent thundering herd
|
|
9
|
-
* - Error classification (retryable vs non-retryable)
|
|
10
|
-
*
|
|
11
|
-
* Usage:
|
|
12
|
-
* const { retry, isRetryableError } = require('./retry.cjs');
|
|
13
|
-
* const result = await retry(() => fetch(url), { maxRetries: 3 });
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
const Logger = require('./logger.cjs');
|
|
17
|
-
const logger = new Logger();
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Retry an operation with exponential backoff
|
|
21
|
-
* @param {Function} operation - Async function to retry
|
|
22
|
-
* @param {Object} options - Retry options
|
|
23
|
-
* @returns {Promise<any>} - Result of operation
|
|
24
|
-
*/
|
|
25
|
-
async function retry(operation, options = {}) {
|
|
26
|
-
const {
|
|
27
|
-
maxRetries = 3,
|
|
28
|
-
baseDelay = 1000,
|
|
29
|
-
maxDelay = 30000,
|
|
30
|
-
jitter = true,
|
|
31
|
-
shouldRetry = isRetryableError
|
|
32
|
-
} = options;
|
|
33
|
-
|
|
34
|
-
let lastError;
|
|
35
|
-
let lastAttempt = null;
|
|
36
|
-
|
|
37
|
-
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
38
|
-
try {
|
|
39
|
-
lastAttempt = attempt;
|
|
40
|
-
return await operation();
|
|
41
|
-
} catch (err) {
|
|
42
|
-
lastError = err;
|
|
43
|
-
|
|
44
|
-
// Don't retry if error is not retryable or max retries reached
|
|
45
|
-
if (attempt === maxRetries || !shouldRetry(err)) {
|
|
46
|
-
logger.error('Operation failed after retries', {
|
|
47
|
-
attempts: attempt + 1,
|
|
48
|
-
error: err.message
|
|
49
|
-
});
|
|
50
|
-
break;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Calculate delay with exponential backoff and jitter
|
|
54
|
-
const delay = Math.min(
|
|
55
|
-
baseDelay * Math.pow(2, attempt),
|
|
56
|
-
maxDelay
|
|
57
|
-
);
|
|
58
|
-
const jitteredDelay = jitter ? delay * (0.5 + Math.random()) : delay;
|
|
59
|
-
|
|
60
|
-
logger.warn('Retrying operation', {
|
|
61
|
-
attempt: attempt + 1,
|
|
62
|
-
maxRetries,
|
|
63
|
-
delay: Math.round(jitteredDelay),
|
|
64
|
-
error: err.message
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
await new Promise(resolve => setTimeout(resolve, jitteredDelay));
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const error = new Error(`Operation failed after ${lastAttempt + 1} attempts: ${lastError.message}`);
|
|
72
|
-
error.cause = lastError;
|
|
73
|
-
throw error;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Check if error is retryable
|
|
78
|
-
* @param {Error} err - Error to check
|
|
79
|
-
* @returns {boolean} - True if retryable
|
|
80
|
-
*/
|
|
81
|
-
function isRetryableError(err) {
|
|
82
|
-
const retryableCodes = ['ECONNRESET', 'ETIMEDOUT', 'EAI_AGAIN', 'ENOTFOUND'];
|
|
83
|
-
const retryableStatus = [429, 500, 502, 503, 504];
|
|
84
|
-
|
|
85
|
-
if (err.code && retryableCodes.includes(err.code)) return true;
|
|
86
|
-
if (err.status && retryableStatus.includes(err.status)) return true;
|
|
87
|
-
if (err.message?.includes('rate limit')) return true;
|
|
88
|
-
if (err.message?.includes('timeout')) return true;
|
|
89
|
-
if (err.message?.includes('network')) return true;
|
|
90
|
-
|
|
91
|
-
return false;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Classify error type
|
|
96
|
-
* @param {Error} err - Error to classify
|
|
97
|
-
* @returns {string} - Error classification
|
|
98
|
-
*/
|
|
99
|
-
function classifyError(err) {
|
|
100
|
-
if (isRetryableError(err)) {
|
|
101
|
-
return 'retryable';
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (err.code === 'ENOENT' || err.code === 'EPERM') {
|
|
105
|
-
return 'filesystem';
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (err.message?.includes('parse') || err.message?.includes('invalid')) {
|
|
109
|
-
return 'validation';
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
return 'unknown';
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
module.exports = {
|
|
116
|
-
retry,
|
|
117
|
-
isRetryableError,
|
|
118
|
-
classifyError
|
|
119
|
-
};
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* GSD Retry — Retry utility with exponential backoff
|
|
5
|
+
*
|
|
6
|
+
* Features:
|
|
7
|
+
* - Configurable max retries, base delay, max delay
|
|
8
|
+
* - Jitter to prevent thundering herd
|
|
9
|
+
* - Error classification (retryable vs non-retryable)
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* const { retry, isRetryableError } = require('./retry.cjs');
|
|
13
|
+
* const result = await retry(() => fetch(url), { maxRetries: 3 });
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const Logger = require('./logger.cjs');
|
|
17
|
+
const logger = new Logger();
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Retry an operation with exponential backoff
|
|
21
|
+
* @param {Function} operation - Async function to retry
|
|
22
|
+
* @param {Object} options - Retry options
|
|
23
|
+
* @returns {Promise<any>} - Result of operation
|
|
24
|
+
*/
|
|
25
|
+
async function retry(operation, options = {}) {
|
|
26
|
+
const {
|
|
27
|
+
maxRetries = 3,
|
|
28
|
+
baseDelay = 1000,
|
|
29
|
+
maxDelay = 30000,
|
|
30
|
+
jitter = true,
|
|
31
|
+
shouldRetry = isRetryableError
|
|
32
|
+
} = options;
|
|
33
|
+
|
|
34
|
+
let lastError;
|
|
35
|
+
let lastAttempt = null;
|
|
36
|
+
|
|
37
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
38
|
+
try {
|
|
39
|
+
lastAttempt = attempt;
|
|
40
|
+
return await operation();
|
|
41
|
+
} catch (err) {
|
|
42
|
+
lastError = err;
|
|
43
|
+
|
|
44
|
+
// Don't retry if error is not retryable or max retries reached
|
|
45
|
+
if (attempt === maxRetries || !shouldRetry(err)) {
|
|
46
|
+
logger.error('Operation failed after retries', {
|
|
47
|
+
attempts: attempt + 1,
|
|
48
|
+
error: err.message
|
|
49
|
+
});
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Calculate delay with exponential backoff and jitter
|
|
54
|
+
const delay = Math.min(
|
|
55
|
+
baseDelay * Math.pow(2, attempt),
|
|
56
|
+
maxDelay
|
|
57
|
+
);
|
|
58
|
+
const jitteredDelay = jitter ? delay * (0.5 + Math.random()) : delay;
|
|
59
|
+
|
|
60
|
+
logger.warn('Retrying operation', {
|
|
61
|
+
attempt: attempt + 1,
|
|
62
|
+
maxRetries,
|
|
63
|
+
delay: Math.round(jitteredDelay),
|
|
64
|
+
error: err.message
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
await new Promise(resolve => setTimeout(resolve, jitteredDelay));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const error = new Error(`Operation failed after ${lastAttempt + 1} attempts: ${lastError.message}`);
|
|
72
|
+
error.cause = lastError;
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Check if error is retryable
|
|
78
|
+
* @param {Error} err - Error to check
|
|
79
|
+
* @returns {boolean} - True if retryable
|
|
80
|
+
*/
|
|
81
|
+
function isRetryableError(err) {
|
|
82
|
+
const retryableCodes = ['ECONNRESET', 'ETIMEDOUT', 'EAI_AGAIN', 'ENOTFOUND'];
|
|
83
|
+
const retryableStatus = [429, 500, 502, 503, 504];
|
|
84
|
+
|
|
85
|
+
if (err.code && retryableCodes.includes(err.code)) return true;
|
|
86
|
+
if (err.status && retryableStatus.includes(err.status)) return true;
|
|
87
|
+
if (err.message?.includes('rate limit')) return true;
|
|
88
|
+
if (err.message?.includes('timeout')) return true;
|
|
89
|
+
if (err.message?.includes('network')) return true;
|
|
90
|
+
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Classify error type
|
|
96
|
+
* @param {Error} err - Error to classify
|
|
97
|
+
* @returns {string} - Error classification
|
|
98
|
+
*/
|
|
99
|
+
function classifyError(err) {
|
|
100
|
+
if (isRetryableError(err)) {
|
|
101
|
+
return 'retryable';
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (err.code === 'ENOENT' || err.code === 'EPERM') {
|
|
105
|
+
return 'filesystem';
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (err.message?.includes('parse') || err.message?.includes('invalid')) {
|
|
109
|
+
return 'validation';
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return 'unknown';
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
module.exports = {
|
|
116
|
+
retry,
|
|
117
|
+
isRetryableError,
|
|
118
|
+
classifyError
|
|
119
|
+
};
|