kynjal-cli 3.1.3 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/core/coder.md +1 -1
- package/.claude/agents/core/planner.md +2 -2
- package/.claude/agents/core/researcher.md +1 -1
- package/.claude/agents/core/reviewer.md +1 -1
- package/.claude/agents/core/tester.md +1 -1
- package/.claude/agents/data/data-ml-model.md +4 -4
- package/.claude/agents/development/dev-backend-api.md +4 -4
- package/.claude/agents/documentation/docs-api-openapi.md +4 -4
- package/.claude/agents/github/code-review-swarm.md +2 -2
- package/.claude/agents/github/issue-tracker.md +2 -2
- package/.claude/agents/github/pr-manager.md +2 -2
- package/.claude/agents/github/release-manager.md +2 -2
- package/.claude/agents/github/workflow-automation.md +2 -2
- package/.claude/agents/sparc/architecture.md +3 -3
- package/.claude/agents/sparc/pseudocode.md +2 -2
- package/.claude/agents/sparc/refinement.md +3 -3
- package/.claude/agents/sparc/specification.md +2 -2
- package/.claude/agents/swarm/adaptive-coordinator.md +1 -1
- package/.claude/agents/swarm/hierarchical-coordinator.md +1 -1
- package/.claude/agents/swarm/mesh-coordinator.md +1 -1
- package/.claude/agents/templates/base-template-generator.md +25 -4
- package/.claude/agents/templates/sparc-coordinator.md +3 -3
- package/.claude/helpers/auto-commit.sh +1 -1
- package/.claude/helpers/auto-memory-hook.mjs +27 -9
- package/.claude/helpers/hook-handler.cjs +58 -18
- package/.claude/helpers/statusline.cjs +14 -33
- package/.claude/helpers/statusline.js +3 -3
- package/.claude/settings.json +9 -9
- package/.claude/skills/reasoningbank-intelligence/SKILL.md +2 -2
- package/.claude/skills/swarm-orchestration/SKILL.md +1 -1
- package/README.md +383 -170
- package/bin/cli.js +6 -6
- package/bin/mcp-server.js +1 -1
- package/bin/preinstall.cjs +2 -0
- package/dist/src/appliance/gguf-engine.js +664 -0
- package/dist/src/appliance/gguf-engine.js.map +1 -0
- package/dist/src/appliance/ruvllm-bridge.js +492 -0
- package/dist/src/appliance/ruvllm-bridge.js.map +1 -0
- package/dist/src/appliance/rvfa-builder.js +383 -0
- package/dist/src/appliance/rvfa-builder.js.map +1 -0
- package/dist/src/appliance/rvfa-distribution.js +533 -0
- package/dist/src/appliance/rvfa-distribution.js.map +1 -0
- package/dist/src/appliance/rvfa-format.js +465 -0
- package/dist/src/appliance/rvfa-format.js.map +1 -0
- package/dist/src/appliance/rvfa-runner.js +373 -0
- package/dist/src/appliance/rvfa-runner.js.map +1 -0
- package/dist/src/appliance/rvfa-signing.js +469 -0
- package/dist/src/appliance/rvfa-signing.js.map +1 -0
- package/dist/src/benchmarks/pretrain/index.js +542 -331
- package/dist/src/benchmarks/pretrain/index.js.map +1 -1
- package/dist/src/commands/agent.d.ts.map +1 -1
- package/dist/src/commands/agent.js +725 -502
- package/dist/src/commands/agent.js.map +1 -1
- package/dist/src/commands/analyze.js +1548 -1218
- package/dist/src/commands/analyze.js.map +1 -1
- package/dist/src/commands/appliance-advanced.d.ts +9 -0
- package/dist/src/commands/appliance-advanced.d.ts.map +1 -0
- package/dist/src/commands/appliance-advanced.js +324 -0
- package/dist/src/commands/appliance-advanced.js.map +1 -0
- package/dist/src/commands/appliance.d.ts +8 -0
- package/dist/src/commands/appliance.d.ts.map +1 -0
- package/dist/src/commands/appliance.js +581 -0
- package/dist/src/commands/appliance.js.map +1 -0
- package/dist/src/commands/benchmark.js +523 -372
- package/dist/src/commands/benchmark.js.map +1 -1
- package/dist/src/commands/claims.js +364 -274
- package/dist/src/commands/claims.js.map +1 -1
- package/dist/src/commands/cleanup.d.ts +13 -0
- package/dist/src/commands/cleanup.d.ts.map +1 -0
- package/dist/src/commands/cleanup.js +262 -0
- package/dist/src/commands/cleanup.js.map +1 -0
- package/dist/src/commands/completions.js +118 -477
- package/dist/src/commands/completions.js.map +1 -1
- package/dist/src/commands/config.js +303 -237
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/daemon.d.ts.map +1 -1
- package/dist/src/commands/daemon.js +597 -425
- package/dist/src/commands/daemon.js.map +1 -1
- package/dist/src/commands/deployment.js +275 -194
- package/dist/src/commands/deployment.js.map +1 -1
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +690 -460
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/embeddings.js +1543 -1293
- package/dist/src/commands/embeddings.js.map +1 -1
- package/dist/src/commands/guidance.js +596 -449
- package/dist/src/commands/guidance.js.map +1 -1
- package/dist/src/commands/hive-mind.js +938 -854
- package/dist/src/commands/hive-mind.js.map +1 -1
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +3677 -2570
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.js +322 -122
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init.d.ts +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +943 -787
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/issues.js +558 -383
- package/dist/src/commands/issues.js.map +1 -1
- package/dist/src/commands/mcp.d.ts.map +1 -1
- package/dist/src/commands/mcp.js +605 -475
- package/dist/src/commands/mcp.js.map +1 -1
- package/dist/src/commands/memory.d.ts.map +1 -1
- package/dist/src/commands/memory.js +1031 -814
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/migrate.js +347 -282
- package/dist/src/commands/migrate.js.map +1 -1
- package/dist/src/commands/neural.d.ts.map +1 -1
- package/dist/src/commands/neural.js +1563 -1283
- package/dist/src/commands/neural.js.map +1 -1
- package/dist/src/commands/performance.js +643 -497
- package/dist/src/commands/performance.js.map +1 -1
- package/dist/src/commands/plugins.js +841 -668
- package/dist/src/commands/plugins.js.map +1 -1
- package/dist/src/commands/process.js +447 -392
- package/dist/src/commands/process.js.map +1 -1
- package/dist/src/commands/progress.js +256 -162
- package/dist/src/commands/progress.js.map +1 -1
- package/dist/src/commands/providers.js +220 -150
- package/dist/src/commands/providers.js.map +1 -1
- package/dist/src/commands/route.js +665 -520
- package/dist/src/commands/route.js.map +1 -1
- package/dist/src/commands/ruvector/backup.js +651 -505
- package/dist/src/commands/ruvector/backup.js.map +1 -1
- package/dist/src/commands/ruvector/benchmark.js +401 -349
- package/dist/src/commands/ruvector/benchmark.js.map +1 -1
- package/dist/src/commands/ruvector/import.js +267 -225
- package/dist/src/commands/ruvector/import.js.map +1 -1
- package/dist/src/commands/ruvector/index.js +75 -37
- package/dist/src/commands/ruvector/index.js.map +1 -1
- package/dist/src/commands/ruvector/init.js +359 -336
- package/dist/src/commands/ruvector/init.js.map +1 -1
- package/dist/src/commands/ruvector/migrate.js +322 -335
- package/dist/src/commands/ruvector/migrate.js.map +1 -1
- package/dist/src/commands/ruvector/optimize.js +431 -375
- package/dist/src/commands/ruvector/optimize.js.map +1 -1
- package/dist/src/commands/ruvector/setup.js +117 -703
- package/dist/src/commands/ruvector/setup.js.map +1 -1
- package/dist/src/commands/ruvector/status.js +419 -364
- package/dist/src/commands/ruvector/status.js.map +1 -1
- package/dist/src/commands/security.d.ts.map +1 -1
- package/dist/src/commands/security.js +610 -456
- package/dist/src/commands/security.js.map +1 -1
- package/dist/src/commands/session.d.ts +1 -1
- package/dist/src/commands/session.js +627 -505
- package/dist/src/commands/session.js.map +1 -1
- package/dist/src/commands/start.d.ts +1 -1
- package/dist/src/commands/start.js +368 -271
- package/dist/src/commands/start.js.map +1 -1
- package/dist/src/commands/status.d.ts +1 -1
- package/dist/src/commands/status.d.ts.map +1 -1
- package/dist/src/commands/status.js +492 -379
- package/dist/src/commands/status.js.map +1 -1
- package/dist/src/commands/swarm.js +488 -408
- package/dist/src/commands/swarm.js.map +1 -1
- package/dist/src/commands/task.d.ts +1 -1
- package/dist/src/commands/task.js +539 -424
- package/dist/src/commands/task.js.map +1 -1
- package/dist/src/commands/transfer-store.js +412 -322
- package/dist/src/commands/transfer-store.js.map +1 -1
- package/dist/src/commands/update.js +291 -196
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/commands/workflow.js +486 -386
- package/dist/src/commands/workflow.js.map +1 -1
- package/dist/src/config-adapter.js +40 -39
- package/dist/src/config-adapter.js.map +1 -1
- package/dist/src/index.js +416 -312
- package/dist/src/index.js.map +1 -1
- package/dist/src/infrastructure/in-memory-repositories.js +507 -246
- package/dist/src/infrastructure/in-memory-repositories.js.map +1 -1
- package/dist/src/init/claudemd-generator.js +78 -368
- package/dist/src/init/claudemd-generator.js.map +1 -1
- package/dist/src/init/executor.js +1019 -1345
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/helpers-generator.js +60 -635
- package/dist/src/init/helpers-generator.js.map +1 -1
- package/dist/src/init/index.d.ts +1 -1
- package/dist/src/init/index.d.ts.map +1 -1
- package/dist/src/init/index.js +1 -1
- package/dist/src/init/index.js.map +1 -1
- package/dist/src/init/mcp-generator.d.ts +0 -1
- package/dist/src/init/mcp-generator.d.ts.map +1 -1
- package/dist/src/init/mcp-generator.js +62 -42
- package/dist/src/init/mcp-generator.js.map +1 -1
- package/dist/src/init/settings-generator.d.ts.map +1 -1
- package/dist/src/init/settings-generator.js +167 -100
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/init/statusline-generator.d.ts +16 -8
- package/dist/src/init/statusline-generator.d.ts.map +1 -1
- package/dist/src/init/statusline-generator.js +20 -1300
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/init/types.d.ts +15 -5
- package/dist/src/init/types.d.ts.map +1 -1
- package/dist/src/init/types.js +66 -76
- package/dist/src/init/types.js.map +1 -1
- package/dist/src/mcp-client.js +130 -76
- package/dist/src/mcp-client.js.map +1 -1
- package/dist/src/mcp-server.js +758 -445
- package/dist/src/mcp-server.js.map +1 -1
- package/dist/src/mcp-tools/agent-tools.js +492 -391
- package/dist/src/mcp-tools/agent-tools.js.map +1 -1
- package/dist/src/mcp-tools/agentdb-tools.d.ts +30 -0
- package/dist/src/mcp-tools/agentdb-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/agentdb-tools.js +758 -0
- package/dist/src/mcp-tools/agentdb-tools.js.map +1 -0
- package/dist/src/mcp-tools/analyze-tools.js +236 -172
- package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
- package/dist/src/mcp-tools/auto-install.js +142 -80
- package/dist/src/mcp-tools/auto-install.js.map +1 -1
- package/dist/src/mcp-tools/browser-tools.js +375 -252
- package/dist/src/mcp-tools/browser-tools.js.map +1 -1
- package/dist/src/mcp-tools/claims-tools.js +565 -473
- package/dist/src/mcp-tools/claims-tools.js.map +1 -1
- package/dist/src/mcp-tools/config-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/config-tools.js +284 -190
- package/dist/src/mcp-tools/config-tools.js.map +1 -1
- package/dist/src/mcp-tools/coordination-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/coordination-tools.js +600 -349
- package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
- package/dist/src/mcp-tools/daa-tools.js +367 -289
- package/dist/src/mcp-tools/daa-tools.js.map +1 -1
- package/dist/src/mcp-tools/embeddings-tools.js +693 -582
- package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
- package/dist/src/mcp-tools/github-tools.js +312 -261
- package/dist/src/mcp-tools/github-tools.js.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.js +718 -423
- package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +2726 -1978
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/index.d.ts +2 -0
- package/dist/src/mcp-tools/index.d.ts.map +1 -1
- package/dist/src/mcp-tools/index.js +2 -0
- package/dist/src/mcp-tools/index.js.map +1 -1
- package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/memory-tools.js +514 -329
- package/dist/src/mcp-tools/memory-tools.js.map +1 -1
- package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/neural-tools.js +428 -326
- package/dist/src/mcp-tools/neural-tools.js.map +1 -1
- package/dist/src/mcp-tools/performance-tools.js +480 -420
- package/dist/src/mcp-tools/performance-tools.js.map +1 -1
- package/dist/src/mcp-tools/progress-tools.js +278 -204
- package/dist/src/mcp-tools/progress-tools.js.map +1 -1
- package/dist/src/mcp-tools/ruvllm-tools.d.ts +9 -0
- package/dist/src/mcp-tools/ruvllm-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/ruvllm-tools.js +399 -0
- package/dist/src/mcp-tools/ruvllm-tools.js.map +1 -0
- package/dist/src/mcp-tools/security-tools.js +429 -297
- package/dist/src/mcp-tools/security-tools.js.map +1 -1
- package/dist/src/mcp-tools/session-tools.js +234 -185
- package/dist/src/mcp-tools/session-tools.js.map +1 -1
- package/dist/src/mcp-tools/swarm-tools.d.ts +2 -1
- package/dist/src/mcp-tools/swarm-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/swarm-tools.js +303 -64
- package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
- package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/system-tools.js +352 -200
- package/dist/src/mcp-tools/system-tools.js.map +1 -1
- package/dist/src/mcp-tools/task-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/task-tools.js +357 -189
- package/dist/src/mcp-tools/task-tools.js.map +1 -1
- package/dist/src/mcp-tools/terminal-tools.js +196 -148
- package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
- package/dist/src/mcp-tools/transfer-tools.js +333 -186
- package/dist/src/mcp-tools/transfer-tools.js.map +1 -1
- package/dist/src/mcp-tools/wasm-agent-tools.d.ts +9 -0
- package/dist/src/mcp-tools/wasm-agent-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/wasm-agent-tools.js +377 -0
- package/dist/src/mcp-tools/wasm-agent-tools.js.map +1 -0
- package/dist/src/mcp-tools/workflow-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/workflow-tools.js +471 -335
- package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
- package/dist/src/memory/ewc-consolidation.js +345 -173
- package/dist/src/memory/ewc-consolidation.js.map +1 -1
- package/dist/src/memory/intelligence.js +841 -359
- package/dist/src/memory/intelligence.js.map +1 -1
- package/dist/src/memory/memory-bridge.js +1964 -0
- package/dist/src/memory/memory-bridge.js.map +1 -0
- package/dist/src/memory/memory-initializer.js +1895 -1602
- package/dist/src/memory/memory-initializer.js.map +1 -1
- package/dist/src/memory/sona-optimizer.js +329 -199
- package/dist/src/memory/sona-optimizer.js.map +1 -1
- package/dist/src/output.d.ts +2 -2
- package/dist/src/output.d.ts.map +1 -1
- package/dist/src/output.js +273 -242
- package/dist/src/output.js.map +1 -1
- package/dist/src/parser.js +217 -124
- package/dist/src/parser.js.map +1 -1
- package/dist/src/plugins/manager.js +531 -278
- package/dist/src/plugins/manager.js.map +1 -1
- package/dist/src/plugins/store/discovery.js +362 -275
- package/dist/src/plugins/store/discovery.js.map +1 -1
- package/dist/src/plugins/store/index.js +105 -48
- package/dist/src/plugins/store/index.js.map +1 -1
- package/dist/src/plugins/store/search.js +107 -69
- package/dist/src/plugins/store/search.js.map +1 -1
- package/dist/src/plugins/tests/demo-plugin-store.js +160 -113
- package/dist/src/plugins/tests/demo-plugin-store.js.map +1 -1
- package/dist/src/plugins/tests/standalone-test.js +223 -172
- package/dist/src/plugins/tests/standalone-test.js.map +1 -1
- package/dist/src/plugins/tests/test-plugin-store.js +228 -190
- package/dist/src/plugins/tests/test-plugin-store.js.map +1 -1
- package/dist/src/production/circuit-breaker.js +126 -62
- package/dist/src/production/circuit-breaker.js.map +1 -1
- package/dist/src/production/error-handler.js +156 -86
- package/dist/src/production/error-handler.js.map +1 -1
- package/dist/src/production/monitoring.js +220 -139
- package/dist/src/production/monitoring.js.map +1 -1
- package/dist/src/production/rate-limiter.js +93 -74
- package/dist/src/production/rate-limiter.js.map +1 -1
- package/dist/src/production/retry.js +167 -75
- package/dist/src/production/retry.js.map +1 -1
- package/dist/src/prompt.js +560 -436
- package/dist/src/prompt.js.map +1 -1
- package/dist/src/runtime/headless.js +289 -200
- package/dist/src/runtime/headless.js.map +1 -1
- package/dist/src/ruvector/agent-wasm.js +511 -0
- package/dist/src/ruvector/agent-wasm.js.map +1 -0
- package/dist/src/ruvector/ast-analyzer.js +232 -145
- package/dist/src/ruvector/ast-analyzer.js.map +1 -1
- package/dist/src/ruvector/coverage-router.js +419 -287
- package/dist/src/ruvector/coverage-router.js.map +1 -1
- package/dist/src/ruvector/coverage-tools.js +101 -56
- package/dist/src/ruvector/coverage-tools.js.map +1 -1
- package/dist/src/ruvector/diff-classifier.js +451 -324
- package/dist/src/ruvector/diff-classifier.js.map +1 -1
- package/dist/src/ruvector/enhanced-model-router.js +337 -251
- package/dist/src/ruvector/enhanced-model-router.js.map +1 -1
- package/dist/src/ruvector/flash-attention.js +254 -223
- package/dist/src/ruvector/flash-attention.js.map +1 -1
- package/dist/src/ruvector/graph-analyzer.js +680 -486
- package/dist/src/ruvector/graph-analyzer.js.map +1 -1
- package/dist/src/ruvector/index.js +113 -27
- package/dist/src/ruvector/index.js.map +1 -1
- package/dist/src/ruvector/lora-adapter.js +248 -155
- package/dist/src/ruvector/lora-adapter.js.map +1 -1
- package/dist/src/ruvector/model-router.js +248 -175
- package/dist/src/ruvector/model-router.js.map +1 -1
- package/dist/src/ruvector/moe-router.js +286 -228
- package/dist/src/ruvector/moe-router.js.map +1 -1
- package/dist/src/ruvector/q-learning-router.js +338 -257
- package/dist/src/ruvector/q-learning-router.js.map +1 -1
- package/dist/src/ruvector/ruvllm-wasm.js +527 -0
- package/dist/src/ruvector/ruvllm-wasm.js.map +1 -0
- package/dist/src/ruvector/semantic-router.js +67 -60
- package/dist/src/ruvector/semantic-router.js.map +1 -1
- package/dist/src/ruvector/vector-db.js +205 -119
- package/dist/src/ruvector/vector-db.js.map +1 -1
- package/dist/src/services/agentic-flow-bridge.js +168 -0
- package/dist/src/services/agentic-flow-bridge.js.map +1 -0
- package/dist/src/services/claim-service.js +940 -615
- package/dist/src/services/claim-service.js.map +1 -1
- package/dist/src/services/container-worker-pool.js +669 -399
- package/dist/src/services/container-worker-pool.js.map +1 -1
- package/dist/src/services/headless-worker-executor.js +467 -441
- package/dist/src/services/headless-worker-executor.js.map +1 -1
- package/dist/src/services/index.d.ts +5 -5
- package/dist/src/services/index.d.ts.map +1 -1
- package/dist/src/services/index.js +4 -4
- package/dist/src/services/index.js.map +1 -1
- package/dist/src/services/registry-api.js +201 -93
- package/dist/src/services/registry-api.js.map +1 -1
- package/dist/src/services/ruvector-training.js +414 -144
- package/dist/src/services/ruvector-training.js.map +1 -1
- package/dist/src/services/worker-daemon.js +928 -531
- package/dist/src/services/worker-daemon.js.map +1 -1
- package/dist/src/services/worker-queue.js +550 -331
- package/dist/src/services/worker-queue.js.map +1 -1
- package/dist/src/suggest.js +55 -45
- package/dist/src/suggest.js.map +1 -1
- package/dist/src/transfer/anonymization/index.js +37 -29
- package/dist/src/transfer/anonymization/index.js.map +1 -1
- package/dist/src/transfer/deploy-seraphine.d.ts +1 -1
- package/dist/src/transfer/deploy-seraphine.js +156 -129
- package/dist/src/transfer/deploy-seraphine.js.map +1 -1
- package/dist/src/transfer/export.js +142 -84
- package/dist/src/transfer/export.js.map +1 -1
- package/dist/src/transfer/index.d.ts +1 -1
- package/dist/src/transfer/index.d.ts.map +1 -1
- package/dist/src/transfer/index.js +2 -0
- package/dist/src/transfer/index.js.map +1 -1
- package/dist/src/transfer/ipfs/client.js +337 -179
- package/dist/src/transfer/ipfs/client.js.map +1 -1
- package/dist/src/transfer/ipfs/upload.js +434 -290
- package/dist/src/transfer/ipfs/upload.js.map +1 -1
- package/dist/src/transfer/models/seraphine.js +58 -58
- package/dist/src/transfer/models/seraphine.js.map +1 -1
- package/dist/src/transfer/serialization/cfp.js +37 -33
- package/dist/src/transfer/serialization/cfp.js.map +1 -1
- package/dist/src/transfer/storage/gcs.js +248 -139
- package/dist/src/transfer/storage/gcs.js.map +1 -1
- package/dist/src/transfer/store/discovery.js +353 -243
- package/dist/src/transfer/store/discovery.js.map +1 -1
- package/dist/src/transfer/store/download.js +365 -243
- package/dist/src/transfer/store/download.js.map +1 -1
- package/dist/src/transfer/store/index.js +130 -63
- package/dist/src/transfer/store/index.js.map +1 -1
- package/dist/src/transfer/store/publish.js +258 -184
- package/dist/src/transfer/store/publish.js.map +1 -1
- package/dist/src/transfer/store/registry.js +73 -51
- package/dist/src/transfer/store/registry.js.map +1 -1
- package/dist/src/transfer/store/search.js +96 -64
- package/dist/src/transfer/store/search.js.map +1 -1
- package/dist/src/transfer/store/tests/standalone-test.js +231 -174
- package/dist/src/transfer/store/tests/standalone-test.js.map +1 -1
- package/dist/src/transfer/test-seraphine.js +130 -95
- package/dist/src/transfer/test-seraphine.js.map +1 -1
- package/dist/src/transfer/tests/test-store.js +239 -194
- package/dist/src/transfer/tests/test-store.js.map +1 -1
- package/dist/src/types.js +56 -27
- package/dist/src/types.js.map +1 -1
- package/dist/src/update/checker.js +183 -106
- package/dist/src/update/checker.js.map +1 -1
- package/dist/src/update/executor.js +198 -135
- package/dist/src/update/executor.js.map +1 -1
- package/dist/src/update/index.js +85 -38
- package/dist/src/update/index.js.map +1 -1
- package/dist/src/update/rate-limiter.js +31 -19
- package/dist/src/update/rate-limiter.js.map +1 -1
- package/dist/src/update/validator.js +64 -38
- package/dist/src/update/validator.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -10
- package/.claude/agents/custom/accessibility-auditor.yaml +0 -56
- package/.claude/agents/custom/design-architect.yaml +0 -48
- package/.claude/agents/custom/ui-developer.yaml +0 -46
- package/.claude/agents/custom/ux-researcher.yaml +0 -60
- package/dist/src/benchmarks/pretrain/index.d.ts +0 -58
- package/dist/src/benchmarks/pretrain/index.d.ts.map +0 -1
- package/dist/src/commands/index.d.ts +0 -108
- package/dist/src/commands/index.d.ts.map +0 -1
- package/dist/src/config-adapter.d.ts +0 -15
- package/dist/src/config-adapter.d.ts.map +0 -1
- package/dist/src/index.d.ts +0 -76
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/infrastructure/in-memory-repositories.d.ts +0 -68
- package/dist/src/infrastructure/in-memory-repositories.d.ts.map +0 -1
- package/dist/src/init/claudemd-generator.d.ts +0 -25
- package/dist/src/init/claudemd-generator.d.ts.map +0 -1
- package/dist/src/init/executor.d.ts +0 -41
- package/dist/src/init/executor.d.ts.map +0 -1
- package/dist/src/init/helpers-generator.d.ts +0 -60
- package/dist/src/init/helpers-generator.d.ts.map +0 -1
- package/dist/src/mcp-client.d.ts +0 -92
- package/dist/src/mcp-client.d.ts.map +0 -1
- package/dist/src/mcp-server.d.ts +0 -161
- package/dist/src/mcp-server.d.ts.map +0 -1
- package/dist/src/mcp-tools/auto-install.d.ts +0 -83
- package/dist/src/mcp-tools/auto-install.d.ts.map +0 -1
- package/dist/src/mcp-tools/types.d.ts +0 -31
- package/dist/src/mcp-tools/types.d.ts.map +0 -1
- package/dist/src/memory/ewc-consolidation.d.ts +0 -271
- package/dist/src/memory/ewc-consolidation.d.ts.map +0 -1
- package/dist/src/memory/intelligence.d.ts +0 -285
- package/dist/src/memory/intelligence.d.ts.map +0 -1
- package/dist/src/memory/memory-initializer.d.ts +0 -396
- package/dist/src/memory/memory-initializer.d.ts.map +0 -1
- package/dist/src/memory/sona-optimizer.d.ts +0 -227
- package/dist/src/memory/sona-optimizer.d.ts.map +0 -1
- package/dist/src/parser.d.ts +0 -41
- package/dist/src/parser.d.ts.map +0 -1
- package/dist/src/plugins/manager.d.ts +0 -133
- package/dist/src/plugins/manager.d.ts.map +0 -1
- package/dist/src/plugins/store/discovery.d.ts +0 -88
- package/dist/src/plugins/store/discovery.d.ts.map +0 -1
- package/dist/src/plugins/store/index.d.ts +0 -76
- package/dist/src/plugins/store/index.d.ts.map +0 -1
- package/dist/src/plugins/store/search.d.ts +0 -46
- package/dist/src/plugins/store/search.d.ts.map +0 -1
- package/dist/src/plugins/store/types.d.ts +0 -274
- package/dist/src/plugins/store/types.d.ts.map +0 -1
- package/dist/src/production/circuit-breaker.d.ts +0 -101
- package/dist/src/production/circuit-breaker.d.ts.map +0 -1
- package/dist/src/production/error-handler.d.ts +0 -92
- package/dist/src/production/error-handler.d.ts.map +0 -1
- package/dist/src/production/monitoring.d.ts +0 -161
- package/dist/src/production/monitoring.d.ts.map +0 -1
- package/dist/src/production/rate-limiter.d.ts +0 -80
- package/dist/src/production/rate-limiter.d.ts.map +0 -1
- package/dist/src/production/retry.d.ts +0 -48
- package/dist/src/production/retry.d.ts.map +0 -1
- package/dist/src/prompt.d.ts +0 -44
- package/dist/src/prompt.d.ts.map +0 -1
- package/dist/src/runtime/headless.d.ts +0 -60
- package/dist/src/runtime/headless.d.ts.map +0 -1
- package/dist/src/ruvector/ast-analyzer.d.ts +0 -67
- package/dist/src/ruvector/ast-analyzer.d.ts.map +0 -1
- package/dist/src/ruvector/coverage-router.d.ts +0 -160
- package/dist/src/ruvector/coverage-router.d.ts.map +0 -1
- package/dist/src/ruvector/diff-classifier.d.ts +0 -175
- package/dist/src/ruvector/diff-classifier.d.ts.map +0 -1
- package/dist/src/ruvector/enhanced-model-router.d.ts +0 -146
- package/dist/src/ruvector/enhanced-model-router.d.ts.map +0 -1
- package/dist/src/ruvector/flash-attention.d.ts +0 -195
- package/dist/src/ruvector/flash-attention.d.ts.map +0 -1
- package/dist/src/ruvector/graph-analyzer.d.ts +0 -187
- package/dist/src/ruvector/graph-analyzer.d.ts.map +0 -1
- package/dist/src/ruvector/index.d.ts +0 -34
- package/dist/src/ruvector/index.d.ts.map +0 -1
- package/dist/src/ruvector/lora-adapter.d.ts +0 -218
- package/dist/src/ruvector/lora-adapter.d.ts.map +0 -1
- package/dist/src/ruvector/model-router.d.ts +0 -220
- package/dist/src/ruvector/model-router.d.ts.map +0 -1
- package/dist/src/ruvector/moe-router.d.ts +0 -206
- package/dist/src/ruvector/moe-router.d.ts.map +0 -1
- package/dist/src/ruvector/q-learning-router.d.ts +0 -211
- package/dist/src/ruvector/q-learning-router.d.ts.map +0 -1
- package/dist/src/ruvector/semantic-router.d.ts +0 -77
- package/dist/src/ruvector/semantic-router.d.ts.map +0 -1
- package/dist/src/ruvector/vector-db.d.ts +0 -69
- package/dist/src/ruvector/vector-db.d.ts.map +0 -1
- package/dist/src/services/claim-service.d.ts +0 -204
- package/dist/src/services/claim-service.d.ts.map +0 -1
- package/dist/src/services/container-worker-pool.d.ts +0 -197
- package/dist/src/services/container-worker-pool.d.ts.map +0 -1
- package/dist/src/services/headless-worker-executor.d.ts +0 -304
- package/dist/src/services/headless-worker-executor.d.ts.map +0 -1
- package/dist/src/services/registry-api.d.ts +0 -58
- package/dist/src/services/registry-api.d.ts.map +0 -1
- package/dist/src/services/ruvector-training.d.ts +0 -213
- package/dist/src/services/ruvector-training.d.ts.map +0 -1
- package/dist/src/services/worker-daemon.d.ts +0 -203
- package/dist/src/services/worker-daemon.d.ts.map +0 -1
- package/dist/src/services/worker-queue.d.ts +0 -194
- package/dist/src/services/worker-queue.d.ts.map +0 -1
- package/dist/src/suggest.d.ts +0 -53
- package/dist/src/suggest.d.ts.map +0 -1
- package/dist/src/transfer/export.d.ts +0 -25
- package/dist/src/transfer/export.d.ts.map +0 -1
- package/dist/src/transfer/ipfs/client.d.ts +0 -109
- package/dist/src/transfer/ipfs/client.d.ts.map +0 -1
- package/dist/src/transfer/ipfs/upload.d.ts +0 -95
- package/dist/src/transfer/ipfs/upload.d.ts.map +0 -1
- package/dist/src/transfer/models/seraphine.d.ts +0 -72
- package/dist/src/transfer/models/seraphine.d.ts.map +0 -1
- package/dist/src/transfer/serialization/cfp.d.ts +0 -49
- package/dist/src/transfer/serialization/cfp.d.ts.map +0 -1
- package/dist/src/transfer/storage/gcs.d.ts +0 -82
- package/dist/src/transfer/storage/gcs.d.ts.map +0 -1
- package/dist/src/transfer/store/discovery.d.ts +0 -84
- package/dist/src/transfer/store/discovery.d.ts.map +0 -1
- package/dist/src/transfer/store/download.d.ts +0 -70
- package/dist/src/transfer/store/download.d.ts.map +0 -1
- package/dist/src/transfer/store/index.d.ts +0 -84
- package/dist/src/transfer/store/index.d.ts.map +0 -1
- package/dist/src/transfer/store/publish.d.ts +0 -76
- package/dist/src/transfer/store/publish.d.ts.map +0 -1
- package/dist/src/transfer/store/search.d.ts +0 -54
- package/dist/src/transfer/store/search.d.ts.map +0 -1
- package/dist/src/transfer/types.d.ts +0 -245
- package/dist/src/transfer/types.d.ts.map +0 -1
- package/dist/src/types.d.ts +0 -198
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/update/checker.d.ts +0 -34
- package/dist/src/update/checker.d.ts.map +0 -1
- package/dist/src/update/executor.d.ts +0 -32
- package/dist/src/update/executor.d.ts.map +0 -1
- package/dist/src/update/index.d.ts +0 -33
- package/dist/src/update/index.d.ts.map +0 -1
- package/dist/src/update/rate-limiter.d.ts +0 -20
- package/dist/src/update/rate-limiter.d.ts.map +0 -1
- package/dist/src/update/validator.d.ts +0 -17
- package/dist/src/update/validator.d.ts.map +0 -1
|
@@ -7,349 +7,31 @@ import { generateStatuslineScript, generateStatuslineHook } from './statusline-g
|
|
|
7
7
|
* Generate pre-commit hook script
|
|
8
8
|
*/
|
|
9
9
|
export function generatePreCommitHook() {
|
|
10
|
-
return
|
|
11
|
-
# KynjalFlow Pre-Commit Hook
|
|
12
|
-
# Validates code quality before commit
|
|
13
|
-
|
|
14
|
-
set -e
|
|
15
|
-
|
|
16
|
-
echo "🔍 Running KynjalFlow pre-commit checks..."
|
|
17
|
-
|
|
18
|
-
# Get staged files
|
|
19
|
-
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM)
|
|
20
|
-
|
|
21
|
-
# Run validation for each staged file
|
|
22
|
-
for FILE in $STAGED_FILES; do
|
|
23
|
-
if [[ "$FILE" =~ \\.(ts|js|tsx|jsx)$ ]]; then
|
|
24
|
-
echo " Validating: $FILE"
|
|
25
|
-
npx @kynjal/cli hooks pre-edit --file "$FILE" --validate-syntax 2>/dev/null || true
|
|
26
|
-
fi
|
|
27
|
-
done
|
|
28
|
-
|
|
29
|
-
# Run tests if available
|
|
30
|
-
if [ -f "package.json" ] && grep -q '"test"' package.json; then
|
|
31
|
-
echo "🧪 Running tests..."
|
|
32
|
-
npm test --if-present 2>/dev/null || echo " Tests skipped or failed"
|
|
33
|
-
fi
|
|
34
|
-
|
|
35
|
-
echo "✅ Pre-commit checks complete"
|
|
36
|
-
`;
|
|
10
|
+
return "#!/bin/bash\n# Ruflo Pre-Commit Hook\n# Validates code quality before commit\n\nset -e\n\necho \"\uD83D\uDD0D Running Ruflo pre-commit checks...\"\n\n# Get staged files\nSTAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM)\n\n# Run validation for each staged file\nfor FILE in $STAGED_FILES; do\n if [[ \"$FILE\" =~ \\.(ts|js|tsx|jsx)$ ]]; then\n echo \" Validating: $FILE\"\n npx @claude-flow/cli hooks pre-edit --file \"$FILE\" --validate-syntax 2>/dev/null || true\n fi\ndone\n\n# Run tests if available\nif [ -f \"package.json\" ] && grep -q '\"test\"' package.json; then\n echo \"\uD83E\uDDEA Running tests...\"\n npm test --if-present 2>/dev/null || echo \" Tests skipped or failed\"\nfi\n\necho \"\u2705 Pre-commit checks complete\"\n";
|
|
37
11
|
}
|
|
38
12
|
/**
|
|
39
13
|
* Generate post-commit hook script
|
|
40
14
|
*/
|
|
41
15
|
export function generatePostCommitHook() {
|
|
42
|
-
return
|
|
43
|
-
# KynjalFlow Post-Commit Hook
|
|
44
|
-
# Records commit metrics and trains patterns
|
|
45
|
-
|
|
46
|
-
COMMIT_HASH=$(git rev-parse HEAD)
|
|
47
|
-
COMMIT_MSG=$(git log -1 --pretty=%B)
|
|
48
|
-
|
|
49
|
-
echo "📊 Recording commit metrics..."
|
|
50
|
-
|
|
51
|
-
# Notify claude-flow of commit
|
|
52
|
-
npx @kynjal/cli hooks notify \\
|
|
53
|
-
--message "Commit: $COMMIT_MSG" \\
|
|
54
|
-
--level info \\
|
|
55
|
-
--metadata '{"hash": "'$COMMIT_HASH'"}' 2>/dev/null || true
|
|
56
|
-
|
|
57
|
-
echo "✅ Commit recorded"
|
|
58
|
-
`;
|
|
16
|
+
return "#!/bin/bash\n# Ruflo Post-Commit Hook\n# Records commit metrics and trains patterns\n\nCOMMIT_HASH=$(git rev-parse HEAD)\nCOMMIT_MSG=$(git log -1 --pretty=%B)\n\necho \"\uD83D\uDCCA Recording commit metrics...\"\n\n# Notify ruflo of commit\nnpx ruflo@latest hooks notify \\\n --message \"Commit: $COMMIT_MSG\" \\\n --level info \\\n --metadata '{\"hash\": \"'$COMMIT_HASH'\"}' 2>/dev/null || true\n\necho \"\u2705 Commit recorded\"\n";
|
|
59
17
|
}
|
|
60
18
|
/**
|
|
61
19
|
* Generate session manager script
|
|
62
20
|
*/
|
|
63
21
|
export function generateSessionManager() {
|
|
64
|
-
return
|
|
65
|
-
/**
|
|
66
|
-
* KynjalFlow Session Manager
|
|
67
|
-
* Handles session lifecycle: start, restore, end
|
|
68
|
-
*/
|
|
69
|
-
|
|
70
|
-
const fs = require('fs');
|
|
71
|
-
const path = require('path');
|
|
72
|
-
|
|
73
|
-
const SESSION_DIR = path.join(process.cwd(), '.claude-flow', 'sessions');
|
|
74
|
-
const SESSION_FILE = path.join(SESSION_DIR, 'current.json');
|
|
75
|
-
|
|
76
|
-
const commands = {
|
|
77
|
-
start: () => {
|
|
78
|
-
const sessionId = \`session-\${Date.now()}\`;
|
|
79
|
-
const session = {
|
|
80
|
-
id: sessionId,
|
|
81
|
-
startedAt: new Date().toISOString(),
|
|
82
|
-
cwd: process.cwd(),
|
|
83
|
-
context: {},
|
|
84
|
-
metrics: {
|
|
85
|
-
edits: 0,
|
|
86
|
-
commands: 0,
|
|
87
|
-
tasks: 0,
|
|
88
|
-
errors: 0,
|
|
89
|
-
},
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
fs.mkdirSync(SESSION_DIR, { recursive: true });
|
|
93
|
-
fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
|
|
94
|
-
|
|
95
|
-
console.log(\`Session started: \${sessionId}\`);
|
|
96
|
-
return session;
|
|
97
|
-
},
|
|
98
|
-
|
|
99
|
-
restore: () => {
|
|
100
|
-
if (!fs.existsSync(SESSION_FILE)) {
|
|
101
|
-
console.log('No session to restore');
|
|
102
|
-
return null;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
|
|
106
|
-
session.restoredAt = new Date().toISOString();
|
|
107
|
-
fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
|
|
108
|
-
|
|
109
|
-
console.log(\`Session restored: \${session.id}\`);
|
|
110
|
-
return session;
|
|
111
|
-
},
|
|
112
|
-
|
|
113
|
-
end: () => {
|
|
114
|
-
if (!fs.existsSync(SESSION_FILE)) {
|
|
115
|
-
console.log('No active session');
|
|
116
|
-
return null;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
|
|
120
|
-
session.endedAt = new Date().toISOString();
|
|
121
|
-
session.duration = Date.now() - new Date(session.startedAt).getTime();
|
|
122
|
-
|
|
123
|
-
// Archive session
|
|
124
|
-
const archivePath = path.join(SESSION_DIR, \`\${session.id}.json\`);
|
|
125
|
-
fs.writeFileSync(archivePath, JSON.stringify(session, null, 2));
|
|
126
|
-
fs.unlinkSync(SESSION_FILE);
|
|
127
|
-
|
|
128
|
-
console.log(\`Session ended: \${session.id}\`);
|
|
129
|
-
console.log(\`Duration: \${Math.round(session.duration / 1000 / 60)} minutes\`);
|
|
130
|
-
console.log(\`Metrics: \${JSON.stringify(session.metrics)}\`);
|
|
131
|
-
|
|
132
|
-
return session;
|
|
133
|
-
},
|
|
134
|
-
|
|
135
|
-
status: () => {
|
|
136
|
-
if (!fs.existsSync(SESSION_FILE)) {
|
|
137
|
-
console.log('No active session');
|
|
138
|
-
return null;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
|
|
142
|
-
const duration = Date.now() - new Date(session.startedAt).getTime();
|
|
143
|
-
|
|
144
|
-
console.log(\`Session: \${session.id}\`);
|
|
145
|
-
console.log(\`Started: \${session.startedAt}\`);
|
|
146
|
-
console.log(\`Duration: \${Math.round(duration / 1000 / 60)} minutes\`);
|
|
147
|
-
console.log(\`Metrics: \${JSON.stringify(session.metrics)}\`);
|
|
148
|
-
|
|
149
|
-
return session;
|
|
150
|
-
},
|
|
151
|
-
|
|
152
|
-
update: (key, value) => {
|
|
153
|
-
if (!fs.existsSync(SESSION_FILE)) {
|
|
154
|
-
console.log('No active session');
|
|
155
|
-
return null;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
|
|
159
|
-
session.context[key] = value;
|
|
160
|
-
session.updatedAt = new Date().toISOString();
|
|
161
|
-
fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
|
|
162
|
-
|
|
163
|
-
return session;
|
|
164
|
-
},
|
|
165
|
-
|
|
166
|
-
metric: (name) => {
|
|
167
|
-
if (!fs.existsSync(SESSION_FILE)) {
|
|
168
|
-
return null;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
|
|
172
|
-
if (session.metrics[name] !== undefined) {
|
|
173
|
-
session.metrics[name]++;
|
|
174
|
-
fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
return session;
|
|
178
|
-
},
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
// CLI
|
|
182
|
-
const [,, command, ...args] = process.argv;
|
|
183
|
-
|
|
184
|
-
if (command && commands[command]) {
|
|
185
|
-
commands[command](...args);
|
|
186
|
-
} else {
|
|
187
|
-
console.log('Usage: session.js <start|restore|end|status|update|metric> [args]');
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
module.exports = commands;
|
|
191
|
-
`;
|
|
22
|
+
return "#!/usr/bin/env node\n/**\n * Ruflo Session Manager\n * Handles session lifecycle: start, restore, end\n */\n\nconst fs = require('fs');\nconst path = require('path');\n\nconst SESSION_DIR = path.join(process.cwd(), '.claude-flow', 'sessions');\nconst SESSION_FILE = path.join(SESSION_DIR, 'current.json');\n\nconst commands = {\n start: () => {\n const sessionId = `session-${Date.now()}`;\n const session = {\n id: sessionId,\n startedAt: new Date().toISOString(),\n cwd: process.cwd(),\n context: {},\n metrics: {\n edits: 0,\n commands: 0,\n tasks: 0,\n errors: 0,\n },\n };\n\n fs.mkdirSync(SESSION_DIR, { recursive: true });\n fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));\n\n console.log(`Session started: ${sessionId}`);\n return session;\n },\n\n restore: () => {\n if (!fs.existsSync(SESSION_FILE)) {\n console.log('No session to restore');\n return null;\n }\n\n const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));\n session.restoredAt = new Date().toISOString();\n fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));\n\n console.log(`Session restored: ${session.id}`);\n return session;\n },\n\n end: () => {\n if (!fs.existsSync(SESSION_FILE)) {\n console.log('No active session');\n return null;\n }\n\n const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));\n session.endedAt = new Date().toISOString();\n session.duration = Date.now() - new Date(session.startedAt).getTime();\n\n // Archive session\n const archivePath = path.join(SESSION_DIR, `${session.id}.json`);\n fs.writeFileSync(archivePath, JSON.stringify(session, null, 2));\n fs.unlinkSync(SESSION_FILE);\n\n console.log(`Session ended: ${session.id}`);\n console.log(`Duration: ${Math.round(session.duration / 1000 / 60)} minutes`);\n console.log(`Metrics: ${JSON.stringify(session.metrics)}`);\n\n return session;\n },\n\n status: () => {\n if (!fs.existsSync(SESSION_FILE)) {\n console.log('No active session');\n return null;\n }\n\n const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));\n const duration = Date.now() - new Date(session.startedAt).getTime();\n\n console.log(`Session: ${session.id}`);\n console.log(`Started: ${session.startedAt}`);\n console.log(`Duration: ${Math.round(duration / 1000 / 60)} minutes`);\n console.log(`Metrics: ${JSON.stringify(session.metrics)}`);\n\n return session;\n },\n\n update: (key, value) => {\n if (!fs.existsSync(SESSION_FILE)) {\n console.log('No active session');\n return null;\n }\n\n const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));\n session.context[key] = value;\n session.updatedAt = new Date().toISOString();\n fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));\n\n return session;\n },\n\n metric: (name) => {\n if (!fs.existsSync(SESSION_FILE)) {\n return null;\n }\n\n const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));\n if (session.metrics[name] !== undefined) {\n session.metrics[name]++;\n fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));\n }\n\n return session;\n },\n};\n\n// CLI\nconst [,, command, ...args] = process.argv;\n\nif (command && commands[command]) {\n commands[command](...args);\n} else {\n console.log('Usage: session.js <start|restore|end|status|update|metric> [args]');\n}\n\nmodule.exports = commands;\n";
|
|
192
23
|
}
|
|
193
24
|
/**
|
|
194
25
|
* Generate agent router script
|
|
195
26
|
*/
|
|
196
27
|
export function generateAgentRouter() {
|
|
197
|
-
return
|
|
198
|
-
/**
|
|
199
|
-
* KynjalFlow Agent Router
|
|
200
|
-
* Routes tasks to optimal agents based on learned patterns
|
|
201
|
-
*/
|
|
202
|
-
|
|
203
|
-
const AGENT_CAPABILITIES = {
|
|
204
|
-
coder: ['code-generation', 'refactoring', 'debugging', 'implementation'],
|
|
205
|
-
tester: ['unit-testing', 'integration-testing', 'coverage', 'test-generation'],
|
|
206
|
-
reviewer: ['code-review', 'security-audit', 'quality-check', 'best-practices'],
|
|
207
|
-
researcher: ['web-search', 'documentation', 'analysis', 'summarization'],
|
|
208
|
-
architect: ['system-design', 'architecture', 'patterns', 'scalability'],
|
|
209
|
-
'backend-dev': ['api', 'database', 'server', 'authentication'],
|
|
210
|
-
'frontend-dev': ['ui', 'react', 'css', 'components'],
|
|
211
|
-
devops: ['ci-cd', 'docker', 'deployment', 'infrastructure'],
|
|
212
|
-
};
|
|
213
|
-
|
|
214
|
-
const TASK_PATTERNS = {
|
|
215
|
-
// Code patterns
|
|
216
|
-
'implement|create|build|add|write code': 'coder',
|
|
217
|
-
'test|spec|coverage|unit test|integration': 'tester',
|
|
218
|
-
'review|audit|check|validate|security': 'reviewer',
|
|
219
|
-
'research|find|search|documentation|explore': 'researcher',
|
|
220
|
-
'design|architect|structure|plan': 'architect',
|
|
221
|
-
|
|
222
|
-
// Domain patterns
|
|
223
|
-
'api|endpoint|server|backend|database': 'backend-dev',
|
|
224
|
-
'ui|frontend|component|react|css|style': 'frontend-dev',
|
|
225
|
-
'deploy|docker|ci|cd|pipeline|infrastructure': 'devops',
|
|
226
|
-
};
|
|
227
|
-
|
|
228
|
-
function routeTask(task) {
|
|
229
|
-
const taskLower = task.toLowerCase();
|
|
230
|
-
|
|
231
|
-
// Check patterns
|
|
232
|
-
for (const [pattern, agent] of Object.entries(TASK_PATTERNS)) {
|
|
233
|
-
const regex = new RegExp(pattern, 'i');
|
|
234
|
-
if (regex.test(taskLower)) {
|
|
235
|
-
return {
|
|
236
|
-
agent,
|
|
237
|
-
confidence: 0.8,
|
|
238
|
-
reason: \`Matched pattern: \${pattern}\`,
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// Default to coder for unknown tasks
|
|
244
|
-
return {
|
|
245
|
-
agent: 'coder',
|
|
246
|
-
confidence: 0.5,
|
|
247
|
-
reason: 'Default routing - no specific pattern matched',
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
// CLI
|
|
252
|
-
const task = process.argv.slice(2).join(' ');
|
|
253
|
-
|
|
254
|
-
if (task) {
|
|
255
|
-
const result = routeTask(task);
|
|
256
|
-
console.log(JSON.stringify(result, null, 2));
|
|
257
|
-
} else {
|
|
258
|
-
console.log('Usage: router.js <task description>');
|
|
259
|
-
console.log('\\nAvailable agents:', Object.keys(AGENT_CAPABILITIES).join(', '));
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
module.exports = { routeTask, AGENT_CAPABILITIES, TASK_PATTERNS };
|
|
263
|
-
`;
|
|
28
|
+
return "#!/usr/bin/env node\n/**\n * Ruflo Agent Router\n * Routes tasks to optimal agents based on learned patterns\n */\n\nconst AGENT_CAPABILITIES = {\n coder: ['code-generation', 'refactoring', 'debugging', 'implementation'],\n tester: ['unit-testing', 'integration-testing', 'coverage', 'test-generation'],\n reviewer: ['code-review', 'security-audit', 'quality-check', 'best-practices'],\n researcher: ['web-search', 'documentation', 'analysis', 'summarization'],\n architect: ['system-design', 'architecture', 'patterns', 'scalability'],\n 'backend-dev': ['api', 'database', 'server', 'authentication'],\n 'frontend-dev': ['ui', 'react', 'css', 'components'],\n devops: ['ci-cd', 'docker', 'deployment', 'infrastructure'],\n};\n\nconst TASK_PATTERNS = {\n // Code patterns\n 'implement|create|build|add|write code': 'coder',\n 'test|spec|coverage|unit test|integration': 'tester',\n 'review|audit|check|validate|security': 'reviewer',\n 'research|find|search|documentation|explore': 'researcher',\n 'design|architect|structure|plan': 'architect',\n\n // Domain patterns\n 'api|endpoint|server|backend|database': 'backend-dev',\n 'ui|frontend|component|react|css|style': 'frontend-dev',\n 'deploy|docker|ci|cd|pipeline|infrastructure': 'devops',\n};\n\nfunction routeTask(task) {\n const taskLower = task.toLowerCase();\n\n // Check patterns\n for (const [pattern, agent] of Object.entries(TASK_PATTERNS)) {\n const regex = new RegExp(pattern, 'i');\n if (regex.test(taskLower)) {\n return {\n agent,\n confidence: 0.8,\n reason: `Matched pattern: ${pattern}`,\n };\n }\n }\n\n // Default to coder for unknown tasks\n return {\n agent: 'coder',\n confidence: 0.5,\n reason: 'Default routing - no specific pattern matched',\n };\n}\n\n// CLI\nconst task = process.argv.slice(2).join(' ');\n\nif (task) {\n const result = routeTask(task);\n console.log(JSON.stringify(result, null, 2));\n} else {\n console.log('Usage: router.js <task description>');\n console.log('\\nAvailable agents:', Object.keys(AGENT_CAPABILITIES).join(', '));\n}\n\nmodule.exports = { routeTask, AGENT_CAPABILITIES, TASK_PATTERNS };\n";
|
|
264
29
|
}
|
|
265
30
|
/**
|
|
266
31
|
* Generate memory helper script
|
|
267
32
|
*/
|
|
268
33
|
export function generateMemoryHelper() {
|
|
269
|
-
return
|
|
270
|
-
/**
|
|
271
|
-
* KynjalFlow Memory Helper
|
|
272
|
-
* Simple key-value memory for cross-session context
|
|
273
|
-
*/
|
|
274
|
-
|
|
275
|
-
const fs = require('fs');
|
|
276
|
-
const path = require('path');
|
|
277
|
-
|
|
278
|
-
const MEMORY_DIR = path.join(process.cwd(), '.claude-flow', 'data');
|
|
279
|
-
const MEMORY_FILE = path.join(MEMORY_DIR, 'memory.json');
|
|
280
|
-
|
|
281
|
-
function loadMemory() {
|
|
282
|
-
try {
|
|
283
|
-
if (fs.existsSync(MEMORY_FILE)) {
|
|
284
|
-
return JSON.parse(fs.readFileSync(MEMORY_FILE, 'utf-8'));
|
|
285
|
-
}
|
|
286
|
-
} catch (e) {
|
|
287
|
-
// Ignore
|
|
288
|
-
}
|
|
289
|
-
return {};
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
function saveMemory(memory) {
|
|
293
|
-
fs.mkdirSync(MEMORY_DIR, { recursive: true });
|
|
294
|
-
fs.writeFileSync(MEMORY_FILE, JSON.stringify(memory, null, 2));
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
const commands = {
|
|
298
|
-
get: (key) => {
|
|
299
|
-
const memory = loadMemory();
|
|
300
|
-
const value = key ? memory[key] : memory;
|
|
301
|
-
console.log(JSON.stringify(value, null, 2));
|
|
302
|
-
return value;
|
|
303
|
-
},
|
|
304
|
-
|
|
305
|
-
set: (key, value) => {
|
|
306
|
-
if (!key) {
|
|
307
|
-
console.error('Key required');
|
|
308
|
-
return;
|
|
309
|
-
}
|
|
310
|
-
const memory = loadMemory();
|
|
311
|
-
memory[key] = value;
|
|
312
|
-
memory._updated = new Date().toISOString();
|
|
313
|
-
saveMemory(memory);
|
|
314
|
-
console.log(\`Set: \${key}\`);
|
|
315
|
-
},
|
|
316
|
-
|
|
317
|
-
delete: (key) => {
|
|
318
|
-
if (!key) {
|
|
319
|
-
console.error('Key required');
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
const memory = loadMemory();
|
|
323
|
-
delete memory[key];
|
|
324
|
-
saveMemory(memory);
|
|
325
|
-
console.log(\`Deleted: \${key}\`);
|
|
326
|
-
},
|
|
327
|
-
|
|
328
|
-
clear: () => {
|
|
329
|
-
saveMemory({});
|
|
330
|
-
console.log('Memory cleared');
|
|
331
|
-
},
|
|
332
|
-
|
|
333
|
-
keys: () => {
|
|
334
|
-
const memory = loadMemory();
|
|
335
|
-
const keys = Object.keys(memory).filter(k => !k.startsWith('_'));
|
|
336
|
-
console.log(keys.join('\\n'));
|
|
337
|
-
return keys;
|
|
338
|
-
},
|
|
339
|
-
};
|
|
340
|
-
|
|
341
|
-
// CLI
|
|
342
|
-
const [,, command, key, ...valueParts] = process.argv;
|
|
343
|
-
const value = valueParts.join(' ');
|
|
344
|
-
|
|
345
|
-
if (command && commands[command]) {
|
|
346
|
-
commands[command](key, value);
|
|
347
|
-
} else {
|
|
348
|
-
console.log('Usage: memory.js <get|set|delete|clear|keys> [key] [value]');
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
module.exports = commands;
|
|
352
|
-
`;
|
|
34
|
+
return "#!/usr/bin/env node\n/**\n * Ruflo Memory Helper\n * Simple key-value memory for cross-session context\n */\n\nconst fs = require('fs');\nconst path = require('path');\n\nconst MEMORY_DIR = path.join(process.cwd(), '.claude-flow', 'data');\nconst MEMORY_FILE = path.join(MEMORY_DIR, 'memory.json');\n\nfunction loadMemory() {\n try {\n if (fs.existsSync(MEMORY_FILE)) {\n return JSON.parse(fs.readFileSync(MEMORY_FILE, 'utf-8'));\n }\n } catch (e) {\n // Ignore\n }\n return {};\n}\n\nfunction saveMemory(memory) {\n fs.mkdirSync(MEMORY_DIR, { recursive: true });\n fs.writeFileSync(MEMORY_FILE, JSON.stringify(memory, null, 2));\n}\n\nconst commands = {\n get: (key) => {\n const memory = loadMemory();\n const value = key ? memory[key] : memory;\n console.log(JSON.stringify(value, null, 2));\n return value;\n },\n\n set: (key, value) => {\n if (!key) {\n console.error('Key required');\n return;\n }\n const memory = loadMemory();\n memory[key] = value;\n memory._updated = new Date().toISOString();\n saveMemory(memory);\n console.log(`Set: ${key}`);\n },\n\n delete: (key) => {\n if (!key) {\n console.error('Key required');\n return;\n }\n const memory = loadMemory();\n delete memory[key];\n saveMemory(memory);\n console.log(`Deleted: ${key}`);\n },\n\n clear: () => {\n saveMemory({});\n console.log('Memory cleared');\n },\n\n keys: () => {\n const memory = loadMemory();\n const keys = Object.keys(memory).filter(k => !k.startsWith('_'));\n console.log(keys.join('\\n'));\n return keys;\n },\n};\n\n// CLI\nconst [,, command, key, ...valueParts] = process.argv;\nconst value = valueParts.join(' ');\n\nif (command && commands[command]) {\n commands[command](key, value);\n} else {\n console.log('Usage: memory.js <get|set|delete|clear|keys> [key] [value]');\n}\n\nmodule.exports = commands;\n";
|
|
353
35
|
}
|
|
354
36
|
/**
|
|
355
37
|
* Generate hook-handler.cjs (cross-platform hook dispatcher)
|
|
@@ -358,10 +40,10 @@ module.exports = commands;
|
|
|
358
40
|
*/
|
|
359
41
|
export function generateHookHandler() {
|
|
360
42
|
// Build as array of lines to avoid template-in-template escaping nightmares
|
|
361
|
-
|
|
43
|
+
var lines = [
|
|
362
44
|
'#!/usr/bin/env node',
|
|
363
45
|
'/**',
|
|
364
|
-
' *
|
|
46
|
+
' * Ruflo Hook Handler (Cross-Platform)',
|
|
365
47
|
' * Dispatches hook events to the appropriate helper modules.',
|
|
366
48
|
' */',
|
|
367
49
|
'',
|
|
@@ -397,7 +79,35 @@ export function generateHookHandler() {
|
|
|
397
79
|
"const intelligence = safeRequire(path.join(helpersDir, 'intelligence.cjs'));",
|
|
398
80
|
'',
|
|
399
81
|
'const [,, command, ...args] = process.argv;',
|
|
400
|
-
|
|
82
|
+
'',
|
|
83
|
+
'// Read stdin with timeout — Claude Code sends hook data as JSON via stdin.',
|
|
84
|
+
'// Timeout prevents hanging when stdin is in an ambiguous state (not TTY, not pipe).',
|
|
85
|
+
'async function readStdin() {',
|
|
86
|
+
' if (process.stdin.isTTY) return "";',
|
|
87
|
+
' return new Promise((resolve) => {',
|
|
88
|
+
' let data = "";',
|
|
89
|
+
' const timer = setTimeout(() => {',
|
|
90
|
+
' process.stdin.removeAllListeners();',
|
|
91
|
+
' process.stdin.pause();',
|
|
92
|
+
' resolve(data);',
|
|
93
|
+
' }, 500);',
|
|
94
|
+
' process.stdin.setEncoding("utf8");',
|
|
95
|
+
' process.stdin.on("data", (chunk) => { data += chunk; });',
|
|
96
|
+
' process.stdin.on("end", () => { clearTimeout(timer); resolve(data); });',
|
|
97
|
+
' process.stdin.on("error", () => { clearTimeout(timer); resolve(data); });',
|
|
98
|
+
' process.stdin.resume();',
|
|
99
|
+
' });',
|
|
100
|
+
'}',
|
|
101
|
+
'',
|
|
102
|
+
'async function main() {',
|
|
103
|
+
' let stdinData = "";',
|
|
104
|
+
' try { stdinData = await readStdin(); } catch (e) { /* ignore */ }',
|
|
105
|
+
' let hookInput = {};',
|
|
106
|
+
' if (stdinData.trim()) {',
|
|
107
|
+
' try { hookInput = JSON.parse(stdinData); } catch (e) { /* ignore */ }',
|
|
108
|
+
' }',
|
|
109
|
+
' // Prefer stdin fields, then env, then argv',
|
|
110
|
+
" var prompt = hookInput.prompt || hookInput.command || hookInput.toolInput || process.env.PROMPT || process.env.TOOL_INPUT_command || args.join(' ') || '';",
|
|
401
111
|
'',
|
|
402
112
|
'const handlers = {',
|
|
403
113
|
" 'route': () => {",
|
|
@@ -550,6 +260,10 @@ export function generateHookHandler() {
|
|
|
550
260
|
'} else {',
|
|
551
261
|
" console.log('Usage: hook-handler.cjs <route|pre-bash|post-edit|session-restore|session-end|pre-task|post-task|compact-manual|compact-auto|status|stats>');",
|
|
552
262
|
'}',
|
|
263
|
+
'} // end main',
|
|
264
|
+
'',
|
|
265
|
+
'process.exitCode = 0;',
|
|
266
|
+
'main().catch(() => {}).finally(() => { process.exit(0); });',
|
|
553
267
|
];
|
|
554
268
|
return lines.join('\n') + '\n';
|
|
555
269
|
}
|
|
@@ -559,7 +273,7 @@ export function generateHookHandler() {
|
|
|
559
273
|
* Gets overwritten when source copy succeeds (full version has PageRank, Jaccard, etc.)
|
|
560
274
|
*/
|
|
561
275
|
export function generateIntelligenceStub() {
|
|
562
|
-
|
|
276
|
+
var lines = [
|
|
563
277
|
'#!/usr/bin/env node',
|
|
564
278
|
'/**',
|
|
565
279
|
' * Intelligence Layer Stub (ADR-050)',
|
|
@@ -631,7 +345,8 @@ export function generateIntelligenceStub() {
|
|
|
631
345
|
' var items = fs.readdirSync(candidates[i], { withFileTypes: true, recursive: true });',
|
|
632
346
|
' for (var j = 0; j < items.length; j++) {',
|
|
633
347
|
' if (items[j].name === "MEMORY.md") {',
|
|
634
|
-
' var
|
|
348
|
+
' var parentDir = items[j].parentPath || items[j].path || candidates[i];',
|
|
349
|
+
' var fp = path.join(parentDir, items[j].name);',
|
|
635
350
|
' files.push(fp);',
|
|
636
351
|
' }',
|
|
637
352
|
' }',
|
|
@@ -663,15 +378,24 @@ export function generateIntelligenceStub() {
|
|
|
663
378
|
'// Load entries from auto-memory-store or bootstrap from MEMORY.md',
|
|
664
379
|
'function loadEntries() {',
|
|
665
380
|
' var store = readJSON(STORE_PATH);',
|
|
666
|
-
'
|
|
667
|
-
'
|
|
381
|
+
' // Support both formats: flat array or { entries: [...] }',
|
|
382
|
+
' var entries = null;',
|
|
383
|
+
' if (store) {',
|
|
384
|
+
' if (Array.isArray(store) && store.length > 0) {',
|
|
385
|
+
' entries = store;',
|
|
386
|
+
' } else if (store.entries && store.entries.length > 0) {',
|
|
387
|
+
' entries = store.entries;',
|
|
388
|
+
' }',
|
|
389
|
+
' }',
|
|
390
|
+
' if (entries) {',
|
|
391
|
+
' return entries.map(function(e, i) {',
|
|
668
392
|
' return {',
|
|
669
393
|
' id: e.id || ("entry-" + i),',
|
|
670
394
|
' content: e.content || e.value || "",',
|
|
671
395
|
' summary: e.summary || e.key || "",',
|
|
672
396
|
' category: e.category || e.namespace || "default",',
|
|
673
397
|
' confidence: e.confidence || 0.5,',
|
|
674
|
-
' sourceFile: e.sourceFile || "",',
|
|
398
|
+
' sourceFile: e.sourceFile || (e.metadata && e.metadata.sourceFile) || "",',
|
|
675
399
|
' words: tokenize((e.content || e.value || "") + " " + (e.summary || e.key || "")),',
|
|
676
400
|
' };',
|
|
677
401
|
' });',
|
|
@@ -766,330 +490,31 @@ export function generateIntelligenceStub() {
|
|
|
766
490
|
* @claude-flow/memory is not installed. Gets overwritten when source copy succeeds.
|
|
767
491
|
*/
|
|
768
492
|
export function generateAutoMemoryHook() {
|
|
769
|
-
return
|
|
770
|
-
/**
|
|
771
|
-
* Auto Memory Bridge Hook (ADR-048/049) — Minimal Fallback
|
|
772
|
-
* Full version is copied from package source when available.
|
|
773
|
-
*
|
|
774
|
-
* Usage:
|
|
775
|
-
* node auto-memory-hook.mjs import # SessionStart
|
|
776
|
-
* node auto-memory-hook.mjs sync # SessionEnd / Stop
|
|
777
|
-
* node auto-memory-hook.mjs status # Show bridge status
|
|
778
|
-
*/
|
|
779
|
-
|
|
780
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
781
|
-
import { join, dirname } from 'path';
|
|
782
|
-
import { fileURLToPath } from 'url';
|
|
783
|
-
|
|
784
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
785
|
-
const __dirname = dirname(__filename);
|
|
786
|
-
const PROJECT_ROOT = join(__dirname, '../..');
|
|
787
|
-
const DATA_DIR = join(PROJECT_ROOT, '.claude-flow', 'data');
|
|
788
|
-
const STORE_PATH = join(DATA_DIR, 'auto-memory-store.json');
|
|
789
|
-
|
|
790
|
-
const DIM = '\\x1b[2m';
|
|
791
|
-
const RESET = '\\x1b[0m';
|
|
792
|
-
const dim = (msg) => console.log(\` \${DIM}\${msg}\${RESET}\`);
|
|
793
|
-
|
|
794
|
-
// Ensure data dir
|
|
795
|
-
if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR, { recursive: true });
|
|
796
|
-
|
|
797
|
-
async function doImport() {
|
|
798
|
-
// Try loading @claude-flow/memory for full functionality
|
|
799
|
-
let memPkg = null;
|
|
800
|
-
try { memPkg = await import('@claude-flow/memory'); } catch {}
|
|
801
|
-
|
|
802
|
-
if (!memPkg || !memPkg.AutoMemoryBridge) {
|
|
803
|
-
dim('Memory package not available — auto memory import skipped (non-critical)');
|
|
804
|
-
return;
|
|
805
|
-
}
|
|
806
|
-
|
|
807
|
-
// Full implementation deferred to copied version
|
|
808
|
-
dim('Auto memory import available — run init --upgrade for full support');
|
|
809
|
-
}
|
|
810
|
-
|
|
811
|
-
async function doSync() {
|
|
812
|
-
if (!existsSync(STORE_PATH)) {
|
|
813
|
-
dim('No entries to sync');
|
|
814
|
-
return;
|
|
815
|
-
}
|
|
816
|
-
|
|
817
|
-
let memPkg = null;
|
|
818
|
-
try { memPkg = await import('@claude-flow/memory'); } catch {}
|
|
819
|
-
|
|
820
|
-
if (!memPkg || !memPkg.AutoMemoryBridge) {
|
|
821
|
-
dim('Memory package not available — sync skipped (non-critical)');
|
|
822
|
-
return;
|
|
823
|
-
}
|
|
824
|
-
|
|
825
|
-
dim('Auto memory sync available — run init --upgrade for full support');
|
|
826
|
-
}
|
|
827
|
-
|
|
828
|
-
function doStatus() {
|
|
829
|
-
console.log('\\n=== Auto Memory Bridge Status ===\\n');
|
|
830
|
-
console.log(' Package: Fallback mode (run init --upgrade for full)');
|
|
831
|
-
console.log(\` Store: \${existsSync(STORE_PATH) ? 'Initialized' : 'Not initialized'}\`);
|
|
832
|
-
console.log('');
|
|
833
|
-
}
|
|
834
|
-
|
|
835
|
-
const command = process.argv[2] || 'status';
|
|
836
|
-
|
|
837
|
-
try {
|
|
838
|
-
switch (command) {
|
|
839
|
-
case 'import': await doImport(); break;
|
|
840
|
-
case 'sync': await doSync(); break;
|
|
841
|
-
case 'status': doStatus(); break;
|
|
842
|
-
default:
|
|
843
|
-
console.log('Usage: auto-memory-hook.mjs <import|sync|status>');
|
|
844
|
-
process.exit(1);
|
|
845
|
-
}
|
|
846
|
-
} catch (err) {
|
|
847
|
-
// Hooks must never crash Claude Code - fail silently
|
|
848
|
-
dim(\`Error (non-critical): \${err.message}\`);
|
|
849
|
-
}
|
|
850
|
-
`;
|
|
493
|
+
return "#!/usr/bin/env node\n/**\n * Auto Memory Bridge Hook (ADR-048/049) \u2014 Minimal Fallback\n * Full version is copied from package source when available.\n *\n * Usage:\n * node auto-memory-hook.mjs import # SessionStart\n * node auto-memory-hook.mjs sync # SessionEnd / Stop\n * node auto-memory-hook.mjs status # Show bridge status\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst PROJECT_ROOT = join(__dirname, '../..');\nconst DATA_DIR = join(PROJECT_ROOT, '.claude-flow', 'data');\nconst STORE_PATH = join(DATA_DIR, 'auto-memory-store.json');\n\nconst DIM = '\\x1b[2m';\nconst RESET = '\\x1b[0m';\nconst dim = (msg) => console.log(` ${DIM}${msg}${RESET}`);\n\n// Ensure data dir\nif (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR, { recursive: true });\n\nasync function loadMemoryPackage() {\n // Strategy 1: Use createRequire for CJS-style resolution (handles nested node_modules\n // when installed as a transitive dependency via npx ruflo / npx claude-flow)\n try {\n const { createRequire } = await import('module');\n const require = createRequire(join(PROJECT_ROOT, 'package.json'));\n return require('@claude-flow/memory');\n } catch { /* fall through */ }\n\n // Strategy 2: ESM import (works when @claude-flow/memory is a direct dependency)\n try { return await import('@claude-flow/memory'); } catch { /* fall through */ }\n\n // Strategy 3: Walk up from PROJECT_ROOT looking for the package in any node_modules\n let searchDir = PROJECT_ROOT;\n const { parse } = await import('path');\n while (searchDir !== parse(searchDir).root) {\n const candidate = join(searchDir, 'node_modules', '@claude-flow', 'memory', 'dist', 'index.js');\n if (existsSync(candidate)) {\n try { return await import(`file://${candidate}`); } catch { /* fall through */ }\n }\n searchDir = dirname(searchDir);\n }\n\n return null;\n}\n\nasync function doImport() {\n const memPkg = await loadMemoryPackage();\n\n if (!memPkg || !memPkg.AutoMemoryBridge) {\n dim('Memory package not available \u2014 auto memory import skipped (non-critical)');\n return;\n }\n\n // Full implementation deferred to copied version\n dim('Auto memory import available \u2014 run init --upgrade for full support');\n}\n\nasync function doSync() {\n if (!existsSync(STORE_PATH)) {\n dim('No entries to sync');\n return;\n }\n\n const memPkg = await loadMemoryPackage();\n\n if (!memPkg || !memPkg.AutoMemoryBridge) {\n dim('Memory package not available \u2014 sync skipped (non-critical)');\n return;\n }\n\n dim('Auto memory sync available \u2014 run init --upgrade for full support');\n}\n\nfunction doStatus() {\n console.log('\\n=== Auto Memory Bridge Status ===\\n');\n console.log(' Package: Fallback mode (run init --upgrade for full)');\n console.log(` Store: ${existsSync(STORE_PATH) ? 'Initialized' : 'Not initialized'}`);\n console.log('');\n}\n\n// Suppress unhandled rejection warnings from dynamic import() failures\nprocess.on('unhandledRejection', () => {});\n\nconst command = process.argv[2] || 'status';\n\ntry {\n switch (command) {\n case 'import': await doImport(); break;\n case 'sync': await doSync(); break;\n case 'status': doStatus(); break;\n default:\n console.log('Usage: auto-memory-hook.mjs <import|sync|status>');\n process.exit(1);\n }\n} catch (err) {\n // Hooks must never crash Claude Code - fail silently\n dim(`Error (non-critical): ${err.message}`);\n}\n// Ensure clean exit for Claude Code hooks (exit 0 = success)\nprocess.exit(0);\n";
|
|
851
494
|
}
|
|
852
495
|
/**
|
|
853
496
|
* Generate Windows PowerShell daemon manager
|
|
854
497
|
*/
|
|
855
498
|
export function generateWindowsDaemonManager() {
|
|
856
|
-
return
|
|
857
|
-
# PowerShell script for managing background processes
|
|
858
|
-
|
|
859
|
-
param(
|
|
860
|
-
[Parameter(Position=0)]
|
|
861
|
-
[ValidateSet('start', 'stop', 'status', 'restart')]
|
|
862
|
-
[string]$Action = 'status'
|
|
863
|
-
)
|
|
864
|
-
|
|
865
|
-
$ErrorActionPreference = 'SilentlyContinue'
|
|
866
|
-
$ClaudeFlowDir = Join-Path $PWD '.claude-flow'
|
|
867
|
-
$PidDir = Join-Path $ClaudeFlowDir 'pids'
|
|
868
|
-
|
|
869
|
-
# Ensure directories exist
|
|
870
|
-
if (-not (Test-Path $PidDir)) {
|
|
871
|
-
New-Item -ItemType Directory -Path $PidDir -Force | Out-Null
|
|
872
|
-
}
|
|
873
|
-
|
|
874
|
-
function Get-DaemonStatus {
|
|
875
|
-
param([string]$Name, [string]$PidFile)
|
|
876
|
-
|
|
877
|
-
if (Test-Path $PidFile) {
|
|
878
|
-
$pid = Get-Content $PidFile
|
|
879
|
-
$process = Get-Process -Id $pid -ErrorAction SilentlyContinue
|
|
880
|
-
if ($process) {
|
|
881
|
-
return @{ Running = $true; Pid = $pid }
|
|
882
|
-
}
|
|
883
|
-
}
|
|
884
|
-
return @{ Running = $false; Pid = $null }
|
|
885
|
-
}
|
|
886
|
-
|
|
887
|
-
function Start-SwarmMonitor {
|
|
888
|
-
$pidFile = Join-Path $PidDir 'swarm-monitor.pid'
|
|
889
|
-
$status = Get-DaemonStatus -Name 'swarm-monitor' -PidFile $pidFile
|
|
890
|
-
|
|
891
|
-
if ($status.Running) {
|
|
892
|
-
Write-Host "Swarm monitor already running (PID: $($status.Pid))" -ForegroundColor Yellow
|
|
893
|
-
return
|
|
894
|
-
}
|
|
895
|
-
|
|
896
|
-
Write-Host "Starting swarm monitor..." -ForegroundColor Cyan
|
|
897
|
-
$process = Start-Process -FilePath 'node' -ArgumentList @(
|
|
898
|
-
'-e',
|
|
899
|
-
'setInterval(() => { require("fs").writeFileSync(".claude-flow/metrics/swarm-activity.json", JSON.stringify({swarm:{active:true,agent_count:0},timestamp:Date.now()})) }, 5000)'
|
|
900
|
-
) -PassThru -WindowStyle Hidden
|
|
901
|
-
|
|
902
|
-
$process.Id | Out-File $pidFile
|
|
903
|
-
Write-Host "Swarm monitor started (PID: $($process.Id))" -ForegroundColor Green
|
|
904
|
-
}
|
|
905
|
-
|
|
906
|
-
function Stop-SwarmMonitor {
|
|
907
|
-
$pidFile = Join-Path $PidDir 'swarm-monitor.pid'
|
|
908
|
-
$status = Get-DaemonStatus -Name 'swarm-monitor' -PidFile $pidFile
|
|
909
|
-
|
|
910
|
-
if (-not $status.Running) {
|
|
911
|
-
Write-Host "Swarm monitor not running" -ForegroundColor Yellow
|
|
912
|
-
return
|
|
913
|
-
}
|
|
914
|
-
|
|
915
|
-
Stop-Process -Id $status.Pid -Force
|
|
916
|
-
Remove-Item $pidFile -Force
|
|
917
|
-
Write-Host "Swarm monitor stopped" -ForegroundColor Green
|
|
918
|
-
}
|
|
919
|
-
|
|
920
|
-
function Show-Status {
|
|
921
|
-
Write-Host ""
|
|
922
|
-
Write-Host "KynjalFlow V3 Daemon Status" -ForegroundColor Cyan
|
|
923
|
-
Write-Host "=============================" -ForegroundColor Cyan
|
|
924
|
-
|
|
925
|
-
$swarmPid = Join-Path $PidDir 'swarm-monitor.pid'
|
|
926
|
-
$swarmStatus = Get-DaemonStatus -Name 'swarm-monitor' -PidFile $swarmPid
|
|
927
|
-
|
|
928
|
-
if ($swarmStatus.Running) {
|
|
929
|
-
Write-Host " Swarm Monitor: RUNNING (PID: $($swarmStatus.Pid))" -ForegroundColor Green
|
|
930
|
-
} else {
|
|
931
|
-
Write-Host " Swarm Monitor: STOPPED" -ForegroundColor Red
|
|
932
|
-
}
|
|
933
|
-
Write-Host ""
|
|
934
|
-
}
|
|
935
|
-
|
|
936
|
-
switch ($Action) {
|
|
937
|
-
'start' {
|
|
938
|
-
Start-SwarmMonitor
|
|
939
|
-
Show-Status
|
|
940
|
-
}
|
|
941
|
-
'stop' {
|
|
942
|
-
Stop-SwarmMonitor
|
|
943
|
-
Show-Status
|
|
944
|
-
}
|
|
945
|
-
'restart' {
|
|
946
|
-
Stop-SwarmMonitor
|
|
947
|
-
Start-Sleep -Seconds 1
|
|
948
|
-
Start-SwarmMonitor
|
|
949
|
-
Show-Status
|
|
950
|
-
}
|
|
951
|
-
'status' {
|
|
952
|
-
Show-Status
|
|
953
|
-
}
|
|
954
|
-
}
|
|
955
|
-
`;
|
|
499
|
+
return "# RuFlo V3 Daemon Manager for Windows\n# PowerShell script for managing background processes\n\nparam(\n [Parameter(Position=0)]\n [ValidateSet('start', 'stop', 'status', 'restart')]\n [string]$Action = 'status'\n)\n\n$ErrorActionPreference = 'SilentlyContinue'\n$ClaudeFlowDir = Join-Path $PWD '.claude-flow'\n$PidDir = Join-Path $ClaudeFlowDir 'pids'\n\n# Ensure directories exist\nif (-not (Test-Path $PidDir)) {\n New-Item -ItemType Directory -Path $PidDir -Force | Out-Null\n}\n\nfunction Get-DaemonStatus {\n param([string]$Name, [string]$PidFile)\n\n if (Test-Path $PidFile) {\n $pid = Get-Content $PidFile\n $process = Get-Process -Id $pid -ErrorAction SilentlyContinue\n if ($process) {\n return @{ Running = $true; Pid = $pid }\n }\n }\n return @{ Running = $false; Pid = $null }\n}\n\nfunction Start-SwarmMonitor {\n $pidFile = Join-Path $PidDir 'swarm-monitor.pid'\n $status = Get-DaemonStatus -Name 'swarm-monitor' -PidFile $pidFile\n\n if ($status.Running) {\n Write-Host \"Swarm monitor already running (PID: $($status.Pid))\" -ForegroundColor Yellow\n return\n }\n\n Write-Host \"Starting swarm monitor...\" -ForegroundColor Cyan\n $process = Start-Process -FilePath 'node' -ArgumentList @(\n '-e',\n 'setInterval(() => { require(\"fs\").writeFileSync(\".claude-flow/metrics/swarm-activity.json\", JSON.stringify({swarm:{active:true,agent_count:0},timestamp:Date.now()})) }, 5000)'\n ) -PassThru -WindowStyle Hidden\n\n $process.Id | Out-File $pidFile\n Write-Host \"Swarm monitor started (PID: $($process.Id))\" -ForegroundColor Green\n}\n\nfunction Stop-SwarmMonitor {\n $pidFile = Join-Path $PidDir 'swarm-monitor.pid'\n $status = Get-DaemonStatus -Name 'swarm-monitor' -PidFile $pidFile\n\n if (-not $status.Running) {\n Write-Host \"Swarm monitor not running\" -ForegroundColor Yellow\n return\n }\n\n Stop-Process -Id $status.Pid -Force\n Remove-Item $pidFile -Force\n Write-Host \"Swarm monitor stopped\" -ForegroundColor Green\n}\n\nfunction Show-Status {\n Write-Host \"\"\n Write-Host \"RuFlo V3 Daemon Status\" -ForegroundColor Cyan\n Write-Host \"=============================\" -ForegroundColor Cyan\n\n $swarmPid = Join-Path $PidDir 'swarm-monitor.pid'\n $swarmStatus = Get-DaemonStatus -Name 'swarm-monitor' -PidFile $swarmPid\n\n if ($swarmStatus.Running) {\n Write-Host \" Swarm Monitor: RUNNING (PID: $($swarmStatus.Pid))\" -ForegroundColor Green\n } else {\n Write-Host \" Swarm Monitor: STOPPED\" -ForegroundColor Red\n }\n Write-Host \"\"\n}\n\nswitch ($Action) {\n 'start' {\n Start-SwarmMonitor\n Show-Status\n }\n 'stop' {\n Stop-SwarmMonitor\n Show-Status\n }\n 'restart' {\n Stop-SwarmMonitor\n Start-Sleep -Seconds 1\n Start-SwarmMonitor\n Show-Status\n }\n 'status' {\n Show-Status\n }\n}\n";
|
|
956
500
|
}
|
|
957
501
|
/**
|
|
958
502
|
* Generate Windows batch file wrapper
|
|
959
503
|
*/
|
|
960
504
|
export function generateWindowsBatchWrapper() {
|
|
961
|
-
return
|
|
962
|
-
REM KynjalFlow V3 - Windows Batch Wrapper
|
|
963
|
-
REM Routes to PowerShell daemon manager
|
|
964
|
-
|
|
965
|
-
PowerShell -ExecutionPolicy Bypass -File "%~dp0daemon-manager.ps1" %*
|
|
966
|
-
`;
|
|
505
|
+
return "@echo off\nREM RuFlo V3 - Windows Batch Wrapper\nREM Routes to PowerShell daemon manager\n\nPowerShell -ExecutionPolicy Bypass -File \"%~dp0daemon-manager.ps1\" %*\n";
|
|
967
506
|
}
|
|
968
507
|
/**
|
|
969
508
|
* Generate cross-platform session manager
|
|
970
509
|
*/
|
|
971
510
|
export function generateCrossPlatformSessionManager() {
|
|
972
|
-
return
|
|
973
|
-
/**
|
|
974
|
-
* KynjalFlow Cross-Platform Session Manager
|
|
975
|
-
* Works on Windows, macOS, and Linux
|
|
976
|
-
*/
|
|
977
|
-
|
|
978
|
-
const fs = require('fs');
|
|
979
|
-
const path = require('path');
|
|
980
|
-
const os = require('os');
|
|
981
|
-
|
|
982
|
-
// Platform-specific paths
|
|
983
|
-
const platform = os.platform();
|
|
984
|
-
const homeDir = os.homedir();
|
|
985
|
-
|
|
986
|
-
// Get data directory based on platform
|
|
987
|
-
function getDataDir() {
|
|
988
|
-
const localDir = path.join(process.cwd(), '.claude-flow', 'sessions');
|
|
989
|
-
if (fs.existsSync(path.dirname(localDir))) {
|
|
990
|
-
return localDir;
|
|
991
|
-
}
|
|
992
|
-
|
|
993
|
-
switch (platform) {
|
|
994
|
-
case 'win32':
|
|
995
|
-
return path.join(process.env.APPDATA || homeDir, 'kynjalflow', 'sessions');
|
|
996
|
-
case 'darwin':
|
|
997
|
-
return path.join(homeDir, 'Library', 'Application Support', 'kynjalflow', 'sessions');
|
|
998
|
-
default:
|
|
999
|
-
return path.join(homeDir, '.claude-flow', 'sessions');
|
|
1000
|
-
}
|
|
1001
|
-
}
|
|
1002
|
-
|
|
1003
|
-
const SESSION_DIR = getDataDir();
|
|
1004
|
-
const SESSION_FILE = path.join(SESSION_DIR, 'current.json');
|
|
1005
|
-
|
|
1006
|
-
// Ensure directory exists
|
|
1007
|
-
function ensureDir(dir) {
|
|
1008
|
-
if (!fs.existsSync(dir)) {
|
|
1009
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
1010
|
-
}
|
|
1011
|
-
}
|
|
1012
|
-
|
|
1013
|
-
const commands = {
|
|
1014
|
-
start: () => {
|
|
1015
|
-
ensureDir(SESSION_DIR);
|
|
1016
|
-
const sessionId = \`session-\${Date.now()}\`;
|
|
1017
|
-
const session = {
|
|
1018
|
-
id: sessionId,
|
|
1019
|
-
startedAt: new Date().toISOString(),
|
|
1020
|
-
platform: platform,
|
|
1021
|
-
cwd: process.cwd(),
|
|
1022
|
-
context: {},
|
|
1023
|
-
metrics: { edits: 0, commands: 0, tasks: 0, errors: 0 }
|
|
1024
|
-
};
|
|
1025
|
-
fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
|
|
1026
|
-
console.log(\`Session started: \${sessionId}\`);
|
|
1027
|
-
return session;
|
|
1028
|
-
},
|
|
1029
|
-
|
|
1030
|
-
restore: () => {
|
|
1031
|
-
if (!fs.existsSync(SESSION_FILE)) {
|
|
1032
|
-
console.log('No session to restore');
|
|
1033
|
-
return null;
|
|
1034
|
-
}
|
|
1035
|
-
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
|
|
1036
|
-
session.restoredAt = new Date().toISOString();
|
|
1037
|
-
fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
|
|
1038
|
-
console.log(\`Session restored: \${session.id}\`);
|
|
1039
|
-
return session;
|
|
1040
|
-
},
|
|
1041
|
-
|
|
1042
|
-
end: () => {
|
|
1043
|
-
if (!fs.existsSync(SESSION_FILE)) {
|
|
1044
|
-
console.log('No active session');
|
|
1045
|
-
return null;
|
|
1046
|
-
}
|
|
1047
|
-
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
|
|
1048
|
-
session.endedAt = new Date().toISOString();
|
|
1049
|
-
session.duration = Date.now() - new Date(session.startedAt).getTime();
|
|
1050
|
-
|
|
1051
|
-
const archivePath = path.join(SESSION_DIR, \`\${session.id}.json\`);
|
|
1052
|
-
fs.writeFileSync(archivePath, JSON.stringify(session, null, 2));
|
|
1053
|
-
fs.unlinkSync(SESSION_FILE);
|
|
1054
|
-
|
|
1055
|
-
console.log(\`Session ended: \${session.id}\`);
|
|
1056
|
-
console.log(\`Duration: \${Math.round(session.duration / 1000 / 60)} minutes\`);
|
|
1057
|
-
return session;
|
|
1058
|
-
},
|
|
1059
|
-
|
|
1060
|
-
status: () => {
|
|
1061
|
-
if (!fs.existsSync(SESSION_FILE)) {
|
|
1062
|
-
console.log('No active session');
|
|
1063
|
-
return null;
|
|
1064
|
-
}
|
|
1065
|
-
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
|
|
1066
|
-
const duration = Date.now() - new Date(session.startedAt).getTime();
|
|
1067
|
-
console.log(\`Session: \${session.id}\`);
|
|
1068
|
-
console.log(\`Platform: \${session.platform}\`);
|
|
1069
|
-
console.log(\`Started: \${session.startedAt}\`);
|
|
1070
|
-
console.log(\`Duration: \${Math.round(duration / 1000 / 60)} minutes\`);
|
|
1071
|
-
return session;
|
|
1072
|
-
}
|
|
1073
|
-
};
|
|
1074
|
-
|
|
1075
|
-
// CLI
|
|
1076
|
-
const [,, command, ...args] = process.argv;
|
|
1077
|
-
if (command && commands[command]) {
|
|
1078
|
-
commands[command](...args);
|
|
1079
|
-
} else {
|
|
1080
|
-
console.log('Usage: session.js <start|restore|end|status>');
|
|
1081
|
-
console.log(\`Platform: \${platform}\`);
|
|
1082
|
-
console.log(\`Data dir: \${SESSION_DIR}\`);
|
|
1083
|
-
}
|
|
1084
|
-
|
|
1085
|
-
module.exports = commands;
|
|
1086
|
-
`;
|
|
511
|
+
return "#!/usr/bin/env node\n/**\n * Ruflo Cross-Platform Session Manager\n * Works on Windows, macOS, and Linux\n */\n\nconst fs = require('fs');\nconst path = require('path');\nconst os = require('os');\n\n// Platform-specific paths\nconst platform = os.platform();\nconst homeDir = os.homedir();\n\n// Get data directory based on platform\nfunction getDataDir() {\n const localDir = path.join(process.cwd(), '.claude-flow', 'sessions');\n if (fs.existsSync(path.dirname(localDir))) {\n return localDir;\n }\n\n switch (platform) {\n case 'win32':\n return path.join(process.env.APPDATA || homeDir, 'claude-flow', 'sessions');\n case 'darwin':\n return path.join(homeDir, 'Library', 'Application Support', 'claude-flow', 'sessions');\n default:\n return path.join(homeDir, '.claude-flow', 'sessions');\n }\n}\n\nconst SESSION_DIR = getDataDir();\nconst SESSION_FILE = path.join(SESSION_DIR, 'current.json');\n\n// Ensure directory exists\nfunction ensureDir(dir) {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n}\n\nconst commands = {\n start: () => {\n ensureDir(SESSION_DIR);\n const sessionId = `session-${Date.now()}`;\n const session = {\n id: sessionId,\n startedAt: new Date().toISOString(),\n platform: platform,\n cwd: process.cwd(),\n context: {},\n metrics: { edits: 0, commands: 0, tasks: 0, errors: 0 }\n };\n fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));\n console.log(`Session started: ${sessionId}`);\n return session;\n },\n\n restore: () => {\n if (!fs.existsSync(SESSION_FILE)) {\n console.log('No session to restore');\n return null;\n }\n const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));\n session.restoredAt = new Date().toISOString();\n fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));\n console.log(`Session restored: ${session.id}`);\n return session;\n },\n\n end: () => {\n if (!fs.existsSync(SESSION_FILE)) {\n console.log('No active session');\n return null;\n }\n const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));\n session.endedAt = new Date().toISOString();\n session.duration = Date.now() - new Date(session.startedAt).getTime();\n\n const archivePath = path.join(SESSION_DIR, `${session.id}.json`);\n fs.writeFileSync(archivePath, JSON.stringify(session, null, 2));\n fs.unlinkSync(SESSION_FILE);\n\n console.log(`Session ended: ${session.id}`);\n console.log(`Duration: ${Math.round(session.duration / 1000 / 60)} minutes`);\n return session;\n },\n\n status: () => {\n if (!fs.existsSync(SESSION_FILE)) {\n console.log('No active session');\n return null;\n }\n const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));\n const duration = Date.now() - new Date(session.startedAt).getTime();\n console.log(`Session: ${session.id}`);\n console.log(`Platform: ${session.platform}`);\n console.log(`Started: ${session.startedAt}`);\n console.log(`Duration: ${Math.round(duration / 1000 / 60)} minutes`);\n return session;\n }\n};\n\n// CLI\nconst [,, command, ...args] = process.argv;\nif (command && commands[command]) {\n commands[command](...args);\n} else {\n console.log('Usage: session.js <start|restore|end|status>');\n console.log(`Platform: ${platform}`);\n console.log(`Data dir: ${SESSION_DIR}`);\n}\n\nmodule.exports = commands;\n";
|
|
1087
512
|
}
|
|
1088
513
|
/**
|
|
1089
514
|
* Generate all helper files
|
|
1090
515
|
*/
|
|
1091
516
|
export function generateHelpers(options) {
|
|
1092
|
-
|
|
517
|
+
var helpers = {};
|
|
1093
518
|
if (options.components.helpers) {
|
|
1094
519
|
// Unix/macOS shell scripts
|
|
1095
520
|
helpers['pre-commit'] = generatePreCommitHook();
|