@howlil/ez-agents 3.4.2 → 3.5.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.
Files changed (74) hide show
  1. package/README.md +77 -2
  2. package/agents/ez-observer-agent.md +260 -0
  3. package/agents/ez-release-agent.md +333 -0
  4. package/agents/ez-requirements-agent.md +377 -0
  5. package/agents/ez-scrum-master-agent.md +242 -0
  6. package/agents/ez-tech-lead-agent.md +267 -0
  7. package/bin/install.js +3221 -3272
  8. package/commands/ez/arch-review.md +102 -0
  9. package/commands/ez/execute-phase.md +11 -0
  10. package/commands/ez/export-session.md +79 -0
  11. package/commands/ez/gather-requirements.md +117 -0
  12. package/commands/ez/git-workflow.md +72 -0
  13. package/commands/ez/hotfix.md +120 -0
  14. package/commands/ez/import-session.md +82 -0
  15. package/commands/ez/list-sessions.md +96 -0
  16. package/commands/ez/package-manager.md +316 -0
  17. package/commands/ez/plan-phase.md +9 -1
  18. package/commands/ez/preflight.md +79 -0
  19. package/commands/ez/progress.md +13 -1
  20. package/commands/ez/release.md +153 -0
  21. package/commands/ez/resume.md +107 -0
  22. package/commands/ez/standup.md +85 -0
  23. package/ez-agents/bin/ez-tools.cjs +1095 -716
  24. package/ez-agents/bin/lib/bdd-validator.cjs +622 -0
  25. package/ez-agents/bin/lib/content-scanner.cjs +238 -0
  26. package/ez-agents/bin/lib/context-cache.cjs +154 -0
  27. package/ez-agents/bin/lib/context-errors.cjs +71 -0
  28. package/ez-agents/bin/lib/context-manager.cjs +220 -0
  29. package/ez-agents/bin/lib/discussion-synthesizer.cjs +458 -0
  30. package/ez-agents/bin/lib/file-access.cjs +207 -0
  31. package/ez-agents/bin/lib/git-errors.cjs +83 -0
  32. package/ez-agents/bin/lib/git-utils.cjs +321 -203
  33. package/ez-agents/bin/lib/git-workflow-engine.cjs +1157 -0
  34. package/ez-agents/bin/lib/index.cjs +46 -2
  35. package/ez-agents/bin/lib/lockfile-validator.cjs +227 -0
  36. package/ez-agents/bin/lib/logger.cjs +124 -154
  37. package/ez-agents/bin/lib/memory-compression.cjs +256 -0
  38. package/ez-agents/bin/lib/metrics-tracker.cjs +406 -0
  39. package/ez-agents/bin/lib/package-manager-detector.cjs +203 -0
  40. package/ez-agents/bin/lib/package-manager-executor.cjs +385 -0
  41. package/ez-agents/bin/lib/package-manager-service.cjs +216 -0
  42. package/ez-agents/bin/lib/release-validator.cjs +614 -0
  43. package/ez-agents/bin/lib/safe-exec.cjs +128 -214
  44. package/ez-agents/bin/lib/session-chain.cjs +304 -0
  45. package/ez-agents/bin/lib/session-errors.cjs +81 -0
  46. package/ez-agents/bin/lib/session-export.cjs +251 -0
  47. package/ez-agents/bin/lib/session-import.cjs +262 -0
  48. package/ez-agents/bin/lib/session-manager.cjs +280 -0
  49. package/ez-agents/bin/lib/tier-manager.cjs +428 -0
  50. package/ez-agents/bin/lib/url-fetch.cjs +170 -0
  51. package/ez-agents/references/metrics-schema.md +118 -0
  52. package/ez-agents/references/planning-config.md +140 -0
  53. package/ez-agents/references/tier-strategy.md +103 -0
  54. package/ez-agents/templates/bdd-feature.md +173 -0
  55. package/ez-agents/templates/discussion.md +68 -0
  56. package/ez-agents/templates/incident-runbook.md +205 -0
  57. package/ez-agents/templates/release-checklist.md +133 -0
  58. package/ez-agents/templates/rollback-plan.md +201 -0
  59. package/ez-agents/workflows/arch-review.md +54 -0
  60. package/ez-agents/workflows/autonomous.md +844 -743
  61. package/ez-agents/workflows/execute-phase.md +45 -0
  62. package/ez-agents/workflows/export-session.md +255 -0
  63. package/ez-agents/workflows/gather-requirements.md +206 -0
  64. package/ez-agents/workflows/help.md +92 -0
  65. package/ez-agents/workflows/hotfix.md +291 -0
  66. package/ez-agents/workflows/import-session.md +303 -0
  67. package/ez-agents/workflows/new-milestone.md +713 -384
  68. package/ez-agents/workflows/new-project.md +1107 -1113
  69. package/ez-agents/workflows/plan-phase.md +22 -0
  70. package/ez-agents/workflows/progress.md +15 -25
  71. package/ez-agents/workflows/release.md +253 -0
  72. package/ez-agents/workflows/resume-session.md +215 -0
  73. package/ez-agents/workflows/standup.md +64 -0
  74. package/package.json +9 -2
@@ -29,6 +29,8 @@ const auditExec = require('./audit-exec.cjs');
29
29
 
30
30
  // Git
31
31
  const GitUtils = require('./git-utils.cjs');
32
+ const GitWorkflowEngine = require('./git-workflow-engine.cjs');
33
+ const GitErrors = require('./git-errors.cjs');
32
34
 
33
35
  // Reliability
34
36
  const retry = require('./retry.cjs');
@@ -48,6 +50,25 @@ const modelProvider = require('./model-provider.cjs');
48
50
  // Adapters
49
51
  const assistantAdapter = require('./assistant-adapter.cjs');
50
52
 
53
+ // Package Manager
54
+ const PackageManagerService = require('./package-manager-service.cjs');
55
+ const PackageManagerDetector = require('./package-manager-detector.cjs');
56
+ const PackageManagerExecutor = require('./package-manager-executor.cjs');
57
+ const LockfileValidator = require('./lockfile-validator.cjs');
58
+
59
+ // BDD & Requirements (Phase 30)
60
+ const bddValidator = require('./bdd-validator.cjs');
61
+
62
+ // Discussion Synthesis (Phase 31)
63
+ const discussionSynthesizer = require('./discussion-synthesizer.cjs');
64
+
65
+ // Tier Management & Release Validation (Phase 32-33)
66
+ const TierManager = require('./tier-manager.cjs');
67
+ const ReleaseValidator = require('./release-validator.cjs');
68
+
69
+ // Metrics (Phase 34)
70
+ const MetricsTracker = require('./metrics-tracker.cjs');
71
+
51
72
  module.exports = {
52
73
  // Core
53
74
  Logger,
@@ -64,6 +85,8 @@ module.exports = {
64
85
 
65
86
  // Git
66
87
  GitUtils,
88
+ GitWorkflowEngine,
89
+ GitErrors,
67
90
 
68
91
  // Reliability
69
92
  ...retry,
@@ -82,9 +105,28 @@ module.exports = {
82
105
 
83
106
  // Adapters
84
107
  ...assistantAdapter,
85
-
108
+
109
+ // Package Manager
110
+ PackageManagerService,
111
+ PackageManagerDetector,
112
+ PackageManagerExecutor,
113
+ LockfileValidator,
114
+
115
+ // BDD & Requirements (Phase 30)
116
+ ...bddValidator,
117
+
118
+ // Discussion Synthesis (Phase 31)
119
+ ...discussionSynthesizer,
120
+
121
+ // Tier Management & Release (Phase 32-33)
122
+ TierManager,
123
+ ReleaseValidator,
124
+
125
+ // Metrics (Phase 34)
126
+ MetricsTracker,
127
+
86
128
  // Version info
87
- version: '2.0.0',
129
+ version: '3.0.0',
88
130
 
89
131
  /**
90
132
  * Get health status of all modules
@@ -101,6 +143,8 @@ module.exports = {
101
143
  safePath: 'ok',
102
144
  auth: auth.isKeychainAvailable() ? 'keychain' : 'fallback',
103
145
  gitUtils: 'ok',
146
+ gitWorkflowEngine: 'ok',
147
+ gitErrors: 'ok',
104
148
  retry: 'ok',
105
149
  circuitBreaker: 'ok',
106
150
  fileLock: 'ok',
@@ -0,0 +1,227 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Lockfile Validator — Validate package manager lockfiles
5
+ *
6
+ * Validates lockfile integrity for npm, yarn, and pnpm:
7
+ * - npm: package-lock.json (JSON format with lockfileVersion)
8
+ * - yarn: yarn.lock (YAML-like format with metadata header)
9
+ * - pnpm: pnpm-lock.yaml (YAML format with lockfileVersion)
10
+ *
11
+ * Usage:
12
+ * const LockfileValidator = require('./lockfile-validator.cjs');
13
+ * const validator = new LockfileValidator(cwd);
14
+ * const result = validator.validate('npm');
15
+ * // Returns: { valid, reason, lockfileVersion?, packageCount? }
16
+ */
17
+
18
+ const fs = require('fs');
19
+ const path = require('path');
20
+ const Logger = require('./logger.cjs');
21
+
22
+ /**
23
+ * Lockfile Validator class
24
+ * Validates lockfile integrity for different package managers
25
+ */
26
+ class LockfileValidator {
27
+ /**
28
+ * Create a LockfileValidator instance
29
+ * @param {string} cwd - Working directory (default: process.cwd())
30
+ */
31
+ constructor(cwd = process.cwd()) {
32
+ this.cwd = cwd;
33
+ this.logger = new Logger();
34
+ }
35
+
36
+ /**
37
+ * Validate lockfile for a specific package manager
38
+ * @param {string} manager - Package manager name ('npm', 'yarn', or 'pnpm')
39
+ * @returns {Object} Validation result
40
+ * - {boolean} valid - Whether lockfile is valid
41
+ * - {string} reason - Reason code if invalid
42
+ * - {string} message - Human-readable message if invalid
43
+ * - {number} lockfileVersion - Lockfile version (if valid)
44
+ * - {number} packageCount - Number of packages (if valid)
45
+ */
46
+ validate(manager) {
47
+ const lockfilePath = this.getLockfilePath(manager);
48
+
49
+ this.logger.debug('Validating lockfile', {
50
+ manager,
51
+ lockfilePath,
52
+ cwd: this.cwd
53
+ });
54
+
55
+ // Check file existence
56
+ if (!fs.existsSync(lockfilePath)) {
57
+ this.logger.debug('Lockfile not found', { lockfilePath });
58
+ return {
59
+ valid: false,
60
+ reason: 'lockfile_missing',
61
+ message: `No ${path.basename(lockfilePath)} found`
62
+ };
63
+ }
64
+
65
+ try {
66
+ const content = fs.readFileSync(lockfilePath, 'utf-8');
67
+
68
+ switch (manager) {
69
+ case 'npm':
70
+ return this.validateNpmLockfile(content);
71
+ case 'yarn':
72
+ return this.validateYarnLockfile(content);
73
+ case 'pnpm':
74
+ return this.validatePnpmLockfile(content);
75
+ default:
76
+ return {
77
+ valid: false,
78
+ reason: 'unknown_manager',
79
+ message: `Unknown package manager: ${manager}`
80
+ };
81
+ }
82
+ } catch (err) {
83
+ this.logger.error('Lockfile read error', {
84
+ manager,
85
+ lockfilePath,
86
+ error: err.message
87
+ });
88
+ return {
89
+ valid: false,
90
+ reason: 'read_error',
91
+ message: err.message
92
+ };
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Validate npm lockfile (package-lock.json)
98
+ * @param {string} content - Lockfile content
99
+ * @returns {Object} Validation result
100
+ */
101
+ validateNpmLockfile(content) {
102
+ try {
103
+ const lockfile = JSON.parse(content);
104
+
105
+ // Check required fields
106
+ if (!lockfile.lockfileVersion) {
107
+ return {
108
+ valid: false,
109
+ reason: 'invalid_format',
110
+ message: 'Missing lockfileVersion field'
111
+ };
112
+ }
113
+
114
+ if (!lockfile.packages && !lockfile.dependencies) {
115
+ return {
116
+ valid: false,
117
+ reason: 'empty_lockfile',
118
+ message: 'Lockfile has no dependencies'
119
+ };
120
+ }
121
+
122
+ const packageCount = Object.keys(lockfile.packages || lockfile.dependencies || {}).length;
123
+
124
+ this.logger.debug('npm lockfile valid', {
125
+ lockfileVersion: lockfile.lockfileVersion,
126
+ packageCount
127
+ });
128
+
129
+ return {
130
+ valid: true,
131
+ lockfileVersion: lockfile.lockfileVersion,
132
+ packageCount
133
+ };
134
+ } catch (err) {
135
+ this.logger.debug('npm lockfile invalid JSON', { error: err.message });
136
+ return {
137
+ valid: false,
138
+ reason: 'invalid_json',
139
+ message: `Invalid JSON: ${err.message}`
140
+ };
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Validate yarn lockfile (yarn.lock)
146
+ * @param {string} content - Lockfile content
147
+ * @returns {Object} Validation result
148
+ */
149
+ validateYarnLockfile(content) {
150
+ // Yarn lockfile is YAML-like format
151
+ // Check for basic structure: __metadata__ (Yarn 2+) or "# yarn lockfile v" (Yarn 1)
152
+ const hasYarn2Metadata = content.includes('__metadata:');
153
+ const hasYarn1Header = content.match(/^# yarn lockfile v/i);
154
+
155
+ if (!hasYarn2Metadata && !hasYarn1Header) {
156
+ this.logger.debug('yarn lockfile invalid format');
157
+ return {
158
+ valid: false,
159
+ reason: 'invalid_format',
160
+ message: 'Invalid yarn.lock format'
161
+ };
162
+ }
163
+
164
+ // Count dependency entries (lines starting with package name pattern)
165
+ const entryCount = (content.match(/^"?[^@\s]+@/gm) || []).length;
166
+
167
+ this.logger.debug('yarn lockfile valid', {
168
+ version: hasYarn2Metadata ? '2+' : '1',
169
+ entryCount
170
+ });
171
+
172
+ return {
173
+ valid: true,
174
+ entryCount
175
+ };
176
+ }
177
+
178
+ /**
179
+ * Validate pnpm lockfile (pnpm-lock.yaml)
180
+ * @param {string} content - Lockfile content
181
+ * @returns {Object} Validation result
182
+ */
183
+ validatePnpmLockfile(content) {
184
+ // Check for lockfileVersion
185
+ const versionMatch = content.match(/^lockfileVersion:\s*(\d+)/m);
186
+ if (!versionMatch) {
187
+ this.logger.debug('pnpm lockfile missing lockfileVersion');
188
+ return {
189
+ valid: false,
190
+ reason: 'invalid_format',
191
+ message: 'Missing lockfileVersion in pnpm-lock.yaml'
192
+ };
193
+ }
194
+
195
+ const lockfileVersion = parseInt(versionMatch[1], 10);
196
+
197
+ // Count dependency entries (lines starting with " /" which are package specs)
198
+ const entryCount = (content.match(/^ \/[^:]+:/gm) || []).length;
199
+
200
+ this.logger.debug('pnpm lockfile valid', {
201
+ lockfileVersion,
202
+ entryCount
203
+ });
204
+
205
+ return {
206
+ valid: true,
207
+ lockfileVersion,
208
+ entryCount
209
+ };
210
+ }
211
+
212
+ /**
213
+ * Get the lockfile path for a specific package manager
214
+ * @param {string} manager - Package manager name
215
+ * @returns {string} Full path to lockfile
216
+ */
217
+ getLockfilePath(manager) {
218
+ const lockfiles = {
219
+ 'npm': 'package-lock.json',
220
+ 'yarn': 'yarn.lock',
221
+ 'pnpm': 'pnpm-lock.yaml'
222
+ };
223
+ return path.join(this.cwd, lockfiles[manager] || 'package-lock.json');
224
+ }
225
+ }
226
+
227
+ module.exports = LockfileValidator;
@@ -1,154 +1,124 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * EZ Logger — Centralized logging module for EZ workflow
5
- *
6
- * Provides structured logging with levels (ERROR, WARN, INFO, DEBUG)
7
- * Writes to .planning/logs/{category}/ez-{YYYY-MM-DD}.log
8
- * - One file per day per category (reduces file waste)
9
- * - Categories: error, warn, info, debug
10
- * Replaces silent catch {} blocks with proper error logging
11
- *
12
- * Usage:
13
- * const Logger = require('./logger.cjs');
14
- * const logger = new Logger();
15
- * logger.error('Something failed', { context: 'details' });
16
- */
17
-
18
- const fs = require('fs');
19
- const path = require('path');
20
-
21
- class Logger {
22
- /**
23
- * Create a Logger instance
24
- * @param {string} logDir - Directory for log files (default: .planning/logs)
25
- */
26
- constructor(logDir = '.planning/logs') {
27
- this.logDir = logDir;
28
- this.logFiles = {
29
- error: null,
30
- warn: null,
31
- info: null,
32
- debug: null
33
- };
34
- this.currentDate = null;
35
- }
36
-
37
- /**
38
- * Get current date string in YYYY-MM-DD format
39
- * @returns {string} - Date string
40
- */
41
- _getDateStr() {
42
- return new Date().toISOString().split('T')[0];
43
- }
44
-
45
- /**
46
- * Ensure log directory exists
47
- */
48
- _ensureLogDir() {
49
- if (!fs.existsSync(this.logDir)) {
50
- fs.mkdirSync(this.logDir, { recursive: true });
51
- }
52
- }
53
-
54
- /**
55
- * Get log file path for a specific category
56
- * Creates new file when date changes (daily rotation)
57
- * @param {string} category - Log category (error, warn, info, debug)
58
- * @returns {string} - Path to log file
59
- */
60
- _getLogFile(category) {
61
- const dateStr = this._getDateStr();
62
-
63
- // Rotate log file if date changed
64
- if (this.currentDate !== dateStr) {
65
- this.currentDate = dateStr;
66
- this.logFiles = { error: null, warn: null, info: null, debug: null };
67
- }
68
-
69
- if (!this.logFiles[category]) {
70
- this._ensureLogDir();
71
- // Create category subdirectory
72
- const categoryDir = path.join(this.logDir, category);
73
- if (!fs.existsSync(categoryDir)) {
74
- fs.mkdirSync(categoryDir, { recursive: true });
75
- }
76
- this.logFiles[category] = path.join(categoryDir, `ez-${dateStr}.log`);
77
- }
78
-
79
- return this.logFiles[category];
80
- }
81
-
82
- /**
83
- * Write a log entry
84
- * @param {string} level - Log level (ERROR, WARN, INFO, DEBUG)
85
- * @param {string} message - Log message
86
- * @param {Object} context - Additional context data
87
- */
88
- log(level, message, context = {}) {
89
- const category = level.toLowerCase();
90
- const logFile = this._getLogFile(category);
91
-
92
- const entry = {
93
- timestamp: new Date().toISOString(),
94
- level,
95
- message,
96
- context,
97
- pid: process.pid
98
- };
99
-
100
- try {
101
- fs.appendFileSync(logFile, JSON.stringify(entry) + '\n');
102
-
103
- // Always output ERROR level to console for visibility
104
- if (level === 'ERROR') {
105
- console.error(`[EZ ${level}] ${message}`);
106
- }
107
- } catch (err) {
108
- // Fallback: log to console if file write fails
109
- console.error(`[EZ ${level}] ${message} (file write failed: ${err.message})`);
110
- }
111
- }
112
-
113
- /**
114
- * Log an ERROR level message
115
- * @param {string} msg - Error message
116
- * @param {Object} ctx - Additional context
117
- */
118
- error(msg, ctx) {
119
- this.log('ERROR', msg, ctx);
120
- }
121
-
122
- /**
123
- * Log a WARN level message
124
- * @param {string} msg - Warning message
125
- * @param {Object} ctx - Additional context
126
- */
127
- warn(msg, ctx) {
128
- this.log('WARN', msg, ctx);
129
- }
130
-
131
- /**
132
- * Log an INFO level message
133
- * @param {string} msg - Info message
134
- * @param {Object} ctx - Additional context
135
- */
136
- info(msg, ctx) {
137
- this.log('INFO', msg, ctx);
138
- }
139
-
140
- /**
141
- * Log a DEBUG level message
142
- * @param {string} msg - Debug message
143
- * @param {Object} ctx - Additional context
144
- */
145
- debug(msg, ctx) {
146
- this.log('DEBUG', msg, ctx);
147
- }
148
- }
149
-
150
- // Singleton instance for default usage
151
- const defaultLogger = new Logger();
152
-
153
- module.exports = Logger;
154
- module.exports.defaultLogger = defaultLogger;
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * EZ Logger — Centralized logging module for EZ workflow
5
+ *
6
+ * Provides structured logging with levels (ERROR, WARN, INFO, DEBUG)
7
+ * Writes to .planning/logs/ez-{timestamp}.log
8
+ * Replaces silent catch {} blocks with proper error logging
9
+ *
10
+ * Usage:
11
+ * const Logger = require('./logger.cjs');
12
+ * const logger = new Logger();
13
+ * logger.error('Something failed', { context: 'details' });
14
+ */
15
+
16
+ const fs = require('fs');
17
+ const path = require('path');
18
+
19
+ class Logger {
20
+ /**
21
+ * Create a Logger instance
22
+ * @param {string} logDir - Directory for log files (default: .planning/logs)
23
+ */
24
+ constructor(logDir = '.planning/logs') {
25
+ this.logDir = logDir;
26
+ this.logFile = null;
27
+ }
28
+
29
+ /**
30
+ * Ensure log directory exists and initialize log file
31
+ */
32
+ _ensureLogDir() {
33
+ if (!fs.existsSync(this.logDir)) {
34
+ fs.mkdirSync(this.logDir, { recursive: true });
35
+ }
36
+ this.logFile = path.join(this.logDir, `ez-${Date.now()}.log`);
37
+ }
38
+
39
+ /**
40
+ * Get current log file path
41
+ * @returns {string} - Path to log file
42
+ */
43
+ getLogFile() {
44
+ if (!this.logFile) {
45
+ this._ensureLogDir();
46
+ }
47
+ return this.logFile;
48
+ }
49
+
50
+ /**
51
+ * Write a log entry
52
+ * @param {string} level - Log level (ERROR, WARN, INFO, DEBUG)
53
+ * @param {string} message - Log message
54
+ * @param {Object} context - Additional context data
55
+ */
56
+ log(level, message, context = {}) {
57
+ // Ensure log directory exists before first write
58
+ if (!this.logFile) {
59
+ this._ensureLogDir();
60
+ }
61
+
62
+ const entry = {
63
+ timestamp: new Date().toISOString(),
64
+ level,
65
+ message,
66
+ context,
67
+ pid: process.pid
68
+ };
69
+
70
+ try {
71
+ fs.appendFileSync(this.logFile, JSON.stringify(entry) + '\n');
72
+
73
+ // Always output ERROR level to console for visibility
74
+ if (level === 'ERROR') {
75
+ console.error(`[EZ ${level}] ${message}`);
76
+ }
77
+ } catch (err) {
78
+ // Fallback: log to console if file write fails
79
+ console.error(`[EZ ${level}] ${message} (file write failed: ${err.message})`);
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Log an ERROR level message
85
+ * @param {string} msg - Error message
86
+ * @param {Object} ctx - Additional context
87
+ */
88
+ error(msg, ctx) {
89
+ this.log('ERROR', msg, ctx);
90
+ }
91
+
92
+ /**
93
+ * Log a WARN level message
94
+ * @param {string} msg - Warning message
95
+ * @param {Object} ctx - Additional context
96
+ */
97
+ warn(msg, ctx) {
98
+ this.log('WARN', msg, ctx);
99
+ }
100
+
101
+ /**
102
+ * Log an INFO level message
103
+ * @param {string} msg - Info message
104
+ * @param {Object} ctx - Additional context
105
+ */
106
+ info(msg, ctx) {
107
+ this.log('INFO', msg, ctx);
108
+ }
109
+
110
+ /**
111
+ * Log a DEBUG level message
112
+ * @param {string} msg - Debug message
113
+ * @param {Object} ctx - Additional context
114
+ */
115
+ debug(msg, ctx) {
116
+ this.log('DEBUG', msg, ctx);
117
+ }
118
+ }
119
+
120
+ // Singleton instance for default usage
121
+ const defaultLogger = new Logger();
122
+
123
+ module.exports = Logger;
124
+ module.exports.defaultLogger = defaultLogger;