@howlil/ez-agents 3.1.0 → 3.4.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 (110) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +288 -718
  3. package/bin/install.js +438 -71
  4. package/commands/ez/auth.md +87 -0
  5. package/commands/ez/join-discord.md +18 -18
  6. package/ez-agents/bin/ez-tools.cjs +120 -2
  7. package/ez-agents/bin/lib/assistant-adapter.cjs +264 -205
  8. package/ez-agents/bin/lib/audit-exec.cjs +26 -9
  9. package/ez-agents/bin/lib/auth.cjs +2 -1
  10. package/ez-agents/bin/lib/circuit-breaker.cjs +118 -118
  11. package/ez-agents/bin/lib/commands.cjs +42 -23
  12. package/ez-agents/bin/lib/config.cjs +190 -183
  13. package/ez-agents/bin/lib/core.cjs +42 -25
  14. package/ez-agents/bin/lib/file-lock.cjs +236 -236
  15. package/ez-agents/bin/lib/frontmatter.cjs +299 -299
  16. package/ez-agents/bin/lib/fs-utils.cjs +153 -153
  17. package/ez-agents/bin/lib/git-utils.cjs +203 -203
  18. package/ez-agents/bin/lib/health-check.cjs +2 -3
  19. package/ez-agents/bin/lib/index.cjs +113 -113
  20. package/ez-agents/bin/lib/init.cjs +757 -710
  21. package/ez-agents/bin/lib/logger.cjs +52 -15
  22. package/ez-agents/bin/lib/milestone.cjs +241 -241
  23. package/ez-agents/bin/lib/model-provider.cjs +241 -146
  24. package/ez-agents/bin/lib/phase.cjs +925 -908
  25. package/ez-agents/bin/lib/planning-write.cjs +107 -0
  26. package/ez-agents/bin/lib/retry.cjs +119 -119
  27. package/ez-agents/bin/lib/roadmap.cjs +306 -305
  28. package/ez-agents/bin/lib/safe-exec.cjs +91 -5
  29. package/ez-agents/bin/lib/safe-path.cjs +130 -130
  30. package/ez-agents/bin/lib/state.cjs +736 -721
  31. package/ez-agents/bin/lib/temp-file.cjs +239 -239
  32. package/ez-agents/bin/lib/template.cjs +223 -222
  33. package/ez-agents/bin/lib/test-file-lock.cjs +112 -112
  34. package/ez-agents/bin/lib/test-graceful.cjs +93 -93
  35. package/ez-agents/bin/lib/test-logger.cjs +60 -60
  36. package/ez-agents/bin/lib/test-safe-exec.cjs +38 -38
  37. package/ez-agents/bin/lib/test-safe-path.cjs +33 -33
  38. package/ez-agents/bin/lib/test-temp-file.cjs +125 -125
  39. package/ez-agents/bin/lib/timeout-exec.cjs +63 -62
  40. package/ez-agents/bin/lib/verify.cjs +69 -26
  41. package/ez-agents/references/checkpoints.md +776 -776
  42. package/ez-agents/references/continuation-format.md +249 -249
  43. package/ez-agents/references/questioning.md +162 -162
  44. package/ez-agents/references/tdd.md +263 -263
  45. package/ez-agents/templates/codebase/concerns.md +310 -310
  46. package/ez-agents/templates/codebase/conventions.md +307 -307
  47. package/ez-agents/templates/codebase/integrations.md +280 -280
  48. package/ez-agents/templates/codebase/stack.md +186 -186
  49. package/ez-agents/templates/codebase/testing.md +480 -480
  50. package/ez-agents/templates/config.json +37 -37
  51. package/ez-agents/templates/continue-here.md +78 -78
  52. package/ez-agents/templates/milestone-archive.md +123 -123
  53. package/ez-agents/templates/milestone.md +115 -115
  54. package/ez-agents/templates/requirements.md +231 -231
  55. package/ez-agents/templates/research-project/ARCHITECTURE.md +204 -204
  56. package/ez-agents/templates/research-project/FEATURES.md +147 -147
  57. package/ez-agents/templates/research-project/PITFALLS.md +200 -200
  58. package/ez-agents/templates/research-project/STACK.md +120 -120
  59. package/ez-agents/templates/research-project/SUMMARY.md +170 -170
  60. package/ez-agents/templates/retrospective.md +54 -54
  61. package/ez-agents/templates/roadmap.md +202 -202
  62. package/ez-agents/templates/summary-minimal.md +41 -41
  63. package/ez-agents/templates/summary-standard.md +48 -48
  64. package/ez-agents/templates/summary.md +248 -248
  65. package/ez-agents/templates/user-setup.md +311 -311
  66. package/ez-agents/templates/verification-report.md +322 -322
  67. package/ez-agents/workflows/add-phase.md +112 -112
  68. package/ez-agents/workflows/add-tests.md +351 -351
  69. package/ez-agents/workflows/add-todo.md +158 -158
  70. package/ez-agents/workflows/audit-milestone.md +332 -332
  71. package/ez-agents/workflows/autonomous.md +743 -743
  72. package/ez-agents/workflows/check-todos.md +177 -177
  73. package/ez-agents/workflows/cleanup.md +152 -152
  74. package/ez-agents/workflows/complete-milestone.md +766 -766
  75. package/ez-agents/workflows/diagnose-issues.md +219 -219
  76. package/ez-agents/workflows/discovery-phase.md +289 -289
  77. package/ez-agents/workflows/discuss-phase.md +762 -762
  78. package/ez-agents/workflows/execute-phase.md +468 -468
  79. package/ez-agents/workflows/execute-plan.md +483 -483
  80. package/ez-agents/workflows/health.md +159 -159
  81. package/ez-agents/workflows/help.md +492 -492
  82. package/ez-agents/workflows/insert-phase.md +130 -130
  83. package/ez-agents/workflows/list-phase-assumptions.md +178 -178
  84. package/ez-agents/workflows/map-codebase.md +316 -316
  85. package/ez-agents/workflows/new-milestone.md +384 -384
  86. package/ez-agents/workflows/new-project.md +1113 -1111
  87. package/ez-agents/workflows/node-repair.md +92 -92
  88. package/ez-agents/workflows/pause-work.md +122 -122
  89. package/ez-agents/workflows/plan-milestone-gaps.md +274 -274
  90. package/ez-agents/workflows/plan-phase.md +651 -651
  91. package/ez-agents/workflows/progress.md +382 -382
  92. package/ez-agents/workflows/quick.md +610 -610
  93. package/ez-agents/workflows/remove-phase.md +155 -155
  94. package/ez-agents/workflows/research-phase.md +74 -74
  95. package/ez-agents/workflows/resume-project.md +307 -307
  96. package/ez-agents/workflows/set-profile.md +81 -81
  97. package/ez-agents/workflows/settings.md +242 -242
  98. package/ez-agents/workflows/stats.md +57 -57
  99. package/ez-agents/workflows/transition.md +544 -544
  100. package/ez-agents/workflows/ui-phase.md +290 -290
  101. package/ez-agents/workflows/ui-review.md +157 -157
  102. package/ez-agents/workflows/update.md +320 -320
  103. package/ez-agents/workflows/validate-phase.md +167 -167
  104. package/ez-agents/workflows/verify-phase.md +243 -243
  105. package/ez-agents/workflows/verify-work.md +584 -584
  106. package/package.json +2 -3
  107. package/scripts/build-hooks.js +43 -43
  108. package/scripts/fix-qwen-installation.js +144 -0
  109. package/scripts/run-tests.cjs +29 -29
  110. package/README.zh-CN.md +0 -702
package/package.json CHANGED
@@ -1,10 +1,9 @@
1
1
  {
2
2
  "name": "@howlil/ez-agents",
3
- "version": "3.1.0",
3
+ "version": "3.4.2",
4
4
  "description": "EZ Agents — Meta-prompting with multi-model support (Qwen, Kimi, OpenAI)",
5
5
  "bin": {
6
- "ez-agents": "bin/install.js",
7
- "ez-agents-update": "bin/update.js"
6
+ "ez-agents": "bin/install.js"
8
7
  },
9
8
  "files": [
10
9
  "bin",
@@ -1,43 +1,43 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Copy GSD hooks to dist for installation.
4
- */
5
-
6
- const fs = require('fs');
7
- const path = require('path');
8
-
9
- const HOOKS_DIR = path.join(__dirname, '..', 'hooks');
10
- const DIST_DIR = path.join(HOOKS_DIR, 'dist');
11
-
12
- // Hooks to copy (pure Node.js, no bundling needed)
13
- const HOOKS_TO_COPY = [
14
- 'ez-check-update.js',
15
- 'ez-context-monitor.js',
16
- 'ez-statusline.js'
17
- ];
18
-
19
- function build() {
20
- // Ensure dist directory exists
21
- if (!fs.existsSync(DIST_DIR)) {
22
- fs.mkdirSync(DIST_DIR, { recursive: true });
23
- }
24
-
25
- // Copy hooks to dist
26
- for (const hook of HOOKS_TO_COPY) {
27
- const src = path.join(HOOKS_DIR, hook);
28
- const dest = path.join(DIST_DIR, hook);
29
-
30
- if (!fs.existsSync(src)) {
31
- console.warn(`Warning: ${hook} not found, skipping`);
32
- continue;
33
- }
34
-
35
- console.log(`Copying ${hook}...`);
36
- fs.copyFileSync(src, dest);
37
- console.log(` → ${dest}`);
38
- }
39
-
40
- console.log('\nBuild complete.');
41
- }
42
-
43
- build();
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Copy EZ hooks to dist for installation.
4
+ */
5
+
6
+ const fs = require('fs');
7
+ const path = require('path');
8
+
9
+ const HOOKS_DIR = path.join(__dirname, '..', 'hooks');
10
+ const DIST_DIR = path.join(HOOKS_DIR, 'dist');
11
+
12
+ // Hooks to copy (pure Node.js, no bundling needed)
13
+ const HOOKS_TO_COPY = [
14
+ 'ez-check-update.js',
15
+ 'ez-context-monitor.js',
16
+ 'ez-statusline.js'
17
+ ];
18
+
19
+ function build() {
20
+ // Ensure dist directory exists
21
+ if (!fs.existsSync(DIST_DIR)) {
22
+ fs.mkdirSync(DIST_DIR, { recursive: true });
23
+ }
24
+
25
+ // Copy hooks to dist
26
+ for (const hook of HOOKS_TO_COPY) {
27
+ const src = path.join(HOOKS_DIR, hook);
28
+ const dest = path.join(DIST_DIR, hook);
29
+
30
+ if (!fs.existsSync(src)) {
31
+ console.warn(`Warning: ${hook} not found, skipping`);
32
+ continue;
33
+ }
34
+
35
+ console.log(`Copying ${hook}...`);
36
+ fs.copyFileSync(src, dest);
37
+ console.log(` → ${dest}`);
38
+ }
39
+
40
+ console.log('\nBuild complete.');
41
+ }
42
+
43
+ build();
@@ -0,0 +1,144 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Fix Qwen Code Installation
5
+ *
6
+ * This script fixes the Qwen Code installation by copying ez-agents commands
7
+ * to the correct ~/.qwen/commands/ez/ directory instead of ~/.qwen/skills/
8
+ *
9
+ * Usage: node fix-qwen-installation.js
10
+ */
11
+
12
+ const fs = require('fs');
13
+ const path = require('path');
14
+ const os = require('os');
15
+
16
+ const cyan = '\x1b[36m';
17
+ const green = '\x1b[32m';
18
+ const yellow = '\x1b[33m';
19
+ const red = '\x1b[31m';
20
+ const reset = '\x1b[0m';
21
+
22
+ console.log(`${cyan}Fixing Qwen Code Installation${reset}\n`);
23
+
24
+ // Get Qwen config directory
25
+ const qwenDir = process.env.QWEN_CONFIG_DIR
26
+ ? path.resolve(process.env.QWEN_CONFIG_DIR)
27
+ : path.join(os.homedir(), '.qwen');
28
+
29
+ const skillsDir = path.join(qwenDir, 'skills');
30
+ const commandsDir = path.join(qwenDir, 'commands');
31
+ const ezCommandsDir = path.join(commandsDir, 'ez');
32
+
33
+ // Find ez-agents installation
34
+ let ezAgentsDir = null;
35
+ const possibleLocations = [
36
+ path.join(qwenDir, 'ez-agents'),
37
+ path.join(qwenDir, '.ez-agents'),
38
+ path.join(os.homedir(), '.ez-agents'),
39
+ ];
40
+
41
+ for (const loc of possibleLocations) {
42
+ if (fs.existsSync(loc)) {
43
+ ezAgentsDir = loc;
44
+ break;
45
+ }
46
+ }
47
+
48
+ if (!ezAgentsDir) {
49
+ console.log(`${yellow}Warning:${reset} ez-agents installation not found in common locations`);
50
+ console.log(`Looking for workflows in ${skillsDir}/ez-*/`);
51
+
52
+ // Try to find workflows from installed skills
53
+ if (!fs.existsSync(skillsDir)) {
54
+ console.log(`${red}Error:${reset} Neither ez-agents nor skills directory found`);
55
+ console.log(`Please run: ${cyan}ez-agents --qwen --global${reset}`);
56
+ process.exit(1);
57
+ }
58
+ }
59
+
60
+ console.log(`Qwen config directory: ${cyan}${qwenDir}${reset}`);
61
+ console.log(`Current skills location: ${yellow}${skillsDir}${reset}`);
62
+ console.log(`Target commands location: ${green}${ezCommandsDir}${reset}\n`);
63
+
64
+ // Create commands/ez directory
65
+ console.log(`${cyan}Step 1: Creating commands directory${reset}`);
66
+ fs.mkdirSync(ezCommandsDir, { recursive: true });
67
+ console.log(`${green}✓${reset} Created ${ezCommandsDir}\n`);
68
+
69
+ // Copy workflow files from skills to commands
70
+ console.log(`${cyan}Step 2: Copying ez-agents commands${reset}`);
71
+
72
+ let sourceDir = null;
73
+ if (ezAgentsDir && fs.existsSync(path.join(ezAgentsDir, 'workflows'))) {
74
+ sourceDir = path.join(ezAgentsDir, 'workflows');
75
+ } else if (fs.existsSync(skillsDir)) {
76
+ // Check if skills are installed as ez-* directories
77
+ const skillDirs = fs.readdirSync(skillsDir, { withFileTypes: true })
78
+ .filter(d => d.isDirectory() && d.name.startsWith('ez-'))
79
+ .map(d => d.name);
80
+
81
+ if (skillDirs.length > 0) {
82
+ console.log(`${yellow}Note:${reset} Found skills in skills/ directory: ${skillDirs.join(', ')}`);
83
+ console.log(`${yellow}Note:${reset} Qwen Code uses commands/ directory instead\n`);
84
+ }
85
+ }
86
+
87
+ if (sourceDir && fs.existsSync(sourceDir)) {
88
+ const files = fs.readdirSync(sourceDir).filter(f => f.endsWith('.md'));
89
+
90
+ for (const file of files) {
91
+ const srcFile = path.join(sourceDir, file);
92
+ const destFile = path.join(ezCommandsDir, file);
93
+
94
+ try {
95
+ let content = fs.readFileSync(srcFile, 'utf-8');
96
+
97
+ // Update any references from skills/ to commands/
98
+ content = content.replace(/~\/\.qwen\/skills\//g, '~/.qwen/commands/');
99
+ content = content.replace(/\.qwen\/skills\//g, '.qwen/commands/');
100
+
101
+ fs.writeFileSync(destFile, content, 'utf-8');
102
+ console.log(`${green}✓${reset} Copied ${file}`);
103
+ } catch (err) {
104
+ console.log(`${red}✗${reset} Failed to copy ${file}: ${err.message}`);
105
+ }
106
+ }
107
+
108
+ console.log(`\n${green}✓${reset} Copied ${files.length} commands\n`);
109
+ } else {
110
+ console.log(`${yellow}Note:${reset} No workflows found to copy`);
111
+ console.log(`The commands will be available after running ${cyan}ez-agents --qwen --global${reset} again\n`);
112
+ }
113
+
114
+ // Verify installation
115
+ console.log(`${cyan}Step 3: Verifying installation${reset}`);
116
+ if (fs.existsSync(ezCommandsDir)) {
117
+ const commandFiles = fs.readdirSync(ezCommandsDir).filter(f => f.endsWith('.md'));
118
+ console.log(`${green}✓${reset} Found ${commandFiles.length} command files in ${ezCommandsDir}`);
119
+
120
+ if (commandFiles.length > 0) {
121
+ console.log(`\n${green}Success!${reset} EZ Agents commands are now available in Qwen Code\n`);
122
+ console.log(`Available commands:`);
123
+
124
+ // Show first 10 commands
125
+ const sampleCommands = commandFiles.slice(0, 10).map(f => f.replace('.md', ''));
126
+ sampleCommands.forEach(cmd => {
127
+ console.log(` ${cyan}/ez:${cmd}${reset}`);
128
+ });
129
+
130
+ if (commandFiles.length > 10) {
131
+ console.log(` ... and ${commandFiles.length - 10} more`);
132
+ }
133
+
134
+ console.log(`\n${green}Usage:${reset}`);
135
+ console.log(` Open a project in Qwen Code and run:`);
136
+ console.log(` ${cyan}/ez:help${reset} - Show all available commands`);
137
+ console.log(` ${cyan}/ez:new-project${reset} - Initialize new project`);
138
+ console.log(` ${cyan}/ez:quick${reset} - Quick start\n`);
139
+ }
140
+ } else {
141
+ console.log(`${red}✗${reset} Commands directory not created`);
142
+ }
143
+
144
+ console.log(`${cyan}Note:${reset} You may need to restart Qwen Code for changes to take effect\n`);
@@ -1,29 +1,29 @@
1
- #!/usr/bin/env node
2
- // Cross-platform test runner — resolves test file globs via Node
3
- // instead of relying on shell expansion (which fails on Windows PowerShell/cmd).
4
- // Propagates NODE_V8_COVERAGE so c8 collects coverage from the child process.
5
- 'use strict';
6
-
7
- const { readdirSync } = require('fs');
8
- const { join } = require('path');
9
- const { execFileSync } = require('child_process');
10
-
11
- const testDir = join(__dirname, '..', 'tests');
12
- const files = readdirSync(testDir)
13
- .filter(f => f.endsWith('.test.cjs'))
14
- .sort()
15
- .map(f => join('tests', f));
16
-
17
- if (files.length === 0) {
18
- console.error('No test files found in tests/');
19
- process.exit(1);
20
- }
21
-
22
- try {
23
- execFileSync(process.execPath, ['--test', ...files], {
24
- stdio: 'inherit',
25
- env: { ...process.env },
26
- });
27
- } catch (err) {
28
- process.exit(err.status || 1);
29
- }
1
+ #!/usr/bin/env node
2
+ // Cross-platform test runner — resolves test file globs via Node
3
+ // instead of relying on shell expansion (which fails on Windows PowerShell/cmd).
4
+ // Propagates NODE_V8_COVERAGE so c8 collects coverage from the child process.
5
+ 'use strict';
6
+
7
+ const { readdirSync } = require('fs');
8
+ const { join } = require('path');
9
+ const { execFileSync } = require('child_process');
10
+
11
+ const testDir = join(__dirname, '..', 'tests');
12
+ const files = readdirSync(testDir)
13
+ .filter(f => f.endsWith('.test.cjs'))
14
+ .sort()
15
+ .map(f => join('tests', f));
16
+
17
+ if (files.length === 0) {
18
+ console.error('No test files found in tests/');
19
+ process.exit(1);
20
+ }
21
+
22
+ try {
23
+ execFileSync(process.execPath, ['--test', ...files], {
24
+ stdio: 'inherit',
25
+ env: { ...process.env },
26
+ });
27
+ } catch (err) {
28
+ process.exit(err.status || 1);
29
+ }