@vinaes/succ 1.3.19
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 +87 -0
- package/README.md +588 -0
- package/agents/succ-checkpoint-manager.md +51 -0
- package/agents/succ-code-reviewer.md +181 -0
- package/agents/succ-context-optimizer.md +83 -0
- package/agents/succ-debug.md +224 -0
- package/agents/succ-decision-auditor.md +74 -0
- package/agents/succ-deep-search.md +41 -0
- package/agents/succ-diff-reviewer.md +123 -0
- package/agents/succ-explore.md +83 -0
- package/agents/succ-general.md +109 -0
- package/agents/succ-knowledge-indexer.md +45 -0
- package/agents/succ-knowledge-mapper.md +61 -0
- package/agents/succ-memory-curator.md +43 -0
- package/agents/succ-memory-health-monitor.md +55 -0
- package/agents/succ-pattern-detective.md +62 -0
- package/agents/succ-plan.md +172 -0
- package/agents/succ-quality-improvement-coach.md +63 -0
- package/agents/succ-readiness-improver.md +62 -0
- package/agents/succ-session-handoff-orchestrator.md +54 -0
- package/agents/succ-session-reviewer.md +46 -0
- package/agents/succ-style-tracker.md +73 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +749 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/agents-md.d.ts +16 -0
- package/dist/commands/agents-md.d.ts.map +1 -0
- package/dist/commands/agents-md.js +33 -0
- package/dist/commands/agents-md.js.map +1 -0
- package/dist/commands/analyze-agents.d.ts +20 -0
- package/dist/commands/analyze-agents.d.ts.map +1 -0
- package/dist/commands/analyze-agents.js +305 -0
- package/dist/commands/analyze-agents.js.map +1 -0
- package/dist/commands/analyze-helpers.d.ts +22 -0
- package/dist/commands/analyze-helpers.d.ts.map +1 -0
- package/dist/commands/analyze-helpers.js +38 -0
- package/dist/commands/analyze-helpers.js.map +1 -0
- package/dist/commands/analyze-profile.d.ts +53 -0
- package/dist/commands/analyze-profile.d.ts.map +1 -0
- package/dist/commands/analyze-profile.js +638 -0
- package/dist/commands/analyze-profile.js.map +1 -0
- package/dist/commands/analyze-recursive.d.ts +20 -0
- package/dist/commands/analyze-recursive.d.ts.map +1 -0
- package/dist/commands/analyze-recursive.js +326 -0
- package/dist/commands/analyze-recursive.js.map +1 -0
- package/dist/commands/analyze-utils.d.ts +83 -0
- package/dist/commands/analyze-utils.d.ts.map +1 -0
- package/dist/commands/analyze-utils.js +541 -0
- package/dist/commands/analyze-utils.js.map +1 -0
- package/dist/commands/analyze.d.ts +15 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +265 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/backfill.d.ts +22 -0
- package/dist/commands/backfill.d.ts.map +1 -0
- package/dist/commands/backfill.js +62 -0
- package/dist/commands/backfill.js.map +1 -0
- package/dist/commands/benchmark-quality.d.ts +18 -0
- package/dist/commands/benchmark-quality.d.ts.map +1 -0
- package/dist/commands/benchmark-quality.js +316 -0
- package/dist/commands/benchmark-quality.js.map +1 -0
- package/dist/commands/benchmark-sqlite-vec.d.ts +12 -0
- package/dist/commands/benchmark-sqlite-vec.d.ts.map +1 -0
- package/dist/commands/benchmark-sqlite-vec.js +281 -0
- package/dist/commands/benchmark-sqlite-vec.js.map +1 -0
- package/dist/commands/benchmark.d.ts +57 -0
- package/dist/commands/benchmark.d.ts.map +1 -0
- package/dist/commands/benchmark.js +682 -0
- package/dist/commands/benchmark.js.map +1 -0
- package/dist/commands/chat.d.ts +14 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +84 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/checkpoint.d.ts +27 -0
- package/dist/commands/checkpoint.d.ts.map +1 -0
- package/dist/commands/checkpoint.js +181 -0
- package/dist/commands/checkpoint.js.map +1 -0
- package/dist/commands/clear.d.ts +9 -0
- package/dist/commands/clear.d.ts.map +1 -0
- package/dist/commands/clear.js +31 -0
- package/dist/commands/clear.js.map +1 -0
- package/dist/commands/config.d.ts +26 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +247 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/consolidate.d.ts +21 -0
- package/dist/commands/consolidate.d.ts.map +1 -0
- package/dist/commands/consolidate.js +117 -0
- package/dist/commands/consolidate.js.map +1 -0
- package/dist/commands/daemon.d.ts +48 -0
- package/dist/commands/daemon.d.ts.map +1 -0
- package/dist/commands/daemon.js +218 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/embedding.d.ts +26 -0
- package/dist/commands/embedding.d.ts.map +1 -0
- package/dist/commands/embedding.js +168 -0
- package/dist/commands/embedding.js.map +1 -0
- package/dist/commands/graph.d.ts +20 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +128 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/index-code.d.ts +23 -0
- package/dist/commands/index-code.d.ts.map +1 -0
- package/dist/commands/index-code.js +218 -0
- package/dist/commands/index-code.js.map +1 -0
- package/dist/commands/index.d.ts +23 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +217 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init-templates.d.ts +21 -0
- package/dist/commands/init-templates.d.ts.map +1 -0
- package/dist/commands/init-templates.js +487 -0
- package/dist/commands/init-templates.js.map +1 -0
- package/dist/commands/init.d.ts +10 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +865 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/memories.d.ts +47 -0
- package/dist/commands/memories.d.ts.map +1 -0
- package/dist/commands/memories.js +597 -0
- package/dist/commands/memories.js.map +1 -0
- package/dist/commands/migrate.d.ts +19 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +154 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/prd.d.ts +46 -0
- package/dist/commands/prd.d.ts.map +1 -0
- package/dist/commands/prd.js +378 -0
- package/dist/commands/prd.js.map +1 -0
- package/dist/commands/precompute-context.d.ts +11 -0
- package/dist/commands/precompute-context.d.ts.map +1 -0
- package/dist/commands/precompute-context.js +12 -0
- package/dist/commands/precompute-context.js.map +1 -0
- package/dist/commands/progress.d.ts +16 -0
- package/dist/commands/progress.d.ts.map +1 -0
- package/dist/commands/progress.js +38 -0
- package/dist/commands/progress.js.map +1 -0
- package/dist/commands/reindex.d.ts +17 -0
- package/dist/commands/reindex.d.ts.map +1 -0
- package/dist/commands/reindex.js +83 -0
- package/dist/commands/reindex.js.map +1 -0
- package/dist/commands/retention.d.ts +19 -0
- package/dist/commands/retention.d.ts.map +1 -0
- package/dist/commands/retention.js +162 -0
- package/dist/commands/retention.js.map +1 -0
- package/dist/commands/score.d.ts +10 -0
- package/dist/commands/score.d.ts.map +1 -0
- package/dist/commands/score.js +28 -0
- package/dist/commands/score.js.map +1 -0
- package/dist/commands/search.d.ts +7 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +89 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/session-summary.d.ts +15 -0
- package/dist/commands/session-summary.d.ts.map +1 -0
- package/dist/commands/session-summary.js +16 -0
- package/dist/commands/session-summary.js.map +1 -0
- package/dist/commands/setup.d.ts +6 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +222 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/soul.d.ts +9 -0
- package/dist/commands/soul.d.ts.map +1 -0
- package/dist/commands/soul.js +256 -0
- package/dist/commands/soul.js.map +1 -0
- package/dist/commands/stats.d.ts +18 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +138 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +145 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/train-bpe.d.ts +8 -0
- package/dist/commands/train-bpe.d.ts.map +1 -0
- package/dist/commands/train-bpe.js +35 -0
- package/dist/commands/train-bpe.js.map +1 -0
- package/dist/commands/watch.d.ts +22 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +171 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/daemon/analyzer.d.ts +54 -0
- package/dist/daemon/analyzer.d.ts.map +1 -0
- package/dist/daemon/analyzer.js +362 -0
- package/dist/daemon/analyzer.js.map +1 -0
- package/dist/daemon/client.d.ts +87 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +356 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/index.d.ts +12 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +12 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/service.d.ts +51 -0
- package/dist/daemon/service.d.ts.map +1 -0
- package/dist/daemon/service.js +1203 -0
- package/dist/daemon/service.js.map +1 -0
- package/dist/daemon/session-processor.d.ts +85 -0
- package/dist/daemon/session-processor.d.ts.map +1 -0
- package/dist/daemon/session-processor.js +571 -0
- package/dist/daemon/session-processor.js.map +1 -0
- package/dist/daemon/sessions.d.ts +62 -0
- package/dist/daemon/sessions.d.ts.map +1 -0
- package/dist/daemon/sessions.js +192 -0
- package/dist/daemon/sessions.js.map +1 -0
- package/dist/daemon/watcher.d.ts +52 -0
- package/dist/daemon/watcher.d.ts.map +1 -0
- package/dist/daemon/watcher.js +363 -0
- package/dist/daemon/watcher.js.map +1 -0
- package/dist/lib/agents-md-generator.d.ts +33 -0
- package/dist/lib/agents-md-generator.d.ts.map +1 -0
- package/dist/lib/agents-md-generator.js +156 -0
- package/dist/lib/agents-md-generator.js.map +1 -0
- package/dist/lib/ai-readiness.d.ts +132 -0
- package/dist/lib/ai-readiness.d.ts.map +1 -0
- package/dist/lib/ai-readiness.js +702 -0
- package/dist/lib/ai-readiness.js.map +1 -0
- package/dist/lib/analyze-state.d.ts +34 -0
- package/dist/lib/analyze-state.d.ts.map +1 -0
- package/dist/lib/analyze-state.js +106 -0
- package/dist/lib/analyze-state.js.map +1 -0
- package/dist/lib/benchmark.d.ts +250 -0
- package/dist/lib/benchmark.d.ts.map +1 -0
- package/dist/lib/benchmark.js +778 -0
- package/dist/lib/benchmark.js.map +1 -0
- package/dist/lib/bm25.d.ts +114 -0
- package/dist/lib/bm25.d.ts.map +1 -0
- package/dist/lib/bm25.js +727 -0
- package/dist/lib/bm25.js.map +1 -0
- package/dist/lib/bpe.d.ts +70 -0
- package/dist/lib/bpe.d.ts.map +1 -0
- package/dist/lib/bpe.js +270 -0
- package/dist/lib/bpe.js.map +1 -0
- package/dist/lib/checkpoint.d.ts +124 -0
- package/dist/lib/checkpoint.d.ts.map +1 -0
- package/dist/lib/checkpoint.js +321 -0
- package/dist/lib/checkpoint.js.map +1 -0
- package/dist/lib/chunker.d.ts +47 -0
- package/dist/lib/chunker.d.ts.map +1 -0
- package/dist/lib/chunker.js +358 -0
- package/dist/lib/chunker.js.map +1 -0
- package/dist/lib/claude-ws-transport.d.ts +76 -0
- package/dist/lib/claude-ws-transport.d.ts.map +1 -0
- package/dist/lib/claude-ws-transport.js +487 -0
- package/dist/lib/claude-ws-transport.js.map +1 -0
- package/dist/lib/compact-briefing.d.ts +22 -0
- package/dist/lib/compact-briefing.d.ts.map +1 -0
- package/dist/lib/compact-briefing.js +180 -0
- package/dist/lib/compact-briefing.js.map +1 -0
- package/dist/lib/config-defaults.d.ts +41 -0
- package/dist/lib/config-defaults.d.ts.map +1 -0
- package/dist/lib/config-defaults.js +99 -0
- package/dist/lib/config-defaults.js.map +1 -0
- package/dist/lib/config-display.d.ts +16 -0
- package/dist/lib/config-display.d.ts.map +1 -0
- package/dist/lib/config-display.js +408 -0
- package/dist/lib/config-display.js.map +1 -0
- package/dist/lib/config-types.d.ts +601 -0
- package/dist/lib/config-types.d.ts.map +1 -0
- package/dist/lib/config-types.js +7 -0
- package/dist/lib/config-types.js.map +1 -0
- package/dist/lib/config-validation.d.ts +19 -0
- package/dist/lib/config-validation.d.ts.map +1 -0
- package/dist/lib/config-validation.js +136 -0
- package/dist/lib/config-validation.js.map +1 -0
- package/dist/lib/config.d.ts +143 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +689 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/consolidate.d.ts +115 -0
- package/dist/lib/consolidate.d.ts.map +1 -0
- package/dist/lib/consolidate.js +600 -0
- package/dist/lib/consolidate.js.map +1 -0
- package/dist/lib/db/bm25-indexes.d.ts +58 -0
- package/dist/lib/db/bm25-indexes.d.ts.map +1 -0
- package/dist/lib/db/bm25-indexes.js +333 -0
- package/dist/lib/db/bm25-indexes.js.map +1 -0
- package/dist/lib/db/bpe.d.ts +18 -0
- package/dist/lib/db/bpe.d.ts.map +1 -0
- package/dist/lib/db/bpe.js +44 -0
- package/dist/lib/db/bpe.js.map +1 -0
- package/dist/lib/db/connection.d.ts +47 -0
- package/dist/lib/db/connection.d.ts.map +1 -0
- package/dist/lib/db/connection.js +114 -0
- package/dist/lib/db/connection.js.map +1 -0
- package/dist/lib/db/documents.d.ts +58 -0
- package/dist/lib/db/documents.d.ts.map +1 -0
- package/dist/lib/db/documents.js +374 -0
- package/dist/lib/db/documents.js.map +1 -0
- package/dist/lib/db/file-hash.d.ts +26 -0
- package/dist/lib/db/file-hash.d.ts.map +1 -0
- package/dist/lib/db/file-hash.js +56 -0
- package/dist/lib/db/file-hash.js.map +1 -0
- package/dist/lib/db/global-memories.d.ts +62 -0
- package/dist/lib/db/global-memories.d.ts.map +1 -0
- package/dist/lib/db/global-memories.js +173 -0
- package/dist/lib/db/global-memories.js.map +1 -0
- package/dist/lib/db/graph.d.ts +163 -0
- package/dist/lib/db/graph.d.ts.map +1 -0
- package/dist/lib/db/graph.js +488 -0
- package/dist/lib/db/graph.js.map +1 -0
- package/dist/lib/db/helpers.d.ts +13 -0
- package/dist/lib/db/helpers.d.ts.map +1 -0
- package/dist/lib/db/helpers.js +21 -0
- package/dist/lib/db/helpers.js.map +1 -0
- package/dist/lib/db/hybrid-search.d.ts +64 -0
- package/dist/lib/db/hybrid-search.d.ts.map +1 -0
- package/dist/lib/db/hybrid-search.js +549 -0
- package/dist/lib/db/hybrid-search.js.map +1 -0
- package/dist/lib/db/index.d.ts +23 -0
- package/dist/lib/db/index.d.ts.map +1 -0
- package/dist/lib/db/index.js +23 -0
- package/dist/lib/db/index.js.map +1 -0
- package/dist/lib/db/memories.d.ts +174 -0
- package/dist/lib/db/memories.d.ts.map +1 -0
- package/dist/lib/db/memories.js +866 -0
- package/dist/lib/db/memories.js.map +1 -0
- package/dist/lib/db/retention.d.ts +64 -0
- package/dist/lib/db/retention.d.ts.map +1 -0
- package/dist/lib/db/retention.js +115 -0
- package/dist/lib/db/retention.js.map +1 -0
- package/dist/lib/db/schema.d.ts +29 -0
- package/dist/lib/db/schema.d.ts.map +1 -0
- package/dist/lib/db/schema.js +832 -0
- package/dist/lib/db/schema.js.map +1 -0
- package/dist/lib/db/skills.d.ts +65 -0
- package/dist/lib/db/skills.d.ts.map +1 -0
- package/dist/lib/db/skills.js +119 -0
- package/dist/lib/db/skills.js.map +1 -0
- package/dist/lib/db/token-frequency.d.ts +34 -0
- package/dist/lib/db/token-frequency.d.ts.map +1 -0
- package/dist/lib/db/token-frequency.js +92 -0
- package/dist/lib/db/token-frequency.js.map +1 -0
- package/dist/lib/db/token-stats.d.ts +43 -0
- package/dist/lib/db/token-stats.d.ts.map +1 -0
- package/dist/lib/db/token-stats.js +59 -0
- package/dist/lib/db/token-stats.js.map +1 -0
- package/dist/lib/db/types.d.ts +57 -0
- package/dist/lib/db/types.d.ts.map +1 -0
- package/dist/lib/db/types.js +5 -0
- package/dist/lib/db/types.js.map +1 -0
- package/dist/lib/db/web-search-history.d.ts +22 -0
- package/dist/lib/db/web-search-history.d.ts.map +1 -0
- package/dist/lib/db/web-search-history.js +107 -0
- package/dist/lib/db/web-search-history.js.map +1 -0
- package/dist/lib/debug/state.d.ts +17 -0
- package/dist/lib/debug/state.d.ts.map +1 -0
- package/dist/lib/debug/state.js +131 -0
- package/dist/lib/debug/state.js.map +1 -0
- package/dist/lib/debug/types.d.ts +74 -0
- package/dist/lib/debug/types.d.ts.map +1 -0
- package/dist/lib/debug/types.js +85 -0
- package/dist/lib/debug/types.js.map +1 -0
- package/dist/lib/embedding-pool.d.ts +37 -0
- package/dist/lib/embedding-pool.d.ts.map +1 -0
- package/dist/lib/embedding-pool.js +159 -0
- package/dist/lib/embedding-pool.js.map +1 -0
- package/dist/lib/embedding-worker.d.ts +7 -0
- package/dist/lib/embedding-worker.d.ts.map +1 -0
- package/dist/lib/embedding-worker.js +49 -0
- package/dist/lib/embedding-worker.js.map +1 -0
- package/dist/lib/embeddings.d.ts +54 -0
- package/dist/lib/embeddings.d.ts.map +1 -0
- package/dist/lib/embeddings.js +437 -0
- package/dist/lib/embeddings.js.map +1 -0
- package/dist/lib/errors.d.ts +40 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +66 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/fault-logger.d.ts +35 -0
- package/dist/lib/fault-logger.d.ts.map +1 -0
- package/dist/lib/fault-logger.js +182 -0
- package/dist/lib/fault-logger.js.map +1 -0
- package/dist/lib/graph/centrality.d.ts +34 -0
- package/dist/lib/graph/centrality.d.ts.map +1 -0
- package/dist/lib/graph/centrality.js +76 -0
- package/dist/lib/graph/centrality.js.map +1 -0
- package/dist/lib/graph/cleanup.d.ts +36 -0
- package/dist/lib/graph/cleanup.d.ts.map +1 -0
- package/dist/lib/graph/cleanup.js +96 -0
- package/dist/lib/graph/cleanup.js.map +1 -0
- package/dist/lib/graph/community-detection.d.ts +61 -0
- package/dist/lib/graph/community-detection.d.ts.map +1 -0
- package/dist/lib/graph/community-detection.js +218 -0
- package/dist/lib/graph/community-detection.js.map +1 -0
- package/dist/lib/graph/contextual-proximity.d.ts +41 -0
- package/dist/lib/graph/contextual-proximity.d.ts.map +1 -0
- package/dist/lib/graph/contextual-proximity.js +125 -0
- package/dist/lib/graph/contextual-proximity.js.map +1 -0
- package/dist/lib/graph/llm-relations.d.ts +54 -0
- package/dist/lib/graph/llm-relations.d.ts.map +1 -0
- package/dist/lib/graph/llm-relations.js +265 -0
- package/dist/lib/graph/llm-relations.js.map +1 -0
- package/dist/lib/graph-export.d.ts +13 -0
- package/dist/lib/graph-export.d.ts.map +1 -0
- package/dist/lib/graph-export.js +637 -0
- package/dist/lib/graph-export.js.map +1 -0
- package/dist/lib/graph-scheduler.d.ts +7 -0
- package/dist/lib/graph-scheduler.d.ts.map +1 -0
- package/dist/lib/graph-scheduler.js +21 -0
- package/dist/lib/graph-scheduler.js.map +1 -0
- package/dist/lib/indexer.d.ts +36 -0
- package/dist/lib/indexer.d.ts.map +1 -0
- package/dist/lib/indexer.js +226 -0
- package/dist/lib/indexer.js.map +1 -0
- package/dist/lib/learning-delta.d.ts +35 -0
- package/dist/lib/learning-delta.d.ts.map +1 -0
- package/dist/lib/learning-delta.js +53 -0
- package/dist/lib/learning-delta.js.map +1 -0
- package/dist/lib/llm.d.ts +118 -0
- package/dist/lib/llm.d.ts.map +1 -0
- package/dist/lib/llm.js +439 -0
- package/dist/lib/llm.js.map +1 -0
- package/dist/lib/lock.d.ts +27 -0
- package/dist/lib/lock.d.ts.map +1 -0
- package/dist/lib/lock.js +143 -0
- package/dist/lib/lock.js.map +1 -0
- package/dist/lib/md-fetch.d.ts +61 -0
- package/dist/lib/md-fetch.d.ts.map +1 -0
- package/dist/lib/md-fetch.js +141 -0
- package/dist/lib/md-fetch.js.map +1 -0
- package/dist/lib/mmr.d.ts +29 -0
- package/dist/lib/mmr.d.ts.map +1 -0
- package/dist/lib/mmr.js +89 -0
- package/dist/lib/mmr.js.map +1 -0
- package/dist/lib/onboarding/ai-chat.d.ts +11 -0
- package/dist/lib/onboarding/ai-chat.d.ts.map +1 -0
- package/dist/lib/onboarding/ai-chat.js +85 -0
- package/dist/lib/onboarding/ai-chat.js.map +1 -0
- package/dist/lib/onboarding/index.d.ts +7 -0
- package/dist/lib/onboarding/index.d.ts.map +1 -0
- package/dist/lib/onboarding/index.js +7 -0
- package/dist/lib/onboarding/index.js.map +1 -0
- package/dist/lib/onboarding/wizard.d.ts +11 -0
- package/dist/lib/onboarding/wizard.d.ts.map +1 -0
- package/dist/lib/onboarding/wizard.js +104 -0
- package/dist/lib/onboarding/wizard.js.map +1 -0
- package/dist/lib/ort-provider.d.ts +27 -0
- package/dist/lib/ort-provider.d.ts.map +1 -0
- package/dist/lib/ort-provider.js +83 -0
- package/dist/lib/ort-provider.js.map +1 -0
- package/dist/lib/ort-session.d.ts +32 -0
- package/dist/lib/ort-session.d.ts.map +1 -0
- package/dist/lib/ort-session.js +227 -0
- package/dist/lib/ort-session.js.map +1 -0
- package/dist/lib/patterns.d.ts +43 -0
- package/dist/lib/patterns.d.ts.map +1 -0
- package/dist/lib/patterns.js +395 -0
- package/dist/lib/patterns.js.map +1 -0
- package/dist/lib/prd/codebase-context.d.ts +27 -0
- package/dist/lib/prd/codebase-context.d.ts.map +1 -0
- package/dist/lib/prd/codebase-context.js +420 -0
- package/dist/lib/prd/codebase-context.js.map +1 -0
- package/dist/lib/prd/context.d.ts +24 -0
- package/dist/lib/prd/context.d.ts.map +1 -0
- package/dist/lib/prd/context.js +68 -0
- package/dist/lib/prd/context.js.map +1 -0
- package/dist/lib/prd/executor.d.ts +52 -0
- package/dist/lib/prd/executor.d.ts.map +1 -0
- package/dist/lib/prd/executor.js +154 -0
- package/dist/lib/prd/executor.js.map +1 -0
- package/dist/lib/prd/export.d.ts +40 -0
- package/dist/lib/prd/export.d.ts.map +1 -0
- package/dist/lib/prd/export.js +511 -0
- package/dist/lib/prd/export.js.map +1 -0
- package/dist/lib/prd/gates.d.ts +30 -0
- package/dist/lib/prd/gates.d.ts.map +1 -0
- package/dist/lib/prd/gates.js +100 -0
- package/dist/lib/prd/gates.js.map +1 -0
- package/dist/lib/prd/generate.d.ts +56 -0
- package/dist/lib/prd/generate.d.ts.map +1 -0
- package/dist/lib/prd/generate.js +357 -0
- package/dist/lib/prd/generate.js.map +1 -0
- package/dist/lib/prd/parse.d.ts +21 -0
- package/dist/lib/prd/parse.d.ts.map +1 -0
- package/dist/lib/prd/parse.js +270 -0
- package/dist/lib/prd/parse.js.map +1 -0
- package/dist/lib/prd/prompt-builder.d.ts +18 -0
- package/dist/lib/prd/prompt-builder.d.ts.map +1 -0
- package/dist/lib/prd/prompt-builder.js +61 -0
- package/dist/lib/prd/prompt-builder.js.map +1 -0
- package/dist/lib/prd/runner.d.ts +54 -0
- package/dist/lib/prd/runner.d.ts.map +1 -0
- package/dist/lib/prd/runner.js +563 -0
- package/dist/lib/prd/runner.js.map +1 -0
- package/dist/lib/prd/scheduler.d.ts +27 -0
- package/dist/lib/prd/scheduler.d.ts.map +1 -0
- package/dist/lib/prd/scheduler.js +113 -0
- package/dist/lib/prd/scheduler.js.map +1 -0
- package/dist/lib/prd/state.d.ts +77 -0
- package/dist/lib/prd/state.d.ts.map +1 -0
- package/dist/lib/prd/state.js +253 -0
- package/dist/lib/prd/state.js.map +1 -0
- package/dist/lib/prd/team-runner.d.ts +48 -0
- package/dist/lib/prd/team-runner.d.ts.map +1 -0
- package/dist/lib/prd/team-runner.js +261 -0
- package/dist/lib/prd/team-runner.js.map +1 -0
- package/dist/lib/prd/types.d.ts +169 -0
- package/dist/lib/prd/types.d.ts.map +1 -0
- package/dist/lib/prd/types.js +143 -0
- package/dist/lib/prd/types.js.map +1 -0
- package/dist/lib/prd/worktree.d.ts +54 -0
- package/dist/lib/prd/worktree.d.ts.map +1 -0
- package/dist/lib/prd/worktree.js +255 -0
- package/dist/lib/prd/worktree.js.map +1 -0
- package/dist/lib/precompute-context.d.ts +48 -0
- package/dist/lib/precompute-context.d.ts.map +1 -0
- package/dist/lib/precompute-context.js +265 -0
- package/dist/lib/precompute-context.js.map +1 -0
- package/dist/lib/pricing.d.ts +60 -0
- package/dist/lib/pricing.d.ts.map +1 -0
- package/dist/lib/pricing.js +258 -0
- package/dist/lib/pricing.js.map +1 -0
- package/dist/lib/process-registry.d.ts +30 -0
- package/dist/lib/process-registry.d.ts.map +1 -0
- package/dist/lib/process-registry.js +92 -0
- package/dist/lib/process-registry.js.map +1 -0
- package/dist/lib/progress-log.d.ts +44 -0
- package/dist/lib/progress-log.d.ts.map +1 -0
- package/dist/lib/progress-log.js +58 -0
- package/dist/lib/progress-log.js.map +1 -0
- package/dist/lib/public-api.d.ts +56 -0
- package/dist/lib/public-api.d.ts.map +1 -0
- package/dist/lib/public-api.js +63 -0
- package/dist/lib/public-api.js.map +1 -0
- package/dist/lib/quality.d.ts +66 -0
- package/dist/lib/quality.d.ts.map +1 -0
- package/dist/lib/quality.js +486 -0
- package/dist/lib/quality.js.map +1 -0
- package/dist/lib/query-expansion.d.ts +16 -0
- package/dist/lib/query-expansion.d.ts.map +1 -0
- package/dist/lib/query-expansion.js +53 -0
- package/dist/lib/query-expansion.js.map +1 -0
- package/dist/lib/readiness.d.ts +35 -0
- package/dist/lib/readiness.d.ts.map +1 -0
- package/dist/lib/readiness.js +142 -0
- package/dist/lib/readiness.js.map +1 -0
- package/dist/lib/reference-embeddings.d.ts +39 -0
- package/dist/lib/reference-embeddings.d.ts.map +1 -0
- package/dist/lib/reference-embeddings.js +95 -0
- package/dist/lib/reference-embeddings.js.map +1 -0
- package/dist/lib/reflection-synthesizer.d.ts +27 -0
- package/dist/lib/reflection-synthesizer.d.ts.map +1 -0
- package/dist/lib/reflection-synthesizer.js +149 -0
- package/dist/lib/reflection-synthesizer.js.map +1 -0
- package/dist/lib/retention.d.ts +105 -0
- package/dist/lib/retention.d.ts.map +1 -0
- package/dist/lib/retention.js +246 -0
- package/dist/lib/retention.js.map +1 -0
- package/dist/lib/sensitive-filter.d.ts +34 -0
- package/dist/lib/sensitive-filter.d.ts.map +1 -0
- package/dist/lib/sensitive-filter.js +344 -0
- package/dist/lib/sensitive-filter.js.map +1 -0
- package/dist/lib/session-observations.d.ts +59 -0
- package/dist/lib/session-observations.d.ts.map +1 -0
- package/dist/lib/session-observations.js +128 -0
- package/dist/lib/session-observations.js.map +1 -0
- package/dist/lib/session-summary.d.ts +65 -0
- package/dist/lib/session-summary.d.ts.map +1 -0
- package/dist/lib/session-summary.js +344 -0
- package/dist/lib/session-summary.js.map +1 -0
- package/dist/lib/similarity-worker.d.ts +7 -0
- package/dist/lib/similarity-worker.d.ts.map +1 -0
- package/dist/lib/similarity-worker.js +36 -0
- package/dist/lib/similarity-worker.js.map +1 -0
- package/dist/lib/skills.d.ts +78 -0
- package/dist/lib/skills.d.ts.map +1 -0
- package/dist/lib/skills.js +439 -0
- package/dist/lib/skills.js.map +1 -0
- package/dist/lib/skyll-client.d.ts +59 -0
- package/dist/lib/skyll-client.d.ts.map +1 -0
- package/dist/lib/skyll-client.js +257 -0
- package/dist/lib/skyll-client.js.map +1 -0
- package/dist/lib/storage/backends/interface.d.ts +383 -0
- package/dist/lib/storage/backends/interface.d.ts.map +1 -0
- package/dist/lib/storage/backends/interface.js +12 -0
- package/dist/lib/storage/backends/interface.js.map +1 -0
- package/dist/lib/storage/backends/postgresql.d.ts +454 -0
- package/dist/lib/storage/backends/postgresql.d.ts.map +1 -0
- package/dist/lib/storage/backends/postgresql.js +2528 -0
- package/dist/lib/storage/backends/postgresql.js.map +1 -0
- package/dist/lib/storage/benchmark.d.ts +16 -0
- package/dist/lib/storage/benchmark.d.ts.map +1 -0
- package/dist/lib/storage/benchmark.js +219 -0
- package/dist/lib/storage/benchmark.js.map +1 -0
- package/dist/lib/storage/dispatcher-export.d.ts +108 -0
- package/dist/lib/storage/dispatcher-export.d.ts.map +1 -0
- package/dist/lib/storage/dispatcher-export.js +593 -0
- package/dist/lib/storage/dispatcher-export.js.map +1 -0
- package/dist/lib/storage/dispatcher.d.ts +468 -0
- package/dist/lib/storage/dispatcher.d.ts.map +1 -0
- package/dist/lib/storage/dispatcher.js +1926 -0
- package/dist/lib/storage/dispatcher.js.map +1 -0
- package/dist/lib/storage/index.d.ts +481 -0
- package/dist/lib/storage/index.d.ts.map +1 -0
- package/dist/lib/storage/index.js +727 -0
- package/dist/lib/storage/index.js.map +1 -0
- package/dist/lib/storage/migration/export-import.d.ts +133 -0
- package/dist/lib/storage/migration/export-import.d.ts.map +1 -0
- package/dist/lib/storage/migration/export-import.js +264 -0
- package/dist/lib/storage/migration/export-import.js.map +1 -0
- package/dist/lib/storage/types.d.ts +313 -0
- package/dist/lib/storage/types.d.ts.map +1 -0
- package/dist/lib/storage/types.js +30 -0
- package/dist/lib/storage/types.js.map +1 -0
- package/dist/lib/storage/vector/interface.d.ts +89 -0
- package/dist/lib/storage/vector/interface.d.ts.map +1 -0
- package/dist/lib/storage/vector/interface.js +10 -0
- package/dist/lib/storage/vector/interface.js.map +1 -0
- package/dist/lib/storage/vector/qdrant.d.ts +221 -0
- package/dist/lib/storage/vector/qdrant.d.ts.map +1 -0
- package/dist/lib/storage/vector/qdrant.js +880 -0
- package/dist/lib/storage/vector/qdrant.js.map +1 -0
- package/dist/lib/supersession.d.ts +26 -0
- package/dist/lib/supersession.d.ts.map +1 -0
- package/dist/lib/supersession.js +97 -0
- package/dist/lib/supersession.js.map +1 -0
- package/dist/lib/temporal.d.ts +140 -0
- package/dist/lib/temporal.d.ts.map +1 -0
- package/dist/lib/temporal.js +303 -0
- package/dist/lib/temporal.js.map +1 -0
- package/dist/lib/token-budget.d.ts +79 -0
- package/dist/lib/token-budget.d.ts.map +1 -0
- package/dist/lib/token-budget.js +146 -0
- package/dist/lib/token-budget.js.map +1 -0
- package/dist/lib/token-counter.d.ts +27 -0
- package/dist/lib/token-counter.d.ts.map +1 -0
- package/dist/lib/token-counter.js +52 -0
- package/dist/lib/token-counter.js.map +1 -0
- package/dist/lib/tree-sitter/chunker-ts.d.ts +24 -0
- package/dist/lib/tree-sitter/chunker-ts.d.ts.map +1 -0
- package/dist/lib/tree-sitter/chunker-ts.js +206 -0
- package/dist/lib/tree-sitter/chunker-ts.js.map +1 -0
- package/dist/lib/tree-sitter/extractor.d.ts +43 -0
- package/dist/lib/tree-sitter/extractor.d.ts.map +1 -0
- package/dist/lib/tree-sitter/extractor.js +297 -0
- package/dist/lib/tree-sitter/extractor.js.map +1 -0
- package/dist/lib/tree-sitter/index.d.ts +13 -0
- package/dist/lib/tree-sitter/index.d.ts.map +1 -0
- package/dist/lib/tree-sitter/index.js +14 -0
- package/dist/lib/tree-sitter/index.js.map +1 -0
- package/dist/lib/tree-sitter/parser.d.ts +70 -0
- package/dist/lib/tree-sitter/parser.d.ts.map +1 -0
- package/dist/lib/tree-sitter/parser.js +354 -0
- package/dist/lib/tree-sitter/parser.js.map +1 -0
- package/dist/lib/tree-sitter/public.d.ts +28 -0
- package/dist/lib/tree-sitter/public.d.ts.map +1 -0
- package/dist/lib/tree-sitter/public.js +50 -0
- package/dist/lib/tree-sitter/public.js.map +1 -0
- package/dist/lib/tree-sitter/queries.d.ts +28 -0
- package/dist/lib/tree-sitter/queries.d.ts.map +1 -0
- package/dist/lib/tree-sitter/queries.js +383 -0
- package/dist/lib/tree-sitter/queries.js.map +1 -0
- package/dist/lib/tree-sitter/types.d.ts +69 -0
- package/dist/lib/tree-sitter/types.d.ts.map +1 -0
- package/dist/lib/tree-sitter/types.js +131 -0
- package/dist/lib/tree-sitter/types.js.map +1 -0
- package/dist/lib/working-memory-pipeline.d.ts +118 -0
- package/dist/lib/working-memory-pipeline.d.ts.map +1 -0
- package/dist/lib/working-memory-pipeline.js +344 -0
- package/dist/lib/working-memory-pipeline.js.map +1 -0
- package/dist/mcp/helpers.d.ts +44 -0
- package/dist/mcp/helpers.d.ts.map +1 -0
- package/dist/mcp/helpers.js +244 -0
- package/dist/mcp/helpers.js.map +1 -0
- package/dist/mcp/index.d.ts +10 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +15 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/resources.d.ts +12 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +136 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +22 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +131 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/config.d.ts +10 -0
- package/dist/mcp/tools/config.d.ts.map +1 -0
- package/dist/mcp/tools/config.js +236 -0
- package/dist/mcp/tools/config.js.map +1 -0
- package/dist/mcp/tools/dead-end.d.ts +9 -0
- package/dist/mcp/tools/dead-end.d.ts.map +1 -0
- package/dist/mcp/tools/dead-end.js +137 -0
- package/dist/mcp/tools/dead-end.js.map +1 -0
- package/dist/mcp/tools/debug.d.ts +9 -0
- package/dist/mcp/tools/debug.d.ts.map +1 -0
- package/dist/mcp/tools/debug.js +387 -0
- package/dist/mcp/tools/debug.js.map +1 -0
- package/dist/mcp/tools/graph.d.ts +9 -0
- package/dist/mcp/tools/graph.d.ts.map +1 -0
- package/dist/mcp/tools/graph.js +337 -0
- package/dist/mcp/tools/graph.js.map +1 -0
- package/dist/mcp/tools/indexing.d.ts +12 -0
- package/dist/mcp/tools/indexing.d.ts.map +1 -0
- package/dist/mcp/tools/indexing.js +289 -0
- package/dist/mcp/tools/indexing.js.map +1 -0
- package/dist/mcp/tools/memory.d.ts +14 -0
- package/dist/mcp/tools/memory.d.ts.map +1 -0
- package/dist/mcp/tools/memory.js +1170 -0
- package/dist/mcp/tools/memory.js.map +1 -0
- package/dist/mcp/tools/prd.d.ts +12 -0
- package/dist/mcp/tools/prd.d.ts.map +1 -0
- package/dist/mcp/tools/prd.js +276 -0
- package/dist/mcp/tools/prd.js.map +1 -0
- package/dist/mcp/tools/search.d.ts +9 -0
- package/dist/mcp/tools/search.d.ts.map +1 -0
- package/dist/mcp/tools/search.js +279 -0
- package/dist/mcp/tools/search.js.map +1 -0
- package/dist/mcp/tools/status.d.ts +10 -0
- package/dist/mcp/tools/status.d.ts.map +1 -0
- package/dist/mcp/tools/status.js +296 -0
- package/dist/mcp/tools/status.js.map +1 -0
- package/dist/mcp/tools/web-fetch.d.ts +10 -0
- package/dist/mcp/tools/web-fetch.d.ts.map +1 -0
- package/dist/mcp/tools/web-fetch.js +107 -0
- package/dist/mcp/tools/web-fetch.js.map +1 -0
- package/dist/mcp/tools/web-search.d.ts +14 -0
- package/dist/mcp/tools/web-search.d.ts.map +1 -0
- package/dist/mcp/tools/web-search.js +427 -0
- package/dist/mcp/tools/web-search.js.map +1 -0
- package/dist/mcp/types.d.ts +16 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +5 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/mcp-server.d.ts +9 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +9 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/prompts/analyze.d.ts +21 -0
- package/dist/prompts/analyze.d.ts.map +1 -0
- package/dist/prompts/analyze.js +27 -0
- package/dist/prompts/analyze.js.map +1 -0
- package/dist/prompts/briefing.d.ts +27 -0
- package/dist/prompts/briefing.d.ts.map +1 -0
- package/dist/prompts/briefing.js +123 -0
- package/dist/prompts/briefing.js.map +1 -0
- package/dist/prompts/chat.d.ts +8 -0
- package/dist/prompts/chat.d.ts.map +1 -0
- package/dist/prompts/chat.js +39 -0
- package/dist/prompts/chat.js.map +1 -0
- package/dist/prompts/daemon.d.ts +16 -0
- package/dist/prompts/daemon.d.ts.map +1 -0
- package/dist/prompts/daemon.js +46 -0
- package/dist/prompts/daemon.js.map +1 -0
- package/dist/prompts/extraction.d.ts +13 -0
- package/dist/prompts/extraction.d.ts.map +1 -0
- package/dist/prompts/extraction.js +93 -0
- package/dist/prompts/extraction.js.map +1 -0
- package/dist/prompts/index.d.ts +17 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +27 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/memory.d.ts +11 -0
- package/dist/prompts/memory.d.ts.map +1 -0
- package/dist/prompts/memory.js +23 -0
- package/dist/prompts/memory.js.map +1 -0
- package/dist/prompts/onboarding.d.ts +16 -0
- package/dist/prompts/onboarding.d.ts.map +1 -0
- package/dist/prompts/onboarding.js +183 -0
- package/dist/prompts/onboarding.js.map +1 -0
- package/dist/prompts/prd.d.ts +12 -0
- package/dist/prompts/prd.d.ts.map +1 -0
- package/dist/prompts/prd.js +211 -0
- package/dist/prompts/prd.js.map +1 -0
- package/dist/prompts/quality.d.ts +11 -0
- package/dist/prompts/quality.d.ts.map +1 -0
- package/dist/prompts/quality.js +11 -0
- package/dist/prompts/quality.js.map +1 -0
- package/dist/prompts/skills.d.ts +16 -0
- package/dist/prompts/skills.d.ts.map +1 -0
- package/dist/prompts/skills.js +30 -0
- package/dist/prompts/skills.js.map +1 -0
- package/hooks/succ-post-tool.cjs +227 -0
- package/hooks/succ-pre-tool.cjs +312 -0
- package/hooks/succ-session-end.cjs +85 -0
- package/hooks/succ-session-start.cjs +618 -0
- package/hooks/succ-stop-reflection.cjs +87 -0
- package/hooks/succ-user-prompt.cjs +220 -0
- package/package.json +128 -0
|
@@ -0,0 +1,865 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { select, input, password } from '@inquirer/prompts';
|
|
6
|
+
import ora from 'ora';
|
|
7
|
+
import isInstalledGlobally from 'is-installed-globally';
|
|
8
|
+
import { getProjectRoot, getSuccDir, isOnboardingCompleted, markOnboardingCompleted, } from '../lib/config.js';
|
|
9
|
+
import { runStaticWizard, runAiOnboarding } from '../lib/onboarding/index.js';
|
|
10
|
+
import { logWarn } from '../lib/fault-logger.js';
|
|
11
|
+
import { getSoulTemplate, getLearningsTemplate, getContextRulesTemplate, getInboxMocTemplate, getProjectMocTemplate, getDecisionsMocTemplate, getFeaturesMocTemplate, getFilesMocTemplate, getTechnicalMocTemplate, getSystemsMocTemplate, getStrategyMocTemplate, getSessionsMocTemplate, getKnowledgeMocTemplate, getArchiveMocTemplate, getPrdMocTemplate, getCommunicationMocTemplate, } from './init-templates.js';
|
|
12
|
+
// Get the directory where succ is installed
|
|
13
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
+
const __dirname = path.dirname(__filename);
|
|
15
|
+
const SUCC_PACKAGE_DIR = path.resolve(__dirname, '..', '..');
|
|
16
|
+
export async function init(options = {}) {
|
|
17
|
+
const projectRoot = getProjectRoot();
|
|
18
|
+
const succDir = getSuccDir();
|
|
19
|
+
const isInteractive = !options.yes && process.stdout.isTTY && process.stdin.isTTY;
|
|
20
|
+
const verbose = options.verbose || false;
|
|
21
|
+
// Determine if running in global mode
|
|
22
|
+
// --global flag forces global mode (for testing), otherwise auto-detect
|
|
23
|
+
const useGlobalHooks = options.global || isInstalledGlobally;
|
|
24
|
+
// Check if already initialized
|
|
25
|
+
if (fs.existsSync(path.join(succDir, 'succ.db')) && !options.force) {
|
|
26
|
+
console.log('succ is already initialized. Use --force to reinitialize.');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// Create directories - flat brain vault structure (no numbered prefixes)
|
|
30
|
+
const projectName = path.basename(projectRoot);
|
|
31
|
+
const dirs = [
|
|
32
|
+
succDir,
|
|
33
|
+
path.join(succDir, 'brain'),
|
|
34
|
+
path.join(succDir, 'brain', '.meta'),
|
|
35
|
+
path.join(succDir, 'brain', 'inbox'),
|
|
36
|
+
path.join(succDir, 'brain', 'project', 'decisions'),
|
|
37
|
+
path.join(succDir, 'brain', 'project', 'features'),
|
|
38
|
+
path.join(succDir, 'brain', 'project', 'files'),
|
|
39
|
+
path.join(succDir, 'brain', 'project', 'technical'),
|
|
40
|
+
path.join(succDir, 'brain', 'project', 'systems'),
|
|
41
|
+
path.join(succDir, 'brain', 'project', 'strategy'),
|
|
42
|
+
path.join(succDir, 'brain', 'project', 'sessions'),
|
|
43
|
+
path.join(succDir, 'brain', 'knowledge'),
|
|
44
|
+
path.join(succDir, 'brain', 'archive'),
|
|
45
|
+
path.join(succDir, 'brain', 'prd'),
|
|
46
|
+
path.join(succDir, 'brain', 'communication'),
|
|
47
|
+
path.join(succDir, 'brain', 'reflections'),
|
|
48
|
+
// hooks directory only created for local development (not global install)
|
|
49
|
+
...(useGlobalHooks ? [] : [path.join(succDir, 'hooks')]),
|
|
50
|
+
];
|
|
51
|
+
// Start spinner for directory creation
|
|
52
|
+
const spinner = ora('Initializing succ...').start();
|
|
53
|
+
for (const dir of dirs) {
|
|
54
|
+
if (!fs.existsSync(dir)) {
|
|
55
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Helper to log only in verbose mode
|
|
59
|
+
const log = (msg) => {
|
|
60
|
+
if (verbose) {
|
|
61
|
+
spinner.stop();
|
|
62
|
+
console.log(` ${msg}`);
|
|
63
|
+
spinner.start('Initializing succ...');
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
// Note: brain/index.md removed - not used, brain vault has MOC files instead
|
|
67
|
+
// Create .meta/learnings.md - rich learnings file with templates
|
|
68
|
+
const learningsPath = path.join(succDir, 'brain', '.meta', 'learnings.md');
|
|
69
|
+
if (!fs.existsSync(learningsPath)) {
|
|
70
|
+
fs.writeFileSync(learningsPath, getLearningsTemplate(projectName));
|
|
71
|
+
log('Created brain/.meta/learnings.md');
|
|
72
|
+
}
|
|
73
|
+
// Create .meta/context-rules.md
|
|
74
|
+
const contextRulesPath = path.join(succDir, 'brain', '.meta', 'context-rules.md');
|
|
75
|
+
if (!fs.existsSync(contextRulesPath)) {
|
|
76
|
+
fs.writeFileSync(contextRulesPath, getContextRulesTemplate(projectName));
|
|
77
|
+
log('Created brain/.meta/context-rules.md');
|
|
78
|
+
}
|
|
79
|
+
// Create MOC (Map of Content) files for each major folder
|
|
80
|
+
const mocFiles = [
|
|
81
|
+
{ path: path.join(succDir, 'brain', 'inbox', 'Inbox.md'), content: getInboxMocTemplate() },
|
|
82
|
+
{
|
|
83
|
+
path: path.join(succDir, 'brain', 'project', `${projectName}.md`),
|
|
84
|
+
content: getProjectMocTemplate(projectName),
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
path: path.join(succDir, 'brain', 'project', 'decisions', 'Decisions.md'),
|
|
88
|
+
content: getDecisionsMocTemplate(projectName),
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
path: path.join(succDir, 'brain', 'project', 'features', 'Features.md'),
|
|
92
|
+
content: getFeaturesMocTemplate(projectName),
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
path: path.join(succDir, 'brain', 'project', 'files', 'Files.md'),
|
|
96
|
+
content: getFilesMocTemplate(projectName),
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
path: path.join(succDir, 'brain', 'project', 'technical', 'Technical.md'),
|
|
100
|
+
content: getTechnicalMocTemplate(projectName),
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
path: path.join(succDir, 'brain', 'project', 'systems', 'Systems.md'),
|
|
104
|
+
content: getSystemsMocTemplate(projectName),
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
path: path.join(succDir, 'brain', 'project', 'strategy', 'Strategy.md'),
|
|
108
|
+
content: getStrategyMocTemplate(projectName),
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
path: path.join(succDir, 'brain', 'project', 'sessions', 'Sessions.md'),
|
|
112
|
+
content: getSessionsMocTemplate(projectName),
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
path: path.join(succDir, 'brain', 'knowledge', 'Knowledge.md'),
|
|
116
|
+
content: getKnowledgeMocTemplate(),
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
path: path.join(succDir, 'brain', 'archive', 'Archive.md'),
|
|
120
|
+
content: getArchiveMocTemplate(),
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
path: path.join(succDir, 'brain', 'prd', 'PRD.md'),
|
|
124
|
+
content: getPrdMocTemplate(),
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
path: path.join(succDir, 'brain', 'communication', 'Communication.md'),
|
|
128
|
+
content: getCommunicationMocTemplate(),
|
|
129
|
+
},
|
|
130
|
+
];
|
|
131
|
+
for (const moc of mocFiles) {
|
|
132
|
+
if (!fs.existsSync(moc.path)) {
|
|
133
|
+
fs.writeFileSync(moc.path, moc.content);
|
|
134
|
+
log(`Created ${path.relative(projectRoot, moc.path)}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Create soul.md template
|
|
138
|
+
const soulPath = path.join(succDir, 'soul.md');
|
|
139
|
+
if (!fs.existsSync(soulPath)) {
|
|
140
|
+
fs.writeFileSync(soulPath, getSoulTemplate());
|
|
141
|
+
log('Created soul.md');
|
|
142
|
+
}
|
|
143
|
+
// Create hooks in project only for local development
|
|
144
|
+
// Global install uses hooks from the succ package directory
|
|
145
|
+
if (!useGlobalHooks) {
|
|
146
|
+
// Copy hooks from package hooks/ directory (source of truth)
|
|
147
|
+
// Note: succ-idle-reflection.cjs and succ-idle-watcher.cjs removed -
|
|
148
|
+
// all idle operations now handled by unified daemon
|
|
149
|
+
const hooksToCreate = [
|
|
150
|
+
'succ-session-start.cjs',
|
|
151
|
+
'succ-session-end.cjs',
|
|
152
|
+
'succ-stop-reflection.cjs',
|
|
153
|
+
'succ-user-prompt.cjs',
|
|
154
|
+
'succ-post-tool.cjs',
|
|
155
|
+
'succ-pre-tool.cjs',
|
|
156
|
+
];
|
|
157
|
+
for (const hookFile of hooksToCreate) {
|
|
158
|
+
const destPath = path.join(succDir, 'hooks', hookFile);
|
|
159
|
+
const srcPath = path.join(SUCC_PACKAGE_DIR, 'hooks', hookFile);
|
|
160
|
+
if (!fs.existsSync(destPath) || options.force) {
|
|
161
|
+
// Try to copy from package hooks/ directory (source of truth)
|
|
162
|
+
if (fs.existsSync(srcPath)) {
|
|
163
|
+
fs.copyFileSync(srcPath, destPath);
|
|
164
|
+
log(options.force && fs.existsSync(destPath)
|
|
165
|
+
? `Updated hooks/${hookFile}`
|
|
166
|
+
: `Created hooks/${hookFile}`);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
// Fallback to inline templates for backwards compatibility
|
|
170
|
+
const hookContent = getHookContent(hookFile);
|
|
171
|
+
if (hookContent) {
|
|
172
|
+
fs.writeFileSync(destPath, hookContent);
|
|
173
|
+
log(options.force && fs.existsSync(destPath)
|
|
174
|
+
? `Updated hooks/${hookFile}`
|
|
175
|
+
: `Created hooks/${hookFile}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Create or merge settings.json in .claude/ (Claude Code looks for it there)
|
|
182
|
+
const claudeDir = path.join(projectRoot, '.claude');
|
|
183
|
+
if (!fs.existsSync(claudeDir)) {
|
|
184
|
+
fs.mkdirSync(claudeDir, { recursive: true });
|
|
185
|
+
}
|
|
186
|
+
// Copy succ agents to .claude/agents/ for Claude Code subagent support
|
|
187
|
+
const agentsDir = path.join(claudeDir, 'agents');
|
|
188
|
+
if (!fs.existsSync(agentsDir)) {
|
|
189
|
+
fs.mkdirSync(agentsDir, { recursive: true });
|
|
190
|
+
}
|
|
191
|
+
// Agent files to install
|
|
192
|
+
const agentFiles = [
|
|
193
|
+
// Original agents
|
|
194
|
+
'succ-memory-curator.md',
|
|
195
|
+
'succ-knowledge-indexer.md',
|
|
196
|
+
'succ-deep-search.md',
|
|
197
|
+
'succ-checkpoint-manager.md',
|
|
198
|
+
'succ-session-reviewer.md',
|
|
199
|
+
// New agents
|
|
200
|
+
'succ-session-handoff-orchestrator.md',
|
|
201
|
+
'succ-memory-health-monitor.md',
|
|
202
|
+
'succ-pattern-detective.md',
|
|
203
|
+
'succ-readiness-improver.md',
|
|
204
|
+
'succ-knowledge-mapper.md',
|
|
205
|
+
'succ-quality-improvement-coach.md',
|
|
206
|
+
'succ-decision-auditor.md',
|
|
207
|
+
'succ-context-optimizer.md',
|
|
208
|
+
'succ-explore.md',
|
|
209
|
+
'succ-plan.md',
|
|
210
|
+
'succ-code-reviewer.md',
|
|
211
|
+
'succ-diff-reviewer.md',
|
|
212
|
+
'succ-debug.md',
|
|
213
|
+
'succ-style-tracker.md',
|
|
214
|
+
'succ-general.md',
|
|
215
|
+
];
|
|
216
|
+
for (const agentFile of agentFiles) {
|
|
217
|
+
const destPath = path.join(agentsDir, agentFile);
|
|
218
|
+
const srcPath = path.join(SUCC_PACKAGE_DIR, 'agents', agentFile);
|
|
219
|
+
if (!fs.existsSync(destPath) || options.force) {
|
|
220
|
+
if (fs.existsSync(srcPath)) {
|
|
221
|
+
fs.copyFileSync(srcPath, destPath);
|
|
222
|
+
log(options.force && fs.existsSync(destPath)
|
|
223
|
+
? `Updated agents/${agentFile}`
|
|
224
|
+
: `Created agents/${agentFile}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
const settingsPath = path.join(claudeDir, 'settings.json');
|
|
229
|
+
const settingsExisted = fs.existsSync(settingsPath);
|
|
230
|
+
if (!settingsExisted || options.force) {
|
|
231
|
+
// Determine hooks path based on installation mode
|
|
232
|
+
// Global install: hooks are in the succ package directory
|
|
233
|
+
// Local dev: hooks are copied to .succ/hooks/ in the project
|
|
234
|
+
const hooksPath = useGlobalHooks
|
|
235
|
+
? path.join(SUCC_PACKAGE_DIR, 'hooks').replace(/\\/g, '/')
|
|
236
|
+
: '.succ/hooks';
|
|
237
|
+
if (verbose) {
|
|
238
|
+
console.log(` Installation mode: ${useGlobalHooks ? 'global' : 'local development'}`);
|
|
239
|
+
console.log(` Hooks path: ${hooksPath}`);
|
|
240
|
+
}
|
|
241
|
+
// Define succ hooks
|
|
242
|
+
// Hook files prefixed with "succ-" to avoid conflicts with other hooks
|
|
243
|
+
const succHooks = {
|
|
244
|
+
SessionStart: [
|
|
245
|
+
{
|
|
246
|
+
hooks: [
|
|
247
|
+
{
|
|
248
|
+
type: 'command',
|
|
249
|
+
command: `node --no-warnings --no-deprecation "${hooksPath}/succ-session-start.cjs"`,
|
|
250
|
+
timeout: 10,
|
|
251
|
+
},
|
|
252
|
+
],
|
|
253
|
+
},
|
|
254
|
+
],
|
|
255
|
+
Stop: [
|
|
256
|
+
{
|
|
257
|
+
hooks: [
|
|
258
|
+
{
|
|
259
|
+
type: 'command',
|
|
260
|
+
command: `node --no-warnings --no-deprecation "${hooksPath}/succ-stop-reflection.cjs"`,
|
|
261
|
+
timeout: 60,
|
|
262
|
+
},
|
|
263
|
+
],
|
|
264
|
+
},
|
|
265
|
+
],
|
|
266
|
+
SessionEnd: [
|
|
267
|
+
{
|
|
268
|
+
hooks: [
|
|
269
|
+
{
|
|
270
|
+
type: 'command',
|
|
271
|
+
command: `node --no-warnings --no-deprecation "${hooksPath}/succ-session-end.cjs"`,
|
|
272
|
+
timeout: 60,
|
|
273
|
+
},
|
|
274
|
+
],
|
|
275
|
+
},
|
|
276
|
+
],
|
|
277
|
+
UserPromptSubmit: [
|
|
278
|
+
{
|
|
279
|
+
hooks: [
|
|
280
|
+
{
|
|
281
|
+
type: 'command',
|
|
282
|
+
command: `node --no-warnings --no-deprecation "${hooksPath}/succ-user-prompt.cjs"`,
|
|
283
|
+
timeout: 10,
|
|
284
|
+
},
|
|
285
|
+
],
|
|
286
|
+
},
|
|
287
|
+
],
|
|
288
|
+
PostToolUse: [
|
|
289
|
+
{
|
|
290
|
+
hooks: [
|
|
291
|
+
{
|
|
292
|
+
type: 'command',
|
|
293
|
+
command: `node --no-warnings --no-deprecation "${hooksPath}/succ-post-tool.cjs"`,
|
|
294
|
+
timeout: 5,
|
|
295
|
+
},
|
|
296
|
+
],
|
|
297
|
+
},
|
|
298
|
+
],
|
|
299
|
+
PreToolUse: [
|
|
300
|
+
{
|
|
301
|
+
matcher: 'Bash',
|
|
302
|
+
hooks: [
|
|
303
|
+
{
|
|
304
|
+
type: 'command',
|
|
305
|
+
command: `node --no-warnings --no-deprecation "${hooksPath}/succ-pre-tool.cjs"`,
|
|
306
|
+
timeout: 10,
|
|
307
|
+
},
|
|
308
|
+
],
|
|
309
|
+
},
|
|
310
|
+
],
|
|
311
|
+
};
|
|
312
|
+
let finalSettings;
|
|
313
|
+
if (settingsExisted && !options.force) {
|
|
314
|
+
// Merge with existing settings (non-force mode)
|
|
315
|
+
try {
|
|
316
|
+
const existingContent = fs.readFileSync(settingsPath, 'utf-8');
|
|
317
|
+
const existingSettings = JSON.parse(existingContent);
|
|
318
|
+
// Preserve all existing settings
|
|
319
|
+
finalSettings = { ...existingSettings };
|
|
320
|
+
// Ensure hooks object exists
|
|
321
|
+
if (!finalSettings.hooks) {
|
|
322
|
+
finalSettings.hooks = {};
|
|
323
|
+
}
|
|
324
|
+
// Merge hooks: add succ hooks without duplicating
|
|
325
|
+
for (const [hookType, hookConfig] of Object.entries(succHooks)) {
|
|
326
|
+
if (!finalSettings.hooks[hookType]) {
|
|
327
|
+
// No existing hooks of this type, just add ours
|
|
328
|
+
finalSettings.hooks[hookType] = hookConfig;
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
const existingHooks = finalSettings.hooks[hookType];
|
|
332
|
+
const succHookEntries = hookConfig;
|
|
333
|
+
for (const succEntry of succHookEntries) {
|
|
334
|
+
// Check if this exact succ hook is already present
|
|
335
|
+
const succCommand = succEntry.hooks?.[0]?.command || '';
|
|
336
|
+
const succMatcher = succEntry.matcher || '';
|
|
337
|
+
const alreadyExists = existingHooks.some((existing) => {
|
|
338
|
+
const existingCommand = existing.hooks?.[0]?.command || '';
|
|
339
|
+
// Check for succ hook files (prefixed with "succ-")
|
|
340
|
+
if (succCommand.includes('succ-session-start.cjs') &&
|
|
341
|
+
existingCommand.includes('succ-session-start.cjs'))
|
|
342
|
+
return true;
|
|
343
|
+
if (succCommand.includes('succ-session-end.cjs') &&
|
|
344
|
+
existingCommand.includes('succ-session-end.cjs'))
|
|
345
|
+
return true;
|
|
346
|
+
if (succCommand.includes('succ-stop-reflection.cjs') &&
|
|
347
|
+
existingCommand.includes('succ-stop-reflection.cjs'))
|
|
348
|
+
return true;
|
|
349
|
+
if (succCommand.includes('succ-user-prompt.cjs') &&
|
|
350
|
+
existingCommand.includes('succ-user-prompt.cjs'))
|
|
351
|
+
return true;
|
|
352
|
+
if (succCommand.includes('succ-post-tool.cjs') &&
|
|
353
|
+
existingCommand.includes('succ-post-tool.cjs'))
|
|
354
|
+
return true;
|
|
355
|
+
if (succCommand.includes('succ-pre-tool.cjs') &&
|
|
356
|
+
existingCommand.includes('succ-pre-tool.cjs'))
|
|
357
|
+
return true;
|
|
358
|
+
// For Notification hooks, check matcher
|
|
359
|
+
if (succMatcher && existing.matcher === succMatcher)
|
|
360
|
+
return true;
|
|
361
|
+
return false;
|
|
362
|
+
});
|
|
363
|
+
if (!alreadyExists) {
|
|
364
|
+
existingHooks.push(succEntry);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
log('Merged settings.json (preserved existing permissions and hooks)');
|
|
370
|
+
}
|
|
371
|
+
catch {
|
|
372
|
+
// Failed to parse existing, create new
|
|
373
|
+
finalSettings = { hooks: succHooks };
|
|
374
|
+
log('Created settings.json (failed to parse existing)');
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
else if (settingsExisted && options.force) {
|
|
378
|
+
// Force mode: replace succ hooks but preserve other settings
|
|
379
|
+
try {
|
|
380
|
+
const existingContent = fs.readFileSync(settingsPath, 'utf-8');
|
|
381
|
+
const existingSettings = JSON.parse(existingContent);
|
|
382
|
+
// Preserve non-hook settings (permissions, etc.)
|
|
383
|
+
finalSettings = { ...existingSettings };
|
|
384
|
+
// Replace hooks entirely with new succ hooks
|
|
385
|
+
// but preserve any non-succ hooks
|
|
386
|
+
if (finalSettings.hooks) {
|
|
387
|
+
for (const [hookType, hookConfig] of Object.entries(finalSettings.hooks)) {
|
|
388
|
+
const existingHooks = hookConfig;
|
|
389
|
+
// Filter out old succ hooks (both old names and new "succ-" prefixed names)
|
|
390
|
+
const nonSuccHooks = existingHooks.filter((h) => {
|
|
391
|
+
const cmd = h.hooks?.[0]?.command || '';
|
|
392
|
+
// Remove hooks in .succ/hooks/ directory (local dev)
|
|
393
|
+
if (cmd.includes('.succ/hooks/'))
|
|
394
|
+
return false;
|
|
395
|
+
// Remove hooks from global succ install (contains /hooks/succ- pattern)
|
|
396
|
+
if (cmd.includes('/hooks/succ-') || cmd.includes('\\hooks\\succ-'))
|
|
397
|
+
return false;
|
|
398
|
+
// Also remove any legacy hooks with succ hook names
|
|
399
|
+
if (cmd.includes('session-start.cjs') ||
|
|
400
|
+
cmd.includes('session-end.cjs') ||
|
|
401
|
+
cmd.includes('stop-reflection.cjs') ||
|
|
402
|
+
cmd.includes('user-prompt.cjs') ||
|
|
403
|
+
cmd.includes('post-tool.cjs') ||
|
|
404
|
+
cmd.includes('pre-tool.cjs') ||
|
|
405
|
+
cmd.includes('idle-reflection.cjs'))
|
|
406
|
+
return false;
|
|
407
|
+
return true;
|
|
408
|
+
});
|
|
409
|
+
if (nonSuccHooks.length > 0) {
|
|
410
|
+
finalSettings.hooks[hookType] = nonSuccHooks;
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
delete finalSettings.hooks[hookType];
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
// Now add fresh succ hooks
|
|
418
|
+
if (!finalSettings.hooks) {
|
|
419
|
+
finalSettings.hooks = {};
|
|
420
|
+
}
|
|
421
|
+
for (const [hookType, hookConfig] of Object.entries(succHooks)) {
|
|
422
|
+
if (!finalSettings.hooks[hookType]) {
|
|
423
|
+
finalSettings.hooks[hookType] = hookConfig;
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
finalSettings.hooks[hookType] = [
|
|
427
|
+
...finalSettings.hooks[hookType],
|
|
428
|
+
...hookConfig,
|
|
429
|
+
];
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
log('Replaced succ hooks in settings.json (--force)');
|
|
433
|
+
}
|
|
434
|
+
catch {
|
|
435
|
+
// Failed to parse existing, create new
|
|
436
|
+
finalSettings = { hooks: succHooks };
|
|
437
|
+
log('Created settings.json (failed to parse existing)');
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
else {
|
|
441
|
+
// Create new settings
|
|
442
|
+
finalSettings = { hooks: succHooks };
|
|
443
|
+
log('Created settings.json');
|
|
444
|
+
}
|
|
445
|
+
fs.writeFileSync(settingsPath, JSON.stringify(finalSettings, null, 2));
|
|
446
|
+
}
|
|
447
|
+
// Note: All hooks are now created in the earlier block using copyFileSync from hooks/ directory
|
|
448
|
+
// Add MCP server to Claude Code config
|
|
449
|
+
const mcpResult = addMcpServer(projectRoot);
|
|
450
|
+
// Stop spinner with success message
|
|
451
|
+
spinner.succeed('succ initialized successfully!');
|
|
452
|
+
if (verbose && mcpResult === 'added') {
|
|
453
|
+
console.log(' MCP server added to Claude Code config.');
|
|
454
|
+
}
|
|
455
|
+
// Interactive configuration
|
|
456
|
+
if (isInteractive) {
|
|
457
|
+
// Run onboarding for first-time users (before setup wizard)
|
|
458
|
+
await runOnboarding(options.ai || false);
|
|
459
|
+
await runInteractiveSetup(projectRoot, verbose);
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
// Non-interactive: show next steps
|
|
463
|
+
console.log('\nNext steps:');
|
|
464
|
+
console.log(' 1. Run `succ analyze` to generate brain documentation');
|
|
465
|
+
console.log(' 2. Run `succ index` to create doc embeddings (local, no API key needed)');
|
|
466
|
+
console.log(' 3. Run `succ index-code` to index source code for semantic search');
|
|
467
|
+
console.log(' 4. Run `succ search <query>` to find relevant content');
|
|
468
|
+
if (mcpResult === 'added') {
|
|
469
|
+
console.log(' 5. Restart Claude Code to enable succ tools');
|
|
470
|
+
}
|
|
471
|
+
console.log('\n Other editors: `succ setup cursor`, `succ setup windsurf`, `succ setup continue`');
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Run onboarding for first-time users
|
|
476
|
+
* Checks if onboarding was already completed globally
|
|
477
|
+
*/
|
|
478
|
+
async function runOnboarding(useAi) {
|
|
479
|
+
// Skip if already completed
|
|
480
|
+
if (isOnboardingCompleted()) {
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
console.log('');
|
|
484
|
+
console.log(' Welcome to succ!');
|
|
485
|
+
console.log('');
|
|
486
|
+
// Ask if user wants a tour
|
|
487
|
+
const wantsTour = await select({
|
|
488
|
+
message: 'Would you like a quick tour of succ?',
|
|
489
|
+
choices: [
|
|
490
|
+
{
|
|
491
|
+
name: 'Yes, show me around (recommended)',
|
|
492
|
+
value: 'yes',
|
|
493
|
+
description: 'Learn what succ can do',
|
|
494
|
+
},
|
|
495
|
+
{
|
|
496
|
+
name: 'Skip, just set up',
|
|
497
|
+
value: 'skip',
|
|
498
|
+
description: 'Go straight to configuration',
|
|
499
|
+
},
|
|
500
|
+
],
|
|
501
|
+
default: 'yes',
|
|
502
|
+
});
|
|
503
|
+
if (wantsTour === 'skip') {
|
|
504
|
+
markOnboardingCompleted('skipped');
|
|
505
|
+
console.log('\n Skipped onboarding. You can learn more at https://succ.ai\n');
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
508
|
+
// Ask for onboarding style (unless --ai flag was used)
|
|
509
|
+
let onboardingStyle = 'quick';
|
|
510
|
+
if (useAi) {
|
|
511
|
+
onboardingStyle = 'interactive';
|
|
512
|
+
}
|
|
513
|
+
else {
|
|
514
|
+
const styleChoice = await select({
|
|
515
|
+
message: 'How would you like to learn?',
|
|
516
|
+
choices: [
|
|
517
|
+
{
|
|
518
|
+
name: 'Quick walkthrough (~2 min)',
|
|
519
|
+
value: 'quick',
|
|
520
|
+
description: 'Static screens with key concepts',
|
|
521
|
+
},
|
|
522
|
+
{
|
|
523
|
+
name: 'Interactive chat with AI (~3-5 min)',
|
|
524
|
+
value: 'interactive',
|
|
525
|
+
description: 'Personalized conversation about your project',
|
|
526
|
+
},
|
|
527
|
+
],
|
|
528
|
+
default: 'quick',
|
|
529
|
+
});
|
|
530
|
+
onboardingStyle = styleChoice;
|
|
531
|
+
}
|
|
532
|
+
// Run chosen onboarding
|
|
533
|
+
if (onboardingStyle === 'interactive') {
|
|
534
|
+
await runAiOnboarding();
|
|
535
|
+
}
|
|
536
|
+
else {
|
|
537
|
+
await runStaticWizard();
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* Interactive setup wizard
|
|
542
|
+
*/
|
|
543
|
+
async function runInteractiveSetup(projectRoot, _verbose = false) {
|
|
544
|
+
const globalConfigDir = path.join(os.homedir(), '.succ');
|
|
545
|
+
const globalConfigPath = path.join(globalConfigDir, 'config.json');
|
|
546
|
+
const projectConfigDir = path.join(projectRoot, '.succ');
|
|
547
|
+
const projectConfigPath = path.join(projectConfigDir, 'config.json');
|
|
548
|
+
const newGlobalConfig = {};
|
|
549
|
+
const newProjectConfig = {};
|
|
550
|
+
const projectName = path.basename(projectRoot);
|
|
551
|
+
try {
|
|
552
|
+
// Header
|
|
553
|
+
console.log('');
|
|
554
|
+
console.log(' \x1b[32m●\x1b[0m succ');
|
|
555
|
+
console.log('');
|
|
556
|
+
console.log(' Semantic Understanding for Code Contexts');
|
|
557
|
+
console.log(' Claude Code · Cursor · Windsurf · Continue.dev');
|
|
558
|
+
console.log('');
|
|
559
|
+
console.log(' ─────────────────────────────────────────────────────────');
|
|
560
|
+
console.log('');
|
|
561
|
+
// Step 1: Config scope
|
|
562
|
+
const configScope = await select({
|
|
563
|
+
message: 'Where to save embedding/analyze settings?',
|
|
564
|
+
choices: [
|
|
565
|
+
{
|
|
566
|
+
name: 'Global (~/.succ/config.json)',
|
|
567
|
+
value: 'global',
|
|
568
|
+
description: 'Shared across all projects',
|
|
569
|
+
},
|
|
570
|
+
{
|
|
571
|
+
name: `Project (${projectName}/.succ/config.json)`,
|
|
572
|
+
value: 'project',
|
|
573
|
+
description: 'Only for this project',
|
|
574
|
+
},
|
|
575
|
+
],
|
|
576
|
+
default: 'global',
|
|
577
|
+
});
|
|
578
|
+
const targetConfig = configScope === 'global' ? newGlobalConfig : newProjectConfig;
|
|
579
|
+
// Step 2: Embedding mode
|
|
580
|
+
console.log('\n┌─────────────────────────────────────────────────────────┐');
|
|
581
|
+
console.log('│ succ converts text to vectors (embeddings) for search. │');
|
|
582
|
+
console.log('└─────────────────────────────────────────────────────────┘\n');
|
|
583
|
+
const embeddingMode = await select({
|
|
584
|
+
message: 'How should succ generate embeddings?',
|
|
585
|
+
choices: [
|
|
586
|
+
{
|
|
587
|
+
name: 'Local CPU (recommended for most users)',
|
|
588
|
+
value: 'local',
|
|
589
|
+
description: 'Runs on your CPU, no API key needed',
|
|
590
|
+
},
|
|
591
|
+
{
|
|
592
|
+
name: 'API (Ollama, LM Studio, OpenRouter, etc.)',
|
|
593
|
+
value: 'api',
|
|
594
|
+
description: 'Use any OpenAI-compatible embedding endpoint',
|
|
595
|
+
},
|
|
596
|
+
],
|
|
597
|
+
default: 'local',
|
|
598
|
+
});
|
|
599
|
+
if (!targetConfig.llm)
|
|
600
|
+
targetConfig.llm = {};
|
|
601
|
+
if (!targetConfig.llm.embeddings)
|
|
602
|
+
targetConfig.llm.embeddings = {};
|
|
603
|
+
if (embeddingMode === 'local') {
|
|
604
|
+
targetConfig.llm.embeddings.mode = 'local';
|
|
605
|
+
console.log('\n ✓ Using local embeddings (no API key needed)');
|
|
606
|
+
console.log(' Model: Xenova/all-MiniLM-L6-v2 (runs on CPU)\n');
|
|
607
|
+
}
|
|
608
|
+
else if (embeddingMode === 'api') {
|
|
609
|
+
console.log('\n API Embedding Configuration');
|
|
610
|
+
console.log(' ─────────────────────────────');
|
|
611
|
+
console.log(' Examples:');
|
|
612
|
+
console.log(' Ollama: http://localhost:11434/v1');
|
|
613
|
+
console.log(' LM Studio: http://localhost:1234/v1');
|
|
614
|
+
console.log(' OpenRouter: https://openrouter.ai/api/v1\n');
|
|
615
|
+
const embeddingApiUrl = await input({
|
|
616
|
+
message: 'API URL:',
|
|
617
|
+
default: 'http://localhost:11434/v1',
|
|
618
|
+
});
|
|
619
|
+
const embeddingModel = await input({
|
|
620
|
+
message: 'Model name:',
|
|
621
|
+
default: 'nomic-embed-text',
|
|
622
|
+
});
|
|
623
|
+
const embeddingDimensionsStr = await input({
|
|
624
|
+
message: 'Embedding dimensions:',
|
|
625
|
+
default: '768',
|
|
626
|
+
});
|
|
627
|
+
const embeddingDimensions = parseInt(embeddingDimensionsStr, 10) || 768;
|
|
628
|
+
targetConfig.llm.embeddings.mode = 'api';
|
|
629
|
+
targetConfig.llm.embeddings.api_url = embeddingApiUrl;
|
|
630
|
+
targetConfig.llm.embeddings.model = embeddingModel;
|
|
631
|
+
targetConfig.llm.embeddings.dimensions = embeddingDimensions;
|
|
632
|
+
// Prompt for API key if the URL looks like a cloud provider
|
|
633
|
+
if (embeddingApiUrl.includes('openrouter.ai') || embeddingApiUrl.includes('openai.com')) {
|
|
634
|
+
const apiKey = await password({
|
|
635
|
+
message: 'API key:',
|
|
636
|
+
mask: '*',
|
|
637
|
+
validate: (val) => (val?.trim() ? true : 'API key is required'),
|
|
638
|
+
});
|
|
639
|
+
targetConfig.llm.api_key = apiKey;
|
|
640
|
+
}
|
|
641
|
+
console.log(`\n ✓ Using API embeddings: ${embeddingApiUrl}`);
|
|
642
|
+
console.log(` Model: ${embeddingModel} (${embeddingDimensions}d)`);
|
|
643
|
+
if (embeddingApiUrl.includes('11434')) {
|
|
644
|
+
console.log(`\n Tip: Run \`ollama pull ${embeddingModel}\` to download the model`);
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
// Step 3: Analysis mode
|
|
648
|
+
console.log('┌─────────────────────────────────────────────────────────┐');
|
|
649
|
+
console.log('│ succ can analyze your codebase to generate docs. │');
|
|
650
|
+
console.log('│ Choose which LLM to use for `succ analyze`: │');
|
|
651
|
+
console.log('└─────────────────────────────────────────────────────────┘\n');
|
|
652
|
+
const analyzeMode = await select({
|
|
653
|
+
message: 'How should succ analyze your code?',
|
|
654
|
+
choices: [
|
|
655
|
+
{
|
|
656
|
+
name: 'Claude CLI (recommended)',
|
|
657
|
+
value: 'claude',
|
|
658
|
+
description: 'Uses the `claude` command',
|
|
659
|
+
},
|
|
660
|
+
{
|
|
661
|
+
name: 'API (Ollama, LM Studio, OpenRouter, etc.)',
|
|
662
|
+
value: 'api',
|
|
663
|
+
description: 'Use any OpenAI-compatible chat endpoint',
|
|
664
|
+
},
|
|
665
|
+
],
|
|
666
|
+
default: 'claude',
|
|
667
|
+
});
|
|
668
|
+
if (!targetConfig.llm.analyze)
|
|
669
|
+
targetConfig.llm.analyze = {};
|
|
670
|
+
if (analyzeMode === 'claude') {
|
|
671
|
+
targetConfig.llm.analyze.mode = 'claude';
|
|
672
|
+
console.log('\n ✓ Using Claude CLI for analysis');
|
|
673
|
+
console.log(' Make sure `claude` command is available\n');
|
|
674
|
+
}
|
|
675
|
+
else if (analyzeMode === 'api') {
|
|
676
|
+
console.log('\n API Configuration for Analysis');
|
|
677
|
+
console.log(' ─────────────────────────────────');
|
|
678
|
+
console.log(' Examples:');
|
|
679
|
+
console.log(' Ollama: http://localhost:11434/v1');
|
|
680
|
+
console.log(' LM Studio: http://localhost:1234/v1');
|
|
681
|
+
console.log(' OpenRouter: https://openrouter.ai/api/v1\n');
|
|
682
|
+
const analyzeApiUrl = await input({
|
|
683
|
+
message: 'API URL:',
|
|
684
|
+
default: 'http://localhost:11434/v1',
|
|
685
|
+
});
|
|
686
|
+
const analyzeModel = await input({
|
|
687
|
+
message: 'Model name:',
|
|
688
|
+
default: 'qwen2.5-coder:14b',
|
|
689
|
+
});
|
|
690
|
+
targetConfig.llm.analyze.mode = 'api';
|
|
691
|
+
targetConfig.llm.analyze.api_url = analyzeApiUrl;
|
|
692
|
+
targetConfig.llm.analyze.model = analyzeModel;
|
|
693
|
+
// Prompt for API key if cloud provider and not already set
|
|
694
|
+
if (!targetConfig.llm.api_key &&
|
|
695
|
+
(analyzeApiUrl.includes('openrouter.ai') || analyzeApiUrl.includes('openai.com'))) {
|
|
696
|
+
const apiKey = await password({
|
|
697
|
+
message: 'API key:',
|
|
698
|
+
mask: '*',
|
|
699
|
+
validate: (val) => (val?.trim() ? true : 'API key is required'),
|
|
700
|
+
});
|
|
701
|
+
targetConfig.llm.api_key = apiKey;
|
|
702
|
+
}
|
|
703
|
+
console.log(`\n ✓ Using API for analysis: ${analyzeApiUrl}`);
|
|
704
|
+
console.log(` Model: ${analyzeModel}`);
|
|
705
|
+
if (analyzeApiUrl.includes('11434')) {
|
|
706
|
+
console.log(`\n Tip: Run \`ollama pull ${analyzeModel}\` to download the model`);
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
// Step 4: Background services (always project-specific)
|
|
710
|
+
console.log('┌─────────────────────────────────────────────────────────┐');
|
|
711
|
+
console.log('│ succ can run background services during Claude sessions │');
|
|
712
|
+
console.log('│ Watch: auto-index files when they change │');
|
|
713
|
+
console.log('│ Analyze: periodically discover new files │');
|
|
714
|
+
console.log('└─────────────────────────────────────────────────────────┘\n');
|
|
715
|
+
const daemonMode = await select({
|
|
716
|
+
message: 'Enable background services?',
|
|
717
|
+
choices: [
|
|
718
|
+
{
|
|
719
|
+
name: 'None (manual only)',
|
|
720
|
+
value: 'none',
|
|
721
|
+
description: 'Run succ index/analyze manually when needed',
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
name: 'Watch only',
|
|
725
|
+
value: 'watch',
|
|
726
|
+
description: 'Auto-index changed files in background',
|
|
727
|
+
},
|
|
728
|
+
{
|
|
729
|
+
name: 'Both watch and analyze (recommended)',
|
|
730
|
+
value: 'both',
|
|
731
|
+
description: 'Full automation: watch + periodic discovery',
|
|
732
|
+
},
|
|
733
|
+
],
|
|
734
|
+
default: 'none',
|
|
735
|
+
});
|
|
736
|
+
// Initialize daemon config
|
|
737
|
+
const daemonConfig = {
|
|
738
|
+
enabled: true,
|
|
739
|
+
watch: { auto_start: false },
|
|
740
|
+
analyze: { auto_start: false },
|
|
741
|
+
};
|
|
742
|
+
if (daemonMode === 'watch' || daemonMode === 'both') {
|
|
743
|
+
daemonConfig.watch.auto_start = true;
|
|
744
|
+
console.log('\n ✓ Watch service enabled (auto-index on file changes)');
|
|
745
|
+
}
|
|
746
|
+
if (daemonMode === 'both') {
|
|
747
|
+
daemonConfig.analyze.auto_start = true;
|
|
748
|
+
console.log(' ✓ Analyze service enabled (periodic discovery)');
|
|
749
|
+
}
|
|
750
|
+
if (daemonMode === 'none') {
|
|
751
|
+
console.log('\n ✓ Background services disabled');
|
|
752
|
+
console.log(' Run `succ index` and `succ analyze` manually when needed');
|
|
753
|
+
}
|
|
754
|
+
// Save daemon config to target scope
|
|
755
|
+
if (daemonMode !== 'none') {
|
|
756
|
+
targetConfig.daemon = daemonConfig;
|
|
757
|
+
}
|
|
758
|
+
console.log('');
|
|
759
|
+
// Save config to chosen scope
|
|
760
|
+
if (configScope === 'global') {
|
|
761
|
+
if (Object.keys(newGlobalConfig).length > 0) {
|
|
762
|
+
if (!fs.existsSync(globalConfigDir)) {
|
|
763
|
+
fs.mkdirSync(globalConfigDir, { recursive: true });
|
|
764
|
+
}
|
|
765
|
+
fs.writeFileSync(globalConfigPath, JSON.stringify(newGlobalConfig, null, 2));
|
|
766
|
+
console.log(` Saved: ${globalConfigPath}`);
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
else {
|
|
770
|
+
if (Object.keys(newProjectConfig).length > 0) {
|
|
771
|
+
if (!fs.existsSync(projectConfigDir)) {
|
|
772
|
+
fs.mkdirSync(projectConfigDir, { recursive: true });
|
|
773
|
+
}
|
|
774
|
+
fs.writeFileSync(projectConfigPath, JSON.stringify(newProjectConfig, null, 2));
|
|
775
|
+
console.log(` Saved: ${projectConfigPath}`);
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
// Final message
|
|
779
|
+
console.log('\n┌─────────────────────────────────────────────────────────┐');
|
|
780
|
+
console.log('│ Setup Complete! │');
|
|
781
|
+
console.log('└─────────────────────────────────────────────────────────┘\n');
|
|
782
|
+
console.log(' Next steps:\n');
|
|
783
|
+
console.log(' 1. succ analyze Generate brain documentation');
|
|
784
|
+
console.log(' 2. succ index Create doc embeddings for search');
|
|
785
|
+
console.log(' 3. succ index-code Index source code for semantic search');
|
|
786
|
+
console.log(' 4. succ search <query> Find relevant content\n');
|
|
787
|
+
console.log(' The daemon starts automatically with Claude Code sessions.');
|
|
788
|
+
console.log(' Other editors: succ setup cursor | windsurf | continue');
|
|
789
|
+
console.log(' Check status anytime: succ daemon status\n');
|
|
790
|
+
}
|
|
791
|
+
catch (error) {
|
|
792
|
+
// Handle Ctrl+C gracefully
|
|
793
|
+
if (error?.name === 'ExitPromptError' || error?.message?.includes('closed')) {
|
|
794
|
+
console.log('\n\n Setup cancelled.\n');
|
|
795
|
+
process.exit(0);
|
|
796
|
+
}
|
|
797
|
+
throw error;
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
/**
|
|
801
|
+
* Add succ MCP server to Claude Code config
|
|
802
|
+
*
|
|
803
|
+
* Claude Code stores MCP servers in ~/.claude.json under the root "mcpServers" key
|
|
804
|
+
* for global scope (works everywhere including remote sessions via Happy).
|
|
805
|
+
*
|
|
806
|
+
* The old ~/.claude/mcp_servers.json format is deprecated.
|
|
807
|
+
*/
|
|
808
|
+
function addMcpServer(_projectRoot) {
|
|
809
|
+
// Claude Code main config location
|
|
810
|
+
const claudeConfigPath = path.join(os.homedir(), '.claude.json');
|
|
811
|
+
try {
|
|
812
|
+
// Read existing config or create new
|
|
813
|
+
let claudeConfig = {};
|
|
814
|
+
if (fs.existsSync(claudeConfigPath)) {
|
|
815
|
+
const content = fs.readFileSync(claudeConfigPath, 'utf-8');
|
|
816
|
+
claudeConfig = JSON.parse(content);
|
|
817
|
+
}
|
|
818
|
+
// Initialize mcpServers at root level if not exists
|
|
819
|
+
if (!claudeConfig.mcpServers) {
|
|
820
|
+
claudeConfig.mcpServers = {};
|
|
821
|
+
}
|
|
822
|
+
// Check if already configured
|
|
823
|
+
if (claudeConfig.mcpServers.succ) {
|
|
824
|
+
return 'exists';
|
|
825
|
+
}
|
|
826
|
+
// Add succ MCP server to global scope
|
|
827
|
+
// No cwd specified - MCP server will use Claude Code's current working directory
|
|
828
|
+
// This allows it to work with whichever project Claude is currently in
|
|
829
|
+
// Windows: npx is a .cmd script, needs cmd /c wrapper for spawn
|
|
830
|
+
claudeConfig.mcpServers.succ =
|
|
831
|
+
process.platform === 'win32'
|
|
832
|
+
? { command: 'cmd', args: ['/c', 'npx', '--yes', 'succ-mcp'] }
|
|
833
|
+
: { command: 'npx', args: ['--yes', 'succ-mcp'] };
|
|
834
|
+
// Write config
|
|
835
|
+
fs.writeFileSync(claudeConfigPath, JSON.stringify(claudeConfig, null, 2));
|
|
836
|
+
return 'added';
|
|
837
|
+
}
|
|
838
|
+
catch (error) {
|
|
839
|
+
logWarn('init', `Failed to add MCP server to ${claudeConfigPath}`, { error: String(error) });
|
|
840
|
+
console.warn(` Warning: Failed to add MCP server to ${claudeConfigPath}: ${error.message}`);
|
|
841
|
+
logWarn('init', 'You can add it manually: succ init --force');
|
|
842
|
+
console.warn(' You can add it manually: succ init --force');
|
|
843
|
+
return 'failed';
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
// ============================================================================
|
|
847
|
+
// Hook Content (reads from package hooks/ directory)
|
|
848
|
+
// ============================================================================
|
|
849
|
+
/**
|
|
850
|
+
* Get hook content by filename from package hooks/ directory
|
|
851
|
+
* Falls back to null if file not found (hooks are required in npm package)
|
|
852
|
+
*/
|
|
853
|
+
function getHookContent(hookFile) {
|
|
854
|
+
const hookPath = path.join(SUCC_PACKAGE_DIR, 'hooks', hookFile);
|
|
855
|
+
try {
|
|
856
|
+
if (fs.existsSync(hookPath)) {
|
|
857
|
+
return fs.readFileSync(hookPath, 'utf-8');
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
catch {
|
|
861
|
+
// File read error
|
|
862
|
+
}
|
|
863
|
+
return null;
|
|
864
|
+
}
|
|
865
|
+
//# sourceMappingURL=init.js.map
|