@stackmemoryai/stackmemory 0.8.0 → 1.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/LICENSE +64 -0
- package/README.md +54 -4
- package/dist/src/agents/core/agent-task-manager.js +0 -1
- package/dist/src/agents/verifiers/base-verifier.js +0 -1
- package/dist/src/agents/verifiers/formatter-verifier.js +0 -1
- package/dist/src/agents/verifiers/llm-judge.js +0 -1
- package/dist/src/cli/auto-detect.js +0 -1
- package/dist/src/cli/claude-sm-danger.js +0 -1
- package/dist/src/cli/claude-sm.js +69 -373
- package/dist/src/cli/codex-sm-danger.js +0 -1
- package/dist/src/cli/codex-sm.js +28 -1
- package/dist/src/cli/commands/api.js +0 -1
- package/dist/src/cli/commands/auto-background.js +0 -1
- package/dist/src/cli/commands/cleanup-processes.js +0 -1
- package/dist/src/cli/commands/clear.js +0 -1
- package/dist/src/cli/commands/config.js +0 -1
- package/dist/src/cli/commands/context-rehydrate.js +0 -1
- package/dist/src/cli/commands/context.js +0 -1
- package/dist/src/cli/commands/daemon.js +0 -1
- package/dist/src/cli/commands/dashboard.js +4 -5
- package/dist/src/cli/commands/db.js +0 -1
- package/dist/src/cli/commands/decision.js +0 -1
- package/dist/src/cli/commands/discovery.js +0 -1
- package/dist/src/cli/commands/handoff.js +0 -1
- package/dist/src/cli/commands/hooks.js +0 -1
- package/dist/src/cli/commands/linear.js +0 -1
- package/dist/src/cli/commands/log.js +0 -1
- package/dist/src/cli/commands/login.js +0 -1
- package/dist/src/cli/commands/migrate.js +0 -1
- package/dist/src/cli/commands/model.js +0 -1
- package/dist/src/cli/commands/onboard.js +22 -7
- package/dist/src/cli/commands/ping.js +0 -1
- package/dist/src/cli/commands/projects.js +0 -1
- package/dist/src/cli/commands/ralph.js +0 -1
- package/dist/src/cli/commands/retrieval.js +0 -1
- package/dist/src/cli/commands/search.js +0 -1
- package/dist/src/cli/commands/service.js +0 -1
- package/dist/src/cli/commands/session.js +0 -1
- package/dist/src/cli/commands/setup.js +1 -6
- package/dist/src/cli/commands/shell.js +0 -1
- package/dist/src/cli/commands/signup.js +0 -1
- package/dist/src/cli/commands/skills.js +4 -3
- package/dist/src/cli/commands/storage-tier.js +0 -1
- package/dist/src/cli/commands/sweep.js +0 -1
- package/dist/src/cli/commands/tasks.js +0 -1
- package/dist/src/cli/commands/worktree.js +10 -5
- package/dist/src/cli/index.js +9 -76
- package/dist/src/cli/opencode-sm.js +28 -1
- package/dist/src/cli/utils/viewer.js +0 -1
- package/dist/src/core/config/config-manager.js +0 -1
- package/dist/src/core/config/feature-flags.js +1 -14
- package/dist/src/core/config/storage-config.js +0 -1
- package/dist/src/core/config/types.js +0 -1
- package/dist/src/core/context/auto-context.js +0 -1
- package/dist/src/core/context/dual-stack-manager.js +0 -1
- package/dist/src/core/context/enhanced-rehydration.js +0 -2
- package/dist/src/core/context/frame-database.js +60 -6
- package/dist/src/core/context/frame-digest.js +0 -1
- package/dist/src/core/context/frame-handoff-manager.js +0 -1
- package/dist/src/core/context/frame-lifecycle-hooks.js +0 -1
- package/dist/src/core/context/frame-recovery.js +0 -1
- package/dist/src/core/context/frame-stack.js +0 -1
- package/dist/src/core/context/frame-types.js +0 -1
- package/dist/src/core/context/index.js +0 -1
- package/dist/src/core/context/permission-manager.js +0 -1
- package/dist/src/core/context/recursive-context-manager.js +3 -2
- package/dist/src/core/context/refactored-frame-manager.js +0 -1
- package/dist/src/core/context/shared-context-layer.js +0 -1
- package/dist/src/core/context/stack-merge-resolver.js +0 -1
- package/dist/src/core/context/validation.js +0 -1
- package/dist/src/core/database/batch-operations.js +0 -1
- package/dist/src/core/database/connection-pool.js +0 -1
- package/dist/src/core/database/database-adapter.js +0 -1
- package/dist/src/core/database/embedding-provider-factory.js +0 -1
- package/dist/src/core/database/embedding-provider.js +0 -1
- package/dist/src/core/database/migration-manager.js +0 -1
- package/dist/src/core/database/ollama-embedding-provider.js +0 -1
- package/dist/src/core/database/openai-embedding-provider.js +0 -1
- package/dist/src/core/database/query-cache.js +0 -1
- package/dist/src/core/database/query-router.js +0 -1
- package/dist/src/core/database/sqlite-adapter.js +18 -108
- package/dist/src/core/database/transformers-embedding-provider.js +0 -1
- package/dist/src/core/digest/enhanced-hybrid-digest.js +0 -1
- package/dist/src/core/digest/frame-digest-integration.js +0 -1
- package/dist/src/core/digest/hybrid-digest-generator.js +0 -1
- package/dist/src/core/digest/index.js +0 -1
- package/dist/src/core/digest/types.js +0 -1
- package/dist/src/core/errors/error-utils.js +0 -1
- package/dist/src/core/errors/index.js +0 -1
- package/dist/src/core/errors/recovery.js +0 -1
- package/dist/src/core/execution/parallel-executor.js +0 -1
- package/dist/src/core/extensions/custom-tools.js +0 -1
- package/dist/src/core/extensions/index.js +0 -1
- package/dist/src/core/extensions/loader.js +0 -1
- package/dist/src/core/extensions/plugin-system.js +0 -1
- package/dist/src/core/extensions/provider-adapter.js +0 -1
- package/dist/src/core/extensions/sandbox-runtime.js +0 -1
- package/dist/src/core/extensions/types.js +0 -1
- package/dist/src/core/frame/workflow-templates.js +0 -1
- package/dist/src/core/merge/conflict-detector.js +0 -1
- package/dist/src/core/merge/index.js +0 -1
- package/dist/src/core/merge/resolution-engine.js +0 -1
- package/dist/src/core/merge/stack-diff.js +0 -1
- package/dist/src/core/merge/types.js +0 -1
- package/dist/src/core/merge/unified-merge-resolver.js +0 -1
- package/dist/src/core/models/fallback-monitor.js +0 -1
- package/dist/src/core/models/model-router.js +0 -1
- package/dist/src/core/monitoring/error-handler.js +0 -1
- package/dist/src/core/monitoring/logger.js +0 -1
- package/dist/src/core/monitoring/metrics.js +0 -1
- package/dist/src/core/monitoring/progress-tracker.js +0 -1
- package/dist/src/core/monitoring/session-monitor.js +0 -1
- package/dist/src/core/performance/context-cache.js +0 -1
- package/dist/src/core/performance/index.js +0 -1
- package/dist/src/core/performance/lazy-context-loader.js +3 -8
- package/dist/src/core/performance/monitor.js +0 -1
- package/dist/src/core/performance/optimized-frame-context.js +0 -1
- package/dist/src/core/performance/performance-benchmark.js +0 -1
- package/dist/src/core/performance/performance-profiler.js +0 -1
- package/dist/src/core/performance/streaming-jsonl-parser.js +0 -1
- package/dist/src/core/persistence/postgres-adapter.js +0 -1
- package/dist/src/core/projects/project-isolation.js +0 -1
- package/dist/src/core/projects/project-manager.js +0 -1
- package/dist/src/core/query/query-parser.js +0 -1
- package/dist/src/core/query/query-templates.js +0 -1
- package/dist/src/core/retrieval/context-retriever.js +0 -1
- package/dist/src/core/retrieval/index.js +0 -1
- package/dist/src/core/retrieval/llm-context-retrieval.js +0 -1
- package/dist/src/core/retrieval/llm-provider.js +0 -1
- package/dist/src/core/retrieval/privacy-filter.js +0 -1
- package/dist/src/core/retrieval/retrieval-audit.js +0 -1
- package/dist/src/core/retrieval/summary-generator.js +15 -6
- package/dist/src/core/retrieval/types.js +0 -1
- package/dist/src/core/retrieval/unified-context-assembler.js +0 -1
- package/dist/src/core/security/index.js +0 -1
- package/dist/src/core/security/input-sanitizer.js +0 -1
- package/dist/src/core/session/clear-survival.js +0 -1
- package/dist/src/core/session/enhanced-handoff.js +0 -1
- package/dist/src/core/session/handoff-generator.js +0 -1
- package/dist/src/core/session/index.js +0 -1
- package/dist/src/core/session/session-manager.js +0 -1
- package/dist/src/core/skills/index.js +0 -1
- package/dist/src/core/skills/skill-storage.js +0 -1
- package/dist/src/core/skills/types.js +0 -1
- package/dist/src/core/storage/chromadb-adapter.js +0 -1
- package/dist/src/core/storage/infinite-storage.js +0 -1
- package/dist/src/core/storage/project-registry.js +0 -1
- package/dist/src/core/storage/remote-storage.js +4 -2
- package/dist/src/core/storage/storage-tier-manager.js +0 -1
- package/dist/src/core/storage/two-tier-storage.js +0 -1
- package/dist/src/core/trace/cli-trace-wrapper.js +0 -1
- package/dist/src/core/trace/db-trace-wrapper.js +0 -1
- package/dist/src/core/trace/debug-trace.js +0 -1
- package/dist/src/core/trace/index.js +0 -1
- package/dist/src/core/trace/linear-api-wrapper.js +0 -1
- package/dist/src/core/trace/trace-detector.js +0 -1
- package/dist/src/core/trace/trace-store.js +4 -5
- package/dist/src/core/trace/types.js +0 -1
- package/dist/src/core/types.js +0 -1
- package/dist/src/core/utils/async-mutex.js +0 -1
- package/dist/src/core/utils/compression.js +0 -1
- package/dist/src/core/utils/update-checker.js +0 -1
- package/dist/src/core/worktree/worktree-manager.js +0 -1
- package/dist/src/daemon/daemon-config.js +0 -1
- package/dist/src/daemon/services/context-service.js +0 -1
- package/dist/src/daemon/services/linear-service.js +0 -1
- package/dist/src/daemon/services/maintenance-service.js +0 -1
- package/dist/src/daemon/services/memory-service.js +0 -1
- package/dist/src/daemon/session-daemon.js +0 -1
- package/dist/src/daemon/unified-daemon.js +0 -1
- package/dist/src/features/analytics/api/analytics-api.js +0 -1
- package/dist/src/features/analytics/core/analytics-service.js +1 -2
- package/dist/src/features/analytics/index.js +0 -1
- package/dist/src/features/analytics/queries/metrics-queries.js +8 -9
- package/dist/src/features/analytics/types/metrics.js +0 -1
- package/dist/src/features/browser/browser-mcp.js +0 -1
- package/dist/src/features/sweep/index.js +0 -1
- package/dist/src/features/sweep/prediction-client.js +0 -1
- package/dist/src/features/sweep/prompt-builder.js +0 -1
- package/dist/src/features/sweep/pty-wrapper.js +11 -2
- package/dist/src/features/sweep/state-watcher.js +0 -1
- package/dist/src/features/sweep/status-bar.js +0 -1
- package/dist/src/features/sweep/sweep-server-manager.js +0 -1
- package/dist/src/features/sweep/tab-interceptor.js +0 -1
- package/dist/src/features/sweep/types.js +0 -1
- package/dist/src/features/tasks/linear-task-manager.js +0 -1
- package/dist/src/features/tasks/task-aware-context.js +0 -1
- package/dist/src/features/tui/simple-monitor.js +0 -1
- package/dist/src/features/tui/swarm-monitor.js +0 -1
- package/dist/src/features/web/client/stores/task-store.js +0 -1
- package/dist/src/features/web/server/index.js +0 -1
- package/dist/src/features/workers/tmux-manager.js +0 -1
- package/dist/src/features/workers/worker-registry.js +0 -1
- package/dist/src/hooks/auto-background.js +0 -1
- package/dist/src/hooks/config.js +0 -1
- package/dist/src/hooks/daemon.js +0 -1
- package/dist/src/hooks/diffmem-hooks.js +0 -1
- package/dist/src/hooks/events.js +0 -1
- package/dist/src/hooks/index.js +0 -4
- package/dist/src/hooks/linear-task-picker.js +0 -1
- package/dist/src/hooks/schemas.js +0 -118
- package/dist/src/hooks/secure-fs.js +0 -1
- package/dist/src/hooks/security-logger.js +0 -1
- package/dist/src/hooks/session-summary.js +0 -1
- package/dist/src/index.js +0 -1
- package/dist/src/integrations/anthropic/client.js +0 -1
- package/dist/src/integrations/claude-code/agent-bridge.js +0 -1
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +0 -1
- package/dist/src/integrations/claude-code/lifecycle-hooks.js +0 -1
- package/dist/src/integrations/claude-code/post-task-hooks.js +0 -1
- package/dist/src/integrations/claude-code/subagent-client-stub.js +0 -1
- package/dist/src/integrations/claude-code/subagent-client.js +0 -1
- package/dist/src/integrations/claude-code/task-coordinator.js +0 -1
- package/dist/src/integrations/diffmem/client.js +0 -1
- package/dist/src/integrations/diffmem/config.js +0 -1
- package/dist/src/integrations/diffmem/index.js +0 -1
- package/dist/src/integrations/diffmem/types.js +0 -1
- package/dist/src/integrations/linear/auth.js +0 -1
- package/dist/src/integrations/linear/auto-sync.js +0 -1
- package/dist/src/integrations/linear/client.js +0 -1
- package/dist/src/integrations/linear/config.js +0 -1
- package/dist/src/integrations/linear/migration.js +0 -1
- package/dist/src/integrations/linear/oauth-server.js +0 -1
- package/dist/src/integrations/linear/rest-client.js +0 -1
- package/dist/src/integrations/linear/sync-manager.js +0 -1
- package/dist/src/integrations/linear/sync-service.js +0 -1
- package/dist/src/integrations/linear/sync.js +0 -1
- package/dist/src/integrations/linear/types.js +0 -1
- package/dist/src/integrations/linear/unified-sync.js +0 -1
- package/dist/src/integrations/linear/webhook-handler.js +0 -1
- package/dist/src/integrations/linear/webhook-server.js +0 -1
- package/dist/src/integrations/linear/webhook.js +0 -1
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +0 -1
- package/dist/src/integrations/mcp/handlers/context-handlers.js +43 -30
- package/dist/src/integrations/mcp/handlers/diffmem-handlers.js +0 -1
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js +0 -1
- package/dist/src/integrations/mcp/handlers/index.js +1 -3
- package/dist/src/integrations/mcp/handlers/linear-handlers.js +24 -61
- package/dist/src/integrations/mcp/handlers/skill-handlers.js +0 -1
- package/dist/src/integrations/mcp/handlers/task-handlers.js +0 -1
- package/dist/src/integrations/mcp/handlers/trace-handlers.js +0 -1
- package/dist/src/integrations/mcp/index.js +0 -1
- package/dist/src/integrations/mcp/middleware/tool-scoring.js +3 -2
- package/dist/src/integrations/mcp/pending-utils.js +0 -1
- package/dist/src/integrations/mcp/refactored-server.js +0 -1
- package/dist/src/integrations/mcp/remote-server.js +0 -1
- package/dist/src/integrations/mcp/schemas.js +0 -1
- package/dist/src/integrations/mcp/server.js +20 -24
- package/dist/src/integrations/mcp/tool-definitions-code.js +0 -1
- package/dist/src/integrations/mcp/tool-definitions.js +0 -1
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +0 -1
- package/dist/src/integrations/ralph/context/context-budget-manager.js +0 -1
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +0 -1
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +0 -1
- package/dist/src/integrations/ralph/index.js +0 -1
- package/dist/src/integrations/ralph/learning/pattern-learner.js +0 -1
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +5 -5
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +0 -1
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js +0 -1
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +0 -1
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +0 -1
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +0 -1
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +0 -1
- package/dist/src/integrations/ralph/performance/performance-optimizer.js +0 -1
- package/dist/src/integrations/ralph/recovery/crash-recovery.js +0 -1
- package/dist/src/integrations/ralph/state/state-reconciler.js +25 -9
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +0 -1
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +0 -1
- package/dist/src/integrations/ralph/types.js +0 -1
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js +0 -1
- package/dist/src/mcp/stackmemory-mcp-server.js +0 -1
- package/dist/src/middleware/exponential-rate-limiter.js +0 -1
- package/dist/src/models/user.model.js +0 -1
- package/dist/src/orchestrators/multimodal/constants.js +0 -1
- package/dist/src/orchestrators/multimodal/harness.js +0 -1
- package/dist/src/orchestrators/multimodal/providers.js +0 -1
- package/dist/src/orchestrators/multimodal/types.js +0 -1
- package/dist/src/orchestrators/multimodal/utils.js +0 -1
- package/dist/src/servers/production/auth-middleware.js +0 -1
- package/dist/src/services/config-service.js +0 -1
- package/dist/src/services/context-service.js +0 -1
- package/dist/src/skills/api-discovery.js +0 -1
- package/dist/src/skills/api-skill.js +0 -1
- package/dist/src/skills/claude-skills.js +0 -1
- package/dist/src/skills/dashboard-launcher.js +0 -1
- package/dist/src/skills/linear-task-runner.js +0 -1
- package/dist/src/skills/recursive-agent-orchestrator.js +0 -1
- package/dist/src/skills/repo-ingestion-skill.js +0 -1
- package/dist/src/skills/spec-generator-skill.js +0 -1
- package/dist/src/skills/unified-rlm-orchestrator.js +0 -1
- package/dist/src/types/task.js +0 -1
- package/dist/src/utils/env.js +0 -1
- package/dist/src/utils/formatting.js +0 -1
- package/dist/src/utils/process-cleanup.js +0 -1
- package/package.json +33 -8
- package/scripts/smoke-init-db.sh +77 -0
- package/dist/scripts/benchmark-performance.js +0 -48
- package/dist/scripts/benchmark-performance.js.map +0 -7
- package/dist/scripts/check-redis.js +0 -42
- package/dist/scripts/check-redis.js.map +0 -7
- package/dist/scripts/initialize.js +0 -183
- package/dist/scripts/initialize.js.map +0 -7
- package/dist/scripts/list-linear-tasks.js +0 -124
- package/dist/scripts/list-linear-tasks.js.map +0 -7
- package/dist/scripts/measure-handoff-impact.js +0 -340
- package/dist/scripts/measure-handoff-impact.js.map +0 -7
- package/dist/scripts/query-chromadb.js +0 -160
- package/dist/scripts/query-chromadb.js.map +0 -7
- package/dist/scripts/show-linear-summary.js +0 -119
- package/dist/scripts/show-linear-summary.js.map +0 -7
- package/dist/scripts/simple-swarm-demo.js +0 -90
- package/dist/scripts/simple-swarm-demo.js.map +0 -7
- package/dist/scripts/status.js +0 -155
- package/dist/scripts/status.js.map +0 -7
- package/dist/scripts/test-chromadb-sync.js +0 -192
- package/dist/scripts/test-chromadb-sync.js.map +0 -7
- package/dist/scripts/test-ralph-iteration-fix.js +0 -86
- package/dist/scripts/test-ralph-iteration-fix.js.map +0 -7
- package/dist/scripts/test-ralph-iterations.js +0 -121
- package/dist/scripts/test-ralph-iterations.js.map +0 -7
- package/dist/scripts/test-redis-storage.js +0 -389
- package/dist/scripts/test-redis-storage.js.map +0 -7
- package/dist/scripts/test-simple-ralph-state-sync.js +0 -115
- package/dist/scripts/test-simple-ralph-state-sync.js.map +0 -7
- package/dist/scripts/test-swarm-fixes.js +0 -125
- package/dist/scripts/test-swarm-fixes.js.map +0 -7
- package/dist/scripts/test-swarm-tui.js +0 -23
- package/dist/scripts/test-swarm-tui.js.map +0 -7
- package/dist/scripts/test-tui-shortcuts.js +0 -52
- package/dist/scripts/test-tui-shortcuts.js.map +0 -7
- package/dist/scripts/validate-tui-shortcuts.js +0 -60
- package/dist/scripts/validate-tui-shortcuts.js.map +0 -7
- package/dist/src/agents/core/agent-task-manager.js.map +0 -7
- package/dist/src/agents/verifiers/base-verifier.js.map +0 -7
- package/dist/src/agents/verifiers/formatter-verifier.js.map +0 -7
- package/dist/src/agents/verifiers/llm-judge.js.map +0 -7
- package/dist/src/cli/auto-detect.js.map +0 -7
- package/dist/src/cli/claude-sm-danger.js.map +0 -7
- package/dist/src/cli/claude-sm.js.map +0 -7
- package/dist/src/cli/codex-sm-danger.js.map +0 -7
- package/dist/src/cli/codex-sm.js.map +0 -7
- package/dist/src/cli/commands/api.js.map +0 -7
- package/dist/src/cli/commands/auto-background.js.map +0 -7
- package/dist/src/cli/commands/cleanup-processes.js.map +0 -7
- package/dist/src/cli/commands/clear.js.map +0 -7
- package/dist/src/cli/commands/config.js.map +0 -7
- package/dist/src/cli/commands/context-rehydrate.js.map +0 -7
- package/dist/src/cli/commands/context.js.map +0 -7
- package/dist/src/cli/commands/daemon.js.map +0 -7
- package/dist/src/cli/commands/dashboard.js.map +0 -7
- package/dist/src/cli/commands/db.js.map +0 -7
- package/dist/src/cli/commands/decision.js.map +0 -7
- package/dist/src/cli/commands/discovery.js.map +0 -7
- package/dist/src/cli/commands/handoff.js.map +0 -7
- package/dist/src/cli/commands/hooks.js.map +0 -7
- package/dist/src/cli/commands/linear.js.map +0 -7
- package/dist/src/cli/commands/log.js.map +0 -7
- package/dist/src/cli/commands/login.js.map +0 -7
- package/dist/src/cli/commands/migrate.js.map +0 -7
- package/dist/src/cli/commands/model.js.map +0 -7
- package/dist/src/cli/commands/onboard.js.map +0 -7
- package/dist/src/cli/commands/ping.js.map +0 -7
- package/dist/src/cli/commands/projects.js.map +0 -7
- package/dist/src/cli/commands/ralph.js.map +0 -7
- package/dist/src/cli/commands/retrieval.js.map +0 -7
- package/dist/src/cli/commands/search.js.map +0 -7
- package/dist/src/cli/commands/service.js.map +0 -7
- package/dist/src/cli/commands/session.js.map +0 -7
- package/dist/src/cli/commands/settings.js +0 -306
- package/dist/src/cli/commands/settings.js.map +0 -7
- package/dist/src/cli/commands/setup.js.map +0 -7
- package/dist/src/cli/commands/shell.js.map +0 -7
- package/dist/src/cli/commands/signup.js.map +0 -7
- package/dist/src/cli/commands/skills.js.map +0 -7
- package/dist/src/cli/commands/sms-notify.js +0 -795
- package/dist/src/cli/commands/sms-notify.js.map +0 -7
- package/dist/src/cli/commands/storage-tier.js.map +0 -7
- package/dist/src/cli/commands/sweep.js.map +0 -7
- package/dist/src/cli/commands/tasks.js.map +0 -7
- package/dist/src/cli/commands/worktree.js.map +0 -7
- package/dist/src/cli/index.js.map +0 -7
- package/dist/src/cli/opencode-sm.js.map +0 -7
- package/dist/src/cli/utils/viewer.js.map +0 -7
- package/dist/src/core/config/config-manager.js.map +0 -7
- package/dist/src/core/config/feature-flags.js.map +0 -7
- package/dist/src/core/config/storage-config.js.map +0 -7
- package/dist/src/core/config/types.js.map +0 -7
- package/dist/src/core/context/auto-context.js.map +0 -7
- package/dist/src/core/context/dual-stack-manager.js.map +0 -7
- package/dist/src/core/context/enhanced-rehydration.js.map +0 -7
- package/dist/src/core/context/frame-database.js.map +0 -7
- package/dist/src/core/context/frame-digest.js.map +0 -7
- package/dist/src/core/context/frame-handoff-manager.js.map +0 -7
- package/dist/src/core/context/frame-lifecycle-hooks.js.map +0 -7
- package/dist/src/core/context/frame-recovery.js.map +0 -7
- package/dist/src/core/context/frame-stack.js.map +0 -7
- package/dist/src/core/context/frame-types.js.map +0 -7
- package/dist/src/core/context/index.js.map +0 -7
- package/dist/src/core/context/permission-manager.js.map +0 -7
- package/dist/src/core/context/recursive-context-manager.js.map +0 -7
- package/dist/src/core/context/refactored-frame-manager.js.map +0 -7
- package/dist/src/core/context/shared-context-layer.js.map +0 -7
- package/dist/src/core/context/stack-merge-resolver.js.map +0 -7
- package/dist/src/core/context/validation.js.map +0 -7
- package/dist/src/core/database/batch-operations.js.map +0 -7
- package/dist/src/core/database/connection-pool.js.map +0 -7
- package/dist/src/core/database/database-adapter.js.map +0 -7
- package/dist/src/core/database/embedding-provider-factory.js.map +0 -7
- package/dist/src/core/database/embedding-provider.js.map +0 -7
- package/dist/src/core/database/migration-manager.js.map +0 -7
- package/dist/src/core/database/ollama-embedding-provider.js.map +0 -7
- package/dist/src/core/database/openai-embedding-provider.js.map +0 -7
- package/dist/src/core/database/query-cache.js.map +0 -7
- package/dist/src/core/database/query-router.js.map +0 -7
- package/dist/src/core/database/sqlite-adapter.js.map +0 -7
- package/dist/src/core/database/transformers-embedding-provider.js.map +0 -7
- package/dist/src/core/digest/enhanced-hybrid-digest.js.map +0 -7
- package/dist/src/core/digest/frame-digest-integration.js.map +0 -7
- package/dist/src/core/digest/hybrid-digest-generator.js.map +0 -7
- package/dist/src/core/digest/index.js.map +0 -7
- package/dist/src/core/digest/types.js.map +0 -7
- package/dist/src/core/errors/error-utils.js.map +0 -7
- package/dist/src/core/errors/index.js.map +0 -7
- package/dist/src/core/errors/recovery.js.map +0 -7
- package/dist/src/core/execution/parallel-executor.js.map +0 -7
- package/dist/src/core/extensions/custom-tools.js.map +0 -7
- package/dist/src/core/extensions/index.js.map +0 -7
- package/dist/src/core/extensions/loader.js.map +0 -7
- package/dist/src/core/extensions/plugin-system.js.map +0 -7
- package/dist/src/core/extensions/provider-adapter.js.map +0 -7
- package/dist/src/core/extensions/sandbox-runtime.js.map +0 -7
- package/dist/src/core/extensions/types.js.map +0 -7
- package/dist/src/core/frame/workflow-templates.js.map +0 -7
- package/dist/src/core/merge/conflict-detector.js.map +0 -7
- package/dist/src/core/merge/index.js.map +0 -7
- package/dist/src/core/merge/resolution-engine.js.map +0 -7
- package/dist/src/core/merge/stack-diff.js.map +0 -7
- package/dist/src/core/merge/types.js.map +0 -7
- package/dist/src/core/merge/unified-merge-resolver.js.map +0 -7
- package/dist/src/core/models/fallback-monitor.js.map +0 -7
- package/dist/src/core/models/model-router.js.map +0 -7
- package/dist/src/core/monitoring/error-handler.js.map +0 -7
- package/dist/src/core/monitoring/logger.js.map +0 -7
- package/dist/src/core/monitoring/metrics.js.map +0 -7
- package/dist/src/core/monitoring/progress-tracker.js.map +0 -7
- package/dist/src/core/monitoring/session-monitor.js.map +0 -7
- package/dist/src/core/performance/context-cache.js.map +0 -7
- package/dist/src/core/performance/index.js.map +0 -7
- package/dist/src/core/performance/lazy-context-loader.js.map +0 -7
- package/dist/src/core/performance/monitor.js.map +0 -7
- package/dist/src/core/performance/optimized-frame-context.js.map +0 -7
- package/dist/src/core/performance/performance-benchmark.js.map +0 -7
- package/dist/src/core/performance/performance-profiler.js.map +0 -7
- package/dist/src/core/performance/streaming-jsonl-parser.js.map +0 -7
- package/dist/src/core/persistence/postgres-adapter.js.map +0 -7
- package/dist/src/core/projects/project-isolation.js.map +0 -7
- package/dist/src/core/projects/project-manager.js.map +0 -7
- package/dist/src/core/query/query-parser.js.map +0 -7
- package/dist/src/core/query/query-templates.js.map +0 -7
- package/dist/src/core/retrieval/context-retriever.js.map +0 -7
- package/dist/src/core/retrieval/index.js.map +0 -7
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +0 -7
- package/dist/src/core/retrieval/llm-provider.js.map +0 -7
- package/dist/src/core/retrieval/privacy-filter.js.map +0 -7
- package/dist/src/core/retrieval/retrieval-audit.js.map +0 -7
- package/dist/src/core/retrieval/summary-generator.js.map +0 -7
- package/dist/src/core/retrieval/types.js.map +0 -7
- package/dist/src/core/retrieval/unified-context-assembler.js.map +0 -7
- package/dist/src/core/security/index.js.map +0 -7
- package/dist/src/core/security/input-sanitizer.js.map +0 -7
- package/dist/src/core/session/clear-survival.js.map +0 -7
- package/dist/src/core/session/enhanced-handoff.js.map +0 -7
- package/dist/src/core/session/handoff-generator.js.map +0 -7
- package/dist/src/core/session/index.js.map +0 -7
- package/dist/src/core/session/session-manager.js.map +0 -7
- package/dist/src/core/skills/index.js.map +0 -7
- package/dist/src/core/skills/skill-storage.js.map +0 -7
- package/dist/src/core/skills/types.js.map +0 -7
- package/dist/src/core/storage/chromadb-adapter.js.map +0 -7
- package/dist/src/core/storage/infinite-storage.js.map +0 -7
- package/dist/src/core/storage/project-registry.js.map +0 -7
- package/dist/src/core/storage/remote-storage.js.map +0 -7
- package/dist/src/core/storage/storage-tier-manager.js.map +0 -7
- package/dist/src/core/storage/two-tier-storage.js.map +0 -7
- package/dist/src/core/trace/cli-trace-wrapper.js.map +0 -7
- package/dist/src/core/trace/db-trace-wrapper.js.map +0 -7
- package/dist/src/core/trace/debug-trace.js.map +0 -7
- package/dist/src/core/trace/index.js.map +0 -7
- package/dist/src/core/trace/linear-api-wrapper.js.map +0 -7
- package/dist/src/core/trace/trace-detector.js.map +0 -7
- package/dist/src/core/trace/trace-store.js.map +0 -7
- package/dist/src/core/trace/types.js.map +0 -7
- package/dist/src/core/types.js.map +0 -7
- package/dist/src/core/utils/async-mutex.js.map +0 -7
- package/dist/src/core/utils/compression.js.map +0 -7
- package/dist/src/core/utils/update-checker.js.map +0 -7
- package/dist/src/core/worktree/worktree-manager.js.map +0 -7
- package/dist/src/daemon/daemon-config.js.map +0 -7
- package/dist/src/daemon/services/context-service.js.map +0 -7
- package/dist/src/daemon/services/linear-service.js.map +0 -7
- package/dist/src/daemon/services/maintenance-service.js.map +0 -7
- package/dist/src/daemon/services/memory-service.js.map +0 -7
- package/dist/src/daemon/session-daemon.js.map +0 -7
- package/dist/src/daemon/unified-daemon.js.map +0 -7
- package/dist/src/features/analytics/api/analytics-api.js.map +0 -7
- package/dist/src/features/analytics/core/analytics-service.js.map +0 -7
- package/dist/src/features/analytics/index.js.map +0 -7
- package/dist/src/features/analytics/queries/metrics-queries.js.map +0 -7
- package/dist/src/features/analytics/types/metrics.js.map +0 -7
- package/dist/src/features/browser/browser-mcp.js.map +0 -7
- package/dist/src/features/sweep/index.js.map +0 -7
- package/dist/src/features/sweep/prediction-client.js.map +0 -7
- package/dist/src/features/sweep/prompt-builder.js.map +0 -7
- package/dist/src/features/sweep/pty-wrapper.js.map +0 -7
- package/dist/src/features/sweep/state-watcher.js.map +0 -7
- package/dist/src/features/sweep/status-bar.js.map +0 -7
- package/dist/src/features/sweep/sweep-server-manager.js.map +0 -7
- package/dist/src/features/sweep/tab-interceptor.js.map +0 -7
- package/dist/src/features/sweep/types.js.map +0 -7
- package/dist/src/features/tasks/linear-task-manager.js.map +0 -7
- package/dist/src/features/tasks/task-aware-context.js.map +0 -7
- package/dist/src/features/tui/simple-monitor.js.map +0 -7
- package/dist/src/features/tui/swarm-monitor.js.map +0 -7
- package/dist/src/features/web/client/stores/task-store.js.map +0 -7
- package/dist/src/features/web/server/index.js.map +0 -7
- package/dist/src/features/workers/tmux-manager.js.map +0 -7
- package/dist/src/features/workers/worker-registry.js.map +0 -7
- package/dist/src/hooks/auto-background.js.map +0 -7
- package/dist/src/hooks/claude-code-whatsapp-hook.js +0 -197
- package/dist/src/hooks/claude-code-whatsapp-hook.js.map +0 -7
- package/dist/src/hooks/config.js.map +0 -7
- package/dist/src/hooks/daemon.js.map +0 -7
- package/dist/src/hooks/diffmem-hooks.js.map +0 -7
- package/dist/src/hooks/events.js.map +0 -7
- package/dist/src/hooks/index.js.map +0 -7
- package/dist/src/hooks/linear-task-picker.js.map +0 -7
- package/dist/src/hooks/schemas.js.map +0 -7
- package/dist/src/hooks/secure-fs.js.map +0 -7
- package/dist/src/hooks/security-logger.js.map +0 -7
- package/dist/src/hooks/session-summary.js.map +0 -7
- package/dist/src/hooks/sms-action-runner.js +0 -371
- package/dist/src/hooks/sms-action-runner.js.map +0 -7
- package/dist/src/hooks/sms-notify.js +0 -506
- package/dist/src/hooks/sms-notify.js.map +0 -7
- package/dist/src/hooks/sms-watcher.js +0 -93
- package/dist/src/hooks/sms-watcher.js.map +0 -7
- package/dist/src/hooks/sms-webhook.js +0 -555
- package/dist/src/hooks/sms-webhook.js.map +0 -7
- package/dist/src/hooks/whatsapp-commands.js +0 -479
- package/dist/src/hooks/whatsapp-commands.js.map +0 -7
- package/dist/src/hooks/whatsapp-scheduler.js +0 -317
- package/dist/src/hooks/whatsapp-scheduler.js.map +0 -7
- package/dist/src/hooks/whatsapp-sync.js +0 -409
- package/dist/src/hooks/whatsapp-sync.js.map +0 -7
- package/dist/src/index.js.map +0 -7
- package/dist/src/integrations/anthropic/client.js.map +0 -7
- package/dist/src/integrations/claude-code/agent-bridge.js.map +0 -7
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
- package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +0 -7
- package/dist/src/integrations/claude-code/post-task-hooks.js.map +0 -7
- package/dist/src/integrations/claude-code/subagent-client-stub.js.map +0 -7
- package/dist/src/integrations/claude-code/subagent-client.js.map +0 -7
- package/dist/src/integrations/claude-code/task-coordinator.js.map +0 -7
- package/dist/src/integrations/diffmem/client.js.map +0 -7
- package/dist/src/integrations/diffmem/config.js.map +0 -7
- package/dist/src/integrations/diffmem/index.js.map +0 -7
- package/dist/src/integrations/diffmem/types.js.map +0 -7
- package/dist/src/integrations/linear/auth.js.map +0 -7
- package/dist/src/integrations/linear/auto-sync.js.map +0 -7
- package/dist/src/integrations/linear/client.js.map +0 -7
- package/dist/src/integrations/linear/config.js.map +0 -7
- package/dist/src/integrations/linear/migration.js.map +0 -7
- package/dist/src/integrations/linear/oauth-server.js.map +0 -7
- package/dist/src/integrations/linear/rest-client.js.map +0 -7
- package/dist/src/integrations/linear/sync-manager.js.map +0 -7
- package/dist/src/integrations/linear/sync-service.js.map +0 -7
- package/dist/src/integrations/linear/sync.js.map +0 -7
- package/dist/src/integrations/linear/types.js.map +0 -7
- package/dist/src/integrations/linear/unified-sync.js.map +0 -7
- package/dist/src/integrations/linear/webhook-handler.js.map +0 -7
- package/dist/src/integrations/linear/webhook-server.js.map +0 -7
- package/dist/src/integrations/linear/webhook.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/context-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/diffmem-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/index.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/task-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/index.js.map +0 -7
- package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +0 -7
- package/dist/src/integrations/mcp/pending-utils.js.map +0 -7
- package/dist/src/integrations/mcp/refactored-server.js.map +0 -7
- package/dist/src/integrations/mcp/remote-server.js.map +0 -7
- package/dist/src/integrations/mcp/schemas.js.map +0 -7
- package/dist/src/integrations/mcp/server.js.map +0 -7
- package/dist/src/integrations/mcp/tool-definitions-code.js.map +0 -7
- package/dist/src/integrations/mcp/tool-definitions.js.map +0 -7
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
- package/dist/src/integrations/ralph/context/context-budget-manager.js.map +0 -7
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
- package/dist/src/integrations/ralph/index.js.map +0 -7
- package/dist/src/integrations/ralph/learning/pattern-learner.js.map +0 -7
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
- package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +0 -7
- package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +0 -7
- package/dist/src/integrations/ralph/state/state-reconciler.js.map +0 -7
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
- package/dist/src/integrations/ralph/types.js.map +0 -7
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
- package/dist/src/mcp/stackmemory-mcp-server.js.map +0 -7
- package/dist/src/middleware/exponential-rate-limiter.js.map +0 -7
- package/dist/src/models/user.model.js.map +0 -7
- package/dist/src/orchestrators/multimodal/constants.js.map +0 -7
- package/dist/src/orchestrators/multimodal/harness.js.map +0 -7
- package/dist/src/orchestrators/multimodal/providers.js.map +0 -7
- package/dist/src/orchestrators/multimodal/types.js.map +0 -7
- package/dist/src/orchestrators/multimodal/utils.js.map +0 -7
- package/dist/src/servers/production/auth-middleware.js.map +0 -7
- package/dist/src/services/config-service.js.map +0 -7
- package/dist/src/services/context-service.js.map +0 -7
- package/dist/src/skills/api-discovery.js.map +0 -7
- package/dist/src/skills/api-skill.js.map +0 -7
- package/dist/src/skills/claude-skills.js.map +0 -7
- package/dist/src/skills/dashboard-launcher.js.map +0 -7
- package/dist/src/skills/linear-task-runner.js.map +0 -7
- package/dist/src/skills/recursive-agent-orchestrator.js.map +0 -7
- package/dist/src/skills/repo-ingestion-skill.js.map +0 -7
- package/dist/src/skills/spec-generator-skill.js.map +0 -7
- package/dist/src/skills/unified-rlm-orchestrator.js.map +0 -7
- package/dist/src/types/task.js.map +0 -7
- package/dist/src/utils/env.js.map +0 -7
- package/dist/src/utils/formatting.js.map +0 -7
- package/dist/src/utils/process-cleanup.js.map +0 -7
- package/scripts/README-TESTING.md +0 -186
- package/scripts/analyze-cli-security.js +0 -288
- package/scripts/archive/add-phase-tasks-to-linear.js +0 -163
- package/scripts/archive/analyze-linear-duplicates.js +0 -214
- package/scripts/archive/analyze-remaining-duplicates.js +0 -230
- package/scripts/archive/analyze-sta-duplicates.js +0 -292
- package/scripts/archive/analyze-sta-graphql.js +0 -399
- package/scripts/archive/cancel-duplicate-tasks.ts +0 -246
- package/scripts/archive/check-all-duplicates.ts +0 -419
- package/scripts/archive/clean-duplicate-tasks.js +0 -114
- package/scripts/archive/cleanup-duplicate-tasks.ts +0 -286
- package/scripts/archive/create-phase-tasks.js +0 -387
- package/scripts/archive/delete-linear-duplicates.js +0 -182
- package/scripts/archive/delete-remaining-duplicates.js +0 -158
- package/scripts/archive/delete-sta-duplicates.js +0 -201
- package/scripts/archive/delete-sta-oauth.js +0 -201
- package/scripts/archive/export-sta-tasks.js +0 -62
- package/scripts/archive/install-auto-sync.js +0 -266
- package/scripts/archive/install-chromadb-hooks.sh +0 -133
- package/scripts/archive/install-enhanced-clear-hooks.sh +0 -431
- package/scripts/archive/install-post-task-hooks.sh +0 -289
- package/scripts/archive/install-stackmemory-hooks.sh +0 -420
- package/scripts/archive/merge-linear-duplicates-safe.ts +0 -362
- package/scripts/archive/merge-linear-duplicates.ts +0 -182
- package/scripts/archive/remove-sta-tasks.js +0 -70
- package/scripts/archive/setup-background-sync.sh +0 -168
- package/scripts/archive/setup-claude-auto-triggers.sh +0 -181
- package/scripts/archive/setup-claude-autostart.sh +0 -305
- package/scripts/archive/setup-git-hooks.sh +0 -25
- package/scripts/archive/setup-linear-oauth.sh +0 -46
- package/scripts/archive/setup-mcp.sh +0 -113
- package/scripts/archive/setup-railway-deployment.sh +0 -81
- package/scripts/auto-handoff.sh +0 -262
- package/scripts/background-sync-manager.js +0 -478
- package/scripts/benchmark-performance.ts +0 -57
- package/scripts/check-redis.ts +0 -48
- package/scripts/chromadb-auto-loader.sh +0 -128
- package/scripts/chromadb-context-loader.js +0 -479
- package/scripts/claude-chromadb-hook.js +0 -460
- package/scripts/claude-linear-skill.js +0 -455
- package/scripts/claude-pre-commit.sh +0 -302
- package/scripts/claude-sm-autostart.js +0 -579
- package/scripts/claude-with-chromadb.sh +0 -69
- package/scripts/clean-linear-backlog.js +0 -273
- package/scripts/cleanup-old-sessions.sh +0 -57
- package/scripts/create-cleanup-issues.js +0 -302
- package/scripts/create-sandbox.sh +0 -269
- package/scripts/debug-linear-update.js +0 -174
- package/scripts/delete-linear-tasks.js +0 -167
- package/scripts/demos/browser-test.ts +0 -39
- package/scripts/demos/ralph-integration-demo.ts +0 -245
- package/scripts/demos/trace-demo.ts +0 -200
- package/scripts/demos/trace-detector.demo.ts +0 -171
- package/scripts/demos/trace-test.ts +0 -79
- package/scripts/deploy-ralph-swarm.sh +0 -365
- package/scripts/deploy.sh +0 -89
- package/scripts/deployment/test-deployment.js +0 -194
- package/scripts/detect-and-rehydrate.js +0 -162
- package/scripts/detect-and-rehydrate.mjs +0 -165
- package/scripts/development/create-demo-tasks.js +0 -143
- package/scripts/development/debug-frame-test.js +0 -16
- package/scripts/development/demo-auto-sync.js +0 -128
- package/scripts/development/fix-all-imports.js +0 -213
- package/scripts/development/fix-imports.js +0 -229
- package/scripts/development/fix-lint-loop.cjs +0 -103
- package/scripts/development/fix-project-id.ts +0 -161
- package/scripts/development/fix-strict-mode-issues.ts +0 -291
- package/scripts/development/reorganize-structure.sh +0 -228
- package/scripts/development/test-persistence-direct.js +0 -148
- package/scripts/development/test-persistence.js +0 -114
- package/scripts/development/test-tasks.js +0 -93
- package/scripts/development/update-imports.js +0 -212
- package/scripts/fetch-linear-status.js +0 -125
- package/scripts/initialize.ts +0 -220
- package/scripts/install-notify-hook.sh +0 -84
- package/scripts/linear-auto-sync.js +0 -262
- package/scripts/linear-auto-sync.sh +0 -161
- package/scripts/linear-sync-daemon.js +0 -150
- package/scripts/linear-task-review.js +0 -237
- package/scripts/list-linear-tasks.ts +0 -178
- package/scripts/mcp-proxy.js +0 -66
- package/scripts/measure-handoff-impact.mjs +0 -395
- package/scripts/measure-handoff-impact.ts +0 -450
- package/scripts/publish-local.js +0 -74
- package/scripts/query-chromadb.ts +0 -201
- package/scripts/ralph-integration-test.js +0 -274
- package/scripts/reconcile-local-tasks.js +0 -170
- package/scripts/recreate-frames-db.js +0 -89
- package/scripts/setup-notify-webhook.sh +0 -103
- package/scripts/show-linear-summary.ts +0 -172
- package/scripts/simple-swarm-demo.ts +0 -114
- package/scripts/stackmemory-auto-handoff.sh +0 -231
- package/scripts/start-linear-sync-daemon.sh +0 -141
- package/scripts/start-temporal-paradox.sh +0 -214
- package/scripts/status.ts +0 -224
- package/scripts/stop-notify-webhook.sh +0 -19
- package/scripts/swarm-monitor.js +0 -509
- package/scripts/sync-and-clean-tasks.js +0 -258
- package/scripts/sync-linear-graphql.js +0 -303
- package/scripts/sync-linear-tasks.js +0 -186
- package/scripts/test-auto-triggers.sh +0 -57
- package/scripts/test-browser-mcp.js +0 -74
- package/scripts/test-chromadb-full.js +0 -115
- package/scripts/test-chromadb-hooks.sh +0 -28
- package/scripts/test-chromadb-sync.ts +0 -245
- package/scripts/test-claude-config.sh +0 -123
- package/scripts/test-cli-security.js +0 -293
- package/scripts/test-code-execution.js +0 -143
- package/scripts/test-hooks-persistence.sh +0 -220
- package/scripts/test-installation-scenarios.sh +0 -359
- package/scripts/test-installation.sh +0 -224
- package/scripts/test-mcp.js +0 -163
- package/scripts/test-parallel-swarms.js +0 -443
- package/scripts/test-pre-publish-quick.sh +0 -77
- package/scripts/test-quality-gates.sh +0 -263
- package/scripts/test-ralph-iteration-fix.ts +0 -118
- package/scripts/test-ralph-iterations.ts +0 -164
- package/scripts/test-redis-storage.ts +0 -490
- package/scripts/test-rlm-basic.sh +0 -122
- package/scripts/test-rlm-comprehensive.sh +0 -260
- package/scripts/test-rlm-e2e.sh +0 -268
- package/scripts/test-rlm-simple.js +0 -90
- package/scripts/test-rlm.js +0 -110
- package/scripts/test-session-handoff.sh +0 -165
- package/scripts/test-setup-e2e.sh +0 -154
- package/scripts/test-shell-integration.sh +0 -275
- package/scripts/test-simple-ralph-state-sync.ts +0 -178
- package/scripts/test-swarm-fixes.ts +0 -161
- package/scripts/test-swarm-git-workflow.js +0 -338
- package/scripts/test-swarm-tui.ts +0 -34
- package/scripts/test-tui-shortcuts.ts +0 -66
- package/scripts/testing/ab-test-runner.ts +0 -510
- package/scripts/testing/collect-metrics.ts +0 -457
- package/scripts/testing/quick-effectiveness-demo.js +0 -187
- package/scripts/testing/ralph-cli-test.js +0 -88
- package/scripts/testing/ralph-integration-validation.js +0 -727
- package/scripts/testing/ralph-swarm-test-scenarios.js +0 -613
- package/scripts/testing/real-performance-test.js +0 -422
- package/scripts/testing/results/real-performance-results.json +0 -90
- package/scripts/testing/run-effectiveness-tests.sh +0 -176
- package/scripts/testing/simple-effectiveness-test.js +0 -310
- package/scripts/testing/test-tier-migration.js +0 -100
- package/scripts/update-linear-status.js +0 -268
- package/scripts/update-linear-tasks-fixed.js +0 -284
- package/scripts/validate-claude-config.sh +0 -155
- package/scripts/validate-swarm-implementation.js +0 -467
- package/scripts/validate-tui-shortcuts.ts +0 -83
- package/templates/claude-hooks/notify-review-hook.js +0 -360
- package/templates/claude-hooks/sms-response-handler.js +0 -174
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/skills/recursive-agent-orchestrator.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Recursive Language Model (RLM) Orchestrator for StackMemory\n *\n * Implements recursive task decomposition with parallel Claude API execution\n * Based on \"Recursive Language Models\" paper concepts\n *\n * Key Features:\n * - Parallel subagent execution via Claude API\n * - Automatic test generation and validation\n * - Multi-stage code review and improvement\n * - Large codebase processing through chunking\n * - Full operation transparency\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { logger } from '../core/monitoring/logger.js';\nimport { FrameManager } from '../core/context/index.js';\nimport { DualStackManager } from '../core/context/dual-stack-manager.js';\nimport { ContextRetriever } from '../core/retrieval/context-retriever.js';\nimport { LinearTaskManager } from '../features/tasks/linear-task-manager.js';\nimport { ParallelExecutor } from '../core/execution/parallel-executor.js';\nimport { RecursiveContextManager } from '../core/context/recursive-context-manager.js';\nimport { ClaudeCodeSubagentClient } from '../integrations/claude-code/subagent-client.js';\n\n// Subagent types\nexport type SubagentType =\n | 'planning'\n | 'code'\n | 'testing'\n | 'linting'\n | 'review'\n | 'context'\n | 'publish'\n | 'improve';\n\n// Subagent configuration\nexport interface SubagentConfig {\n type: SubagentType;\n model:\n | 'claude-sonnet-4-5-20250929'\n | 'claude-haiku-4-5-20251001'\n | 'claude-opus-4-6';\n maxTokens: number;\n temperature: number;\n systemPrompt: string;\n capabilities: string[];\n}\n\n// Task decomposition node\nexport interface TaskNode {\n id: string;\n type: 'task' | 'parallel' | 'sequential';\n description: string;\n agent: SubagentType;\n dependencies: string[];\n context: Record<string, unknown>;\n children?: TaskNode[];\n status: 'pending' | 'running' | 'completed' | 'failed';\n result?: unknown;\n error?: Error;\n attempts: number;\n startTime?: Date;\n endTime?: Date;\n tokens?: number;\n cost?: number;\n}\n\n// Execution result\nexport interface ExecutionResult {\n success: boolean;\n rootNode: TaskNode;\n totalTokens: number;\n totalCost: number;\n duration: number;\n improvements: string[];\n testsGenerated: number;\n issuesFound: number;\n issuesFixed: number;\n}\n\n// RLM Options\nexport interface RLMOptions {\n maxParallel?: number;\n maxRecursionDepth?: number;\n maxTokensPerAgent?: number;\n maxTotalCost?: number;\n timeoutPerAgent?: number;\n retryFailedAgents?: boolean;\n shareContextRealtime?: boolean;\n testGenerationMode?: 'unit' | 'integration' | 'e2e' | 'all';\n reviewStages?: number;\n qualityThreshold?: number;\n verboseLogging?: boolean;\n}\n\n/**\n * Main RLM Orchestrator\n */\nexport class RecursiveAgentOrchestrator {\n private frameManager: FrameManager;\n private contextRetriever: ContextRetriever;\n private taskStore: LinearTaskManager;\n private parallelExecutor: ParallelExecutor;\n private contextManager: RecursiveContextManager;\n private subagentClient: ClaudeCodeSubagentClient;\n\n // Subagent configurations\n private subagentConfigs: Map<SubagentType, SubagentConfig>;\n\n // Execution tracking\n private activeExecutions: Map<string, TaskNode> = new Map();\n private executionHistory: ExecutionResult[] = [];\n\n // Default options\n private defaultOptions: Required<RLMOptions> = {\n maxParallel: 5,\n maxRecursionDepth: 4,\n maxTokensPerAgent: 30000,\n maxTotalCost: 50.0, // Quality over cost\n timeoutPerAgent: 300,\n retryFailedAgents: true,\n shareContextRealtime: true,\n testGenerationMode: 'all',\n reviewStages: 3, // Multi-stage review\n qualityThreshold: 0.85,\n verboseLogging: true, // Full transparency\n };\n\n constructor(\n frameManager: FrameManager,\n dualStackManager: DualStackManager,\n contextRetriever: ContextRetriever,\n taskStore: LinearTaskManager\n ) {\n this.frameManager = frameManager;\n this.contextRetriever = contextRetriever;\n this.taskStore = taskStore;\n\n // Initialize components\n this.parallelExecutor = new ParallelExecutor(\n this.defaultOptions.maxParallel\n );\n this.contextManager = new RecursiveContextManager(\n dualStackManager,\n contextRetriever\n );\n this.subagentClient = new ClaudeCodeSubagentClient();\n\n // Initialize subagent configurations\n this.subagentConfigs = this.initializeSubagentConfigs();\n\n logger.info('RLM Orchestrator initialized', {\n maxParallel: this.defaultOptions.maxParallel,\n maxRecursion: this.defaultOptions.maxRecursionDepth,\n reviewStages: this.defaultOptions.reviewStages,\n });\n }\n\n /**\n * Initialize subagent configurations with specialized prompts\n */\n private initializeSubagentConfigs(): Map<SubagentType, SubagentConfig> {\n const configs = new Map<SubagentType, SubagentConfig>();\n\n // Planning Agent - Task decomposer\n configs.set('planning', {\n type: 'planning',\n model: 'claude-sonnet-4-5-20250929',\n maxTokens: 20000,\n temperature: 0.3,\n systemPrompt: `You decompose tasks into parallel/sequential subtask trees.\nOutput JSON: { subtasks: [{ id, description, agent, dependencies[], parallel: bool }] }\nRules:\n- Maximize parallelism \u2014 independent tasks run concurrently\n- Each subtask names its agent type: planning, code, testing, linting, review, improve, context, publish\n- Include failure modes and rollback steps for risky operations\n- Keep subtask descriptions actionable (verb + object + constraint)`,\n capabilities: ['decompose', 'analyze', 'strategize', 'prioritize'],\n });\n\n // Code Agent - Implementation specialist\n configs.set('code', {\n type: 'code',\n model: 'claude-sonnet-4-5-20250929',\n maxTokens: 30000,\n temperature: 0.2,\n systemPrompt: `You implement code changes. Read existing code before modifying.\nOutput JSON: { success: bool, filesChanged: string[], changes: string[], notes: string[] }\nRules:\n- Follow existing project conventions (naming, imports, patterns)\n- Add .js extensions to relative TypeScript imports (ESM)\n- Return undefined over throwing; log+continue over crash\n- No emojis, no unnecessary comments, functions under 20 lines\n- Validate inputs at system boundaries only`,\n capabilities: ['implement', 'refactor', 'optimize', 'document'],\n });\n\n // Testing Agent - Test generation and validation\n configs.set('testing', {\n type: 'testing',\n model: 'claude-sonnet-4-5-20250929',\n maxTokens: 25000,\n temperature: 0.1,\n systemPrompt: `You generate and run tests using the project's test framework.\nOutput JSON: { success: bool, tests: [{ name, type, file }], coverage: string, notes: string[] }\nRules:\n- Use vitest (describe/it/expect) \u2014 check existing tests for patterns\n- Prioritize: critical paths > edge cases > happy paths\n- Each test should assert meaningful behavior, not implementation details\n- Use parameterized tests (it.each) to consolidate similar cases\n- Run tests after writing: npm run test:run`,\n capabilities: [\n 'generate-tests',\n 'validate',\n 'coverage-analysis',\n 'test-execution',\n ],\n });\n\n // Linting Agent - Code quality enforcer\n configs.set('linting', {\n type: 'linting',\n model: 'claude-haiku-4-5-20251001',\n maxTokens: 15000,\n temperature: 0,\n systemPrompt: `You run lint checks and fix issues.\nOutput JSON: { success: bool, issuesFound: number, issuesFixed: number, remaining: string[] }\nRules:\n- Run: npm run lint (ESLint + Prettier)\n- Auto-fix: npm run lint:fix\n- ESM imports require .js extension on relative paths\n- Report unfixable issues with file:line format`,\n capabilities: ['lint', 'format', 'type-check', 'security-scan'],\n });\n\n // Review Agent - Multi-stage code reviewer\n configs.set('review', {\n type: 'review',\n model: 'claude-sonnet-4-5-20250929',\n maxTokens: 25000,\n temperature: 0.2,\n systemPrompt: `You review code changes for quality, security, and correctness.\nOutput JSON: { qualityScore: 0-1, issues: [{ severity, file, line, description, suggestion }], approved: bool }\nRules:\n- Score 0.85+ = approved, below = needs improvement\n- Flag: SQL injection, XSS, secret exposure, command injection\n- Flag: functions > 20 lines, cyclomatic complexity > 5\n- Flag: missing error handling at system boundaries\n- Suggest specific fixes, not vague improvements`,\n capabilities: [\n 'review',\n 'critique',\n 'suggest-improvements',\n 'quality-scoring',\n ],\n });\n\n // Improvement Agent - Code enhancer\n configs.set('improve', {\n type: 'improve',\n model: 'claude-sonnet-4-5-20250929',\n maxTokens: 30000,\n temperature: 0.3,\n systemPrompt: `You implement review feedback and improve code quality.\nOutput JSON: { success: bool, improvements: string[], filesChanged: string[] }\nRules:\n- Apply only the specific improvements requested \u2014 no scope creep\n- Maintain backward compatibility unless explicitly breaking\n- Run lint + tests after changes to verify nothing regressed\n- Keep changes minimal and focused`,\n capabilities: ['enhance', 'refactor', 'optimize', 'polish'],\n });\n\n // Context Agent - Information retriever\n configs.set('context', {\n type: 'context',\n model: 'claude-haiku-4-5-20251001',\n maxTokens: 10000,\n temperature: 0,\n systemPrompt: `You retrieve relevant context from the codebase and specs.\nOutput JSON: { context: string, sources: string[], relevanceScore: 0-1 }\nRules:\n- Check docs/specs/ for ONE_PAGER.md, DEV_SPEC.md, PROMPT_PLAN.md\n- Check CLAUDE.md and AGENTS.md for project conventions\n- Search src/ for relevant implementations\n- Return concise summaries, not full file contents`,\n capabilities: ['search', 'retrieve', 'summarize', 'contextualize'],\n });\n\n // Publish Agent - Release and deployment\n configs.set('publish', {\n type: 'publish',\n model: 'claude-haiku-4-5-20251001',\n maxTokens: 15000,\n temperature: 0,\n systemPrompt: `You handle releases and publishing.\nOutput JSON: { success: bool, version: string, actions: string[] }\nRules:\n- Verify lint + tests + build pass before any publish\n- Follow semver: breaking=major, feature=minor, fix=patch\n- Generate changelog from git log since last tag\n- Never force-push or skip pre-publish hooks`,\n capabilities: ['publish-npm', 'github-release', 'deploy', 'document'],\n });\n\n return configs;\n }\n\n /**\n * Execute a task with recursive decomposition\n */\n async execute(\n task: string,\n context: Record<string, unknown>,\n options?: RLMOptions\n ): Promise<ExecutionResult> {\n const opts = { ...this.defaultOptions, ...options };\n const executionId = this.generateExecutionId();\n const startTime = Date.now();\n\n logger.info('Starting RLM execution', {\n executionId,\n task: task.slice(0, 100),\n options: opts,\n });\n\n try {\n // Create root frame for execution\n const rootFrameId = await this.createExecutionFrame(executionId, task);\n\n // Step 1: Planning - Decompose task into subtasks\n const rootNode = await this.planTask(task, context, opts);\n this.activeExecutions.set(executionId, rootNode);\n\n // Log execution tree for transparency\n if (opts.verboseLogging) {\n this.logExecutionTree(rootNode);\n }\n\n // Step 2: Execute task tree recursively with parallelization\n await this.executeTaskTree(rootNode, context, opts, 0);\n\n // Step 3: Multi-stage review and improvement\n const improvements = await this.performMultiStageReview(\n rootNode,\n opts.reviewStages,\n opts.qualityThreshold\n );\n\n // Step 4: Aggregate results\n const result: ExecutionResult = {\n success: rootNode.status === 'completed',\n rootNode,\n totalTokens: this.calculateTotalTokens(rootNode),\n totalCost: this.calculateTotalCost(rootNode),\n duration: Date.now() - startTime,\n improvements,\n testsGenerated: this.countGeneratedTests(rootNode),\n issuesFound: this.countIssuesFound(rootNode),\n issuesFixed: this.countIssuesFixed(rootNode),\n };\n\n // Store execution history\n this.executionHistory.push(result);\n\n // Update frame with results\n await this.updateExecutionFrame(rootFrameId, result);\n\n logger.info('RLM execution completed', {\n executionId,\n success: result.success,\n duration: result.duration,\n totalCost: result.totalCost,\n testsGenerated: result.testsGenerated,\n improvements: improvements.length,\n });\n\n return result;\n } catch (error) {\n logger.error('RLM execution failed', { executionId, error });\n throw error;\n } finally {\n this.activeExecutions.delete(executionId);\n }\n }\n\n /**\n * Plan task decomposition\n */\n private async planTask(\n task: string,\n context: Record<string, unknown>,\n options: Required<RLMOptions>\n ): Promise<TaskNode> {\n // Call planning agent using Claude Code Task tool\n const response = await this.subagentClient.executeSubagent({\n type: 'planning',\n task: task,\n context: {\n ...context,\n requirements: options,\n },\n });\n\n // Parse response into task tree\n const taskTree = this.parseTaskTree(JSON.stringify(response.result));\n\n // Add automatic test generation nodes\n this.injectTestGenerationNodes(taskTree, options.testGenerationMode);\n\n // Add review stages\n this.injectReviewStages(taskTree, options.reviewStages);\n\n return taskTree;\n }\n\n /**\n * Execute task tree recursively with parallelization\n */\n private async executeTaskTree(\n node: TaskNode,\n context: Record<string, unknown>,\n options: Required<RLMOptions>,\n depth: number\n ): Promise<void> {\n // Check recursion depth\n if (depth >= options.maxRecursionDepth) {\n logger.warn('Max recursion depth reached', { nodeId: node.id, depth });\n node.status = 'failed';\n node.error = new Error('Max recursion depth exceeded');\n return;\n }\n\n // Log execution start for transparency\n if (options.verboseLogging) {\n logger.info(`Executing node: ${node.description}`, {\n id: node.id,\n type: node.type,\n agent: node.agent,\n depth,\n });\n }\n\n node.status = 'running';\n node.startTime = new Date();\n\n try {\n if (node.type === 'parallel' && node.children) {\n // Execute children in parallel\n await this.parallelExecutor.executeParallel(\n node.children,\n async (child) => {\n await this.executeTaskTree(child, context, options, depth + 1);\n }\n );\n } else if (node.type === 'sequential' && node.children) {\n // Execute children sequentially\n for (const child of node.children) {\n await this.executeTaskTree(child, context, options, depth + 1);\n\n // Pass results to next child\n if (child.result) {\n context[`${child.id}_result`] = child.result;\n }\n }\n } else {\n // Leaf node - execute with appropriate agent\n await this.executeLeafNode(node, context, options);\n }\n\n node.status = 'completed';\n } catch (error) {\n logger.error(`Node execution failed: ${node.description}`, { error });\n\n if (options.retryFailedAgents && node.attempts < 3) {\n node.attempts++;\n logger.info(`Retrying node: ${node.description}`, {\n attempt: node.attempts,\n });\n await this.executeTaskTree(node, context, options, depth);\n } else {\n node.status = 'failed';\n node.error = error as Error;\n }\n } finally {\n node.endTime = new Date();\n\n // Log completion for transparency\n if (options.verboseLogging) {\n const duration =\n node.endTime.getTime() - (node.startTime?.getTime() ?? 0);\n logger.info(`Completed node: ${node.description}`, {\n id: node.id,\n status: node.status,\n duration,\n tokens: node.tokens,\n cost: node.cost,\n });\n }\n }\n }\n\n /**\n * Execute a leaf node with the appropriate agent\n */\n private async executeLeafNode(\n node: TaskNode,\n context: Record<string, unknown>,\n options: Required<RLMOptions>\n ): Promise<void> {\n const agentConfig = this.subagentConfigs.get(node.agent);\n if (!agentConfig) {\n throw new Error(`Unknown agent type: ${node.agent}`);\n }\n\n // Prepare agent-specific context\n const agentContext = await this.contextManager.prepareAgentContext(\n node.agent,\n context,\n options.maxTokensPerAgent\n );\n\n // Build task description for agent\n const taskDescription = this.buildAgentPrompt(node, agentContext);\n\n // Call agent via Claude Code Task tool\n const response = await this.subagentClient.executeSubagent({\n type: node.agent,\n task: taskDescription,\n context: agentContext,\n });\n\n // Process agent response\n node.result = response.result;\n node.tokens =\n response.tokens || this.estimateTokens(JSON.stringify(response));\n node.cost = this.calculateNodeCost(node.tokens, agentConfig.model);\n\n // Share results with other agents if real-time sharing is enabled\n if (options.shareContextRealtime) {\n await this.shareAgentResults(node);\n }\n }\n\n /**\n * Perform multi-stage review and improvement\n */\n private async performMultiStageReview(\n rootNode: TaskNode,\n stages: number,\n qualityThreshold: number\n ): Promise<string[]> {\n const improvements: string[] = [];\n let currentQuality = 0;\n\n for (let stage = 1; stage <= stages; stage++) {\n logger.info(`Starting review stage ${stage}/${stages}`);\n\n // Review stage\n const reviewNode: TaskNode = {\n id: `review-stage-${stage}`,\n type: 'task',\n description: `Review stage ${stage}`,\n agent: 'review',\n dependencies: [],\n context: { rootNode, stage },\n status: 'pending',\n attempts: 0,\n };\n\n // Execute review via Claude Code subagent\n const reviewResponse = await this.subagentClient.executeSubagent({\n type: 'review',\n task: `Review stage ${stage}: Analyze code quality and suggest improvements`,\n context: { rootNode, stage },\n });\n\n reviewNode.result = reviewResponse.result;\n reviewNode.status = reviewResponse.success ? 'completed' : 'failed';\n\n const reviewResult = reviewResponse.result as {\n quality: number;\n issues: string[];\n suggestions: string[];\n };\n\n currentQuality = reviewResult.quality || 0.5; // Default quality if missing\n\n // Safely handle suggestions array\n if (reviewResult.suggestions && Array.isArray(reviewResult.suggestions)) {\n improvements.push(...reviewResult.suggestions);\n } else {\n // Fallback for mock/test results\n improvements.push(\n `Stage ${stage}: Review completed with quality ${currentQuality}`\n );\n }\n\n logger.info(`Review stage ${stage} complete`, {\n quality: currentQuality,\n issues: reviewResult.issues?.length || 0,\n suggestions: reviewResult.suggestions?.length || 0,\n });\n\n // If quality meets threshold, stop\n if (currentQuality >= qualityThreshold) {\n logger.info(\n `Quality threshold met: ${currentQuality} >= ${qualityThreshold}`\n );\n break;\n }\n\n // Improvement stage\n if (stage < stages) {\n const improveNode: TaskNode = {\n id: `improve-stage-${stage}`,\n type: 'task',\n description: `Improvement stage ${stage}`,\n agent: 'improve',\n dependencies: [reviewNode.id],\n context: { reviewResult, rootNode },\n status: 'pending',\n attempts: 0,\n };\n\n // Execute improvement via Claude Code subagent\n const improveResponse = await this.subagentClient.executeSubagent({\n type: 'improve',\n task: `Improvement stage ${stage}: Implement suggested improvements`,\n context: { reviewResult, rootNode },\n });\n\n improveNode.result = improveResponse.result;\n improveNode.status = improveResponse.success ? 'completed' : 'failed';\n\n // Apply improvements to root node\n this.applyImprovements(rootNode, improveNode.result);\n }\n }\n\n return improvements;\n }\n\n /**\n * Helper methods\n */\n\n private generateExecutionId(): string {\n return `rlm-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n private async createExecutionFrame(\n executionId: string,\n task: string\n ): Promise<string> {\n return this.frameManager.createFrame({\n name: `RLM: ${task.slice(0, 50)}`,\n type: 'task',\n inputs: { executionId, task, type: 'rlm-execution' },\n });\n }\n\n private async updateExecutionFrame(\n frameId: string,\n result: ExecutionResult\n ): Promise<void> {\n // Close the frame with the execution result\n this.frameManager.closeFrame(frameId, {\n type: 'rlm-result',\n content: JSON.stringify(result, null, 2),\n success: result.success,\n duration: result.duration,\n totalTokens: result.totalTokens,\n totalCost: result.totalCost,\n });\n }\n\n private logExecutionTree(node: TaskNode, depth: number = 0): void {\n const indent = ' '.repeat(depth);\n const status =\n node.status === 'completed'\n ? '\u2713'\n : node.status === 'failed'\n ? '\u2717'\n : node.status === 'running'\n ? '\u27F3'\n : '\u25CB';\n\n console.log(`${indent}${status} ${node.description} [${node.agent}]`);\n\n if (node.children) {\n for (const child of node.children) {\n this.logExecutionTree(child, depth + 1);\n }\n }\n }\n\n private parseTaskTree(_response: string): TaskNode {\n // Parse LLM response into structured task tree\n // This would need sophisticated parsing logic\n // For now, return a mock structure\n return {\n id: 'root',\n type: 'sequential',\n description: 'Root task',\n agent: 'planning',\n dependencies: [],\n context: {},\n status: 'pending',\n attempts: 0,\n children: [],\n };\n }\n\n private injectTestGenerationNodes(node: TaskNode, _mode: string): void {\n // Inject test generation nodes based on mode\n // Initialize children array if it doesn't exist\n if (!node.children) {\n node.children = [];\n }\n\n const testNode: TaskNode = {\n id: `${node.id}-test`,\n type: 'task',\n description: `Generate ${_mode} tests for ${node.description}`,\n agent: 'testing',\n dependencies: [node.id],\n context: { testMode: _mode },\n status: 'pending',\n attempts: 0,\n };\n\n node.children.push(testNode);\n }\n\n private injectReviewStages(_node: TaskNode, _stages: number): void {\n // Inject review stages into task tree\n // Implementation would add review nodes at appropriate points\n }\n\n private loadSpecContext(): string {\n const specDir = path.join(process.cwd(), 'docs', 'specs');\n if (!fs.existsSync(specDir)) return '';\n\n const specFiles = ['ONE_PAGER.md', 'DEV_SPEC.md', 'PROMPT_PLAN.md'];\n const sections: string[] = [];\n\n for (const file of specFiles) {\n const filePath = path.join(specDir, file);\n if (fs.existsSync(filePath)) {\n const content = fs.readFileSync(filePath, 'utf-8');\n // Truncate to first 2000 chars to stay within token budgets\n const truncated =\n content.length > 2000\n ? content.slice(0, 2000) + '\\n...[truncated]'\n : content;\n sections.push(`### ${file}\\n${truncated}`);\n }\n }\n\n return sections.length > 0\n ? `\\n## Project Specs\\n${sections.join('\\n\\n')}`\n : '';\n }\n\n private buildAgentPrompt(\n node: TaskNode,\n context: Record<string, unknown>\n ): string {\n const depResults = node.dependencies\n .map((id) => {\n const dep = this.activeExecutions.get(id);\n if (!dep?.result) return null;\n return { id, agent: dep.agent, result: dep.result };\n })\n .filter(Boolean);\n\n const specContext =\n node.agent === 'planning' || node.agent === 'code'\n ? this.loadSpecContext()\n : '';\n\n return [\n `## Task`,\n node.description,\n '',\n `## Agent Role: ${node.agent}`,\n `Config: ${JSON.stringify(this.subagentConfigs.get(node.agent)?.capabilities || [])}`,\n '',\n `## Context`,\n JSON.stringify(context, null, 2),\n '',\n ...(depResults.length > 0\n ? [`## Dependency Results`, JSON.stringify(depResults, null, 2), '']\n : []),\n ...(specContext ? [specContext, ''] : []),\n `## Constraints`,\n `- ESM imports: use .js extensions on relative imports`,\n `- Testing: vitest (not jest)`,\n `- Lint: npm run lint (eslint + prettier)`,\n `- Output structured JSON when possible`,\n ].join('\\n');\n }\n\n private estimateTokens(text: string): number {\n // Rough estimation: 1 token \u2248 4 characters\n return Math.ceil(text.length / 4);\n }\n\n private async shareAgentResults(_node: TaskNode): Promise<void> {\n // Share results with other agents via Redis or shared context\n logger.debug('Sharing agent results', { nodeId: _node.id });\n }\n\n private applyImprovements(_rootNode: TaskNode, improvements: unknown): void {\n // Apply improvements to the task tree\n logger.debug('Applying improvements', { improvements });\n }\n\n private calculateTotalTokens(node: TaskNode): number {\n let total = node.tokens || 0;\n if (node.children) {\n for (const child of node.children) {\n total += this.calculateTotalTokens(child);\n }\n }\n return total;\n }\n\n private calculateTotalCost(node: TaskNode): number {\n let total = node.cost || 0;\n if (node.children) {\n for (const child of node.children) {\n total += this.calculateTotalCost(child);\n }\n }\n return total;\n }\n\n private calculateNodeCost(tokens: number, model: string): number {\n // Pricing per 1M tokens (input+output blended approximate)\n const pricing: Record<string, number> = {\n 'claude-sonnet-4-5-20250929': 15.0,\n 'claude-haiku-4-5-20251001': 1.0,\n 'claude-opus-4-6': 75.0,\n };\n return (tokens / 1000000) * (pricing[model] || 10);\n }\n\n private countGeneratedTests(node: TaskNode): number {\n let count = 0;\n if (node.agent === 'testing' && node.result?.tests) {\n count += node.result.tests.length;\n }\n if (node.children) {\n for (const child of node.children) {\n count += this.countGeneratedTests(child);\n }\n }\n return count;\n }\n\n private countIssuesFound(node: TaskNode): number {\n let count = 0;\n if (\n (node.agent === 'review' || node.agent === 'linting') &&\n node.result?.issues\n ) {\n count += node.result.issues.length;\n }\n if (node.children) {\n for (const child of node.children) {\n count += this.countIssuesFound(child);\n }\n }\n return count;\n }\n\n private countIssuesFixed(node: TaskNode): number {\n let count = 0;\n if (node.agent === 'improve' && node.result?.fixed) {\n count += node.result.fixed.length;\n }\n if (node.children) {\n for (const child of node.children) {\n count += this.countIssuesFixed(child);\n }\n }\n return count;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/skills/repo-ingestion-skill.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Repository Ingestion Skill for ChromaDB\n *\n * Ingests and maintains code repositories in ChromaDB for enhanced code search and context\n *\n * NOTE: chromadb is an optional dependency. This skill gracefully handles\n * the case when chromadb is not installed.\n */\n\n// Dynamic import type for optional chromadb dependency\ntype ChromaDBAdapter =\n import('../core/storage/chromadb-adapter.js').ChromaDBAdapter;\n\nimport { Logger } from '../core/monitoring/logger.js';\nimport {\n isChromaDBEnabled,\n getChromaDBConfig,\n} from '../core/config/storage-config.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport { execSync } from 'child_process';\nimport ignore from 'ignore';\n\n// Helper to dynamically import ChromaDBAdapter\nasync function getChromaDBAdapter(): Promise<\n typeof import('../core/storage/chromadb-adapter.js')\n> {\n try {\n return await import('../core/storage/chromadb-adapter.js');\n } catch {\n throw new Error(\n 'chromadb is not installed. Install it with: npm install chromadb'\n );\n }\n}\n\nexport interface RepoIngestionOptions {\n incremental?: boolean;\n forceUpdate?: boolean;\n includeTests?: boolean;\n includeDocs?: boolean;\n maxFileSize?: number;\n chunkSize?: number;\n extensions?: string[];\n excludePatterns?: string[];\n}\n\nexport interface RepoMetadata {\n repoId: string;\n repoName: string;\n branch: string;\n lastCommit: string;\n lastIngested: number;\n filesCount: number;\n totalSize: number;\n language: string;\n framework?: string;\n}\n\nexport interface FileChunk {\n id: string;\n filePath: string;\n content: string;\n startLine: number;\n endLine: number;\n hash: string;\n language: string;\n}\n\nexport class RepoIngestionSkill {\n private logger: Logger;\n private adapter: ChromaDBAdapter | null = null;\n private metadataCache: Map<string, RepoMetadata> = new Map();\n private fileHashCache: Map<string, string> = new Map();\n private chromaEnabled: boolean = false;\n private adapterConfig: {\n apiKey: string;\n tenant: string;\n database: string;\n collectionName: string;\n } | null = null;\n\n constructor(\n private config: {\n apiKey?: string;\n tenant?: string;\n database?: string;\n collectionName?: string;\n } | null,\n private userId: string,\n private teamId?: string\n ) {\n this.logger = new Logger('RepoIngestionSkill');\n\n // Check if ChromaDB is enabled via storage config\n this.chromaEnabled = isChromaDBEnabled();\n\n if (this.chromaEnabled) {\n const chromaConfig = getChromaDBConfig();\n if (chromaConfig && chromaConfig.apiKey) {\n // Store config for lazy initialization in initialize()\n this.adapterConfig = {\n apiKey: config?.apiKey || chromaConfig.apiKey,\n tenant: config?.tenant || chromaConfig.tenant || 'default_tenant',\n database:\n config?.database || chromaConfig.database || 'default_database',\n collectionName: config?.collectionName || 'stackmemory_repos',\n };\n }\n }\n }\n\n /**\n * Check if ChromaDB is available for use\n */\n isAvailable(): boolean {\n return this.chromaEnabled && this.adapter !== null;\n }\n\n async initialize(): Promise<void> {\n if (!this.chromaEnabled || !this.adapterConfig) {\n this.logger.warn(\n 'ChromaDB not enabled. Repository ingestion features are unavailable.'\n );\n this.logger.warn('Run \"stackmemory init --chromadb\" to enable ChromaDB.');\n return;\n }\n\n // Create adapter using dynamic import (chromadb is optional)\n if (!this.adapter && this.adapterConfig) {\n try {\n const { ChromaDBAdapter } = await getChromaDBAdapter();\n this.adapter = await ChromaDBAdapter.create(\n this.adapterConfig,\n this.userId,\n this.teamId\n );\n } catch (error) {\n this.logger.warn(\n `Failed to initialize ChromaDB: ${error instanceof Error ? error.message : String(error)}`\n );\n this.logger.warn(\n 'chromadb is optional. Install it with: npm install chromadb'\n );\n return;\n }\n }\n\n if (this.adapter) {\n await this.adapter.initialize();\n }\n await this.loadMetadataCache();\n }\n\n /**\n * Ingest a repository into ChromaDB\n */\n async ingestRepository(\n repoPath: string,\n repoName: string,\n options: RepoIngestionOptions = {}\n ): Promise<{\n success: boolean;\n message: string;\n stats?: {\n filesProcessed: number;\n chunksCreated: number;\n timeElapsed: number;\n totalSize: number;\n };\n }> {\n if (!this.isAvailable()) {\n return {\n success: false,\n message:\n 'ChromaDB not enabled. Run \"stackmemory init --chromadb\" to enable semantic search features.',\n };\n }\n\n const startTime = Date.now();\n\n try {\n this.logger.info(`Starting repository ingestion for ${repoName}`);\n\n // Validate repository path\n if (!fs.existsSync(repoPath)) {\n throw new Error(`Repository path not found: ${repoPath}`);\n }\n\n // Get repository metadata\n const metadata = await this.getRepoMetadata(repoPath, repoName);\n\n // Check if incremental update is possible\n const existingMetadata = this.metadataCache.get(metadata.repoId);\n if (options.incremental && existingMetadata && !options.forceUpdate) {\n const changedFiles = await this.getChangedFiles(\n repoPath,\n existingMetadata.lastCommit,\n metadata.lastCommit\n );\n\n if (changedFiles.length === 0) {\n return {\n success: true,\n message: 'No changes detected since last ingestion',\n };\n }\n\n this.logger.info(\n `Incremental update: ${changedFiles.length} files changed`\n );\n }\n\n // Get files to process\n const files = await this.getRepoFiles(repoPath, options);\n this.logger.info(`Found ${files.length} files to process`);\n\n // Process files and create chunks\n let filesProcessed = 0;\n let chunksCreated = 0;\n let totalSize = 0;\n\n for (const file of files) {\n try {\n const chunks = await this.processFile(\n file,\n repoPath,\n repoName,\n metadata,\n options\n );\n\n for (const chunk of chunks) {\n await this.storeChunk(chunk, metadata);\n chunksCreated++;\n }\n\n filesProcessed++;\n totalSize += fs.statSync(file).size;\n\n // Log progress every 100 files\n if (filesProcessed % 100 === 0) {\n this.logger.info(\n `Processed ${filesProcessed}/${files.length} files`\n );\n }\n } catch (error: unknown) {\n this.logger.warn(`Failed to process file ${file}:`, error);\n }\n }\n\n // Update metadata\n metadata.filesCount = filesProcessed;\n metadata.totalSize = totalSize;\n metadata.lastIngested = Date.now();\n await this.saveMetadata(metadata);\n\n const timeElapsed = Date.now() - startTime;\n\n this.logger.info(\n `Repository ingestion complete: ${filesProcessed} files, ${chunksCreated} chunks in ${timeElapsed}ms`\n );\n\n return {\n success: true,\n message: `Successfully ingested ${repoName}`,\n stats: {\n filesProcessed,\n chunksCreated,\n timeElapsed,\n totalSize,\n },\n };\n } catch (error: unknown) {\n this.logger.error('Repository ingestion failed:', error);\n return {\n success: false,\n message: `Failed to ingest repository: ${error instanceof Error ? error.message : 'Unknown error'}`,\n };\n }\n }\n\n /**\n * Update an existing repository in ChromaDB\n */\n async updateRepository(\n repoPath: string,\n repoName: string,\n options: RepoIngestionOptions = {}\n ): Promise<{\n success: boolean;\n message: string;\n stats?: {\n filesUpdated: number;\n filesAdded: number;\n filesRemoved: number;\n timeElapsed: number;\n };\n }> {\n const startTime = Date.now();\n\n try {\n const metadata = await this.getRepoMetadata(repoPath, repoName);\n const existingMetadata = this.metadataCache.get(metadata.repoId);\n\n if (!existingMetadata) {\n // No existing data, perform full ingestion\n return this.ingestRepository(repoPath, repoName, options);\n }\n\n // Get changed files since last ingestion\n const changedFiles = await this.getChangedFiles(\n repoPath,\n existingMetadata.lastCommit,\n metadata.lastCommit\n );\n\n if (changedFiles.length === 0) {\n return {\n success: true,\n message: 'No changes detected',\n stats: {\n filesUpdated: 0,\n filesAdded: 0,\n filesRemoved: 0,\n timeElapsed: Date.now() - startTime,\n },\n };\n }\n\n let filesUpdated = 0;\n let filesAdded = 0;\n let filesRemoved = 0;\n\n for (const change of changedFiles) {\n const filePath = path.join(repoPath, change.path);\n\n if (change.status === 'deleted') {\n await this.removeFileChunks(change.path, metadata.repoId);\n filesRemoved++;\n } else if (change.status === 'added') {\n const chunks = await this.processFile(\n filePath,\n repoPath,\n repoName,\n metadata,\n options\n );\n for (const chunk of chunks) {\n await this.storeChunk(chunk, metadata);\n }\n filesAdded++;\n } else if (change.status === 'modified') {\n // Remove old chunks and add new ones\n await this.removeFileChunks(change.path, metadata.repoId);\n const chunks = await this.processFile(\n filePath,\n repoPath,\n repoName,\n metadata,\n options\n );\n for (const chunk of chunks) {\n await this.storeChunk(chunk, metadata);\n }\n filesUpdated++;\n }\n }\n\n // Update metadata\n metadata.lastIngested = Date.now();\n await this.saveMetadata(metadata);\n\n const timeElapsed = Date.now() - startTime;\n\n return {\n success: true,\n message: `Successfully updated ${repoName}`,\n stats: {\n filesUpdated,\n filesAdded,\n filesRemoved,\n timeElapsed,\n },\n };\n } catch (error: unknown) {\n this.logger.error('Repository update failed:', error);\n return {\n success: false,\n message: `Failed to update repository: ${error instanceof Error ? error.message : 'Unknown error'}`,\n };\n }\n }\n\n /**\n * Search code in ingested repositories\n */\n async searchCode(\n query: string,\n options?: {\n repoName?: string;\n language?: string;\n limit?: number;\n includeContext?: boolean;\n }\n ): Promise<\n Array<{\n filePath: string;\n content: string;\n score: number;\n startLine: number;\n endLine: number;\n repoName: string;\n }>\n > {\n if (!this.isAvailable() || !this.adapter) {\n this.logger.warn('ChromaDB not enabled. Code search unavailable.');\n return [];\n }\n\n try {\n const filters: Record<string, unknown> = {\n type: ['code_chunk'],\n };\n\n if (options?.repoName) {\n filters.repo_name = options.repoName;\n }\n\n if (options?.language) {\n filters.language = options.language;\n }\n\n const results = await this.adapter.queryContexts(\n query,\n options?.limit || 20,\n filters\n );\n\n return results.map((result) => ({\n filePath: result.metadata.file_path,\n content: result.content,\n score: 1 - result.distance, // Convert distance to similarity score\n startLine: result.metadata.start_line,\n endLine: result.metadata.end_line,\n repoName: result.metadata.repo_name,\n }));\n } catch (error: unknown) {\n this.logger.error('Code search failed:', error);\n return [];\n }\n }\n\n /**\n * Get repository metadata\n */\n private async getRepoMetadata(\n repoPath: string,\n repoName: string\n ): Promise<RepoMetadata> {\n const branch = this.getCurrentBranch(repoPath);\n const lastCommit = this.getLastCommit(repoPath);\n const repoId = `${repoName}_${branch}`.replace(/[^a-zA-Z0-9_-]/g, '_');\n\n // Detect primary language and framework\n const { language, framework } =\n await this.detectLanguageAndFramework(repoPath);\n\n return {\n repoId,\n repoName,\n branch,\n lastCommit,\n lastIngested: Date.now(),\n filesCount: 0,\n totalSize: 0,\n language,\n framework,\n };\n }\n\n /**\n * Get current git branch\n */\n private getCurrentBranch(repoPath: string): string {\n try {\n return execSync('git rev-parse --abbrev-ref HEAD', {\n cwd: repoPath,\n encoding: 'utf8',\n }).trim();\n } catch {\n return 'main';\n }\n }\n\n /**\n * Get last commit hash\n */\n private getLastCommit(repoPath: string): string {\n try {\n return execSync('git rev-parse HEAD', {\n cwd: repoPath,\n encoding: 'utf8',\n }).trim();\n } catch {\n return 'unknown';\n }\n }\n\n /**\n * Get changed files between commits\n */\n private async getChangedFiles(\n repoPath: string,\n fromCommit: string,\n toCommit: string\n ): Promise<Array<{ path: string; status: string }>> {\n try {\n const diff = execSync(\n `git diff --name-status ${fromCommit}..${toCommit}`,\n {\n cwd: repoPath,\n encoding: 'utf8',\n }\n );\n\n return diff\n .split('\\n')\n .filter((line) => line.trim())\n .map((line) => {\n const [status, ...pathParts] = line.split('\\t');\n return {\n path: pathParts.join('\\t'),\n status:\n status === 'A'\n ? 'added'\n : status === 'D'\n ? 'deleted'\n : 'modified',\n };\n });\n } catch {\n return [];\n }\n }\n\n /**\n * Get repository files to process\n */\n private async getRepoFiles(\n repoPath: string,\n options: RepoIngestionOptions\n ): Promise<string[]> {\n const files: string[] = [];\n const ig = ignore();\n\n // Load .gitignore if it exists\n const gitignorePath = path.join(repoPath, '.gitignore');\n if (fs.existsSync(gitignorePath)) {\n ig.add(fs.readFileSync(gitignorePath, 'utf8'));\n }\n\n // Add default exclude patterns\n const defaultExcludes = [\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n 'coverage',\n '.env',\n '*.log',\n ...(options.excludePatterns || []),\n ];\n ig.add(defaultExcludes);\n\n // Default extensions to include\n const extensions = options.extensions || [\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.py',\n '.java',\n '.go',\n '.rs',\n '.c',\n '.cpp',\n '.h',\n '.hpp',\n '.cs',\n '.rb',\n '.php',\n '.swift',\n '.kt',\n '.scala',\n '.r',\n '.m',\n '.sql',\n '.yaml',\n '.yml',\n '.json',\n ];\n\n // Add documentation if requested\n if (options.includeDocs) {\n extensions.push('.md', '.rst', '.txt');\n }\n\n const maxFileSize = options.maxFileSize || 1024 * 1024; // 1MB default\n\n const walkDir = (dir: string, baseDir: string = repoPath) => {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativePath = path.relative(baseDir, fullPath);\n\n if (ig.ignores(relativePath)) {\n continue;\n }\n\n if (entry.isDirectory()) {\n walkDir(fullPath, baseDir);\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name);\n\n // Check if file should be included\n if (!extensions.includes(ext)) {\n continue;\n }\n\n // Check if it's a test file\n if (\n !options.includeTests &&\n (entry.name.includes('.test.') ||\n entry.name.includes('.spec.') ||\n relativePath.includes('__tests__') ||\n relativePath.includes('test/') ||\n relativePath.includes('tests/'))\n ) {\n continue;\n }\n\n // Check file size\n const stats = fs.statSync(fullPath);\n if (stats.size > maxFileSize) {\n this.logger.debug(`Skipping large file: ${relativePath}`);\n continue;\n }\n\n files.push(fullPath);\n }\n }\n };\n\n walkDir(repoPath);\n return files;\n }\n\n /**\n * Process a file into chunks\n */\n private async processFile(\n filePath: string,\n repoPath: string,\n repoName: string,\n metadata: RepoMetadata,\n options: RepoIngestionOptions\n ): Promise<FileChunk[]> {\n const relativePath = path.relative(repoPath, filePath);\n const content = fs.readFileSync(filePath, 'utf8');\n const lines = content.split('\\n');\n const language = this.detectFileLanguage(filePath);\n\n const chunkSize = options.chunkSize || 100; // 100 lines per chunk\n const chunks: FileChunk[] = [];\n\n // Calculate file hash for caching\n const fileHash = crypto.createHash('md5').update(content).digest('hex');\n\n // Check if file has changed\n const cachedHash = this.fileHashCache.get(relativePath);\n if (cachedHash === fileHash && !options.forceUpdate) {\n return []; // File hasn't changed\n }\n\n this.fileHashCache.set(relativePath, fileHash);\n\n // Split into chunks\n for (let i = 0; i < lines.length; i += chunkSize) {\n const chunkLines = lines.slice(i, Math.min(i + chunkSize, lines.length));\n const chunkContent = chunkLines.join('\\n');\n\n if (chunkContent.trim().length === 0) {\n continue; // Skip empty chunks\n }\n\n const chunkId = `${metadata.repoId}_${relativePath}_${i}`;\n const chunkHash = crypto\n .createHash('md5')\n .update(chunkContent)\n .digest('hex');\n\n chunks.push({\n id: chunkId,\n filePath: relativePath,\n content: chunkContent,\n startLine: i + 1,\n endLine: Math.min(i + chunkSize, lines.length),\n hash: chunkHash,\n language,\n });\n }\n\n return chunks;\n }\n\n /**\n * Store a chunk in ChromaDB\n */\n private async storeChunk(\n chunk: FileChunk,\n metadata: RepoMetadata\n ): Promise<void> {\n if (!this.adapter) {\n throw new Error('ChromaDB adapter not available');\n }\n\n const documentContent = `File: ${chunk.filePath} (Lines ${chunk.startLine}-${chunk.endLine})\nLanguage: ${chunk.language}\nRepository: ${metadata.repoName}/${metadata.branch}\n\n${chunk.content}`;\n\n if (!this.adapter) {\n throw new Error('ChromaDB adapter not initialized');\n }\n await this.adapter.storeContext('observation', documentContent, {\n type: 'code_chunk',\n repo_id: metadata.repoId,\n repo_name: metadata.repoName,\n branch: metadata.branch,\n file_path: chunk.filePath,\n start_line: chunk.startLine,\n end_line: chunk.endLine,\n language: chunk.language,\n framework: metadata.framework,\n chunk_hash: chunk.hash,\n last_commit: metadata.lastCommit,\n });\n }\n\n /**\n * Remove file chunks from ChromaDB\n */\n private async removeFileChunks(\n filePath: string,\n repoId: string\n ): Promise<void> {\n // This would need to be implemented in ChromaDBAdapter\n // For now, we'll log it\n this.logger.debug(\n `Would remove chunks for file: ${filePath} from repo: ${repoId}`\n );\n }\n\n /**\n * Detect file language\n */\n private detectFileLanguage(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n const languageMap: Record<string, string> = {\n '.ts': 'typescript',\n '.tsx': 'typescript',\n '.js': 'javascript',\n '.jsx': 'javascript',\n '.py': 'python',\n '.java': 'java',\n '.go': 'go',\n '.rs': 'rust',\n '.c': 'c',\n '.cpp': 'cpp',\n '.cs': 'csharp',\n '.rb': 'ruby',\n '.php': 'php',\n '.swift': 'swift',\n '.kt': 'kotlin',\n '.scala': 'scala',\n '.r': 'r',\n '.sql': 'sql',\n '.yaml': 'yaml',\n '.yml': 'yaml',\n '.json': 'json',\n '.md': 'markdown',\n };\n\n return languageMap[ext] || 'unknown';\n }\n\n /**\n * Detect language and framework\n */\n private async detectLanguageAndFramework(repoPath: string): Promise<{\n language: string;\n framework?: string;\n }> {\n // Check for package.json (JavaScript/TypeScript)\n const packageJsonPath = path.join(repoPath, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(\n fs.readFileSync(packageJsonPath, 'utf8')\n );\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n let framework: string | undefined;\n if (deps.react) framework = 'react';\n else if (deps.vue) framework = 'vue';\n else if (deps.angular) framework = 'angular';\n else if (deps.express) framework = 'express';\n else if (deps.next) framework = 'nextjs';\n else if (deps.svelte) framework = 'svelte';\n\n return {\n language: deps.typescript ? 'typescript' : 'javascript',\n framework,\n };\n } catch {}\n }\n\n // Check for requirements.txt or setup.py (Python)\n if (\n fs.existsSync(path.join(repoPath, 'requirements.txt')) ||\n fs.existsSync(path.join(repoPath, 'setup.py'))\n ) {\n return { language: 'python' };\n }\n\n // Check for go.mod (Go)\n if (fs.existsSync(path.join(repoPath, 'go.mod'))) {\n return { language: 'go' };\n }\n\n // Check for Cargo.toml (Rust)\n if (fs.existsSync(path.join(repoPath, 'Cargo.toml'))) {\n return { language: 'rust' };\n }\n\n // Check for pom.xml or build.gradle (Java)\n if (\n fs.existsSync(path.join(repoPath, 'pom.xml')) ||\n fs.existsSync(path.join(repoPath, 'build.gradle'))\n ) {\n return { language: 'java' };\n }\n\n // Default to unknown\n return { language: 'unknown' };\n }\n\n /**\n * Load metadata cache\n */\n private async loadMetadataCache(): Promise<void> {\n // In a real implementation, this would load from a persistent store\n // For now, we'll just initialize an empty cache\n this.metadataCache.clear();\n }\n\n /**\n * Save metadata\n */\n private async saveMetadata(metadata: RepoMetadata): Promise<void> {\n this.metadataCache.set(metadata.repoId, metadata);\n // In a real implementation, this would persist to a store\n }\n\n /**\n * Get repository statistics\n */\n async getRepoStats(repoName?: string): Promise<{\n totalRepos: number;\n totalFiles: number;\n totalChunks: number;\n languages: Record<string, number>;\n frameworks: Record<string, number>;\n }> {\n // This would query ChromaDB for statistics\n const stats = {\n totalRepos: this.metadataCache.size,\n totalFiles: 0,\n totalChunks: 0,\n languages: {} as Record<string, number>,\n frameworks: {} as Record<string, number>,\n };\n\n for (const metadata of this.metadataCache.values()) {\n if (!repoName || metadata.repoName === repoName) {\n stats.totalFiles += metadata.filesCount;\n\n if (metadata.language) {\n stats.languages[metadata.language] =\n (stats.languages[metadata.language] || 0) + 1;\n }\n\n if (metadata.framework) {\n stats.frameworks[metadata.framework] =\n (stats.frameworks[metadata.framework] || 0) + 1;\n }\n }\n }\n\n return stats;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/skills/spec-generator-skill.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Spec Generator Skill\n * Generates iterative spec documents: ONE_PAGER \u2192 DEV_SPEC \u2192 PROMPT_PLAN \u2192 AGENTS.md\n * Progressive context \u2014 later docs read earlier ones from disk.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { SkillContext, SkillResult } from './claude-skills.js';\nimport { logger } from '../core/monitoring/logger.js';\n\nexport type SpecType = 'one-pager' | 'dev-spec' | 'prompt-plan' | 'agents';\n\ninterface SpecConfig {\n filename: string;\n title: string;\n sections: string[];\n inputs: SpecType[]; // earlier docs this type reads\n}\n\nconst SPEC_DIR = 'docs/specs';\n\nconst SPEC_CONFIGS: Record<SpecType, SpecConfig> = {\n 'one-pager': {\n filename: 'ONE_PAGER.md',\n title: 'One-Pager',\n sections: [\n 'Problem',\n 'Audience',\n 'Platform',\n 'Core Flow',\n 'MVP Features',\n 'Non-Goals',\n 'Metrics',\n ],\n inputs: [],\n },\n 'dev-spec': {\n filename: 'DEV_SPEC.md',\n title: 'Development Specification',\n sections: [\n 'Architecture',\n 'Tech Stack',\n 'API Contracts',\n 'Data Models',\n 'Auth',\n 'Error Handling',\n 'Deployment',\n ],\n inputs: ['one-pager'],\n },\n 'prompt-plan': {\n filename: 'PROMPT_PLAN.md',\n title: 'Prompt Plan',\n sections: [\n 'Stage A: Project Setup',\n 'Stage B: Core Data Models',\n 'Stage C: API Layer',\n 'Stage D: Business Logic',\n 'Stage E: Frontend / UI',\n 'Stage F: Integration & Testing',\n 'Stage G: Deploy & Polish',\n ],\n inputs: ['one-pager', 'dev-spec'],\n },\n agents: {\n filename: 'AGENTS.md',\n title: 'AGENTS.md',\n sections: [\n 'Repo Files',\n 'Responsibilities',\n 'Guardrails',\n 'Testing',\n 'When to Ask',\n ],\n inputs: ['one-pager', 'dev-spec', 'prompt-plan'],\n },\n};\n\n// --- Templates ---\n\nfunction onePagerTemplate(title: string): string {\n return `# ${title} \u2014 One-Pager\n\n## Problem\n<!-- What problem does this solve? Who has this problem? -->\n\n## Audience\n<!-- Primary users and their context -->\n\n## Platform\n<!-- Web / Mobile / CLI / API \u2014 and why -->\n\n## Core Flow\n<!-- Happy-path user journey in 3-5 steps -->\n1.\n2.\n3.\n\n## MVP Features\n<!-- Minimum set of features for first release -->\n- [ ]\n- [ ]\n- [ ]\n\n## Non-Goals\n<!-- Explicitly out of scope for MVP -->\n-\n\n## Metrics\n<!-- How will you measure success? -->\n-\n`;\n}\n\nfunction devSpecTemplate(title: string, onePagerContent: string): string {\n return `# ${title} \u2014 Development Specification\n\n> Generated from ONE_PAGER.md\n\n<details><summary>Source: ONE_PAGER.md</summary>\n\n${onePagerContent}\n\n</details>\n\n## Architecture\n<!-- High-level system diagram / component breakdown -->\n\n## Tech Stack\n<!-- Languages, frameworks, databases, infra -->\n| Layer | Choice | Rationale |\n|-------|--------|-----------|\n| Frontend | | |\n| Backend | | |\n| Database | | |\n| Hosting | | |\n\n## API Contracts\n<!-- Key endpoints with request/response shapes -->\n\n## Data Models\n<!-- Core entities and relationships -->\n\n## Auth\n<!-- Authentication and authorization strategy -->\n\n## Error Handling\n<!-- Error codes, retry strategies, user-facing messages -->\n\n## Deployment\n<!-- CI/CD, environments, rollback strategy -->\n`;\n}\n\nfunction promptPlanTemplate(\n title: string,\n onePagerContent: string,\n devSpecContent: string\n): string {\n return `# ${title} \u2014 Prompt Plan\n\n> Generated from ONE_PAGER.md and DEV_SPEC.md\n> Each stage has TDD checkboxes \u2014 check off as tasks complete.\n\n<details><summary>Source: ONE_PAGER.md</summary>\n\n${onePagerContent}\n\n</details>\n\n<details><summary>Source: DEV_SPEC.md</summary>\n\n${devSpecContent}\n\n</details>\n\n## Stage A: Project Setup\n- [ ] Initialize repository and tooling\n- [ ] Configure CI/CD pipeline\n- [ ] Set up development environment\n\n## Stage B: Core Data Models\n- [ ] Define database schema\n- [ ] Create model layer\n- [ ] Write model tests\n\n## Stage C: API Layer\n- [ ] Implement API endpoints\n- [ ] Add input validation\n- [ ] Write API tests\n\n## Stage D: Business Logic\n- [ ] Implement core business rules\n- [ ] Add edge case handling\n- [ ] Write integration tests\n\n## Stage E: Frontend / UI\n- [ ] Build core UI components\n- [ ] Implement user flows\n- [ ] Write UI tests\n\n## Stage F: Integration & Testing\n- [ ] End-to-end test suite\n- [ ] Performance testing\n- [ ] Security audit\n\n## Stage G: Deploy & Polish\n- [ ] Production deployment\n- [ ] Monitoring and alerting\n- [ ] Documentation\n`;\n}\n\nfunction agentsTemplate(title: string, inputs: Record<string, string>): string {\n const sourceBlocks = Object.entries(inputs)\n .map(\n ([name, content]) =>\n `<details><summary>Source: ${name}</summary>\\n\\n${content}\\n\\n</details>`\n )\n .join('\\n\\n');\n\n return `# ${title} \u2014 AGENTS.md\n\n> Auto-generated agent configuration for Claude Code / Cursor / Windsurf.\n\n${sourceBlocks}\n\n## Repo Files\n<!-- Key files and their purpose -->\n| File | Purpose |\n|------|---------|\n| | |\n\n## Responsibilities\n<!-- What this agent should and shouldn't do -->\n### DO\n-\n\n### DON'T\n-\n\n## Guardrails\n<!-- Safety constraints and limits -->\n- Never commit secrets or credentials\n- Always run tests before committing\n- Keep changes focused and atomic\n\n## Testing\n<!-- How to validate changes -->\n\\`\\`\\`bash\nnpm test\nnpm run lint\nnpm run build\n\\`\\`\\`\n\n## When to Ask\n<!-- Situations where the agent should ask for human input -->\n- Architectural changes affecting multiple systems\n- Security-sensitive modifications\n- Breaking API changes\n- Ambiguous requirements\n`;\n}\n\n// --- Skill Class ---\n\nexport class SpecGeneratorSkill {\n private baseDir: string;\n\n constructor(private context: SkillContext) {\n this.baseDir = process.cwd();\n }\n\n /** Generate a spec document by type */\n async generate(\n type: SpecType,\n title: string,\n opts?: { force?: boolean }\n ): Promise<SkillResult> {\n const config = SPEC_CONFIGS[type];\n if (!config) {\n return { success: false, message: `Unknown spec type: ${type}` };\n }\n\n const specDir = path.join(this.baseDir, SPEC_DIR);\n const outputPath = path.join(specDir, config.filename);\n\n // Check if file already exists\n if (fs.existsSync(outputPath) && !opts?.force) {\n return {\n success: false,\n message: `${config.filename} already exists. Use --force to overwrite.`,\n data: { path: outputPath },\n };\n }\n\n // Load input documents (progressive context)\n const inputContents: Record<string, string> = {};\n for (const inputType of config.inputs) {\n const inputConfig = SPEC_CONFIGS[inputType];\n const inputPath = path.join(specDir, inputConfig.filename);\n if (fs.existsSync(inputPath)) {\n inputContents[inputConfig.filename] = fs.readFileSync(\n inputPath,\n 'utf-8'\n );\n }\n }\n\n // Generate content from template\n const content = this.renderTemplate(type, title, inputContents);\n\n // Write file\n fs.mkdirSync(specDir, { recursive: true });\n fs.writeFileSync(outputPath, content, 'utf-8');\n\n logger.info(`Generated spec: ${config.filename}`, { type, title });\n\n return {\n success: true,\n message: `Created ${config.filename}`,\n data: {\n path: outputPath,\n type,\n sections: config.sections,\n inputsUsed: Object.keys(inputContents),\n },\n action: `Generated ${SPEC_DIR}/${config.filename}`,\n };\n }\n\n /** List existing spec documents */\n async list(): Promise<SkillResult> {\n const specDir = path.join(this.baseDir, SPEC_DIR);\n const specs: Array<{\n type: SpecType;\n filename: string;\n exists: boolean;\n path: string;\n }> = [];\n\n for (const [type, config] of Object.entries(SPEC_CONFIGS)) {\n const filePath = path.join(specDir, config.filename);\n specs.push({\n type: type as SpecType,\n filename: config.filename,\n exists: fs.existsSync(filePath),\n path: filePath,\n });\n }\n\n const existing = specs.filter((s) => s.exists);\n const missing = specs.filter((s) => !s.exists);\n\n return {\n success: true,\n message: `${existing.length}/${specs.length} specs exist`,\n data: { specs, existing, missing },\n };\n }\n\n /** Update a spec \u2014 primarily for checking off PROMPT_PLAN items */\n async update(filePath: string, changes: string): Promise<SkillResult> {\n const resolvedPath = path.isAbsolute(filePath)\n ? filePath\n : path.join(this.baseDir, filePath);\n\n if (!fs.existsSync(resolvedPath)) {\n return { success: false, message: `File not found: ${resolvedPath}` };\n }\n\n let content = fs.readFileSync(resolvedPath, 'utf-8');\n\n // Parse checkbox updates: \"Stage A:1\" means check item 1 in Stage A\n const checkboxPattern = /^(Stage [A-G])(?::(\\d+))?$/;\n const match = changes.match(checkboxPattern);\n\n if (match) {\n const [, stageName, itemNum] = match;\n content = this.checkItem(\n content,\n stageName,\n itemNum ? parseInt(itemNum) : undefined\n );\n } else {\n // Treat as direct checkbox text match: find \"- [ ] <changes>\" and check it\n const escaped = changes.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const re = new RegExp(`- \\\\[ \\\\] ${escaped}`, 'i');\n if (re.test(content)) {\n content = content.replace(re, `- [x] ${changes}`);\n } else {\n return {\n success: false,\n message: `No unchecked item matching \"${changes}\" found`,\n };\n }\n }\n\n // Append changelog entry\n const timestamp = new Date().toISOString().slice(0, 19).replace('T', ' ');\n const changelog = `\\n<!-- Updated: ${timestamp} | ${changes} -->\\n`;\n content += changelog;\n\n fs.writeFileSync(resolvedPath, content, 'utf-8');\n\n logger.info('Updated spec', { path: resolvedPath, changes });\n\n return {\n success: true,\n message: `Updated: ${changes}`,\n data: { path: resolvedPath, changes },\n action: `Checked off item in ${path.basename(resolvedPath)}`,\n };\n }\n\n /** Validate completeness of a spec */\n async validate(filePath: string): Promise<SkillResult> {\n const resolvedPath = path.isAbsolute(filePath)\n ? filePath\n : path.join(this.baseDir, filePath);\n\n if (!fs.existsSync(resolvedPath)) {\n return { success: false, message: `File not found: ${resolvedPath}` };\n }\n\n const content = fs.readFileSync(resolvedPath, 'utf-8');\n\n // Count checkboxes\n const unchecked = (content.match(/- \\[ \\]/g) || []).length;\n const checked = (content.match(/- \\[x\\]/gi) || []).length;\n const total = checked + unchecked;\n\n // Check for empty sections (## header followed by only whitespace/comments)\n const emptySections: string[] = [];\n const sectionRegex = /^## (.+)$/gm;\n let sectionMatch;\n\n while ((sectionMatch = sectionRegex.exec(content)) !== null) {\n const sectionName = sectionMatch[1];\n const sectionStart = content.indexOf(sectionMatch[0]);\n const nextSection = content.indexOf('\\n## ', sectionStart + 1);\n const sectionContent =\n nextSection === -1\n ? content.slice(sectionStart + sectionMatch[0].length)\n : content.slice(sectionStart + sectionMatch[0].length, nextSection);\n\n // Strip comments and whitespace\n const stripped = sectionContent\n .replace(/<!--.*?-->/gs, '')\n .replace(/\\s+/g, '')\n .trim();\n\n if (stripped.length === 0 || stripped === '||') {\n emptySections.push(sectionName);\n }\n }\n\n const isComplete = unchecked === 0 && emptySections.length === 0;\n\n return {\n success: true,\n message: isComplete\n ? 'Spec is complete'\n : `Spec incomplete: ${unchecked} unchecked items, ${emptySections.length} empty sections`,\n data: {\n path: resolvedPath,\n checkboxes: { checked, unchecked, total },\n emptySections,\n isComplete,\n completionPercent:\n total > 0 ? Math.round((checked / total) * 100) : 100,\n },\n };\n }\n\n // --- Private helpers ---\n\n private renderTemplate(\n type: SpecType,\n title: string,\n inputs: Record<string, string>\n ): string {\n switch (type) {\n case 'one-pager':\n return onePagerTemplate(title);\n\n case 'dev-spec':\n return devSpecTemplate(\n title,\n inputs['ONE_PAGER.md'] ||\n '*ONE_PAGER.md not found \u2014 generate it first.*'\n );\n\n case 'prompt-plan':\n return promptPlanTemplate(\n title,\n inputs['ONE_PAGER.md'] || '*ONE_PAGER.md not found*',\n inputs['DEV_SPEC.md'] ||\n '*DEV_SPEC.md not found \u2014 generate it first.*'\n );\n\n case 'agents':\n return agentsTemplate(title, inputs);\n\n default:\n return `# ${title}\\n\\nUnknown spec type: ${type}\\n`;\n }\n }\n\n /** Check off a specific checkbox item in a stage */\n private checkItem(\n content: string,\n stageName: string,\n itemIndex?: number\n ): string {\n const lines = content.split('\\n');\n let inStage = false;\n let itemCount = 0;\n\n for (let i = 0; i < lines.length; i++) {\n // Detect stage header\n if (lines[i].startsWith('## ') && lines[i].includes(stageName)) {\n inStage = true;\n itemCount = 0;\n continue;\n }\n\n // Exit stage on next header\n if (inStage && lines[i].startsWith('## ')) {\n break;\n }\n\n // Process checkbox\n if (inStage && lines[i].match(/^- \\[ \\]/)) {\n itemCount++;\n if (itemIndex === undefined || itemCount === itemIndex) {\n lines[i] = lines[i].replace('- [ ]', '- [x]');\n if (itemIndex !== undefined) break;\n }\n }\n }\n\n return lines.join('\\n');\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;AAMA,YAAY,QAAQ;AACpB,YAAY,UAAU;AAEtB,SAAS,cAAc;AAWvB,MAAM,WAAW;AAEjB,MAAM,eAA6C;AAAA,EACjD,aAAa;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,EACX;AAAA,EACA,YAAY;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,QAAQ,CAAC,WAAW;AAAA,EACtB;AAAA,EACA,eAAe;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,QAAQ,CAAC,aAAa,UAAU;AAAA,EAClC;AAAA,EACA,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,QAAQ,CAAC,aAAa,YAAY,aAAa;AAAA,EACjD;AACF;AAIA,SAAS,iBAAiB,OAAuB;AAC/C,SAAO,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BnB;AAEA,SAAS,gBAAgB,OAAe,iBAAiC;AACvE,SAAO,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjB,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BjB;AAEA,SAAS,mBACP,OACA,iBACA,gBACQ;AACR,SAAO,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjB,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuChB;AAEA,SAAS,eAAe,OAAe,QAAwC;AAC7E,QAAM,eAAe,OAAO,QAAQ,MAAM,EACvC;AAAA,IACC,CAAC,CAAC,MAAM,OAAO,MACb,6BAA6B,IAAI;AAAA;AAAA,EAAiB,OAAO;AAAA;AAAA;AAAA,EAC7D,EACC,KAAK,MAAM;AAEd,SAAO,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA,EAIjB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqCd;AAIO,MAAM,mBAAmB;AAAA,EAG9B,YAAoB,SAAuB;AAAvB;AAClB,SAAK,UAAU,QAAQ,IAAI;AAAA,EAC7B;AAAA,EAJQ;AAAA;AAAA,EAOR,MAAM,SACJ,MACA,OACA,MACsB;AACtB,UAAM,SAAS,aAAa,IAAI;AAChC,QAAI,CAAC,QAAQ;AACX,aAAO,EAAE,SAAS,OAAO,SAAS,sBAAsB,IAAI,GAAG;AAAA,IACjE;AAEA,UAAM,UAAU,KAAK,KAAK,KAAK,SAAS,QAAQ;AAChD,UAAM,aAAa,KAAK,KAAK,SAAS,OAAO,QAAQ;AAGrD,QAAI,GAAG,WAAW,UAAU,KAAK,CAAC,MAAM,OAAO;AAC7C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,GAAG,OAAO,QAAQ;AAAA,QAC3B,MAAM,EAAE,MAAM,WAAW;AAAA,MAC3B;AAAA,IACF;AAGA,UAAM,gBAAwC,CAAC;AAC/C,eAAW,aAAa,OAAO,QAAQ;AACrC,YAAM,cAAc,aAAa,SAAS;AAC1C,YAAM,YAAY,KAAK,KAAK,SAAS,YAAY,QAAQ;AACzD,UAAI,GAAG,WAAW,SAAS,GAAG;AAC5B,sBAAc,YAAY,QAAQ,IAAI,GAAG;AAAA,UACvC;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,UAAU,KAAK,eAAe,MAAM,OAAO,aAAa;AAG9D,OAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACzC,OAAG,cAAc,YAAY,SAAS,OAAO;AAE7C,WAAO,KAAK,mBAAmB,OAAO,QAAQ,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjE,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,WAAW,OAAO,QAAQ;AAAA,MACnC,MAAM;AAAA,QACJ,MAAM;AAAA,QACN;AAAA,QACA,UAAU,OAAO;AAAA,QACjB,YAAY,OAAO,KAAK,aAAa;AAAA,MACvC;AAAA,MACA,QAAQ,aAAa,QAAQ,IAAI,OAAO,QAAQ;AAAA,IAClD;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAA6B;AACjC,UAAM,UAAU,KAAK,KAAK,KAAK,SAAS,QAAQ;AAChD,UAAM,QAKD,CAAC;AAEN,eAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,YAAY,GAAG;AACzD,YAAM,WAAW,KAAK,KAAK,SAAS,OAAO,QAAQ;AACnD,YAAM,KAAK;AAAA,QACT;AAAA,QACA,UAAU,OAAO;AAAA,QACjB,QAAQ,GAAG,WAAW,QAAQ;AAAA,QAC9B,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,UAAM,WAAW,MAAM,OAAO,CAAC,MAAM,EAAE,MAAM;AAC7C,UAAM,UAAU,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM;AAE7C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,GAAG,SAAS,MAAM,IAAI,MAAM,MAAM;AAAA,MAC3C,MAAM,EAAE,OAAO,UAAU,QAAQ;AAAA,IACnC;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAO,UAAkB,SAAuC;AACpE,UAAM,eAAe,KAAK,WAAW,QAAQ,IACzC,WACA,KAAK,KAAK,KAAK,SAAS,QAAQ;AAEpC,QAAI,CAAC,GAAG,WAAW,YAAY,GAAG;AAChC,aAAO,EAAE,SAAS,OAAO,SAAS,mBAAmB,YAAY,GAAG;AAAA,IACtE;AAEA,QAAI,UAAU,GAAG,aAAa,cAAc,OAAO;AAGnD,UAAM,kBAAkB;AACxB,UAAM,QAAQ,QAAQ,MAAM,eAAe;AAE3C,QAAI,OAAO;AACT,YAAM,CAAC,EAAE,WAAW,OAAO,IAAI;AAC/B,gBAAU,KAAK;AAAA,QACb;AAAA,QACA;AAAA,QACA,UAAU,SAAS,OAAO,IAAI;AAAA,MAChC;AAAA,IACF,OAAO;AAEL,YAAM,UAAU,QAAQ,QAAQ,uBAAuB,MAAM;AAC7D,YAAM,KAAK,IAAI,OAAO,aAAa,OAAO,IAAI,GAAG;AACjD,UAAI,GAAG,KAAK,OAAO,GAAG;AACpB,kBAAU,QAAQ,QAAQ,IAAI,SAAS,OAAO,EAAE;AAAA,MAClD,OAAO;AACL,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,+BAA+B,OAAO;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAGA,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG;AACxE,UAAM,YAAY;AAAA,gBAAmB,SAAS,MAAM,OAAO;AAAA;AAC3D,eAAW;AAEX,OAAG,cAAc,cAAc,SAAS,OAAO;AAE/C,WAAO,KAAK,gBAAgB,EAAE,MAAM,cAAc,QAAQ,CAAC;AAE3D,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,YAAY,OAAO;AAAA,MAC5B,MAAM,EAAE,MAAM,cAAc,QAAQ;AAAA,MACpC,QAAQ,uBAAuB,KAAK,SAAS,YAAY,CAAC;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,SAAS,UAAwC;AACrD,UAAM,eAAe,KAAK,WAAW,QAAQ,IACzC,WACA,KAAK,KAAK,KAAK,SAAS,QAAQ;AAEpC,QAAI,CAAC,GAAG,WAAW,YAAY,GAAG;AAChC,aAAO,EAAE,SAAS,OAAO,SAAS,mBAAmB,YAAY,GAAG;AAAA,IACtE;AAEA,UAAM,UAAU,GAAG,aAAa,cAAc,OAAO;AAGrD,UAAM,aAAa,QAAQ,MAAM,UAAU,KAAK,CAAC,GAAG;AACpD,UAAM,WAAW,QAAQ,MAAM,WAAW,KAAK,CAAC,GAAG;AACnD,UAAM,QAAQ,UAAU;AAGxB,UAAM,gBAA0B,CAAC;AACjC,UAAM,eAAe;AACrB,QAAI;AAEJ,YAAQ,eAAe,aAAa,KAAK,OAAO,OAAO,MAAM;AAC3D,YAAM,cAAc,aAAa,CAAC;AAClC,YAAM,eAAe,QAAQ,QAAQ,aAAa,CAAC,CAAC;AACpD,YAAM,cAAc,QAAQ,QAAQ,SAAS,eAAe,CAAC;AAC7D,YAAM,iBACJ,gBAAgB,KACZ,QAAQ,MAAM,eAAe,aAAa,CAAC,EAAE,MAAM,IACnD,QAAQ,MAAM,eAAe,aAAa,CAAC,EAAE,QAAQ,WAAW;AAGtE,YAAM,WAAW,eACd,QAAQ,gBAAgB,EAAE,EAC1B,QAAQ,QAAQ,EAAE,EAClB,KAAK;AAER,UAAI,SAAS,WAAW,KAAK,aAAa,MAAM;AAC9C,sBAAc,KAAK,WAAW;AAAA,MAChC;AAAA,IACF;AAEA,UAAM,aAAa,cAAc,KAAK,cAAc,WAAW;AAE/D,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,aACL,qBACA,oBAAoB,SAAS,qBAAqB,cAAc,MAAM;AAAA,MAC1E,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,YAAY,EAAE,SAAS,WAAW,MAAM;AAAA,QACxC;AAAA,QACA;AAAA,QACA,mBACE,QAAQ,IAAI,KAAK,MAAO,UAAU,QAAS,GAAG,IAAI;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIQ,eACN,MACA,OACA,QACQ;AACR,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,iBAAiB,KAAK;AAAA,MAE/B,KAAK;AACH,eAAO;AAAA,UACL;AAAA,UACA,OAAO,cAAc,KACnB;AAAA,QACJ;AAAA,MAEF,KAAK;AACH,eAAO;AAAA,UACL;AAAA,UACA,OAAO,cAAc,KAAK;AAAA,UAC1B,OAAO,aAAa,KAClB;AAAA,QACJ;AAAA,MAEF,KAAK;AACH,eAAO,eAAe,OAAO,MAAM;AAAA,MAErC;AACE,eAAO,KAAK,KAAK;AAAA;AAAA,qBAA0B,IAAI;AAAA;AAAA,IACnD;AAAA,EACF;AAAA;AAAA,EAGQ,UACN,SACA,WACA,WACQ;AACR,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAI,UAAU;AACd,QAAI,YAAY;AAEhB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AAErC,UAAI,MAAM,CAAC,EAAE,WAAW,KAAK,KAAK,MAAM,CAAC,EAAE,SAAS,SAAS,GAAG;AAC9D,kBAAU;AACV,oBAAY;AACZ;AAAA,MACF;AAGA,UAAI,WAAW,MAAM,CAAC,EAAE,WAAW,KAAK,GAAG;AACzC;AAAA,MACF;AAGA,UAAI,WAAW,MAAM,CAAC,EAAE,MAAM,UAAU,GAAG;AACzC;AACA,YAAI,cAAc,UAAa,cAAc,WAAW;AACtD,gBAAM,CAAC,IAAI,MAAM,CAAC,EAAE,QAAQ,SAAS,OAAO;AAC5C,cAAI,cAAc,OAAW;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/skills/unified-rlm-orchestrator.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Unified RLM-First Orchestrator for StackMemory\n *\n * All skills and tasks flow through RLM orchestration first,\n * ensuring consistent decomposition, parallel execution, and quality control.\n */\n\nimport {\n RecursiveAgentOrchestrator,\n type RLMOptions,\n type SubagentType,\n type ExecutionResult,\n type TaskNode,\n} from './recursive-agent-orchestrator.js';\nimport {\n ClaudeSkillsManager,\n type SkillContext,\n type SkillResult,\n} from './claude-skills.js';\nimport { logger } from '../core/monitoring/logger.js';\nimport type { DualStackManager } from '../core/context/dual-stack-manager.js';\nimport type { ContextRetriever } from '../core/retrieval/context-retriever.js';\nimport type { FrameManager } from '../core/context/index.js';\nimport type { LinearTaskManager } from '../features/tasks/linear-task-manager.js';\n\n// Skill to RLM mapping configuration\ninterface SkillToRLMConfig {\n skillName: string;\n primaryAgent: SubagentType;\n secondaryAgents?: SubagentType[];\n taskTemplate: string;\n defaultOptions?: Partial<RLMOptions>;\n preprocessor?: (\n args: string[],\n options: Record<string, unknown>\n ) => { task: string; context: Record<string, unknown> };\n postprocessor?: (result: ExecutionResult) => SkillResult;\n}\n\n/**\n * UnifiedRLMOrchestrator - Routes all skills through RLM first\n */\nexport class UnifiedRLMOrchestrator {\n private rlmOrchestrator: RecursiveAgentOrchestrator;\n private skillsManager: ClaudeSkillsManager;\n private skillMappings: Map<string, SkillToRLMConfig>;\n\n constructor(\n frameManager: FrameManager,\n dualStackManager: DualStackManager,\n contextRetriever: ContextRetriever,\n taskStore: LinearTaskManager,\n skillContext: SkillContext\n ) {\n // Initialize RLM orchestrator\n this.rlmOrchestrator = new RecursiveAgentOrchestrator(\n frameManager,\n dualStackManager,\n contextRetriever,\n taskStore\n );\n\n // Initialize skills manager (for legacy compatibility)\n this.skillsManager = new ClaudeSkillsManager(skillContext);\n\n // Initialize skill mappings\n this.skillMappings = this.initializeSkillMappings();\n\n logger.info('Unified RLM Orchestrator initialized with RLM-first routing');\n }\n\n /**\n * Initialize skill to RLM agent mappings\n */\n private initializeSkillMappings(): Map<string, SkillToRLMConfig> {\n const mappings = new Map<string, SkillToRLMConfig>();\n\n // Handoff skill -> Context + Planning agents\n mappings.set('handoff', {\n skillName: 'handoff',\n primaryAgent: 'context',\n secondaryAgents: ['planning'],\n taskTemplate:\n 'Prepare comprehensive handoff to {targetUser}: {message}. Extract relevant context, identify dependencies, and create actionable items.',\n defaultOptions: {\n maxParallel: 3,\n reviewStages: 1,\n shareContextRealtime: true,\n },\n preprocessor: (args, options) => ({\n task: `Handoff to ${args[0]}: ${args[1]}`,\n context: {\n targetUser: args[0],\n message: args[1],\n priority: options.priority || 'medium',\n frames: options.frames || [],\n },\n }),\n postprocessor: (result) => ({\n success: result.success,\n message: `Handoff ${result.success ? 'completed' : 'failed'}`,\n data: result.rootNode.result,\n }),\n });\n\n // Checkpoint skill -> Context + Code agents\n mappings.set('checkpoint', {\n skillName: 'checkpoint',\n primaryAgent: 'context',\n secondaryAgents: ['code'],\n taskTemplate:\n 'Create recovery checkpoint: {description}. Capture current state, identify risky operations, and backup critical files.',\n defaultOptions: {\n maxParallel: 2,\n reviewStages: 0,\n verboseLogging: false,\n },\n preprocessor: (args, options) => ({\n task: `${args[0]} checkpoint: ${args[1]}`,\n context: {\n operation: args[0],\n description: args[1],\n ...options,\n },\n }),\n });\n\n // Dig skill -> Context agent (deep search)\n mappings.set('dig', {\n skillName: 'dig',\n primaryAgent: 'context',\n taskTemplate:\n 'Deep archaeological search: {query}. Analyze patterns, extract decisions, and build timeline.',\n defaultOptions: {\n maxParallel: 1,\n maxTokensPerAgent: 50000,\n reviewStages: 0,\n },\n preprocessor: (args, options) => ({\n task: `Archaeological dig: ${args[0]}`,\n context: {\n query: args[0],\n depth: options.depth || '30days',\n patterns: options.patterns,\n decisions: options.decisions,\n timeline: options.timeline,\n },\n }),\n });\n\n // Lint skill -> Linting agent primarily\n mappings.set('lint', {\n skillName: 'lint',\n primaryAgent: 'linting',\n secondaryAgents: ['improve'],\n taskTemplate:\n 'Comprehensive linting of {path}: Check syntax, types, formatting, security, performance, and dead code. Provide fixes.',\n defaultOptions: {\n maxParallel: 1,\n reviewStages: 0,\n verboseLogging: true,\n },\n preprocessor: (args, options) => ({\n task: `Lint ${args[0] || 'current directory'}`,\n context: {\n path: args[0] || process.cwd(),\n fix: options.fix,\n focus: options.security\n ? 'security'\n : options.performance\n ? 'performance'\n : 'all',\n },\n }),\n postprocessor: (result) => {\n const lintingNode = this.findNodeByAgent(result.rootNode, 'linting');\n return {\n success: result.success,\n message: `Found ${result.issuesFound} issues, fixed ${result.issuesFixed}`,\n data: {\n issues: lintingNode?.result?.issues || [],\n fixes: lintingNode?.result?.fixes || [],\n stats: {\n found: result.issuesFound,\n fixed: result.issuesFixed,\n duration: result.duration,\n },\n },\n };\n },\n });\n\n // Test generation -> Testing agent\n mappings.set('test', {\n skillName: 'test',\n primaryAgent: 'testing',\n secondaryAgents: ['code', 'review'],\n taskTemplate:\n 'Generate comprehensive {testMode} tests for {target}. Ensure high coverage and meaningful assertions.',\n defaultOptions: {\n maxParallel: 3,\n testGenerationMode: 'all',\n reviewStages: 2,\n qualityThreshold: 0.9,\n },\n preprocessor: (args, options) => ({\n task: `Generate tests for ${args[0] || 'project'}`,\n context: {\n target: args[0] || process.cwd(),\n testMode: options.mode || 'all',\n coverage: options.coverage || 'high',\n },\n }),\n });\n\n // Code review -> Review + Improve agents\n mappings.set('review', {\n skillName: 'review',\n primaryAgent: 'review',\n secondaryAgents: ['improve', 'testing'],\n taskTemplate:\n 'Multi-stage code review of {target}. Analyze architecture, quality, performance, security. Suggest improvements.',\n defaultOptions: {\n maxParallel: 2,\n reviewStages: 3,\n qualityThreshold: 0.85,\n verboseLogging: true,\n },\n preprocessor: (args, options) => ({\n task: `Review code in ${args[0] || 'project'}`,\n context: {\n target: args[0] || process.cwd(),\n focus: options.focus || 'all',\n autofix: options.fix || false,\n },\n }),\n });\n\n // Refactor -> Code + Review + Improve agents\n mappings.set('refactor', {\n skillName: 'refactor',\n primaryAgent: 'code',\n secondaryAgents: ['review', 'improve', 'testing'],\n taskTemplate:\n 'Refactor {target}: Improve architecture, reduce complexity, enhance maintainability. Preserve functionality.',\n defaultOptions: {\n maxParallel: 4,\n reviewStages: 2,\n qualityThreshold: 0.9,\n testGenerationMode: 'unit',\n },\n preprocessor: (args, options) => ({\n task: `Refactor ${args[0] || 'codebase'}`,\n context: {\n target: args[0] || process.cwd(),\n scope: options.scope || 'moderate',\n preserveApi: options.preserveApi !== false,\n },\n }),\n });\n\n // Deploy/Publish -> Publish agent\n mappings.set('publish', {\n skillName: 'publish',\n primaryAgent: 'publish',\n secondaryAgents: ['testing', 'linting'],\n taskTemplate:\n 'Prepare and execute {publishType} release. Run tests, update versions, generate changelog, publish.',\n defaultOptions: {\n maxParallel: 1,\n reviewStages: 1,\n testGenerationMode: 'all',\n },\n preprocessor: (args, options) => ({\n task: `Publish ${options.type || 'npm'} release`,\n context: {\n version: args[0],\n publishType: options.type || 'npm',\n prerelease: options.prerelease || false,\n skipTests: options.skipTests || false,\n },\n }),\n });\n\n return mappings;\n }\n\n /**\n * Execute any skill through RLM orchestration first\n */\n async executeSkill(\n skillName: string,\n args: string[],\n options?: Record<string, unknown>\n ): Promise<SkillResult> {\n logger.info(`Executing skill through RLM: ${skillName}`, { args, options });\n\n // Check if skill has RLM mapping\n const mapping = this.skillMappings.get(skillName);\n\n if (mapping) {\n // Route through RLM orchestrator\n return this.executeViaRLM(mapping, args, options || {});\n }\n\n // Special case: Direct RLM execution\n if (skillName === 'rlm') {\n const task = args.join(' ') || 'Analyze and optimize current code';\n const result = await this.rlmOrchestrator.execute(\n task,\n options || {},\n options as RLMOptions\n );\n return {\n success: result.success,\n message: `RLM execution ${result.success ? 'completed' : 'failed'}`,\n data: result,\n };\n }\n\n // Fallback to legacy skill manager for unmapped skills\n logger.warn(`Skill ${skillName} not mapped to RLM, using legacy execution`);\n return this.skillsManager.executeSkill(skillName, args, options);\n }\n\n /**\n * Execute skill via RLM orchestration\n */\n private async executeViaRLM(\n mapping: SkillToRLMConfig,\n args: string[],\n options: Record<string, unknown>\n ): Promise<SkillResult> {\n try {\n // Preprocess arguments\n const { task, context } = mapping.preprocessor\n ? mapping.preprocessor(args, options)\n : {\n task: mapping.taskTemplate.replace('{args}', args.join(' ')),\n context: { args, ...options },\n };\n\n // Merge options\n const rlmOptions: RLMOptions = {\n ...mapping.defaultOptions,\n ...options,\n // Force specific agents if specified\n agents: [mapping.primaryAgent, ...(mapping.secondaryAgents || [])],\n };\n\n // Execute through RLM\n const result = await this.rlmOrchestrator.execute(\n task,\n context,\n rlmOptions\n );\n\n // Postprocess result\n if (mapping.postprocessor) {\n return mapping.postprocessor(result);\n }\n\n // Default postprocessing\n return {\n success: result.success,\n message: `${mapping.skillName} ${result.success ? 'completed' : 'failed'}`,\n data: {\n duration: result.duration,\n tokens: result.totalTokens,\n cost: result.totalCost,\n improvements: result.improvements,\n testsGenerated: result.testsGenerated,\n issuesFound: result.issuesFound,\n issuesFixed: result.issuesFixed,\n details: result.rootNode,\n },\n };\n } catch (error) {\n logger.error(`RLM execution failed for ${mapping.skillName}:`, error);\n return {\n success: false,\n message: `Failed to execute ${mapping.skillName}: ${error.message}`,\n };\n }\n }\n\n /**\n * Helper: Find node by agent type in task tree\n */\n private findNodeByAgent(\n node: TaskNode,\n agentType: SubagentType\n ): TaskNode | null {\n if (node.agent === agentType) {\n return node;\n }\n if (node.children) {\n for (const child of node.children) {\n const found = this.findNodeByAgent(child, agentType);\n if (found) return found;\n }\n }\n return null;\n }\n\n /**\n * Get available skills (all RLM-mapped + legacy)\n */\n getAvailableSkills(): string[] {\n const rlmSkills = Array.from(this.skillMappings.keys());\n const legacySkills = this.skillsManager.getAvailableSkills();\n const allSkills = new Set([...rlmSkills, ...legacySkills, 'rlm']);\n return Array.from(allSkills);\n }\n\n /**\n * Get skill help\n */\n getSkillHelp(skillName: string): string {\n const mapping = this.skillMappings.get(skillName);\n if (mapping) {\n return `\n${skillName} (RLM-Orchestrated)\nPrimary Agent: ${mapping.primaryAgent}\nSecondary Agents: ${mapping.secondaryAgents?.join(', ') || 'none'}\n\n${mapping.taskTemplate}\n\nThis skill is executed through RLM orchestration for:\n- Automatic task decomposition\n- Parallel agent execution\n- Multi-stage quality review\n- Comprehensive result aggregation\n`;\n }\n\n // Fallback to legacy help\n return this.skillsManager.getSkillHelp(skillName);\n }\n\n /**\n * Execute task with intelligent routing\n */\n async executeTask(\n task: string,\n context?: Record<string, unknown>\n ): Promise<SkillResult> {\n // Analyze task to determine best skill/agent combination\n const taskAnalysis = this.analyzeTask(task);\n\n if (taskAnalysis.suggestedSkill) {\n // Route to specific skill\n return this.executeSkill(\n taskAnalysis.suggestedSkill,\n taskAnalysis.args,\n taskAnalysis.options\n );\n }\n\n // Direct RLM execution for complex/ambiguous tasks\n const result = await this.rlmOrchestrator.execute(task, context || {}, {\n maxParallel: 5,\n reviewStages: 2,\n qualityThreshold: 0.85,\n verboseLogging: true,\n });\n\n return {\n success: result.success,\n message: `Task ${result.success ? 'completed' : 'failed'}`,\n data: result,\n };\n }\n\n /**\n * Analyze task to determine best routing\n */\n private analyzeTask(task: string): {\n suggestedSkill?: string;\n args: string[];\n options: Record<string, unknown>;\n } {\n const taskLower = task.toLowerCase();\n\n // Pattern matching for skill detection\n const patterns = [\n { pattern: /lint|format|style|quality/i, skill: 'lint' },\n { pattern: /test|coverage|unit|integration/i, skill: 'test' },\n { pattern: /review|analyze|improve/i, skill: 'review' },\n { pattern: /refactor|restructure|clean/i, skill: 'refactor' },\n { pattern: /handoff|transfer|pass/i, skill: 'handoff' },\n { pattern: /checkpoint|backup|save/i, skill: 'checkpoint' },\n { pattern: /search|find|dig|history/i, skill: 'dig' },\n { pattern: /publish|release|deploy/i, skill: 'publish' },\n ];\n\n for (const { pattern, skill } of patterns) {\n if (pattern.test(taskLower)) {\n return {\n suggestedSkill: skill,\n args: [task],\n options: {},\n };\n }\n }\n\n // No specific skill detected\n return {\n args: [task],\n options: {},\n };\n }\n}\n\n/**\n * Singleton instance for global access\n */\nlet unifiedOrchestrator: UnifiedRLMOrchestrator | null = null;\n\nexport function initializeUnifiedOrchestrator(\n frameManager: FrameManager,\n dualStackManager: DualStackManager,\n contextRetriever: ContextRetriever,\n taskStore: LinearTaskManager,\n skillContext: SkillContext\n): UnifiedRLMOrchestrator {\n if (!unifiedOrchestrator) {\n unifiedOrchestrator = new UnifiedRLMOrchestrator(\n frameManager,\n dualStackManager,\n contextRetriever,\n taskStore,\n skillContext\n );\n }\n return unifiedOrchestrator;\n}\n\nexport function getUnifiedOrchestrator(): UnifiedRLMOrchestrator | null {\n return unifiedOrchestrator;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/utils/env.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Shared environment variable utilities\n */\n\nexport function getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (!value && !defaultValue) {\n throw new Error(`Environment variable ${key} is required but not set`);\n }\n return value || defaultValue || '';\n}\n\nexport function getOptionalEnv(\n key: string,\n defaultValue?: string\n): string | undefined {\n return process.env[key] || defaultValue;\n}\n\nexport function getRequiredEnv(key: string): string {\n const value = process.env[key];\n if (!value) {\n throw new Error(`Environment variable ${key} is required but not set`);\n }\n return value;\n}\n\nexport function getBooleanEnv(\n key: string,\n defaultValue: boolean = false\n): boolean {\n const value = process.env[key];\n if (!value) return defaultValue;\n return value.toLowerCase() === 'true' || value === '1';\n}\n\nexport function getNumberEnv(key: string, defaultValue?: number): number {\n const value = process.env[key];\n if (!value) {\n if (defaultValue === undefined) {\n throw new Error(`Environment variable ${key} is required but not set`);\n }\n return defaultValue;\n }\n const num = parseInt(value, 10);\n if (isNaN(num)) {\n throw new Error(\n `Environment variable ${key} must be a number, got: ${value}`\n );\n }\n return num;\n}\n"],
|
|
5
|
-
"mappings": ";;;;AAIO,SAAS,OAAO,KAAa,cAA+B;AACjE,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,CAAC,SAAS,CAAC,cAAc;AAC3B,UAAM,IAAI,MAAM,wBAAwB,GAAG,0BAA0B;AAAA,EACvE;AACA,SAAO,SAAS,gBAAgB;AAClC;AAEO,SAAS,eACd,KACA,cACoB;AACpB,SAAO,QAAQ,IAAI,GAAG,KAAK;AAC7B;AAEO,SAAS,eAAe,KAAqB;AAClD,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,wBAAwB,GAAG,0BAA0B;AAAA,EACvE;AACA,SAAO;AACT;AAEO,SAAS,cACd,KACA,eAAwB,OACf;AACT,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MAAM,YAAY,MAAM,UAAU,UAAU;AACrD;AAEO,SAAS,aAAa,KAAa,cAA+B;AACvE,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,CAAC,OAAO;AACV,QAAI,iBAAiB,QAAW;AAC9B,YAAM,IAAI,MAAM,wBAAwB,GAAG,0BAA0B;AAAA,IACvE;AACA,WAAO;AAAA,EACT;AACA,QAAM,MAAM,SAAS,OAAO,EAAE;AAC9B,MAAI,MAAM,GAAG,GAAG;AACd,UAAM,IAAI;AAAA,MACR,wBAAwB,GAAG,2BAA2B,KAAK;AAAA,IAC7D;AAAA,EACF;AACA,SAAO;AACT;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/utils/formatting.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Formatting utilities for CLI output\n */\n\n/**\n * Format bytes to human-readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;\n}\n\n/**\n * Format duration in milliseconds to human-readable string\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) {\n return `${days}d ${hours % 24}h`;\n }\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n\n return `${seconds}s`;\n}\n\n/**\n * Format relative time\n */\nexport function formatRelativeTime(timestamp: number): string {\n const now = Date.now();\n const diff = now - timestamp;\n\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days} day${days > 1 ? 's' : ''} ago`;\n if (hours > 0) return `${hours} hour${hours > 1 ? 's' : ''} ago`;\n if (minutes > 0) return `${minutes} minute${minutes > 1 ? 's' : ''} ago`;\n\n return 'just now';\n}\n\n/**\n * Truncate string with ellipsis\n */\nexport function truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.substring(0, maxLength - 3) + '...';\n}\n\n/**\n * Format percentage\n */\nexport function formatPercent(value: number, total: number): string {\n if (total === 0) return '0%';\n return `${((value / total) * 100).toFixed(1)}%`;\n}\n\n/**\n * Create a simple text progress bar\n */\nexport function createProgressBar(\n value: number,\n max: number,\n width: number = 20\n): string {\n const percent = Math.min(value / max, 1);\n const filled = Math.floor(percent * width);\n const empty = width - filled;\n\n return '\u2588'.repeat(filled) + '\u2591'.repeat(empty);\n}\n"],
|
|
5
|
-
"mappings": ";;;;AAOO,SAAS,YAAY,OAAuB;AACjD,MAAI,UAAU,EAAG,QAAO;AAExB,QAAM,IAAI;AACV,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,MAAM,IAAI;AAC1C,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAElD,SAAO,IAAI,QAAQ,KAAK,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAC3D;AAKO,SAAS,eAAe,IAAoB;AACjD,MAAI,KAAK,IAAM,QAAO,GAAG,EAAE;AAE3B,QAAM,UAAU,KAAK,MAAM,KAAK,GAAI;AACpC,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAElC,MAAI,OAAO,GAAG;AACZ,WAAO,GAAG,IAAI,KAAK,QAAQ,EAAE;AAAA,EAC/B;AACA,MAAI,QAAQ,GAAG;AACb,WAAO,GAAG,KAAK,KAAK,UAAU,EAAE;AAAA,EAClC;AACA,MAAI,UAAU,GAAG;AACf,WAAO,GAAG,OAAO,KAAK,UAAU,EAAE;AAAA,EACpC;AAEA,SAAO,GAAG,OAAO;AACnB;AAKO,SAAS,mBAAmB,WAA2B;AAC5D,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,OAAO,MAAM;AAEnB,QAAM,UAAU,KAAK,MAAM,OAAO,GAAK;AACvC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAElC,MAAI,OAAO,EAAG,QAAO,GAAG,IAAI,OAAO,OAAO,IAAI,MAAM,EAAE;AACtD,MAAI,QAAQ,EAAG,QAAO,GAAG,KAAK,QAAQ,QAAQ,IAAI,MAAM,EAAE;AAC1D,MAAI,UAAU,EAAG,QAAO,GAAG,OAAO,UAAU,UAAU,IAAI,MAAM,EAAE;AAElE,SAAO;AACT;AAKO,SAAS,SAAS,KAAa,WAA2B;AAC/D,MAAI,IAAI,UAAU,UAAW,QAAO;AACpC,SAAO,IAAI,UAAU,GAAG,YAAY,CAAC,IAAI;AAC3C;AAKO,SAAS,cAAc,OAAe,OAAuB;AAClE,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO,IAAK,QAAQ,QAAS,KAAK,QAAQ,CAAC,CAAC;AAC9C;AAKO,SAAS,kBACd,OACA,KACA,QAAgB,IACR;AACR,QAAM,UAAU,KAAK,IAAI,QAAQ,KAAK,CAAC;AACvC,QAAM,SAAS,KAAK,MAAM,UAAU,KAAK;AACzC,QAAM,QAAQ,QAAQ;AAEtB,SAAO,SAAI,OAAO,MAAM,IAAI,SAAI,OAAO,KAAK;AAC9C;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/utils/process-cleanup.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Process Cleanup Utility\n * Automatically cleans up stale stackmemory processes older than 24h\n * with no recent log activity.\n */\n\nimport { execSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { logger } from '../core/monitoring/logger.js';\n\nexport interface StaleProcess {\n pid: number;\n command: string;\n startTime: Date;\n ageHours: number;\n logFile?: string;\n lastLogActivity?: Date;\n}\n\nexport interface CleanupResult {\n found: StaleProcess[];\n killed: number[];\n errors: Array<{ pid: number; error: string }>;\n}\n\nconst STACKMEMORY_PROCESS_PATTERNS = [\n 'stackmemory',\n 'ralph orchestrate',\n 'ralph swarm',\n 'ralph loop',\n 'hooks start',\n];\n\n/**\n * Get all running stackmemory-related processes\n */\nexport function getStackmemoryProcesses(): StaleProcess[] {\n const processes: StaleProcess[] = [];\n\n try {\n // Get process list with start time (macOS/Linux compatible)\n const psOutput = execSync(\n 'ps -eo pid,lstart,command 2>/dev/null || ps -eo pid,start,args 2>/dev/null',\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n\n const lines = psOutput.trim().split('\\n').slice(1); // Skip header\n\n for (const line of lines) {\n // Check if it's a stackmemory process\n const isStackmemory = STACKMEMORY_PROCESS_PATTERNS.some((pattern) =>\n line.toLowerCase().includes(pattern.toLowerCase())\n );\n\n if (!isStackmemory) continue;\n\n // Parse the line - format varies by OS\n // macOS: PID \"Day Mon DD HH:MM:SS YYYY\" COMMAND\n const match = line.match(\n /^\\s*(\\d+)\\s+(\\w+\\s+\\w+\\s+\\d+\\s+[\\d:]+\\s+\\d+)\\s+(.+)$/\n );\n\n if (match) {\n const pid = parseInt(match[1], 10);\n const startTimeStr = match[2];\n const command = match[3];\n\n // Skip current process\n if (pid === process.pid) continue;\n\n // Parse start time\n const startTime = new Date(startTimeStr);\n const ageMs = Date.now() - startTime.getTime();\n const ageHours = ageMs / (1000 * 60 * 60);\n\n processes.push({\n pid,\n command: command.slice(0, 100), // Truncate long commands\n startTime,\n ageHours,\n });\n }\n }\n } catch (error) {\n logger.warn('Failed to get process list:', error);\n }\n\n return processes;\n}\n\n/**\n * Check if a process has recent log activity\n */\nfunction hasRecentLogActivity(\n proc: StaleProcess,\n maxAgeHours: number\n): boolean {\n const logDir = path.join(os.homedir(), '.stackmemory', 'logs');\n\n if (!fs.existsSync(logDir)) return false;\n\n try {\n // Look for log files that might be related to this process\n const logFiles = fs.readdirSync(logDir).filter((f) => f.endsWith('.log'));\n\n for (const logFile of logFiles) {\n const logPath = path.join(logDir, logFile);\n const stats = fs.statSync(logPath);\n const logAgeHours = (Date.now() - stats.mtimeMs) / (1000 * 60 * 60);\n\n if (logAgeHours < maxAgeHours) {\n // Check if log contains this PID\n try {\n const content = fs.readFileSync(logPath, 'utf-8').slice(-10000); // Last 10KB\n if (\n content.includes(`pid:${proc.pid}`) ||\n content.includes(`PID ${proc.pid}`)\n ) {\n proc.logFile = logPath;\n proc.lastLogActivity = stats.mtime;\n return true;\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n } catch (error) {\n logger.warn('Failed to check log activity:', error);\n }\n\n return false;\n}\n\n/**\n * Find stale processes older than specified hours with no recent log activity\n */\nexport function findStaleProcesses(maxAgeHours: number = 24): StaleProcess[] {\n const allProcesses = getStackmemoryProcesses();\n\n return allProcesses.filter((proc) => {\n // Must be older than threshold\n if (proc.ageHours < maxAgeHours) return false;\n\n // Check for recent log activity\n if (hasRecentLogActivity(proc, maxAgeHours)) return false;\n\n return true;\n });\n}\n\n/**\n * Kill stale processes\n */\nexport function killStaleProcesses(\n processes: StaleProcess[],\n dryRun: boolean = false\n): CleanupResult {\n const result: CleanupResult = {\n found: processes,\n killed: [],\n errors: [],\n };\n\n for (const proc of processes) {\n if (dryRun) {\n logger.info(`[DRY RUN] Would kill PID ${proc.pid}: ${proc.command}`);\n continue;\n }\n\n try {\n process.kill(proc.pid, 'SIGTERM');\n result.killed.push(proc.pid);\n logger.info(`Killed stale process ${proc.pid}: ${proc.command}`);\n } catch (error: unknown) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ESRCH') {\n // Process already dead\n result.killed.push(proc.pid);\n } else {\n result.errors.push({\n pid: proc.pid,\n error: err.message || 'Unknown error',\n });\n logger.warn(`Failed to kill PID ${proc.pid}:`, err.message);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Main cleanup function\n */\nexport function cleanupStaleProcesses(\n options: {\n maxAgeHours?: number;\n dryRun?: boolean;\n } = {}\n): CleanupResult {\n const { maxAgeHours = 24, dryRun = false } = options;\n\n logger.info(`Looking for stale processes older than ${maxAgeHours}h...`);\n\n const staleProcesses = findStaleProcesses(maxAgeHours);\n\n if (staleProcesses.length === 0) {\n logger.info('No stale processes found');\n return { found: [], killed: [], errors: [] };\n }\n\n logger.info(`Found ${staleProcesses.length} stale process(es)`);\n\n return killStaleProcesses(staleProcesses, dryRun);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
# StackMemory Pre-Publish Test Suite
|
|
2
|
-
|
|
3
|
-
This directory contains comprehensive tests for validating StackMemory installation and functionality before publishing to npm.
|
|
4
|
-
|
|
5
|
-
## Test Scripts
|
|
6
|
-
|
|
7
|
-
### 1. `test-installation.sh`
|
|
8
|
-
**Main pre-publish validation suite**
|
|
9
|
-
- Tests CLI build and compilation
|
|
10
|
-
- Validates package.json structure
|
|
11
|
-
- Checks shell integration setup
|
|
12
|
-
- Validates binary functionality
|
|
13
|
-
- Tests fresh installation simulation
|
|
14
|
-
- Runs security audits
|
|
15
|
-
|
|
16
|
-
**Usage:**
|
|
17
|
-
```bash
|
|
18
|
-
npm run test:install
|
|
19
|
-
# or
|
|
20
|
-
./scripts/test-installation.sh
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
### 2. `test-shell-integration.sh`
|
|
24
|
-
**Shell integration specific tests**
|
|
25
|
-
- Validates all binaries exist and are executable
|
|
26
|
-
- Tests individual binary functionality
|
|
27
|
-
- Checks shell integration file syntax
|
|
28
|
-
- Validates PATH configuration
|
|
29
|
-
- Tests for startup errors
|
|
30
|
-
|
|
31
|
-
**Usage:**
|
|
32
|
-
```bash
|
|
33
|
-
npm run test:shell
|
|
34
|
-
# or
|
|
35
|
-
./scripts/test-shell-integration.sh
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
### 3. `test-installation-scenarios.sh`
|
|
39
|
-
**Real-world installation scenario tests**
|
|
40
|
-
- Tests global installation
|
|
41
|
-
- Tests local project installation
|
|
42
|
-
- Tests permission scenarios
|
|
43
|
-
- Tests Node.js version compatibility
|
|
44
|
-
- Tests package integrity
|
|
45
|
-
- Tests upgrade scenarios
|
|
46
|
-
|
|
47
|
-
**Usage:**
|
|
48
|
-
```bash
|
|
49
|
-
npm run test:scenarios
|
|
50
|
-
# or
|
|
51
|
-
./scripts/test-installation-scenarios.sh
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Complete Pre-Publish Test Suite
|
|
55
|
-
|
|
56
|
-
Run all tests before publishing:
|
|
57
|
-
|
|
58
|
-
```bash
|
|
59
|
-
npm run test:pre-publish
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
This runs all three test suites in sequence and must pass before `npm publish` can succeed.
|
|
63
|
-
|
|
64
|
-
## Test Components Validated
|
|
65
|
-
|
|
66
|
-
### CLI Functionality
|
|
67
|
-
- ✅ Build completes without errors
|
|
68
|
-
- ✅ CLI executable works (`stackmemory --version`, `stackmemory --help`)
|
|
69
|
-
- ✅ Core commands load without module resolution errors
|
|
70
|
-
- ✅ TypeScript compilation succeeds
|
|
71
|
-
- ✅ Linting passes
|
|
72
|
-
|
|
73
|
-
### Shell Integration
|
|
74
|
-
- ✅ `~/.stackmemory/bin/` directory and binaries exist
|
|
75
|
-
- ✅ `stackmemory-daemon` functionality (start, stop, status)
|
|
76
|
-
- ✅ `stackmemory-monitor` configuration management
|
|
77
|
-
- ✅ `sm-review` context review functionality
|
|
78
|
-
- ✅ `stackmemory` wrapper delegates properly
|
|
79
|
-
- ✅ Shell integration files can be sourced without errors
|
|
80
|
-
- ✅ PATH configuration includes StackMemory binaries
|
|
81
|
-
|
|
82
|
-
### Package & Installation
|
|
83
|
-
- ✅ package.json structure is valid
|
|
84
|
-
- ✅ npm pack succeeds
|
|
85
|
-
- ✅ Fresh installation simulation works
|
|
86
|
-
- ✅ Global and local installation scenarios
|
|
87
|
-
- ✅ Permission handling
|
|
88
|
-
- ✅ Node.js compatibility (18, 20, 21, 22)
|
|
89
|
-
- ✅ Package integrity validation
|
|
90
|
-
- ✅ Postinstall setup execution
|
|
91
|
-
- ✅ Upgrade scenarios
|
|
92
|
-
|
|
93
|
-
### Security
|
|
94
|
-
- ✅ Dependencies security audit passes
|
|
95
|
-
- ✅ No high-severity vulnerabilities
|
|
96
|
-
- ✅ Git working directory is clean
|
|
97
|
-
|
|
98
|
-
## Integration with npm
|
|
99
|
-
|
|
100
|
-
The test suite is integrated with npm lifecycle hooks:
|
|
101
|
-
|
|
102
|
-
```json
|
|
103
|
-
{
|
|
104
|
-
"scripts": {
|
|
105
|
-
"prepublishOnly": "npm run build && npm run test:pre-publish"
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
This ensures that:
|
|
111
|
-
1. All tests must pass before any `npm publish` command succeeds
|
|
112
|
-
2. The package is built fresh before testing
|
|
113
|
-
3. Installation scenarios are validated in clean environments
|
|
114
|
-
|
|
115
|
-
## Test Output
|
|
116
|
-
|
|
117
|
-
Each test script provides colored output:
|
|
118
|
-
- 🔵 **INFO**: Test execution information
|
|
119
|
-
- 🟢 **PASS**: Test passed successfully
|
|
120
|
-
- 🔴 **FAIL**: Test failed with error details
|
|
121
|
-
- 🟡 **WARN**: Warning or non-critical issue
|
|
122
|
-
|
|
123
|
-
Example output:
|
|
124
|
-
```
|
|
125
|
-
============================================
|
|
126
|
-
StackMemory Pre-Publish Test Suite
|
|
127
|
-
============================================
|
|
128
|
-
|
|
129
|
-
🔨 Build & Compilation Tests
|
|
130
|
-
[PASS] Build succeeds without errors
|
|
131
|
-
[PASS] TypeScript compilation check
|
|
132
|
-
[PASS] Lint check passes
|
|
133
|
-
|
|
134
|
-
⚡ CLI Functionality Tests
|
|
135
|
-
[PASS] CLI is executable
|
|
136
|
-
[PASS] CLI help displays correctly
|
|
137
|
-
[PASS] CLI commands load without errors
|
|
138
|
-
|
|
139
|
-
📦 Package Validation Tests
|
|
140
|
-
[PASS] package.json structure valid
|
|
141
|
-
[PASS] npm pack succeeds
|
|
142
|
-
[PASS] Git status is clean
|
|
143
|
-
|
|
144
|
-
✅ All tests passed! Ready for npm publish.
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
## Troubleshooting Failed Tests
|
|
148
|
-
|
|
149
|
-
### Build Failures
|
|
150
|
-
- Check TypeScript errors: `npm run build`
|
|
151
|
-
- Fix linting issues: `npm run lint:fix`
|
|
152
|
-
- Ensure all dependencies are installed: `npm install`
|
|
153
|
-
|
|
154
|
-
### CLI Failures
|
|
155
|
-
- Verify dist/cli/index.js exists and is executable
|
|
156
|
-
- Check for missing ES module import extensions (.js)
|
|
157
|
-
- Ensure all imported modules exist in the build
|
|
158
|
-
|
|
159
|
-
### Shell Integration Failures
|
|
160
|
-
- Verify `~/.stackmemory/bin/` directory exists
|
|
161
|
-
- Check binary file permissions: `ls -la ~/.stackmemory/bin/`
|
|
162
|
-
- Test individual binaries manually
|
|
163
|
-
- Check shell integration syntax: `bash -n ~/.stackmemory/shell-integration-consolidated.sh`
|
|
164
|
-
|
|
165
|
-
### Installation Scenario Failures
|
|
166
|
-
- Check npm pack output for missing files
|
|
167
|
-
- Verify package.json bin configuration
|
|
168
|
-
- Test in clean environment manually
|
|
169
|
-
- Check Node.js version compatibility
|
|
170
|
-
|
|
171
|
-
## Continuous Integration
|
|
172
|
-
|
|
173
|
-
For CI/CD pipelines, run the full test suite:
|
|
174
|
-
|
|
175
|
-
```bash
|
|
176
|
-
# In CI environment
|
|
177
|
-
npm ci
|
|
178
|
-
npm run test:pre-publish
|
|
179
|
-
npm publish
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
The tests are designed to work in various environments:
|
|
183
|
-
- Local development machines
|
|
184
|
-
- CI/CD systems (GitHub Actions, etc.)
|
|
185
|
-
- Docker containers
|
|
186
|
-
- Different operating systems (macOS, Linux)
|