@howlil/ez-agents 3.4.2 → 4.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/README.md +735 -462
- package/agents/ez-architect-agent.md +267 -0
- package/agents/ez-backend-agent.md +303 -0
- package/agents/ez-chief-strategist.md +271 -0
- package/agents/ez-codebase-mapper.md +770 -770
- package/agents/ez-context-manager.md +319 -0
- package/agents/ez-debugger.md +1255 -1255
- package/agents/ez-design-expert.md +347 -0
- package/agents/ez-devops-agent.md +331 -0
- package/agents/ez-executor.md +487 -487
- package/agents/ez-frontend-agent.md +322 -0
- package/agents/ez-phase-researcher.md +553 -553
- package/agents/ez-planner.md +1307 -1307
- package/agents/ez-product-engineer.md +435 -0
- package/agents/ez-project-researcher.md +629 -629
- package/agents/ez-qa-agent.md +320 -0
- package/agents/ez-release-agent.md +333 -0
- package/agents/ez-requirements-agent.md +377 -0
- package/agents/ez-roadmapper.md +650 -650
- package/agents/ez-technical-writer.md +551 -0
- package/agents/ez-ux-expert.md +393 -0
- package/agents/ez-verifier.md +579 -579
- package/bin/guards/autonomy-guard.cjs +346 -0
- package/bin/guards/context-budget-guard.cjs +278 -0
- package/bin/guards/hallucination-guard.cjs +380 -0
- package/bin/guards/hidden-state-guard.cjs +182 -0
- package/bin/guards/team-overhead-guard.cjs +266 -0
- package/bin/guards/tool-sprawl-guard.cjs +271 -0
- package/bin/install.js +3221 -3272
- package/bin/lib/analytics/analytics-collector.cjs +86 -0
- package/bin/lib/analytics/analytics-reporter.cjs +130 -0
- package/bin/lib/analytics/cohort-analyzer.cjs +138 -0
- package/bin/lib/analytics/funnel-analyzer.cjs +147 -0
- package/bin/lib/analytics/nps-tracker.cjs +147 -0
- package/bin/lib/archetype-detector.cjs +289 -0
- package/bin/lib/assistant-adapter.cjs +361 -0
- package/bin/lib/audit-exec.cjs +175 -0
- package/bin/lib/auth.cjs +176 -0
- package/bin/lib/backup-service.cjs +422 -0
- package/bin/lib/bdd-validator.cjs +622 -0
- package/bin/lib/business-flow-mapper.cjs +429 -0
- package/bin/lib/circuit-breaker.cjs +276 -0
- package/bin/lib/code-complexity-analyzer.cjs +360 -0
- package/bin/lib/codebase-analyzer.cjs +241 -0
- package/bin/lib/commands.cjs +691 -0
- package/bin/lib/config.cjs +236 -0
- package/bin/lib/constraint-extractor.cjs +526 -0
- package/bin/lib/content-scanner.cjs +238 -0
- package/bin/lib/context-cache.cjs +154 -0
- package/bin/lib/context-compressor.cjs +102 -0
- package/bin/lib/context-deduplicator.cjs +105 -0
- package/bin/lib/context-errors.cjs +78 -0
- package/bin/lib/context-manager.cjs +338 -0
- package/bin/lib/context-metadata-tracker.cjs +140 -0
- package/bin/lib/context-relevance-scorer.cjs +99 -0
- package/bin/lib/core.cjs +507 -0
- package/bin/lib/cost-alerts.cjs +174 -0
- package/bin/lib/cost-tracker.cjs +275 -0
- package/bin/lib/crash-recovery.cjs +220 -0
- package/bin/lib/dependency-graph.cjs +319 -0
- package/bin/lib/deploy/deploy-audit-log.cjs +76 -0
- package/bin/lib/deploy/deploy-detector.cjs +69 -0
- package/bin/lib/deploy/deploy-env-manager.cjs +109 -0
- package/bin/lib/deploy/deploy-health-check.cjs +88 -0
- package/bin/lib/deploy/deploy-pre-flight.cjs +57 -0
- package/bin/lib/deploy/deploy-rollback.cjs +72 -0
- package/bin/lib/deploy/deploy-runner.cjs +97 -0
- package/bin/lib/deploy/deploy-status.cjs +74 -0
- package/bin/lib/discussion-synthesizer.cjs +439 -0
- package/bin/lib/error-cache.cjs +114 -0
- package/bin/lib/error-registry.cjs +177 -0
- package/bin/lib/file-access.cjs +207 -0
- package/bin/lib/file-lock.cjs +236 -0
- package/bin/lib/finops/budget-enforcer.cjs +126 -0
- package/bin/lib/finops/cost-reporter.cjs +132 -0
- package/bin/lib/finops/finops-analyzer.cjs +112 -0
- package/bin/lib/finops/spot-manager.cjs +118 -0
- package/bin/lib/framework-detector.cjs +396 -0
- package/bin/lib/frontmatter.cjs +313 -0
- package/bin/lib/fs-utils.cjs +153 -0
- package/bin/lib/gate-executor.cjs +272 -0
- package/bin/lib/gates/README.md +374 -0
- package/bin/lib/gates/gate-01-requirement.cjs +303 -0
- package/bin/lib/gates/gate-02-architecture.cjs +555 -0
- package/bin/lib/gates/gate-03-code.cjs +635 -0
- package/bin/lib/gates/gate-04-security.cjs +829 -0
- package/bin/lib/git-errors.cjs +83 -0
- package/bin/lib/git-utils.cjs +321 -0
- package/bin/lib/git-workflow-engine.cjs +1157 -0
- package/bin/lib/health-check.cjs +227 -0
- package/bin/lib/index.cjs +279 -0
- package/bin/lib/init.cjs +725 -0
- package/bin/lib/lock-logger.cjs +194 -0
- package/bin/lib/lock-state.cjs +263 -0
- package/bin/lib/lockfile-validator.cjs +227 -0
- package/bin/lib/log-rotation.cjs +71 -0
- package/bin/lib/logger.cjs +125 -0
- package/bin/lib/memory-compression.cjs +256 -0
- package/bin/lib/milestone.cjs +247 -0
- package/bin/lib/model-provider.cjs +241 -0
- package/bin/lib/package-manager-detector.cjs +203 -0
- package/bin/lib/package-manager-executor.cjs +385 -0
- package/bin/lib/package-manager-service.cjs +216 -0
- package/bin/lib/perf/api-monitor.cjs +88 -0
- package/bin/lib/perf/db-optimizer.cjs +78 -0
- package/bin/lib/perf/frontend-performance.cjs +56 -0
- package/bin/lib/perf/perf-analyzer.cjs +77 -0
- package/bin/lib/perf/perf-baseline.cjs +102 -0
- package/bin/lib/perf/perf-reporter.cjs +117 -0
- package/bin/lib/perf/regression-detector.cjs +92 -0
- package/bin/lib/phase.cjs +963 -0
- package/bin/lib/planning-write.cjs +123 -0
- package/bin/lib/project-reporter.cjs +565 -0
- package/bin/lib/quality-gate.cjs +332 -0
- package/bin/lib/quality-metrics.cjs +324 -0
- package/bin/lib/recovery-manager.cjs +98 -0
- package/bin/lib/release-validator.cjs +617 -0
- package/bin/lib/retry.cjs +119 -0
- package/bin/lib/roadmap.cjs +309 -0
- package/bin/lib/safe-exec.cjs +173 -0
- package/bin/lib/safe-path.cjs +130 -0
- package/bin/lib/security-errors.cjs +62 -0
- package/bin/lib/session-chain.cjs +304 -0
- package/bin/lib/session-errors.cjs +81 -0
- package/bin/lib/session-export.cjs +251 -0
- package/bin/lib/session-import.cjs +262 -0
- package/bin/lib/session-manager.cjs +280 -0
- package/bin/lib/skill-context.cjs +148 -0
- package/bin/lib/skill-matcher.cjs +236 -0
- package/bin/lib/skill-registry.cjs +360 -0
- package/bin/lib/skill-resolver.cjs +449 -0
- package/bin/lib/skill-triggers.cjs +90 -0
- package/bin/lib/skill-validator.cjs +270 -0
- package/bin/lib/skill-versioning.cjs +355 -0
- package/bin/lib/stack-detector.cjs +399 -0
- package/bin/lib/state.cjs +736 -0
- package/bin/lib/tech-debt-analyzer.cjs +309 -0
- package/bin/lib/temp-file.cjs +239 -0
- package/bin/lib/template.cjs +223 -0
- package/bin/lib/test-file-lock.cjs +112 -0
- package/bin/lib/test-graceful.cjs +93 -0
- package/bin/lib/test-logger.cjs +60 -0
- package/bin/lib/test-safe-exec.cjs +38 -0
- package/bin/lib/test-safe-path.cjs +33 -0
- package/bin/lib/test-temp-file.cjs +125 -0
- package/bin/lib/tier-manager.cjs +428 -0
- package/bin/lib/timeout-exec.cjs +63 -0
- package/bin/lib/tradeoff-analyzer.cjs +284 -0
- package/bin/lib/url-fetch.cjs +170 -0
- package/bin/lib/verify.cjs +863 -0
- package/bin/update.js +217 -214
- package/commands/deploy.cjs +53 -0
- package/commands/ez/add-tests.md +41 -41
- package/commands/ez/audit-milestone.md +36 -36
- package/commands/ez/complete-milestone.md +136 -136
- package/commands/ez/discuss-phase.md +90 -90
- package/commands/ez/execute-phase.md +52 -41
- package/commands/ez/help.md +22 -22
- package/commands/ez/map-codebase.md +71 -71
- package/commands/ez/new-milestone.md +44 -44
- package/commands/ez/new-project.md +51 -42
- package/commands/ez/plan-phase.md +53 -45
- package/commands/ez/progress.md +36 -24
- package/commands/ez/quick.md +45 -45
- package/commands/ez/resume-work.md +40 -40
- package/commands/ez/run-phase.md +580 -0
- package/commands/ez/settings.md +36 -36
- package/commands/ez/update.md +37 -37
- package/commands/ez/verify-work.md +402 -38
- package/commands/health-check.cjs +44 -0
- package/commands/rollback.cjs +47 -0
- package/ez-agents/bin/ez-tools.cjs +1692 -716
- package/ez-agents/bin/guards/autonomy-guard.cjs +346 -0
- package/ez-agents/bin/guards/context-budget-guard.cjs +247 -0
- package/ez-agents/bin/guards/hallucination-guard.cjs +271 -0
- package/ez-agents/bin/guards/hidden-state-guard.cjs +182 -0
- package/ez-agents/bin/guards/team-overhead-guard.cjs +266 -0
- package/ez-agents/bin/guards/tool-sprawl-guard.cjs +271 -0
- package/ez-agents/bin/lib/analytics/analytics-collector.cjs +86 -0
- package/ez-agents/bin/lib/analytics/analytics-reporter.cjs +130 -0
- package/ez-agents/bin/lib/analytics/cohort-analyzer.cjs +138 -0
- package/ez-agents/bin/lib/analytics/funnel-analyzer.cjs +147 -0
- package/ez-agents/bin/lib/analytics/nps-tracker.cjs +147 -0
- package/ez-agents/bin/lib/archetype-detector.cjs +289 -0
- package/ez-agents/bin/lib/audit-exec.cjs +166 -167
- package/ez-agents/bin/lib/auth.cjs +176 -176
- package/ez-agents/bin/lib/backup-service.cjs +422 -0
- package/ez-agents/bin/lib/bdd-validator.cjs +622 -0
- package/ez-agents/bin/lib/business-flow-mapper.cjs +429 -0
- package/ez-agents/bin/lib/code-complexity-analyzer.cjs +360 -0
- package/ez-agents/bin/lib/codebase-analyzer.cjs +241 -0
- package/ez-agents/bin/lib/commands.cjs +685 -685
- package/ez-agents/bin/lib/config.cjs +41 -1
- package/ez-agents/bin/lib/constraint-extractor.cjs +526 -0
- package/ez-agents/bin/lib/content-scanner.cjs +238 -0
- package/ez-agents/bin/lib/context-cache.cjs +154 -0
- package/ez-agents/bin/lib/context-errors.cjs +71 -0
- package/ez-agents/bin/lib/context-manager.cjs +220 -0
- package/ez-agents/bin/lib/core.cjs +507 -512
- package/ez-agents/bin/lib/cost-tracker.cjs +243 -0
- package/ez-agents/bin/lib/crash-recovery.cjs +172 -0
- package/ez-agents/bin/lib/dependency-graph.cjs +319 -0
- package/ez-agents/bin/lib/deploy/deploy-audit-log.cjs +76 -0
- package/ez-agents/bin/lib/deploy/deploy-detector.cjs +69 -0
- package/ez-agents/bin/lib/deploy/deploy-env-manager.cjs +109 -0
- package/ez-agents/bin/lib/deploy/deploy-health-check.cjs +88 -0
- package/ez-agents/bin/lib/deploy/deploy-pre-flight.cjs +57 -0
- package/ez-agents/bin/lib/deploy/deploy-rollback.cjs +72 -0
- package/ez-agents/bin/lib/deploy/deploy-runner.cjs +97 -0
- package/ez-agents/bin/lib/deploy/deploy-status.cjs +74 -0
- package/ez-agents/bin/lib/discussion-synthesizer.cjs +458 -0
- package/ez-agents/bin/lib/file-access.cjs +207 -0
- package/ez-agents/bin/lib/finops/budget-enforcer.cjs +126 -0
- package/ez-agents/bin/lib/finops/cost-reporter.cjs +132 -0
- package/ez-agents/bin/lib/finops/finops-analyzer.cjs +112 -0
- package/ez-agents/bin/lib/finops/spot-manager.cjs +118 -0
- package/ez-agents/bin/lib/framework-detector.cjs +396 -0
- package/ez-agents/bin/lib/frontmatter.cjs +3 -1
- package/ez-agents/bin/lib/gates/README.md +374 -0
- package/ez-agents/bin/lib/gates/gate-01-requirement.cjs +303 -0
- package/ez-agents/bin/lib/gates/gate-02-architecture.cjs +555 -0
- package/ez-agents/bin/lib/gates/gate-03-code.cjs +635 -0
- package/ez-agents/bin/lib/gates/gate-04-security.cjs +829 -0
- package/ez-agents/bin/lib/git-errors.cjs +83 -0
- package/ez-agents/bin/lib/git-utils.cjs +118 -0
- package/ez-agents/bin/lib/git-workflow-engine.cjs +1157 -0
- package/ez-agents/bin/lib/health-check.cjs +162 -162
- package/ez-agents/bin/lib/index.cjs +40 -2
- package/ez-agents/bin/lib/init.cjs +0 -2
- package/ez-agents/bin/lib/lockfile-validator.cjs +227 -0
- package/ez-agents/bin/lib/log-rotation.cjs +71 -0
- package/ez-agents/bin/lib/logger.cjs +99 -154
- package/ez-agents/bin/lib/memory-compression.cjs +256 -0
- package/ez-agents/bin/lib/package-manager-detector.cjs +203 -0
- package/ez-agents/bin/lib/package-manager-executor.cjs +385 -0
- package/ez-agents/bin/lib/package-manager-service.cjs +216 -0
- package/ez-agents/bin/lib/perf/api-monitor.cjs +88 -0
- package/ez-agents/bin/lib/perf/db-optimizer.cjs +78 -0
- package/ez-agents/bin/lib/perf/frontend-performance.cjs +56 -0
- package/ez-agents/bin/lib/perf/perf-analyzer.cjs +77 -0
- package/ez-agents/bin/lib/perf/perf-baseline.cjs +102 -0
- package/ez-agents/bin/lib/perf/perf-reporter.cjs +117 -0
- package/ez-agents/bin/lib/perf/regression-detector.cjs +92 -0
- package/ez-agents/bin/lib/project-reporter.cjs +502 -0
- package/ez-agents/bin/lib/quality-gate.cjs +332 -0
- package/ez-agents/bin/lib/recovery-manager.cjs +98 -0
- package/ez-agents/bin/lib/release-validator.cjs +617 -0
- package/ez-agents/bin/lib/safe-exec.cjs +128 -214
- package/ez-agents/bin/lib/security-errors.cjs +62 -0
- package/ez-agents/bin/lib/session-chain.cjs +304 -0
- package/ez-agents/bin/lib/session-errors.cjs +81 -0
- package/ez-agents/bin/lib/session-export.cjs +251 -0
- package/ez-agents/bin/lib/session-import.cjs +262 -0
- package/ez-agents/bin/lib/session-manager.cjs +280 -0
- package/ez-agents/bin/lib/skill-context.cjs +148 -0
- package/ez-agents/bin/lib/skill-matcher.cjs +236 -0
- package/ez-agents/bin/lib/skill-registry.cjs +341 -0
- package/ez-agents/bin/lib/skill-resolver.cjs +449 -0
- package/ez-agents/bin/lib/skill-triggers.cjs +90 -0
- package/ez-agents/bin/lib/skill-validator.cjs +270 -0
- package/ez-agents/bin/lib/skill-versioning.cjs +355 -0
- package/ez-agents/bin/lib/stack-detector.cjs +399 -0
- package/ez-agents/bin/lib/tech-debt-analyzer.cjs +309 -0
- package/ez-agents/bin/lib/tier-manager.cjs +428 -0
- package/ez-agents/bin/lib/tradeoff-analyzer.cjs +284 -0
- package/ez-agents/bin/lib/url-fetch.cjs +170 -0
- package/ez-agents/bin/lib/verify.cjs +863 -863
- package/ez-agents/references/decimal-phase-calculation.md +65 -65
- package/ez-agents/references/git-integration.md +248 -248
- package/ez-agents/references/git-planning-commit.md +38 -38
- package/ez-agents/references/metrics-schema.md +118 -0
- package/ez-agents/references/model-profile-resolution.md +34 -34
- package/ez-agents/references/model-profiles.md +93 -93
- package/ez-agents/references/phase-argument-parsing.md +61 -61
- package/ez-agents/references/planning-config.md +340 -200
- package/ez-agents/references/tier-strategy.md +103 -0
- package/ez-agents/references/ui-brand.md +160 -160
- package/ez-agents/references/verification-patterns.md +612 -612
- package/ez-agents/templates/DEBUG.md +164 -164
- package/ez-agents/templates/UAT.md +247 -247
- package/ez-agents/templates/agent-output-format.md +404 -0
- package/ez-agents/templates/bdd-feature.md +173 -0
- package/ez-agents/templates/codebase/architecture.md +255 -255
- package/ez-agents/templates/codebase/structure.md +285 -285
- package/ez-agents/templates/copilot-instructions.md +7 -7
- package/ez-agents/templates/debug-subagent-prompt.md +91 -91
- package/ez-agents/templates/discovery.md +146 -146
- package/ez-agents/templates/discussion.md +68 -0
- package/ez-agents/templates/handoff-protocol.md +294 -0
- package/ez-agents/templates/incident-runbook.md +205 -0
- package/ez-agents/templates/mode-workflow-templates.md +301 -0
- package/ez-agents/templates/phase-prompt.md +610 -610
- package/ez-agents/templates/planner-subagent-prompt.md +117 -117
- package/ez-agents/templates/project.md +184 -184
- package/ez-agents/templates/release-checklist.md +136 -0
- package/ez-agents/templates/research.md +552 -552
- package/ez-agents/templates/rollback-plan.md +201 -0
- package/ez-agents/templates/security-user-setup.md +244 -0
- package/ez-agents/templates/skill-validation-rules.md +476 -0
- package/ez-agents/templates/state.md +180 -176
- package/ez-agents/templates/summary-complex.md +59 -59
- package/ez-agents/tests/gates/gate-01-02.test.cjs +812 -0
- package/ez-agents/tests/gates/gate-03-04.test.cjs +762 -0
- package/ez-agents/tests/gates/gate-05-validator.test.cjs +145 -0
- package/ez-agents/tests/gates/gate-06-docs-validator.test.cjs +244 -0
- package/ez-agents/tests/gates/gate-07-release-validator.test.cjs +219 -0
- package/ez-agents/tests/guards/context-budget-guard.test.cjs +145 -0
- package/ez-agents/tests/guards/edge-case-guards.test.cjs +238 -0
- package/ez-agents/tests/guards/hallucination-guard.test.cjs +124 -0
- package/ez-agents/workflows/audit-milestone.md +1 -1
- package/ez-agents/workflows/autonomous.md +131 -30
- package/ez-agents/workflows/complete-milestone.md +1 -1
- package/ez-agents/workflows/discuss-phase.md +1 -1
- package/ez-agents/workflows/execute-phase.md +169 -3
- package/ez-agents/workflows/help.md +86 -133
- package/ez-agents/workflows/hotfix.md +291 -0
- package/ez-agents/workflows/new-milestone.md +340 -11
- package/ez-agents/workflows/new-project.md +294 -318
- package/ez-agents/workflows/plan-phase.md +22 -40
- package/ez-agents/workflows/progress.md +15 -25
- package/ez-agents/workflows/release.md +253 -0
- package/ez-agents/workflows/resume-session.md +215 -0
- package/ez-agents/workflows/run-phase.md +531 -0
- package/ez-agents/workflows/settings.md +2 -35
- package/hooks/dist/ez-check-update.js +81 -81
- package/hooks/dist/ez-context-monitor.js +148 -141
- package/hooks/dist/ez-statusline.js +115 -115
- package/package.json +78 -64
- package/scripts/fix-qwen-installation.js +144 -144
- package/agents/ez-integration-checker.md +0 -443
- package/agents/ez-nyquist-auditor.md +0 -176
- package/agents/ez-plan-checker.md +0 -706
- package/agents/ez-research-synthesizer.md +0 -247
- package/agents/ez-ui-auditor.md +0 -439
- package/agents/ez-ui-checker.md +0 -300
- package/agents/ez-ui-researcher.md +0 -353
- package/commands/ez/add-phase.md +0 -43
- package/commands/ez/add-todo.md +0 -47
- package/commands/ez/auth.md +0 -87
- package/commands/ez/autonomous.md +0 -41
- package/commands/ez/check-todos.md +0 -45
- package/commands/ez/cleanup.md +0 -18
- package/commands/ez/debug.md +0 -168
- package/commands/ez/health.md +0 -22
- package/commands/ez/insert-phase.md +0 -32
- package/commands/ez/join-discord.md +0 -18
- package/commands/ez/list-phase-assumptions.md +0 -46
- package/commands/ez/pause-work.md +0 -38
- package/commands/ez/plan-milestone-gaps.md +0 -34
- package/commands/ez/reapply-patches.md +0 -124
- package/commands/ez/remove-phase.md +0 -31
- package/commands/ez/research-phase.md +0 -190
- package/commands/ez/set-profile.md +0 -34
- package/commands/ez/stats.md +0 -18
- package/commands/ez/ui-phase.md +0 -34
- package/commands/ez/ui-review.md +0 -32
- package/commands/ez/validate-phase.md +0 -35
- package/ez-agents/templates/UI-SPEC.md +0 -100
- package/ez-agents/templates/VALIDATION.md +0 -76
- package/ez-agents/templates/context.md +0 -352
- package/ez-agents/templates/verification-report.md +0 -322
- package/ez-agents/workflows/research-phase.md +0 -74
- package/ez-agents/workflows/ui-phase.md +0 -290
- package/ez-agents/workflows/ui-review.md +0 -157
- package/ez-agents/workflows/validate-phase.md +0 -167
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// Claude Code Statusline - EZ Agents Edition
|
|
3
|
-
// Shows: model | current task | directory | context usage
|
|
4
|
-
|
|
5
|
-
const fs = require('fs');
|
|
6
|
-
const path = require('path');
|
|
7
|
-
const os = require('os');
|
|
8
|
-
|
|
9
|
-
// Read JSON from stdin
|
|
10
|
-
let input = '';
|
|
11
|
-
// Timeout guard: if stdin doesn't close within 3s (e.g. pipe issues on
|
|
12
|
-
// Windows/Git Bash), exit silently instead of hanging. See #775.
|
|
13
|
-
const stdinTimeout = setTimeout(() => process.exit(0), 3000);
|
|
14
|
-
process.stdin.setEncoding('utf8');
|
|
15
|
-
process.stdin.on('data', chunk => input += chunk);
|
|
16
|
-
process.stdin.on('end', () => {
|
|
17
|
-
clearTimeout(stdinTimeout);
|
|
18
|
-
try {
|
|
19
|
-
const data = JSON.parse(input);
|
|
20
|
-
const model = data.model?.display_name || 'Claude';
|
|
21
|
-
const dir = data.workspace?.current_dir || process.cwd();
|
|
22
|
-
const session = data.session_id || '';
|
|
23
|
-
const remaining = data.context_window?.remaining_percentage;
|
|
24
|
-
|
|
25
|
-
// Context window display (shows USED percentage scaled to usable context)
|
|
26
|
-
// Claude Code reserves ~16.5% for autocompact buffer, so usable context
|
|
27
|
-
// is 83.5% of the total window. We normalize to show 100% at that point.
|
|
28
|
-
const AUTO_COMPACT_BUFFER_PCT = 16.5;
|
|
29
|
-
let ctx = '';
|
|
30
|
-
if (remaining != null) {
|
|
31
|
-
// Normalize: subtract buffer from remaining, scale to usable range
|
|
32
|
-
const usableRemaining = Math.max(0, ((remaining - AUTO_COMPACT_BUFFER_PCT) / (100 - AUTO_COMPACT_BUFFER_PCT)) * 100);
|
|
33
|
-
const used = Math.max(0, Math.min(100, Math.round(100 - usableRemaining)));
|
|
34
|
-
|
|
35
|
-
// Write context metrics to bridge file for the context-monitor PostToolUse hook.
|
|
36
|
-
// The monitor reads this file to inject agent-facing warnings when context is low.
|
|
37
|
-
if (session) {
|
|
38
|
-
try {
|
|
39
|
-
const bridgePath = path.join(os.tmpdir(), `claude-ctx-${session}.json`);
|
|
40
|
-
const bridgeData = JSON.stringify({
|
|
41
|
-
session_id: session,
|
|
42
|
-
remaining_percentage: remaining,
|
|
43
|
-
used_pct: used,
|
|
44
|
-
timestamp: Math.floor(Date.now() / 1000)
|
|
45
|
-
});
|
|
46
|
-
fs.writeFileSync(bridgePath, bridgeData);
|
|
47
|
-
} catch (e) {
|
|
48
|
-
// Silent fail -- bridge is best-effort, don't break statusline
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Build progress bar (10 segments)
|
|
53
|
-
const filled = Math.floor(used / 10);
|
|
54
|
-
const bar = '█'.repeat(filled) + '░'.repeat(10 - filled);
|
|
55
|
-
|
|
56
|
-
// Color based on usable context thresholds
|
|
57
|
-
if (used < 50) {
|
|
58
|
-
ctx = ` \x1b[32m${bar} ${used}%\x1b[0m`;
|
|
59
|
-
} else if (used < 65) {
|
|
60
|
-
ctx = ` \x1b[33m${bar} ${used}%\x1b[0m`;
|
|
61
|
-
} else if (used < 80) {
|
|
62
|
-
ctx = ` \x1b[38;5;208m${bar} ${used}%\x1b[0m`;
|
|
63
|
-
} else {
|
|
64
|
-
ctx = ` \x1b[5;31m💀 ${bar} ${used}%\x1b[0m`;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Current task from todos
|
|
69
|
-
let task = '';
|
|
70
|
-
const homeDir = os.homedir();
|
|
71
|
-
// Respect CLAUDE_CONFIG_DIR for custom config directory setups (#870)
|
|
72
|
-
const claudeDir = process.env.CLAUDE_CONFIG_DIR || path.join(homeDir, '.claude');
|
|
73
|
-
const todosDir = path.join(claudeDir, 'todos');
|
|
74
|
-
if (session && fs.existsSync(todosDir)) {
|
|
75
|
-
try {
|
|
76
|
-
const files = fs.readdirSync(todosDir)
|
|
77
|
-
.filter(f => f.startsWith(session) && f.includes('-agent-') && f.endsWith('.json'))
|
|
78
|
-
.map(f => ({ name: f, mtime: fs.statSync(path.join(todosDir, f)).mtime }))
|
|
79
|
-
.sort((a, b) => b.mtime - a.mtime);
|
|
80
|
-
|
|
81
|
-
if (files.length > 0) {
|
|
82
|
-
try {
|
|
83
|
-
const todos = JSON.parse(fs.readFileSync(path.join(todosDir, files[0].name), 'utf8'));
|
|
84
|
-
const inProgress = todos.find(t => t.status === 'in_progress');
|
|
85
|
-
if (inProgress) task = inProgress.activeForm || '';
|
|
86
|
-
} catch (e) {}
|
|
87
|
-
}
|
|
88
|
-
} catch (e) {
|
|
89
|
-
// Silently fail on file system errors - don't break statusline
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// EZ Agents update available?
|
|
94
|
-
let ezUpdate = '';
|
|
95
|
-
const cacheFile = path.join(claudeDir, 'cache', 'ez-update-check.json');
|
|
96
|
-
if (fs.existsSync(cacheFile)) {
|
|
97
|
-
try {
|
|
98
|
-
const cache = JSON.parse(fs.readFileSync(cacheFile, 'utf8'));
|
|
99
|
-
if (cache.update_available) {
|
|
100
|
-
ezUpdate = '\x1b[33m⬆ /ez:update\x1b[0m │ ';
|
|
101
|
-
}
|
|
102
|
-
} catch (e) {}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Output
|
|
106
|
-
const dirname = path.basename(dir);
|
|
107
|
-
if (task) {
|
|
108
|
-
process.stdout.write(`${ezUpdate}\x1b[2m${model}\x1b[0m │ \x1b[1m${task}\x1b[0m │ \x1b[2m${dirname}\x1b[0m${ctx}`);
|
|
109
|
-
} else {
|
|
110
|
-
process.stdout.write(`${ezUpdate}\x1b[2m${model}\x1b[0m │ \x1b[2m${dirname}\x1b[0m${ctx}`);
|
|
111
|
-
}
|
|
112
|
-
} catch (e) {
|
|
113
|
-
// Silent fail - don't break statusline on parse errors
|
|
114
|
-
}
|
|
115
|
-
});
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Claude Code Statusline - EZ Agents Edition
|
|
3
|
+
// Shows: model | current task | directory | context usage
|
|
4
|
+
|
|
5
|
+
const fs = require('fs');
|
|
6
|
+
const path = require('path');
|
|
7
|
+
const os = require('os');
|
|
8
|
+
|
|
9
|
+
// Read JSON from stdin
|
|
10
|
+
let input = '';
|
|
11
|
+
// Timeout guard: if stdin doesn't close within 3s (e.g. pipe issues on
|
|
12
|
+
// Windows/Git Bash), exit silently instead of hanging. See #775.
|
|
13
|
+
const stdinTimeout = setTimeout(() => process.exit(0), 3000);
|
|
14
|
+
process.stdin.setEncoding('utf8');
|
|
15
|
+
process.stdin.on('data', chunk => input += chunk);
|
|
16
|
+
process.stdin.on('end', () => {
|
|
17
|
+
clearTimeout(stdinTimeout);
|
|
18
|
+
try {
|
|
19
|
+
const data = JSON.parse(input);
|
|
20
|
+
const model = data.model?.display_name || 'Claude';
|
|
21
|
+
const dir = data.workspace?.current_dir || process.cwd();
|
|
22
|
+
const session = data.session_id || '';
|
|
23
|
+
const remaining = data.context_window?.remaining_percentage;
|
|
24
|
+
|
|
25
|
+
// Context window display (shows USED percentage scaled to usable context)
|
|
26
|
+
// Claude Code reserves ~16.5% for autocompact buffer, so usable context
|
|
27
|
+
// is 83.5% of the total window. We normalize to show 100% at that point.
|
|
28
|
+
const AUTO_COMPACT_BUFFER_PCT = 16.5;
|
|
29
|
+
let ctx = '';
|
|
30
|
+
if (remaining != null) {
|
|
31
|
+
// Normalize: subtract buffer from remaining, scale to usable range
|
|
32
|
+
const usableRemaining = Math.max(0, ((remaining - AUTO_COMPACT_BUFFER_PCT) / (100 - AUTO_COMPACT_BUFFER_PCT)) * 100);
|
|
33
|
+
const used = Math.max(0, Math.min(100, Math.round(100 - usableRemaining)));
|
|
34
|
+
|
|
35
|
+
// Write context metrics to bridge file for the context-monitor PostToolUse hook.
|
|
36
|
+
// The monitor reads this file to inject agent-facing warnings when context is low.
|
|
37
|
+
if (session) {
|
|
38
|
+
try {
|
|
39
|
+
const bridgePath = path.join(os.tmpdir(), `claude-ctx-${session}.json`);
|
|
40
|
+
const bridgeData = JSON.stringify({
|
|
41
|
+
session_id: session,
|
|
42
|
+
remaining_percentage: remaining,
|
|
43
|
+
used_pct: used,
|
|
44
|
+
timestamp: Math.floor(Date.now() / 1000)
|
|
45
|
+
});
|
|
46
|
+
fs.writeFileSync(bridgePath, bridgeData);
|
|
47
|
+
} catch (e) {
|
|
48
|
+
// Silent fail -- bridge is best-effort, don't break statusline
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Build progress bar (10 segments)
|
|
53
|
+
const filled = Math.floor(used / 10);
|
|
54
|
+
const bar = '█'.repeat(filled) + '░'.repeat(10 - filled);
|
|
55
|
+
|
|
56
|
+
// Color based on usable context thresholds
|
|
57
|
+
if (used < 50) {
|
|
58
|
+
ctx = ` \x1b[32m${bar} ${used}%\x1b[0m`;
|
|
59
|
+
} else if (used < 65) {
|
|
60
|
+
ctx = ` \x1b[33m${bar} ${used}%\x1b[0m`;
|
|
61
|
+
} else if (used < 80) {
|
|
62
|
+
ctx = ` \x1b[38;5;208m${bar} ${used}%\x1b[0m`;
|
|
63
|
+
} else {
|
|
64
|
+
ctx = ` \x1b[5;31m💀 ${bar} ${used}%\x1b[0m`;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Current task from todos
|
|
69
|
+
let task = '';
|
|
70
|
+
const homeDir = os.homedir();
|
|
71
|
+
// Respect CLAUDE_CONFIG_DIR for custom config directory setups (#870)
|
|
72
|
+
const claudeDir = process.env.CLAUDE_CONFIG_DIR || path.join(homeDir, '.claude');
|
|
73
|
+
const todosDir = path.join(claudeDir, 'todos');
|
|
74
|
+
if (session && fs.existsSync(todosDir)) {
|
|
75
|
+
try {
|
|
76
|
+
const files = fs.readdirSync(todosDir)
|
|
77
|
+
.filter(f => f.startsWith(session) && f.includes('-agent-') && f.endsWith('.json'))
|
|
78
|
+
.map(f => ({ name: f, mtime: fs.statSync(path.join(todosDir, f)).mtime }))
|
|
79
|
+
.sort((a, b) => b.mtime - a.mtime);
|
|
80
|
+
|
|
81
|
+
if (files.length > 0) {
|
|
82
|
+
try {
|
|
83
|
+
const todos = JSON.parse(fs.readFileSync(path.join(todosDir, files[0].name), 'utf8'));
|
|
84
|
+
const inProgress = todos.find(t => t.status === 'in_progress');
|
|
85
|
+
if (inProgress) task = inProgress.activeForm || '';
|
|
86
|
+
} catch (e) {}
|
|
87
|
+
}
|
|
88
|
+
} catch (e) {
|
|
89
|
+
// Silently fail on file system errors - don't break statusline
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// EZ Agents update available?
|
|
94
|
+
let ezUpdate = '';
|
|
95
|
+
const cacheFile = path.join(claudeDir, 'cache', 'ez-update-check.json');
|
|
96
|
+
if (fs.existsSync(cacheFile)) {
|
|
97
|
+
try {
|
|
98
|
+
const cache = JSON.parse(fs.readFileSync(cacheFile, 'utf8'));
|
|
99
|
+
if (cache.update_available) {
|
|
100
|
+
ezUpdate = '\x1b[33m⬆ /ez:update\x1b[0m │ ';
|
|
101
|
+
}
|
|
102
|
+
} catch (e) {}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Output
|
|
106
|
+
const dirname = path.basename(dir);
|
|
107
|
+
if (task) {
|
|
108
|
+
process.stdout.write(`${ezUpdate}\x1b[2m${model}\x1b[0m │ \x1b[1m${task}\x1b[0m │ \x1b[2m${dirname}\x1b[0m${ctx}`);
|
|
109
|
+
} else {
|
|
110
|
+
process.stdout.write(`${ezUpdate}\x1b[2m${model}\x1b[0m │ \x1b[2m${dirname}\x1b[0m${ctx}`);
|
|
111
|
+
}
|
|
112
|
+
} catch (e) {
|
|
113
|
+
// Silent fail - don't break statusline on parse errors
|
|
114
|
+
}
|
|
115
|
+
});
|
package/package.json
CHANGED
|
@@ -1,64 +1,78 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@howlil/ez-agents",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "EZ Agents — Meta-prompting with multi-model support (Qwen, Kimi, OpenAI)",
|
|
5
|
-
"bin": {
|
|
6
|
-
"ez-agents": "bin/install.js"
|
|
7
|
-
},
|
|
8
|
-
"files": [
|
|
9
|
-
"bin",
|
|
10
|
-
"commands",
|
|
11
|
-
"ez-agents",
|
|
12
|
-
"agents",
|
|
13
|
-
"hooks/dist",
|
|
14
|
-
"scripts"
|
|
15
|
-
],
|
|
16
|
-
"keywords": [
|
|
17
|
-
"claude",
|
|
18
|
-
"claude-code",
|
|
19
|
-
"ai",
|
|
20
|
-
"meta-prompting",
|
|
21
|
-
"context-engineering",
|
|
22
|
-
"spec-driven-development",
|
|
23
|
-
"gemini",
|
|
24
|
-
"gemini-cli",
|
|
25
|
-
"codex",
|
|
26
|
-
"codex-cli",
|
|
27
|
-
"ez-agents",
|
|
28
|
-
"agent-orchestration"
|
|
29
|
-
],
|
|
30
|
-
"author": "TÂCHES",
|
|
31
|
-
"license": "MIT",
|
|
32
|
-
"repository": {
|
|
33
|
-
"type": "git",
|
|
34
|
-
"url": "git+https://github.com/howlil/ez-agents.git"
|
|
35
|
-
},
|
|
36
|
-
"homepage": "https://github.com/howlil/ez-agents",
|
|
37
|
-
"bugs": {
|
|
38
|
-
"url": "https://github.com/howlil/ez-agents/issues"
|
|
39
|
-
},
|
|
40
|
-
"engines": {
|
|
41
|
-
"node": ">=16.7.0"
|
|
42
|
-
},
|
|
43
|
-
"devDependencies": {
|
|
44
|
-
"c8": "^11.0.0",
|
|
45
|
-
"
|
|
46
|
-
"husky": "^9.1.7",
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
"
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
"
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@howlil/ez-agents",
|
|
3
|
+
"version": "4.0.0",
|
|
4
|
+
"description": "EZ Agents — Meta-prompting with multi-model support (Qwen, Kimi, OpenAI)",
|
|
5
|
+
"bin": {
|
|
6
|
+
"ez-agents": "bin/install.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin",
|
|
10
|
+
"commands",
|
|
11
|
+
"ez-agents",
|
|
12
|
+
"agents",
|
|
13
|
+
"hooks/dist",
|
|
14
|
+
"scripts"
|
|
15
|
+
],
|
|
16
|
+
"keywords": [
|
|
17
|
+
"claude",
|
|
18
|
+
"claude-code",
|
|
19
|
+
"ai",
|
|
20
|
+
"meta-prompting",
|
|
21
|
+
"context-engineering",
|
|
22
|
+
"spec-driven-development",
|
|
23
|
+
"gemini",
|
|
24
|
+
"gemini-cli",
|
|
25
|
+
"codex",
|
|
26
|
+
"codex-cli",
|
|
27
|
+
"ez-agents",
|
|
28
|
+
"agent-orchestration"
|
|
29
|
+
],
|
|
30
|
+
"author": "TÂCHES",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "git+https://github.com/howlil/ez-agents.git"
|
|
35
|
+
},
|
|
36
|
+
"homepage": "https://github.com/howlil/ez-agents",
|
|
37
|
+
"bugs": {
|
|
38
|
+
"url": "https://github.com/howlil/ez-agents/issues"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=16.7.0"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"c8": "^11.0.0",
|
|
45
|
+
"eslint": "^8.57.0",
|
|
46
|
+
"husky": "^9.1.7",
|
|
47
|
+
"js-yaml": "^4.1.1",
|
|
48
|
+
"jsdoc": "^4.0.2",
|
|
49
|
+
"k6": "^0.0.0",
|
|
50
|
+
"lint-staged": "^15.5.2",
|
|
51
|
+
"markdownlint": "^0.40.0",
|
|
52
|
+
"vitest": "^4.1.0"
|
|
53
|
+
},
|
|
54
|
+
"scripts": {
|
|
55
|
+
"lint": "eslint . --ext .cjs,.js --max-warnings=0",
|
|
56
|
+
"lint:fix": "eslint . --ext .cjs,.js --fix",
|
|
57
|
+
"build:hooks": "node scripts/build-hooks.js",
|
|
58
|
+
"prepublishOnly": "npm run build:hooks",
|
|
59
|
+
"test": "node scripts/run-tests.cjs",
|
|
60
|
+
"test:coverage": "c8 --check-coverage --lines 70 --reporter text --include 'ez-agents/bin/lib/*.cjs' --exclude 'tests/**' --all node scripts/run-tests.cjs",
|
|
61
|
+
"test:a11y": "node tests/accessibility/run-a11y-tests.cjs",
|
|
62
|
+
"test:load": "k6 run tests/perf/load-test.js",
|
|
63
|
+
"security:scan": "npm audit --audit-level=moderate",
|
|
64
|
+
"docs:generate": "jsdoc -c jsdoc.json -r bin/ ez-agents/bin/lib/",
|
|
65
|
+
"prepare": "husky"
|
|
66
|
+
},
|
|
67
|
+
"lint-staged": {
|
|
68
|
+
"*.cjs": [
|
|
69
|
+
"node --test"
|
|
70
|
+
],
|
|
71
|
+
"*.md": [
|
|
72
|
+
"node scripts/run-tests.cjs"
|
|
73
|
+
]
|
|
74
|
+
},
|
|
75
|
+
"dependencies": {
|
|
76
|
+
"micromatch": "^4.0.5"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -1,144 +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
|
+
#!/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`);
|