@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
|
@@ -1,262 +1,262 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Session Import — Import session data from exported files
|
|
5
|
-
*
|
|
6
|
-
* Validates session structure and chain integrity
|
|
7
|
-
* Supports model-specific adapters
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
const fs = require('fs');
|
|
11
|
-
const { SessionImportError, SessionNotFoundError } = require('./session-errors.cjs');
|
|
12
|
-
const { defaultLogger: logger } = require('./logger.cjs');
|
|
13
|
-
|
|
14
|
-
class SessionImport {
|
|
15
|
-
/**
|
|
16
|
-
* Create a SessionImport instance
|
|
17
|
-
* @param {Object} sessionManager - SessionManager instance
|
|
18
|
-
*/
|
|
19
|
-
constructor(sessionManager) {
|
|
20
|
-
this.sessionManager = sessionManager;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Import a session from file
|
|
25
|
-
* @param {string} sessionFile - Path to session file
|
|
26
|
-
* @param {Object} options - Import options
|
|
27
|
-
* @param {string} [options.sourceModel] - Source model for adapter
|
|
28
|
-
* @returns {Object} Import result with sessionId and warnings
|
|
29
|
-
*/
|
|
30
|
-
import(sessionFile, options = {}) {
|
|
31
|
-
const { sourceModel } = options;
|
|
32
|
-
const warnings = [];
|
|
33
|
-
|
|
34
|
-
// Read and parse file
|
|
35
|
-
let importedData;
|
|
36
|
-
try {
|
|
37
|
-
const content = fs.readFileSync(sessionFile, 'utf-8');
|
|
38
|
-
importedData = JSON.parse(content);
|
|
39
|
-
} catch (err) {
|
|
40
|
-
throw new SessionImportError(`Failed to parse JSON: ${err.message}`, [err.message]);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Handle model-specific format conversion
|
|
44
|
-
if (sourceModel) {
|
|
45
|
-
importedData = this.importFromModelSpecificFormat(importedData, sourceModel);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Validate structure
|
|
49
|
-
const structureValidation = this.validateStructure(importedData);
|
|
50
|
-
if (!structureValidation.valid) {
|
|
51
|
-
throw new SessionImportError('Invalid session structure', structureValidation.errors);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Validate session chain
|
|
55
|
-
const chainValidation = this.validateSessionChain(importedData);
|
|
56
|
-
if (!chainValidation.valid) {
|
|
57
|
-
throw new SessionImportError('Invalid session chain', chainValidation.errors);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Validate chain links exist
|
|
61
|
-
const linksValidation = this.validateChainLinksExist(importedData);
|
|
62
|
-
if (linksValidation.warnings && linksValidation.warnings.length > 0) {
|
|
63
|
-
warnings.push(...linksValidation.warnings);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Create new session
|
|
67
|
-
const newSessionId = this.sessionManager.createSession({
|
|
68
|
-
model: importedData.metadata?.model,
|
|
69
|
-
phase: importedData.metadata?.phase,
|
|
70
|
-
plan: importedData.metadata?.plan
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
// Merge imported context and state
|
|
74
|
-
const updates = {
|
|
75
|
-
context: importedData.context || {},
|
|
76
|
-
state: importedData.state || {}
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
// Add previous session to chain
|
|
80
|
-
const previousSessionId = importedData.metadata?.session_id;
|
|
81
|
-
if (previousSessionId) {
|
|
82
|
-
updates.metadata = {
|
|
83
|
-
session_chain: [previousSessionId]
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
this.sessionManager.updateSession(newSessionId, updates);
|
|
88
|
-
|
|
89
|
-
logger.info('Session imported', { sessionId: newSessionId, sourceFile: sessionFile });
|
|
90
|
-
|
|
91
|
-
return {
|
|
92
|
-
success: true,
|
|
93
|
-
sessionId: newSessionId,
|
|
94
|
-
warnings
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Validate session structure
|
|
100
|
-
* @param {Object} session - Session object
|
|
101
|
-
* @returns {Object} Validation result
|
|
102
|
-
*/
|
|
103
|
-
validateStructure(session) {
|
|
104
|
-
const errors = [];
|
|
105
|
-
|
|
106
|
-
// Check for export wrapper or direct session
|
|
107
|
-
const sessionData = session.session || session;
|
|
108
|
-
|
|
109
|
-
if (!sessionData.metadata) {
|
|
110
|
-
errors.push('Missing metadata section');
|
|
111
|
-
} else {
|
|
112
|
-
if (!sessionData.metadata.session_id) {
|
|
113
|
-
errors.push('Missing metadata.session_id');
|
|
114
|
-
}
|
|
115
|
-
if (!sessionData.metadata.started_at) {
|
|
116
|
-
errors.push('Missing metadata.started_at');
|
|
117
|
-
}
|
|
118
|
-
if (!sessionData.metadata.session_version) {
|
|
119
|
-
errors.push('Missing metadata.session_version');
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (!sessionData.context) {
|
|
124
|
-
errors.push('Missing context section');
|
|
125
|
-
} else {
|
|
126
|
-
if (!Array.isArray(sessionData.context.tasks)) {
|
|
127
|
-
errors.push('context.tasks must be an array');
|
|
128
|
-
}
|
|
129
|
-
if (!Array.isArray(sessionData.context.decisions)) {
|
|
130
|
-
errors.push('context.decisions must be an array');
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
return {
|
|
135
|
-
valid: errors.length === 0,
|
|
136
|
-
errors
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Validate session chain integrity
|
|
142
|
-
* @param {Object} session - Session object
|
|
143
|
-
* @returns {Object} Validation result
|
|
144
|
-
*/
|
|
145
|
-
validateSessionChain(session) {
|
|
146
|
-
const errors = [];
|
|
147
|
-
const sessionData = session.session || session;
|
|
148
|
-
|
|
149
|
-
if (sessionData.metadata?.session_chain) {
|
|
150
|
-
const chain = sessionData.metadata.session_chain;
|
|
151
|
-
const sessionId = sessionData.metadata.session_id;
|
|
152
|
-
|
|
153
|
-
if (!Array.isArray(chain)) {
|
|
154
|
-
errors.push('session_chain must be an array');
|
|
155
|
-
} else if (chain.includes(sessionId)) {
|
|
156
|
-
errors.push('Circular reference detected: session_chain includes current session_id');
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
return {
|
|
161
|
-
valid: errors.length === 0,
|
|
162
|
-
errors
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Validate chain links exist in session manager
|
|
168
|
-
* @param {Object} session - Session object
|
|
169
|
-
* @returns {Object} Validation result with warnings
|
|
170
|
-
*/
|
|
171
|
-
validateChainLinksExist(session) {
|
|
172
|
-
const warnings = [];
|
|
173
|
-
const sessionData = session.session || session;
|
|
174
|
-
|
|
175
|
-
if (sessionData.metadata?.session_chain) {
|
|
176
|
-
const chain = sessionData.metadata.session_chain;
|
|
177
|
-
const missingLinks = [];
|
|
178
|
-
|
|
179
|
-
for (const id of chain) {
|
|
180
|
-
const linkedSession = this.sessionManager.loadSession(id);
|
|
181
|
-
if (!linkedSession) {
|
|
182
|
-
missingLinks.push(id);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
if (missingLinks.length > 0) {
|
|
187
|
-
warnings.push(`Missing chain links: ${missingLinks.join(', ')}`);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
return {
|
|
192
|
-
valid: true,
|
|
193
|
-
warnings
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Import from model-specific format
|
|
199
|
-
* @param {Object} data - Data to convert
|
|
200
|
-
* @param {string} sourceModel - Source model name
|
|
201
|
-
* @returns {Object} Converted session object
|
|
202
|
-
*/
|
|
203
|
-
importFromModelSpecificFormat(data, sourceModel) {
|
|
204
|
-
// If data has session wrapper, use it
|
|
205
|
-
if (data.session) {
|
|
206
|
-
return data.session;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// Model-specific adapters (can be extended)
|
|
210
|
-
switch (sourceModel.toLowerCase()) {
|
|
211
|
-
case 'claude':
|
|
212
|
-
return this._adaptClaudeFormat(data);
|
|
213
|
-
case 'qwen':
|
|
214
|
-
return this._adaptQwenFormat(data);
|
|
215
|
-
case 'openai':
|
|
216
|
-
return this._adaptOpenAIFormat(data);
|
|
217
|
-
case 'kimi':
|
|
218
|
-
return this._adaptKimiFormat(data);
|
|
219
|
-
default:
|
|
220
|
-
// Assume standard format
|
|
221
|
-
return data;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* Adapt Claude-specific format
|
|
227
|
-
* @private
|
|
228
|
-
*/
|
|
229
|
-
_adaptClaudeFormat(data) {
|
|
230
|
-
// Claude format adapter (placeholder)
|
|
231
|
-
return data;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Adapt Qwen-specific format
|
|
236
|
-
* @private
|
|
237
|
-
*/
|
|
238
|
-
_adaptQwenFormat(data) {
|
|
239
|
-
// Qwen format adapter (placeholder)
|
|
240
|
-
return data;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* Adapt OpenAI-specific format
|
|
245
|
-
* @private
|
|
246
|
-
*/
|
|
247
|
-
_adaptOpenAIFormat(data) {
|
|
248
|
-
// OpenAI format adapter (placeholder)
|
|
249
|
-
return data;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Adapt Kimi-specific format
|
|
254
|
-
* @private
|
|
255
|
-
*/
|
|
256
|
-
_adaptKimiFormat(data) {
|
|
257
|
-
// Kimi format adapter (placeholder)
|
|
258
|
-
return data;
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
module.exports = SessionImport;
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Session Import — Import session data from exported files
|
|
5
|
+
*
|
|
6
|
+
* Validates session structure and chain integrity
|
|
7
|
+
* Supports model-specific adapters
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const fs = require('fs');
|
|
11
|
+
const { SessionImportError, SessionNotFoundError } = require('./session-errors.cjs');
|
|
12
|
+
const { defaultLogger: logger } = require('./logger.cjs');
|
|
13
|
+
|
|
14
|
+
class SessionImport {
|
|
15
|
+
/**
|
|
16
|
+
* Create a SessionImport instance
|
|
17
|
+
* @param {Object} sessionManager - SessionManager instance
|
|
18
|
+
*/
|
|
19
|
+
constructor(sessionManager) {
|
|
20
|
+
this.sessionManager = sessionManager;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Import a session from file
|
|
25
|
+
* @param {string} sessionFile - Path to session file
|
|
26
|
+
* @param {Object} options - Import options
|
|
27
|
+
* @param {string} [options.sourceModel] - Source model for adapter
|
|
28
|
+
* @returns {Object} Import result with sessionId and warnings
|
|
29
|
+
*/
|
|
30
|
+
import(sessionFile, options = {}) {
|
|
31
|
+
const { sourceModel } = options;
|
|
32
|
+
const warnings = [];
|
|
33
|
+
|
|
34
|
+
// Read and parse file
|
|
35
|
+
let importedData;
|
|
36
|
+
try {
|
|
37
|
+
const content = fs.readFileSync(sessionFile, 'utf-8');
|
|
38
|
+
importedData = JSON.parse(content);
|
|
39
|
+
} catch (err) {
|
|
40
|
+
throw new SessionImportError(`Failed to parse JSON: ${err.message}`, [err.message]);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Handle model-specific format conversion
|
|
44
|
+
if (sourceModel) {
|
|
45
|
+
importedData = this.importFromModelSpecificFormat(importedData, sourceModel);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Validate structure
|
|
49
|
+
const structureValidation = this.validateStructure(importedData);
|
|
50
|
+
if (!structureValidation.valid) {
|
|
51
|
+
throw new SessionImportError('Invalid session structure', structureValidation.errors);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Validate session chain
|
|
55
|
+
const chainValidation = this.validateSessionChain(importedData);
|
|
56
|
+
if (!chainValidation.valid) {
|
|
57
|
+
throw new SessionImportError('Invalid session chain', chainValidation.errors);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Validate chain links exist
|
|
61
|
+
const linksValidation = this.validateChainLinksExist(importedData);
|
|
62
|
+
if (linksValidation.warnings && linksValidation.warnings.length > 0) {
|
|
63
|
+
warnings.push(...linksValidation.warnings);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Create new session
|
|
67
|
+
const newSessionId = this.sessionManager.createSession({
|
|
68
|
+
model: importedData.metadata?.model,
|
|
69
|
+
phase: importedData.metadata?.phase,
|
|
70
|
+
plan: importedData.metadata?.plan
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// Merge imported context and state
|
|
74
|
+
const updates = {
|
|
75
|
+
context: importedData.context || {},
|
|
76
|
+
state: importedData.state || {}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// Add previous session to chain
|
|
80
|
+
const previousSessionId = importedData.metadata?.session_id;
|
|
81
|
+
if (previousSessionId) {
|
|
82
|
+
updates.metadata = {
|
|
83
|
+
session_chain: [previousSessionId]
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
this.sessionManager.updateSession(newSessionId, updates);
|
|
88
|
+
|
|
89
|
+
logger.info('Session imported', { sessionId: newSessionId, sourceFile: sessionFile });
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
success: true,
|
|
93
|
+
sessionId: newSessionId,
|
|
94
|
+
warnings
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Validate session structure
|
|
100
|
+
* @param {Object} session - Session object
|
|
101
|
+
* @returns {Object} Validation result
|
|
102
|
+
*/
|
|
103
|
+
validateStructure(session) {
|
|
104
|
+
const errors = [];
|
|
105
|
+
|
|
106
|
+
// Check for export wrapper or direct session
|
|
107
|
+
const sessionData = session.session || session;
|
|
108
|
+
|
|
109
|
+
if (!sessionData.metadata) {
|
|
110
|
+
errors.push('Missing metadata section');
|
|
111
|
+
} else {
|
|
112
|
+
if (!sessionData.metadata.session_id) {
|
|
113
|
+
errors.push('Missing metadata.session_id');
|
|
114
|
+
}
|
|
115
|
+
if (!sessionData.metadata.started_at) {
|
|
116
|
+
errors.push('Missing metadata.started_at');
|
|
117
|
+
}
|
|
118
|
+
if (!sessionData.metadata.session_version) {
|
|
119
|
+
errors.push('Missing metadata.session_version');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (!sessionData.context) {
|
|
124
|
+
errors.push('Missing context section');
|
|
125
|
+
} else {
|
|
126
|
+
if (!Array.isArray(sessionData.context.tasks)) {
|
|
127
|
+
errors.push('context.tasks must be an array');
|
|
128
|
+
}
|
|
129
|
+
if (!Array.isArray(sessionData.context.decisions)) {
|
|
130
|
+
errors.push('context.decisions must be an array');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return {
|
|
135
|
+
valid: errors.length === 0,
|
|
136
|
+
errors
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Validate session chain integrity
|
|
142
|
+
* @param {Object} session - Session object
|
|
143
|
+
* @returns {Object} Validation result
|
|
144
|
+
*/
|
|
145
|
+
validateSessionChain(session) {
|
|
146
|
+
const errors = [];
|
|
147
|
+
const sessionData = session.session || session;
|
|
148
|
+
|
|
149
|
+
if (sessionData.metadata?.session_chain) {
|
|
150
|
+
const chain = sessionData.metadata.session_chain;
|
|
151
|
+
const sessionId = sessionData.metadata.session_id;
|
|
152
|
+
|
|
153
|
+
if (!Array.isArray(chain)) {
|
|
154
|
+
errors.push('session_chain must be an array');
|
|
155
|
+
} else if (chain.includes(sessionId)) {
|
|
156
|
+
errors.push('Circular reference detected: session_chain includes current session_id');
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return {
|
|
161
|
+
valid: errors.length === 0,
|
|
162
|
+
errors
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Validate chain links exist in session manager
|
|
168
|
+
* @param {Object} session - Session object
|
|
169
|
+
* @returns {Object} Validation result with warnings
|
|
170
|
+
*/
|
|
171
|
+
validateChainLinksExist(session) {
|
|
172
|
+
const warnings = [];
|
|
173
|
+
const sessionData = session.session || session;
|
|
174
|
+
|
|
175
|
+
if (sessionData.metadata?.session_chain) {
|
|
176
|
+
const chain = sessionData.metadata.session_chain;
|
|
177
|
+
const missingLinks = [];
|
|
178
|
+
|
|
179
|
+
for (const id of chain) {
|
|
180
|
+
const linkedSession = this.sessionManager.loadSession(id);
|
|
181
|
+
if (!linkedSession) {
|
|
182
|
+
missingLinks.push(id);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (missingLinks.length > 0) {
|
|
187
|
+
warnings.push(`Missing chain links: ${missingLinks.join(', ')}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return {
|
|
192
|
+
valid: true,
|
|
193
|
+
warnings
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Import from model-specific format
|
|
199
|
+
* @param {Object} data - Data to convert
|
|
200
|
+
* @param {string} sourceModel - Source model name
|
|
201
|
+
* @returns {Object} Converted session object
|
|
202
|
+
*/
|
|
203
|
+
importFromModelSpecificFormat(data, sourceModel) {
|
|
204
|
+
// If data has session wrapper, use it
|
|
205
|
+
if (data.session) {
|
|
206
|
+
return data.session;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Model-specific adapters (can be extended)
|
|
210
|
+
switch (sourceModel.toLowerCase()) {
|
|
211
|
+
case 'claude':
|
|
212
|
+
return this._adaptClaudeFormat(data);
|
|
213
|
+
case 'qwen':
|
|
214
|
+
return this._adaptQwenFormat(data);
|
|
215
|
+
case 'openai':
|
|
216
|
+
return this._adaptOpenAIFormat(data);
|
|
217
|
+
case 'kimi':
|
|
218
|
+
return this._adaptKimiFormat(data);
|
|
219
|
+
default:
|
|
220
|
+
// Assume standard format
|
|
221
|
+
return data;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Adapt Claude-specific format
|
|
227
|
+
* @private
|
|
228
|
+
*/
|
|
229
|
+
_adaptClaudeFormat(data) {
|
|
230
|
+
// Claude format adapter (placeholder)
|
|
231
|
+
return data;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Adapt Qwen-specific format
|
|
236
|
+
* @private
|
|
237
|
+
*/
|
|
238
|
+
_adaptQwenFormat(data) {
|
|
239
|
+
// Qwen format adapter (placeholder)
|
|
240
|
+
return data;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Adapt OpenAI-specific format
|
|
245
|
+
* @private
|
|
246
|
+
*/
|
|
247
|
+
_adaptOpenAIFormat(data) {
|
|
248
|
+
// OpenAI format adapter (placeholder)
|
|
249
|
+
return data;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Adapt Kimi-specific format
|
|
254
|
+
* @private
|
|
255
|
+
*/
|
|
256
|
+
_adaptKimiFormat(data) {
|
|
257
|
+
// Kimi format adapter (placeholder)
|
|
258
|
+
return data;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
module.exports = SessionImport;
|