@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,220 +1,220 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Context Manager
|
|
5
|
-
*
|
|
6
|
-
* Orchestrates context gathering from files and URLs.
|
|
7
|
-
* Aggregates content, tracks sources, and updates STATE.md with context metadata.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
const fs = require('fs');
|
|
11
|
-
const path = require('path');
|
|
12
|
-
const FileAccessService = require('./file-access.cjs');
|
|
13
|
-
const URLFetchService = require('./url-fetch.cjs');
|
|
14
|
-
const ContentSecurityScanner = require('./content-scanner.cjs');
|
|
15
|
-
const ContextCache = require('./context-cache.cjs');
|
|
16
|
-
const { SecurityScanError, FileAccessError, URLFetchError } = require('./context-errors.cjs');
|
|
17
|
-
|
|
18
|
-
class ContextManager {
|
|
19
|
-
/**
|
|
20
|
-
* Create a new ContextManager instance
|
|
21
|
-
* @param {string} cwd - Current working directory
|
|
22
|
-
*/
|
|
23
|
-
constructor(cwd) {
|
|
24
|
-
this.cwd = cwd || process.cwd();
|
|
25
|
-
this.sources = [];
|
|
26
|
-
this.cache = new ContextCache();
|
|
27
|
-
this.fileAccess = new FileAccessService(this.cwd);
|
|
28
|
-
this.urlFetch = new URLFetchService();
|
|
29
|
-
this.scanner = new ContentSecurityScanner();
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Request context from files and URLs
|
|
34
|
-
* @param {{files?: string[], urls?: string[]}} options - Context options
|
|
35
|
-
* @returns {{context: string, sources: Array, errors: Array}} - Aggregated context
|
|
36
|
-
*/
|
|
37
|
-
async requestContext(options = {}) {
|
|
38
|
-
const { files = [], urls = [] } = options;
|
|
39
|
-
const contextParts = [];
|
|
40
|
-
const sources = [];
|
|
41
|
-
const errors = [];
|
|
42
|
-
|
|
43
|
-
// Process file patterns
|
|
44
|
-
for (const pattern of files) {
|
|
45
|
-
try {
|
|
46
|
-
const fileResults = this.fileAccess.readFiles(pattern);
|
|
47
|
-
for (const file of fileResults) {
|
|
48
|
-
contextParts.push(`## File: ${file.path}\n\n${file.content}`);
|
|
49
|
-
const source = {
|
|
50
|
-
type: 'file',
|
|
51
|
-
source: file.path,
|
|
52
|
-
timestamp: new Date().toISOString(),
|
|
53
|
-
size: file.content.length
|
|
54
|
-
};
|
|
55
|
-
sources.push(source);
|
|
56
|
-
this.trackSources([source]);
|
|
57
|
-
}
|
|
58
|
-
} catch (err) {
|
|
59
|
-
errors.push({
|
|
60
|
-
source: pattern,
|
|
61
|
-
type: 'file',
|
|
62
|
-
message: err.message
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Process URLs
|
|
68
|
-
for (const url of urls) {
|
|
69
|
-
try {
|
|
70
|
-
// Confirm URL fetch with user
|
|
71
|
-
const confirmed = await URLFetchService.confirmUrlFetch(url);
|
|
72
|
-
if (!confirmed) {
|
|
73
|
-
errors.push({
|
|
74
|
-
source: url,
|
|
75
|
-
type: 'url',
|
|
76
|
-
message: 'User declined to fetch URL'
|
|
77
|
-
});
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Fetch the URL
|
|
82
|
-
const result = await this.urlFetch.fetchUrl(url);
|
|
83
|
-
|
|
84
|
-
// Scan for security issues
|
|
85
|
-
const scanResult = this.scanner.scan(result.content, result.contentType);
|
|
86
|
-
if (!scanResult.safe) {
|
|
87
|
-
throw new SecurityScanError(scanResult.findings);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Add to context
|
|
91
|
-
contextParts.push(`## URL: ${url}\n\n${result.content}`);
|
|
92
|
-
|
|
93
|
-
const source = {
|
|
94
|
-
type: 'url',
|
|
95
|
-
source: url,
|
|
96
|
-
timestamp: new Date().toISOString(),
|
|
97
|
-
contentType: result.contentType,
|
|
98
|
-
size: result.content.length
|
|
99
|
-
};
|
|
100
|
-
sources.push(source);
|
|
101
|
-
this.trackSources([source]);
|
|
102
|
-
|
|
103
|
-
// Cache the content
|
|
104
|
-
this.cache.set(url, result.content, {
|
|
105
|
-
type: 'url',
|
|
106
|
-
contentType: result.contentType
|
|
107
|
-
});
|
|
108
|
-
} catch (err) {
|
|
109
|
-
errors.push({
|
|
110
|
-
source: url,
|
|
111
|
-
type: 'url',
|
|
112
|
-
message: err.message
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return {
|
|
118
|
-
context: contextParts.join('\n\n---\n\n'),
|
|
119
|
-
sources,
|
|
120
|
-
errors
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Track source metadata (with deduplication)
|
|
126
|
-
* @param {Array} sources - Array of source objects
|
|
127
|
-
*/
|
|
128
|
-
trackSources(sources) {
|
|
129
|
-
for (const source of sources) {
|
|
130
|
-
// Check for duplicates (same type and source)
|
|
131
|
-
const isDuplicate = this.sources.some(
|
|
132
|
-
s => s.type === source.type && s.source === source.source
|
|
133
|
-
);
|
|
134
|
-
|
|
135
|
-
if (!isDuplicate) {
|
|
136
|
-
this.sources.push(source);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Update STATE.md with context sources
|
|
143
|
-
* Creates or appends to the Context Sources section
|
|
144
|
-
*/
|
|
145
|
-
updateStateMd() {
|
|
146
|
-
const statePath = path.join(this.cwd, '.planning', 'STATE.md');
|
|
147
|
-
|
|
148
|
-
// Ensure .planning directory exists
|
|
149
|
-
const planningDir = path.join(this.cwd, '.planning');
|
|
150
|
-
if (!fs.existsSync(planningDir)) {
|
|
151
|
-
fs.mkdirSync(planningDir, { recursive: true });
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
let content = '';
|
|
155
|
-
|
|
156
|
-
// Read existing content or start fresh
|
|
157
|
-
if (fs.existsSync(statePath)) {
|
|
158
|
-
content = fs.readFileSync(statePath, 'utf-8');
|
|
159
|
-
} else {
|
|
160
|
-
content = '# Project State\n\n';
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// Build the context sources table
|
|
164
|
-
const tableHeader = '| Source | Type | Timestamp |\n|--------|------|-----------|';
|
|
165
|
-
const tableRows = this.sources.map(s =>
|
|
166
|
-
`| ${s.source} | ${s.type.toUpperCase()} | ${s.timestamp} |`
|
|
167
|
-
);
|
|
168
|
-
|
|
169
|
-
const contextSection = `\n## Context Sources\n\n${tableHeader}\n${tableRows.join('\n')}\n`;
|
|
170
|
-
|
|
171
|
-
// Check if Context Sources section already exists
|
|
172
|
-
const sectionRegex = /## Context Sources\n[\s\S]*?(?=\n## |\n$|$)/i;
|
|
173
|
-
const existingSection = content.match(sectionRegex);
|
|
174
|
-
|
|
175
|
-
if (existingSection) {
|
|
176
|
-
// Replace existing section
|
|
177
|
-
content = content.replace(sectionRegex, contextSection);
|
|
178
|
-
} else {
|
|
179
|
-
// Append new section
|
|
180
|
-
content = content.trimEnd() + '\n' + contextSection;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// Write back to STATE.md
|
|
184
|
-
fs.writeFileSync(statePath, content, 'utf-8');
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Get all tracked sources
|
|
189
|
-
* @returns {Array} - Array of source objects
|
|
190
|
-
*/
|
|
191
|
-
getSources() {
|
|
192
|
-
return [...this.sources];
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* Get cached content for a URL
|
|
197
|
-
* @param {string} key - Cache key (URL)
|
|
198
|
-
* @returns {{content: string, timestamp: number, type: string}|undefined}
|
|
199
|
-
*/
|
|
200
|
-
getCached(key) {
|
|
201
|
-
return this.cache.get(key);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Clear the cache
|
|
206
|
-
*/
|
|
207
|
-
clearCache() {
|
|
208
|
-
this.cache.clear();
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* Get cache statistics
|
|
213
|
-
* @returns {{size: number, keys: Array<string>}}
|
|
214
|
-
*/
|
|
215
|
-
getCacheStats() {
|
|
216
|
-
return this.cache.stats();
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
module.exports = ContextManager;
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Context Manager
|
|
5
|
+
*
|
|
6
|
+
* Orchestrates context gathering from files and URLs.
|
|
7
|
+
* Aggregates content, tracks sources, and updates STATE.md with context metadata.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const fs = require('fs');
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const FileAccessService = require('./file-access.cjs');
|
|
13
|
+
const URLFetchService = require('./url-fetch.cjs');
|
|
14
|
+
const ContentSecurityScanner = require('./content-scanner.cjs');
|
|
15
|
+
const ContextCache = require('./context-cache.cjs');
|
|
16
|
+
const { SecurityScanError, FileAccessError, URLFetchError } = require('./context-errors.cjs');
|
|
17
|
+
|
|
18
|
+
class ContextManager {
|
|
19
|
+
/**
|
|
20
|
+
* Create a new ContextManager instance
|
|
21
|
+
* @param {string} cwd - Current working directory
|
|
22
|
+
*/
|
|
23
|
+
constructor(cwd) {
|
|
24
|
+
this.cwd = cwd || process.cwd();
|
|
25
|
+
this.sources = [];
|
|
26
|
+
this.cache = new ContextCache();
|
|
27
|
+
this.fileAccess = new FileAccessService(this.cwd);
|
|
28
|
+
this.urlFetch = new URLFetchService();
|
|
29
|
+
this.scanner = new ContentSecurityScanner();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Request context from files and URLs
|
|
34
|
+
* @param {{files?: string[], urls?: string[]}} options - Context options
|
|
35
|
+
* @returns {{context: string, sources: Array, errors: Array}} - Aggregated context
|
|
36
|
+
*/
|
|
37
|
+
async requestContext(options = {}) {
|
|
38
|
+
const { files = [], urls = [] } = options;
|
|
39
|
+
const contextParts = [];
|
|
40
|
+
const sources = [];
|
|
41
|
+
const errors = [];
|
|
42
|
+
|
|
43
|
+
// Process file patterns
|
|
44
|
+
for (const pattern of files) {
|
|
45
|
+
try {
|
|
46
|
+
const fileResults = this.fileAccess.readFiles(pattern);
|
|
47
|
+
for (const file of fileResults) {
|
|
48
|
+
contextParts.push(`## File: ${file.path}\n\n${file.content}`);
|
|
49
|
+
const source = {
|
|
50
|
+
type: 'file',
|
|
51
|
+
source: file.path,
|
|
52
|
+
timestamp: new Date().toISOString(),
|
|
53
|
+
size: file.content.length
|
|
54
|
+
};
|
|
55
|
+
sources.push(source);
|
|
56
|
+
this.trackSources([source]);
|
|
57
|
+
}
|
|
58
|
+
} catch (err) {
|
|
59
|
+
errors.push({
|
|
60
|
+
source: pattern,
|
|
61
|
+
type: 'file',
|
|
62
|
+
message: err.message
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Process URLs
|
|
68
|
+
for (const url of urls) {
|
|
69
|
+
try {
|
|
70
|
+
// Confirm URL fetch with user
|
|
71
|
+
const confirmed = await URLFetchService.confirmUrlFetch(url);
|
|
72
|
+
if (!confirmed) {
|
|
73
|
+
errors.push({
|
|
74
|
+
source: url,
|
|
75
|
+
type: 'url',
|
|
76
|
+
message: 'User declined to fetch URL'
|
|
77
|
+
});
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Fetch the URL
|
|
82
|
+
const result = await this.urlFetch.fetchUrl(url);
|
|
83
|
+
|
|
84
|
+
// Scan for security issues
|
|
85
|
+
const scanResult = this.scanner.scan(result.content, result.contentType);
|
|
86
|
+
if (!scanResult.safe) {
|
|
87
|
+
throw new SecurityScanError(scanResult.findings);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Add to context
|
|
91
|
+
contextParts.push(`## URL: ${url}\n\n${result.content}`);
|
|
92
|
+
|
|
93
|
+
const source = {
|
|
94
|
+
type: 'url',
|
|
95
|
+
source: url,
|
|
96
|
+
timestamp: new Date().toISOString(),
|
|
97
|
+
contentType: result.contentType,
|
|
98
|
+
size: result.content.length
|
|
99
|
+
};
|
|
100
|
+
sources.push(source);
|
|
101
|
+
this.trackSources([source]);
|
|
102
|
+
|
|
103
|
+
// Cache the content
|
|
104
|
+
this.cache.set(url, result.content, {
|
|
105
|
+
type: 'url',
|
|
106
|
+
contentType: result.contentType
|
|
107
|
+
});
|
|
108
|
+
} catch (err) {
|
|
109
|
+
errors.push({
|
|
110
|
+
source: url,
|
|
111
|
+
type: 'url',
|
|
112
|
+
message: err.message
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return {
|
|
118
|
+
context: contextParts.join('\n\n---\n\n'),
|
|
119
|
+
sources,
|
|
120
|
+
errors
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Track source metadata (with deduplication)
|
|
126
|
+
* @param {Array} sources - Array of source objects
|
|
127
|
+
*/
|
|
128
|
+
trackSources(sources) {
|
|
129
|
+
for (const source of sources) {
|
|
130
|
+
// Check for duplicates (same type and source)
|
|
131
|
+
const isDuplicate = this.sources.some(
|
|
132
|
+
s => s.type === source.type && s.source === source.source
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
if (!isDuplicate) {
|
|
136
|
+
this.sources.push(source);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Update STATE.md with context sources
|
|
143
|
+
* Creates or appends to the Context Sources section
|
|
144
|
+
*/
|
|
145
|
+
updateStateMd() {
|
|
146
|
+
const statePath = path.join(this.cwd, '.planning', 'STATE.md');
|
|
147
|
+
|
|
148
|
+
// Ensure .planning directory exists
|
|
149
|
+
const planningDir = path.join(this.cwd, '.planning');
|
|
150
|
+
if (!fs.existsSync(planningDir)) {
|
|
151
|
+
fs.mkdirSync(planningDir, { recursive: true });
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
let content = '';
|
|
155
|
+
|
|
156
|
+
// Read existing content or start fresh
|
|
157
|
+
if (fs.existsSync(statePath)) {
|
|
158
|
+
content = fs.readFileSync(statePath, 'utf-8');
|
|
159
|
+
} else {
|
|
160
|
+
content = '# Project State\n\n';
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Build the context sources table
|
|
164
|
+
const tableHeader = '| Source | Type | Timestamp |\n|--------|------|-----------|';
|
|
165
|
+
const tableRows = this.sources.map(s =>
|
|
166
|
+
`| ${s.source} | ${s.type.toUpperCase()} | ${s.timestamp} |`
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
const contextSection = `\n## Context Sources\n\n${tableHeader}\n${tableRows.join('\n')}\n`;
|
|
170
|
+
|
|
171
|
+
// Check if Context Sources section already exists
|
|
172
|
+
const sectionRegex = /## Context Sources\n[\s\S]*?(?=\n## |\n$|$)/i;
|
|
173
|
+
const existingSection = content.match(sectionRegex);
|
|
174
|
+
|
|
175
|
+
if (existingSection) {
|
|
176
|
+
// Replace existing section
|
|
177
|
+
content = content.replace(sectionRegex, contextSection);
|
|
178
|
+
} else {
|
|
179
|
+
// Append new section
|
|
180
|
+
content = content.trimEnd() + '\n' + contextSection;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Write back to STATE.md
|
|
184
|
+
fs.writeFileSync(statePath, content, 'utf-8');
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Get all tracked sources
|
|
189
|
+
* @returns {Array} - Array of source objects
|
|
190
|
+
*/
|
|
191
|
+
getSources() {
|
|
192
|
+
return [...this.sources];
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Get cached content for a URL
|
|
197
|
+
* @param {string} key - Cache key (URL)
|
|
198
|
+
* @returns {{content: string, timestamp: number, type: string}|undefined}
|
|
199
|
+
*/
|
|
200
|
+
getCached(key) {
|
|
201
|
+
return this.cache.get(key);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Clear the cache
|
|
206
|
+
*/
|
|
207
|
+
clearCache() {
|
|
208
|
+
this.cache.clear();
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Get cache statistics
|
|
213
|
+
* @returns {{size: number, keys: Array<string>}}
|
|
214
|
+
*/
|
|
215
|
+
getCacheStats() {
|
|
216
|
+
return this.cache.stats();
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
module.exports = ContextManager;
|