@howlil/ez-agents 3.5.0 → 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 -537
- 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 -333
- package/agents/ez-requirements-agent.md +377 -377
- 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/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 -52
- 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 -53
- package/commands/ez/progress.md +36 -36
- 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 +599 -2
- 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 -622
- 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 -238
- package/ez-agents/bin/lib/context-cache.cjs +154 -154
- package/ez-agents/bin/lib/context-errors.cjs +71 -71
- package/ez-agents/bin/lib/context-manager.cjs +220 -220
- 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/file-access.cjs +207 -207
- 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 -83
- package/ez-agents/bin/lib/git-utils.cjs +321 -321
- package/ez-agents/bin/lib/git-workflow-engine.cjs +1157 -1157
- package/ez-agents/bin/lib/health-check.cjs +162 -162
- package/ez-agents/bin/lib/index.cjs +2 -8
- package/ez-agents/bin/lib/init.cjs +0 -2
- package/ez-agents/bin/lib/lockfile-validator.cjs +227 -227
- package/ez-agents/bin/lib/log-rotation.cjs +71 -0
- package/ez-agents/bin/lib/logger.cjs +22 -47
- package/ez-agents/bin/lib/memory-compression.cjs +256 -256
- package/ez-agents/bin/lib/package-manager-detector.cjs +203 -203
- package/ez-agents/bin/lib/package-manager-executor.cjs +385 -385
- package/ez-agents/bin/lib/package-manager-service.cjs +216 -216
- 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 -614
- package/ez-agents/bin/lib/security-errors.cjs +62 -0
- package/ez-agents/bin/lib/session-chain.cjs +304 -304
- package/ez-agents/bin/lib/session-errors.cjs +81 -81
- package/ez-agents/bin/lib/session-export.cjs +251 -251
- package/ez-agents/bin/lib/session-import.cjs +262 -262
- package/ez-agents/bin/lib/session-manager.cjs +280 -280
- 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 -428
- package/ez-agents/bin/lib/tradeoff-analyzer.cjs +284 -0
- package/ez-agents/bin/lib/url-fetch.cjs +170 -170
- 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 -118
- 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 -340
- package/ez-agents/references/tier-strategy.md +103 -103
- 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 -173
- 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 -68
- package/ez-agents/templates/handoff-protocol.md +294 -0
- package/ez-agents/templates/incident-runbook.md +205 -205
- 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 -133
- package/ez-agents/templates/research.md +552 -552
- package/ez-agents/templates/rollback-plan.md +201 -201
- 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 +844 -844
- 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 +124 -3
- package/ez-agents/workflows/help.md +42 -181
- package/ez-agents/workflows/hotfix.md +291 -291
- package/ez-agents/workflows/new-milestone.md +713 -713
- package/ez-agents/workflows/new-project.md +1089 -1107
- package/ez-agents/workflows/plan-phase.md +0 -40
- package/ez-agents/workflows/release.md +253 -253
- package/ez-agents/workflows/resume-session.md +215 -215
- 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 -71
- 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-observer-agent.md +0 -260
- package/agents/ez-plan-checker.md +0 -706
- package/agents/ez-research-synthesizer.md +0 -247
- package/agents/ez-scrum-master-agent.md +0 -242
- package/agents/ez-tech-lead-agent.md +0 -267
- 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/arch-review.md +0 -102
- 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/export-session.md +0 -79
- package/commands/ez/gather-requirements.md +0 -117
- package/commands/ez/git-workflow.md +0 -72
- package/commands/ez/health.md +0 -22
- package/commands/ez/hotfix.md +0 -120
- package/commands/ez/import-session.md +0 -82
- 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/list-sessions.md +0 -96
- package/commands/ez/package-manager.md +0 -316
- package/commands/ez/pause-work.md +0 -38
- package/commands/ez/plan-milestone-gaps.md +0 -34
- package/commands/ez/preflight.md +0 -79
- package/commands/ez/reapply-patches.md +0 -124
- package/commands/ez/release.md +0 -153
- package/commands/ez/remove-phase.md +0 -31
- package/commands/ez/research-phase.md +0 -190
- package/commands/ez/resume.md +0 -107
- package/commands/ez/set-profile.md +0 -34
- package/commands/ez/standup.md +0 -85
- 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/bin/lib/metrics-tracker.cjs +0 -406
- 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/arch-review.md +0 -54
- package/ez-agents/workflows/export-session.md +0 -255
- package/ez-agents/workflows/gather-requirements.md +0 -206
- package/ez-agents/workflows/import-session.md +0 -303
- package/ez-agents/workflows/research-phase.md +0 -74
- package/ez-agents/workflows/standup.md +0 -64
- 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
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Archetype Detector — Project type classification from codebase patterns
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - detect(structure, stack, flows): Pattern-based archetype detection
|
|
6
|
+
* - calculateConfidence(archetype, evidence): Confidence scoring
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
|
|
12
|
+
class ArchetypeDetector {
|
|
13
|
+
constructor(rootPath) {
|
|
14
|
+
this.rootPath = rootPath;
|
|
15
|
+
|
|
16
|
+
// Archetype patterns for detection
|
|
17
|
+
this.archetypePatterns = {
|
|
18
|
+
dashboard: {
|
|
19
|
+
patterns: ['Chart', 'Metric', 'Dashboard', 'Admin', 'Analytics', 'stats', 'metrics', 'analytics', 'graph', 'widget', 'kpi', 'report'],
|
|
20
|
+
routes: ['/dashboard', '/admin', '/analytics', '/reports', '/metrics'],
|
|
21
|
+
dependencies: ['recharts', 'chart.js', 'd3', 'plotly', 'highcharts', 'apexcharts']
|
|
22
|
+
},
|
|
23
|
+
POS: {
|
|
24
|
+
patterns: ['Product', 'Order', 'Payment', 'Cart', 'Checkout', 'Inventory', 'Store', 'Register', 'Terminal', 'Receipt', 'Cashier'],
|
|
25
|
+
routes: ['/pos', '/checkout', '/register', '/inventory', '/products'],
|
|
26
|
+
dependencies: ['stripe-terminal', 'square', '@stripe/stripe-js']
|
|
27
|
+
},
|
|
28
|
+
SaaS: {
|
|
29
|
+
patterns: ['Subscription', 'Tenant', 'Plan', 'Billing', 'User', 'Account', 'Recurring', 'Invoice', 'Pricing'],
|
|
30
|
+
routes: ['/subscription', '/billing', '/pricing', '/plans', '/account', '/settings'],
|
|
31
|
+
dependencies: ['stripe', '@stripe/stripe-js', 'paddle', 'lemonsqueezy']
|
|
32
|
+
},
|
|
33
|
+
ecommerce: {
|
|
34
|
+
patterns: ['Cart', 'Checkout', 'Product', 'Order', 'Shipping', 'Payment', 'Catalog', 'Wishlist', 'Review'],
|
|
35
|
+
routes: ['/products', '/cart', '/checkout', '/orders', '/wishlist', '/reviews'],
|
|
36
|
+
dependencies: ['@stripe/stripe-js', 'stripe', 'paypal', 'snipcart']
|
|
37
|
+
},
|
|
38
|
+
LMS: {
|
|
39
|
+
patterns: ['Course', 'Lesson', 'Student', 'Teacher', 'Quiz', 'Enrollment', 'Curriculum', 'Assignment', 'Grade'],
|
|
40
|
+
routes: ['/courses', '/lessons', '/students', '/teachers', '/quiz', '/assignments'],
|
|
41
|
+
dependencies: ['video.js', 'hls.js', 'plyr']
|
|
42
|
+
},
|
|
43
|
+
booking: {
|
|
44
|
+
patterns: ['Appointment', 'Booking', 'Availability', 'Calendar', 'Reservation', 'Schedule', 'Timeslot'],
|
|
45
|
+
routes: ['/booking', '/appointments', '/calendar', '/schedule', '/availability'],
|
|
46
|
+
dependencies: ['react-big-calendar', 'fullcalendar', 'react-calendar']
|
|
47
|
+
},
|
|
48
|
+
fintech: {
|
|
49
|
+
patterns: ['Transaction', 'Account', 'Payment', 'Balance', 'Compliance', 'KYC', 'AML', 'Ledger', 'Wallet', 'Transfer'],
|
|
50
|
+
routes: ['/accounts', '/transactions', '/transfer', '/wallet', '/ledger', '/compliance'],
|
|
51
|
+
dependencies: ['stripe', 'plaid', 'dwolla', 'unit']
|
|
52
|
+
},
|
|
53
|
+
internalTools: {
|
|
54
|
+
patterns: ['Admin', 'CRUD', 'Form', 'Table', 'Dashboard', 'Report', 'Config', 'Settings', 'Management'],
|
|
55
|
+
routes: ['/admin', '/management', '/config', '/settings', '/users', '/roles'],
|
|
56
|
+
dependencies: ['@tanstack/react-table', 'ag-grid', 'handsontable']
|
|
57
|
+
},
|
|
58
|
+
cms: {
|
|
59
|
+
patterns: ['Article', 'Page', 'Post', 'Media', 'Content', 'Block', 'Editor', 'Publish'],
|
|
60
|
+
routes: ['/articles', '/pages', '/posts', '/media', '/content'],
|
|
61
|
+
dependencies: ['@tiptap', 'slate', 'draft-js', 'quill', 'ckeditor']
|
|
62
|
+
},
|
|
63
|
+
social: {
|
|
64
|
+
patterns: ['Post', 'Comment', 'Feed', 'Follow', 'Like', 'Share', 'Profile', 'Notification', 'Message'],
|
|
65
|
+
routes: ['/feed', '/posts', '/profile', '/notifications', '/messages', '/followers'],
|
|
66
|
+
dependencies: ['socket.io', 'pusher', 'stream-chat']
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Detect project archetype from structure, stack, and flows
|
|
73
|
+
* @param {object} structure - Structure from CodebaseAnalyzer
|
|
74
|
+
* @param {object} stack - Stack from StackDetector
|
|
75
|
+
* @param {object} flows - Flows from BusinessFlowMapper
|
|
76
|
+
* @returns {object} Archetype detection result with name, confidence, evidence
|
|
77
|
+
*/
|
|
78
|
+
detect(structure = {}, stack = {}, flows = {}) {
|
|
79
|
+
const scores = {};
|
|
80
|
+
const evidence = {};
|
|
81
|
+
|
|
82
|
+
// Initialize scores for each archetype
|
|
83
|
+
for (const archetype of Object.keys(this.archetypePatterns)) {
|
|
84
|
+
scores[archetype] = 0;
|
|
85
|
+
evidence[archetype] = [];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Score based on file names
|
|
89
|
+
const files = structure.files || [];
|
|
90
|
+
for (const file of files) {
|
|
91
|
+
const fileName = path.basename(file);
|
|
92
|
+
this._scoreByFileName(fileName, scores, evidence);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Score based on directory names
|
|
96
|
+
const directories = structure.directories || [];
|
|
97
|
+
for (const dir of directories) {
|
|
98
|
+
const dirName = path.basename(dir.path);
|
|
99
|
+
this._scoreByDirectoryName(dirName, scores, evidence);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Score based on routes
|
|
103
|
+
const routes = flows.routes || [];
|
|
104
|
+
for (const route of routes) {
|
|
105
|
+
this._scoreByRoute(route.path, scores, evidence);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Score based on dependencies
|
|
109
|
+
const frameworks = stack.frameworks || [];
|
|
110
|
+
const infrastructure = stack.infrastructure || [];
|
|
111
|
+
const allDeps = [...frameworks, ...infrastructure];
|
|
112
|
+
this._scoreByDependencies(allDeps, scores, evidence);
|
|
113
|
+
|
|
114
|
+
// Find the highest scoring archetype
|
|
115
|
+
let bestArchetype = 'internalTools'; // Default
|
|
116
|
+
let bestScore = 0;
|
|
117
|
+
|
|
118
|
+
for (const [archetype, score] of Object.entries(scores)) {
|
|
119
|
+
if (score > bestScore) {
|
|
120
|
+
bestScore = score;
|
|
121
|
+
bestArchetype = archetype;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const confidence = this.calculateConfidence(bestArchetype, evidence[bestArchetype]);
|
|
126
|
+
|
|
127
|
+
return {
|
|
128
|
+
archetype: bestArchetype,
|
|
129
|
+
confidence: confidence.score,
|
|
130
|
+
confidenceLevel: confidence.level,
|
|
131
|
+
scores,
|
|
132
|
+
evidence: evidence[bestArchetype],
|
|
133
|
+
allEvidence: evidence
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Calculate confidence score for an archetype
|
|
139
|
+
* @param {string} archetype - Archetype name
|
|
140
|
+
* @param {Array} evidence - Array of evidence items
|
|
141
|
+
* @returns {object} Confidence with score (0-100) and level (High/Medium/Low)
|
|
142
|
+
*/
|
|
143
|
+
calculateConfidence(archetype, evidence = []) {
|
|
144
|
+
// Base score: evidence.length * 10
|
|
145
|
+
let score = evidence.length * 10;
|
|
146
|
+
|
|
147
|
+
// Bonus for file matches: +20 per file
|
|
148
|
+
const fileMatches = evidence.filter(e => e.type === 'file').length;
|
|
149
|
+
score += fileMatches * 20;
|
|
150
|
+
|
|
151
|
+
// Bonus for dependency matches: +15 per dependency
|
|
152
|
+
const depMatches = evidence.filter(e => e.type === 'dependency').length;
|
|
153
|
+
score += depMatches * 15;
|
|
154
|
+
|
|
155
|
+
// Bonus for route matches: +10 per route
|
|
156
|
+
const routeMatches = evidence.filter(e => e.type === 'route').length;
|
|
157
|
+
score += routeMatches * 10;
|
|
158
|
+
|
|
159
|
+
// Cap at 100
|
|
160
|
+
score = Math.min(score, 100);
|
|
161
|
+
|
|
162
|
+
// Determine level
|
|
163
|
+
let level;
|
|
164
|
+
if (score >= 80) {
|
|
165
|
+
level = 'High';
|
|
166
|
+
} else if (score >= 60) {
|
|
167
|
+
level = 'Medium';
|
|
168
|
+
} else {
|
|
169
|
+
level = 'Low';
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return { score, level };
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Score archetype by file name
|
|
177
|
+
* @private
|
|
178
|
+
*/
|
|
179
|
+
_scoreByFileName(fileName, scores, evidence) {
|
|
180
|
+
const nameWithoutExt = fileName.replace(/\.[^.]+$/, '');
|
|
181
|
+
|
|
182
|
+
for (const [archetype, config] of Object.entries(this.archetypePatterns)) {
|
|
183
|
+
for (const pattern of config.patterns) {
|
|
184
|
+
if (nameWithoutExt.toLowerCase().includes(pattern.toLowerCase())) {
|
|
185
|
+
scores[archetype] += 1;
|
|
186
|
+
evidence[archetype].push({
|
|
187
|
+
type: 'file',
|
|
188
|
+
value: fileName,
|
|
189
|
+
pattern
|
|
190
|
+
});
|
|
191
|
+
break; // Don't double-count same file
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Score archetype by directory name
|
|
199
|
+
* @private
|
|
200
|
+
*/
|
|
201
|
+
_scoreByDirectoryName(dirName, scores, evidence) {
|
|
202
|
+
for (const [archetype, config] of Object.entries(this.archetypePatterns)) {
|
|
203
|
+
for (const pattern of config.patterns) {
|
|
204
|
+
if (dirName.toLowerCase().includes(pattern.toLowerCase())) {
|
|
205
|
+
scores[archetype] += 2; // Directories are stronger signals
|
|
206
|
+
evidence[archetype].push({
|
|
207
|
+
type: 'directory',
|
|
208
|
+
value: dirName,
|
|
209
|
+
pattern
|
|
210
|
+
});
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Score archetype by route
|
|
219
|
+
* @private
|
|
220
|
+
*/
|
|
221
|
+
_scoreByRoute(routePath, scores, evidence) {
|
|
222
|
+
for (const [archetype, config] of Object.entries(this.archetypePatterns)) {
|
|
223
|
+
for (const routePattern of config.routes) {
|
|
224
|
+
if (routePath.toLowerCase().includes(routePattern.toLowerCase())) {
|
|
225
|
+
scores[archetype] += 2;
|
|
226
|
+
evidence[archetype].push({
|
|
227
|
+
type: 'route',
|
|
228
|
+
value: routePath,
|
|
229
|
+
pattern: routePattern
|
|
230
|
+
});
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Score archetype by dependencies
|
|
239
|
+
* @private
|
|
240
|
+
*/
|
|
241
|
+
_scoreByDependencies(dependencies, scores, evidence) {
|
|
242
|
+
for (const [archetype, config] of Object.entries(this.archetypePatterns)) {
|
|
243
|
+
for (const depPattern of config.dependencies) {
|
|
244
|
+
for (const dep of dependencies) {
|
|
245
|
+
if (dep.toLowerCase().includes(depPattern.toLowerCase())) {
|
|
246
|
+
scores[archetype] += 3; // Dependencies are strong signals
|
|
247
|
+
evidence[archetype].push({
|
|
248
|
+
type: 'dependency',
|
|
249
|
+
value: dep,
|
|
250
|
+
pattern: depPattern
|
|
251
|
+
});
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Get all supported archetypes
|
|
261
|
+
* @returns {Array} Array of archetype names
|
|
262
|
+
*/
|
|
263
|
+
getSupportedArchetypes() {
|
|
264
|
+
return Object.keys(this.archetypePatterns);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Get archetype description
|
|
269
|
+
* @param {string} archetype - Archetype name
|
|
270
|
+
* @returns {string} Description
|
|
271
|
+
*/
|
|
272
|
+
getArchetypeDescription(archetype) {
|
|
273
|
+
const descriptions = {
|
|
274
|
+
dashboard: 'Analytics dashboard with charts, metrics, and data visualization',
|
|
275
|
+
POS: 'Point of Sale system for retail transactions and inventory management',
|
|
276
|
+
SaaS: 'Software as a Service with subscription billing and multi-tenant architecture',
|
|
277
|
+
ecommerce: 'E-commerce platform with product catalog, cart, and checkout',
|
|
278
|
+
LMS: 'Learning Management System for courses, lessons, and student tracking',
|
|
279
|
+
booking: 'Booking and appointment scheduling system',
|
|
280
|
+
fintech: 'Financial technology application for transactions and account management',
|
|
281
|
+
internalTools: 'Internal business tools and admin panels',
|
|
282
|
+
cms: 'Content Management System for articles, pages, and media',
|
|
283
|
+
social: 'Social platform with feeds, posts, and user interactions'
|
|
284
|
+
};
|
|
285
|
+
return descriptions[archetype] || 'Unknown project type';
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
module.exports = { ArchetypeDetector };
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* EZ Assistant Adapters — Unified interface for AI coding assistants
|
|
5
|
+
*
|
|
6
|
+
* Adapters for: Claude Code, OpenCode, Gemini CLI, Codex
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const { createAdapter } = require('./assistant-adapter.cjs');
|
|
10
|
+
* const adapter = createAdapter('claude-code');
|
|
11
|
+
* await adapter.spawnAgent('planner', { prompt: '...' });
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const Logger = require('./logger.cjs');
|
|
15
|
+
const logger = new Logger();
|
|
16
|
+
const CircuitBreaker = require('./circuit-breaker.cjs');
|
|
17
|
+
const ModelTierManager = require('./model-tier-manager.cjs');
|
|
18
|
+
const CostTracker = require('./cost-tracker.cjs');
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Base adapter interface
|
|
22
|
+
*/
|
|
23
|
+
class AssistantAdapter {
|
|
24
|
+
constructor(name) {
|
|
25
|
+
if (new.target === AssistantAdapter) {
|
|
26
|
+
throw new Error('AssistantAdapter is abstract - use a concrete subclass');
|
|
27
|
+
}
|
|
28
|
+
this.name = name;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Spawn a subagent
|
|
33
|
+
* @param {string} type - Agent type
|
|
34
|
+
* @param {Object} options - Agent options
|
|
35
|
+
* @returns {Promise<Object>} - Agent result
|
|
36
|
+
*/
|
|
37
|
+
async spawnAgent(type, options) {
|
|
38
|
+
throw new Error('spawnAgent must be implemented');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Call a tool/function
|
|
43
|
+
* @param {string} tool - Tool name
|
|
44
|
+
* @param {Object} params - Tool parameters
|
|
45
|
+
* @returns {Promise<any>} - Tool result
|
|
46
|
+
*/
|
|
47
|
+
async callTool(tool, params) {
|
|
48
|
+
throw new Error('callTool must be implemented');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Select model for task
|
|
53
|
+
* @param {string} taskType - Task type (planning, execution, verification)
|
|
54
|
+
* @returns {string} - Model name
|
|
55
|
+
*/
|
|
56
|
+
selectModel(taskType) {
|
|
57
|
+
throw new Error('selectModel must be implemented');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Get adapter info
|
|
62
|
+
* @returns {Object} - Adapter information
|
|
63
|
+
*/
|
|
64
|
+
getInfo() {
|
|
65
|
+
return {
|
|
66
|
+
name: this.name,
|
|
67
|
+
type: this.constructor.name
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Claude Code adapter
|
|
74
|
+
*/
|
|
75
|
+
class ClaudeCodeAdapter extends AssistantAdapter {
|
|
76
|
+
constructor() {
|
|
77
|
+
super('claude-code');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async spawnAgent(type, options) {
|
|
81
|
+
logger.info('Claude Code: spawning agent', { type });
|
|
82
|
+
// Would use Claude Code's Task tool in production
|
|
83
|
+
return { type, status: 'completed', result: '[Claude Code agent result]' };
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async callTool(tool, params) {
|
|
87
|
+
logger.info('Claude Code: calling tool', { tool });
|
|
88
|
+
// Would use Claude Code's tool system
|
|
89
|
+
return { tool, status: 'success' };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
selectModel(taskType) {
|
|
93
|
+
const models = {
|
|
94
|
+
planning: 'claude-3-opus',
|
|
95
|
+
execution: 'claude-3-sonnet',
|
|
96
|
+
verification: 'claude-3-sonnet'
|
|
97
|
+
};
|
|
98
|
+
return models[taskType] || models.execution;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* OpenCode adapter
|
|
104
|
+
*/
|
|
105
|
+
class OpenCodeAdapter extends AssistantAdapter {
|
|
106
|
+
constructor() {
|
|
107
|
+
super('opencode');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async spawnAgent(type, options) {
|
|
111
|
+
logger.info('OpenCode: spawning agent', { type });
|
|
112
|
+
return { type, status: 'completed', result: '[OpenCode agent result]' };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async callTool(tool, params) {
|
|
116
|
+
logger.info('OpenCode: calling tool', { tool });
|
|
117
|
+
return { tool, status: 'success' };
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
selectModel(taskType) {
|
|
121
|
+
return 'gpt-4-turbo';
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Gemini CLI adapter
|
|
127
|
+
*/
|
|
128
|
+
class GeminiAdapter extends AssistantAdapter {
|
|
129
|
+
constructor() {
|
|
130
|
+
super('gemini');
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async spawnAgent(type, options) {
|
|
134
|
+
logger.info('Gemini: spawning agent', { type });
|
|
135
|
+
return { type, status: 'completed', result: '[Gemini agent result]' };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async callTool(tool, params) {
|
|
139
|
+
logger.info('Gemini: calling tool', { tool });
|
|
140
|
+
return { tool, status: 'success' };
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
selectModel(taskType) {
|
|
144
|
+
return 'gemini-pro';
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Codex adapter
|
|
150
|
+
*/
|
|
151
|
+
class CodexAdapter extends AssistantAdapter {
|
|
152
|
+
constructor() {
|
|
153
|
+
super('codex');
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async spawnAgent(type, options) {
|
|
157
|
+
logger.info('Codex: spawning agent', { type });
|
|
158
|
+
return { type, status: 'completed', result: '[Codex agent result]' };
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
async callTool(tool, params) {
|
|
162
|
+
logger.info('Codex: calling tool', { tool });
|
|
163
|
+
return { tool, status: 'success' };
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
selectModel(taskType) {
|
|
167
|
+
return 'codex-latest';
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Qwen Code adapter
|
|
173
|
+
*/
|
|
174
|
+
class QwenAdapter extends AssistantAdapter {
|
|
175
|
+
constructor() {
|
|
176
|
+
super('qwen');
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
async spawnAgent(type, options) {
|
|
180
|
+
logger.info('Qwen Code: spawning agent', { type });
|
|
181
|
+
// Qwen Code uses its own agent system
|
|
182
|
+
return { type, status: 'completed', result: '[Qwen Code agent result]' };
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
async callTool(tool, params) {
|
|
186
|
+
logger.info('Qwen Code: calling tool', { tool });
|
|
187
|
+
return { tool, status: 'success' };
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
selectModel(taskType) {
|
|
191
|
+
const models = {
|
|
192
|
+
planning: 'qwen-max',
|
|
193
|
+
execution: 'qwen-plus',
|
|
194
|
+
verification: 'qwen-plus'
|
|
195
|
+
};
|
|
196
|
+
return models[taskType] || models.execution;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Kimi Code adapter
|
|
202
|
+
*/
|
|
203
|
+
class KimiAdapter extends AssistantAdapter {
|
|
204
|
+
constructor() {
|
|
205
|
+
super('kimi');
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
async spawnAgent(type, options) {
|
|
209
|
+
logger.info('Kimi Code: spawning agent', { type });
|
|
210
|
+
return { type, status: 'completed', result: '[Kimi Code agent result]' };
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
async callTool(tool, params) {
|
|
214
|
+
logger.info('Kimi Code: calling tool', { tool });
|
|
215
|
+
return { tool, status: 'success' };
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
selectModel(taskType) {
|
|
219
|
+
const models = {
|
|
220
|
+
planning: 'moonshot-v1-32k',
|
|
221
|
+
execution: 'moonshot-v1-8k',
|
|
222
|
+
verification: 'moonshot-v1-8k'
|
|
223
|
+
};
|
|
224
|
+
return models[taskType] || models.execution;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Circuit Breaker Adapter Wrapper — Wraps any adapter with circuit breaker protection
|
|
230
|
+
*/
|
|
231
|
+
class CircuitBreakerAdapter extends AssistantAdapter {
|
|
232
|
+
/**
|
|
233
|
+
* Create circuit breaker wrapped adapter
|
|
234
|
+
* @param {AssistantAdapter} delegate - The actual adapter to wrap
|
|
235
|
+
* @param {CircuitBreaker} breaker - Circuit breaker instance
|
|
236
|
+
*/
|
|
237
|
+
constructor(delegate, breaker) {
|
|
238
|
+
super(delegate.name);
|
|
239
|
+
this.delegate = delegate;
|
|
240
|
+
this.breaker = breaker;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Spawn agent with circuit breaker protection
|
|
245
|
+
* @param {string} type - Agent type
|
|
246
|
+
* @param {Object} options - Agent options
|
|
247
|
+
* @returns {Promise<Object>} - Agent result
|
|
248
|
+
*/
|
|
249
|
+
async spawnAgent(type, options) {
|
|
250
|
+
return this.breaker.execute(() => this.delegate.spawnAgent(type, options));
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Call tool with circuit breaker protection
|
|
255
|
+
* @param {string} tool - Tool name
|
|
256
|
+
* @param {Object} params - Tool parameters
|
|
257
|
+
* @returns {Promise<any>} - Tool result
|
|
258
|
+
*/
|
|
259
|
+
async callTool(tool, params) {
|
|
260
|
+
return this.breaker.execute(() => this.delegate.callTool(tool, params));
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Select model with budget-aware downgrade
|
|
265
|
+
* @param {string} taskType - Task type
|
|
266
|
+
* @returns {string} - Selected model
|
|
267
|
+
*/
|
|
268
|
+
selectModel(taskType) {
|
|
269
|
+
const costTracker = new CostTracker();
|
|
270
|
+
const budgetStatus = costTracker.checkBudget();
|
|
271
|
+
const percentUsed = budgetStatus.percentUsed || 0;
|
|
272
|
+
|
|
273
|
+
const modelManager = new ModelTierManager('claude');
|
|
274
|
+
const model = modelManager.selectModel(taskType, percentUsed);
|
|
275
|
+
|
|
276
|
+
// Log downgrade if not using premium model
|
|
277
|
+
if (percentUsed >= 75) {
|
|
278
|
+
const originalModel = this.delegate.selectModel(taskType);
|
|
279
|
+
if (originalModel !== model) {
|
|
280
|
+
modelManager.logDowngrade(originalModel, model, `budget pressure: ${percentUsed.toFixed(1)}%`);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
return model;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Get adapter info
|
|
289
|
+
* @returns {Object} - Adapter information
|
|
290
|
+
*/
|
|
291
|
+
getInfo() {
|
|
292
|
+
return {
|
|
293
|
+
...this.delegate.getInfo(),
|
|
294
|
+
circuitBreaker: {
|
|
295
|
+
enabled: true,
|
|
296
|
+
state: this.breaker.getState()
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Factory function to create adapter
|
|
304
|
+
* @param {string} type - Adapter type
|
|
305
|
+
* @param {Object} [options] - Adapter options
|
|
306
|
+
* @param {boolean} [options.circuitBreaker=true] - Enable circuit breaker
|
|
307
|
+
* @param {string} [options.cwd] - Working directory
|
|
308
|
+
* @returns {AssistantAdapter} - Adapter instance
|
|
309
|
+
*/
|
|
310
|
+
function createAdapter(type, options = {}) {
|
|
311
|
+
const adapters = {
|
|
312
|
+
'claude-code': ClaudeCodeAdapter,
|
|
313
|
+
'opencode': OpenCodeAdapter,
|
|
314
|
+
'gemini': GeminiAdapter,
|
|
315
|
+
'codex': CodexAdapter,
|
|
316
|
+
'qwen': QwenAdapter,
|
|
317
|
+
'kimi': KimiAdapter
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
const AdapterClass = adapters[type];
|
|
321
|
+
if (!AdapterClass) {
|
|
322
|
+
throw new Error(`Unknown adapter type: ${type}. Available: ${Object.keys(adapters).join(', ')}`);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
const delegate = new AdapterClass();
|
|
326
|
+
|
|
327
|
+
// Wrap with circuit breaker if enabled
|
|
328
|
+
if (options.circuitBreaker !== false) {
|
|
329
|
+
const breaker = new CircuitBreaker({
|
|
330
|
+
failureThreshold: 5,
|
|
331
|
+
resetTimeout: 60000,
|
|
332
|
+
persistState: true,
|
|
333
|
+
cwd: options.cwd,
|
|
334
|
+
agentType: type
|
|
335
|
+
});
|
|
336
|
+
return new CircuitBreakerAdapter(delegate, breaker);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return delegate;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Get available adapters
|
|
344
|
+
* @returns {string[]} - List of adapter names
|
|
345
|
+
*/
|
|
346
|
+
function getAvailableAdapters() {
|
|
347
|
+
return ['claude-code', 'opencode', 'gemini', 'codex', 'qwen', 'kimi'];
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
module.exports = {
|
|
351
|
+
AssistantAdapter,
|
|
352
|
+
ClaudeCodeAdapter,
|
|
353
|
+
OpenCodeAdapter,
|
|
354
|
+
GeminiAdapter,
|
|
355
|
+
CodexAdapter,
|
|
356
|
+
QwenAdapter,
|
|
357
|
+
KimiAdapter,
|
|
358
|
+
CircuitBreakerAdapter,
|
|
359
|
+
createAdapter,
|
|
360
|
+
getAvailableAdapters
|
|
361
|
+
};
|