vemora 0.1.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +716 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +589 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/ask.d.ts +14 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +136 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/audit.d.ts +17 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +408 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/brief.d.ts +14 -0
- package/dist/commands/brief.d.ts.map +1 -0
- package/dist/commands/brief.js +73 -0
- package/dist/commands/brief.js.map +1 -0
- package/dist/commands/chat.d.ts +7 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +161 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/context.d.ts +61 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +778 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/deps.d.ts +20 -0
- package/dist/commands/deps.d.ts.map +1 -0
- package/dist/commands/deps.js +138 -0
- package/dist/commands/deps.js.map +1 -0
- package/dist/commands/focus.d.ts +6 -0
- package/dist/commands/focus.d.ts.map +1 -0
- package/dist/commands/focus.js +302 -0
- package/dist/commands/focus.js.map +1 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +366 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init-agent.d.ts +23 -0
- package/dist/commands/init-agent.d.ts.map +1 -0
- package/dist/commands/init-agent.js +447 -0
- package/dist/commands/init-agent.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +122 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/knowledge.d.ts +8 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +98 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/plan.d.ts +16 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +535 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/query.d.ts +39 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +389 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/remember.d.ts +11 -0
- package/dist/commands/remember.d.ts.map +1 -0
- package/dist/commands/remember.js +174 -0
- package/dist/commands/remember.js.map +1 -0
- package/dist/commands/report.d.ts +10 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +180 -0
- package/dist/commands/report.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 +127 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/summarize.d.ts +14 -0
- package/dist/commands/summarize.d.ts.map +1 -0
- package/dist/commands/summarize.js +205 -0
- package/dist/commands/summarize.js.map +1 -0
- package/dist/commands/triage.d.ts +33 -0
- package/dist/commands/triage.d.ts.map +1 -0
- package/dist/commands/triage.js +419 -0
- package/dist/commands/triage.js.map +1 -0
- package/dist/commands/usages.d.ts +14 -0
- package/dist/commands/usages.d.ts.map +1 -0
- package/dist/commands/usages.js +236 -0
- package/dist/commands/usages.js.map +1 -0
- package/dist/core/config.d.ts +35 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +140 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/types.d.ts +251 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -0
- package/dist/embeddings/factory.d.ts +9 -0
- package/dist/embeddings/factory.d.ts.map +1 -0
- package/dist/embeddings/factory.js +26 -0
- package/dist/embeddings/factory.js.map +1 -0
- package/dist/embeddings/noop.d.ts +17 -0
- package/dist/embeddings/noop.d.ts.map +1 -0
- package/dist/embeddings/noop.js +22 -0
- package/dist/embeddings/noop.js.map +1 -0
- package/dist/embeddings/ollama.d.ts +16 -0
- package/dist/embeddings/ollama.d.ts.map +1 -0
- package/dist/embeddings/ollama.js +41 -0
- package/dist/embeddings/ollama.js.map +1 -0
- package/dist/embeddings/openai.d.ts +10 -0
- package/dist/embeddings/openai.d.ts.map +1 -0
- package/dist/embeddings/openai.js +67 -0
- package/dist/embeddings/openai.js.map +1 -0
- package/dist/embeddings/provider.d.ts +19 -0
- package/dist/embeddings/provider.d.ts.map +1 -0
- package/dist/embeddings/provider.js +3 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/indexer/callgraph.d.ts +16 -0
- package/dist/indexer/callgraph.d.ts.map +1 -0
- package/dist/indexer/callgraph.js +154 -0
- package/dist/indexer/callgraph.js.map +1 -0
- package/dist/indexer/chunkBySlidingWindow.d.ts +6 -0
- package/dist/indexer/chunkBySlidingWindow.d.ts.map +1 -0
- package/dist/indexer/chunkBySlidingWindow.js +30 -0
- package/dist/indexer/chunkBySlidingWindow.js.map +1 -0
- package/dist/indexer/chunkBySymbols.d.ts +7 -0
- package/dist/indexer/chunkBySymbols.d.ts.map +1 -0
- package/dist/indexer/chunkBySymbols.js +57 -0
- package/dist/indexer/chunkBySymbols.js.map +1 -0
- package/dist/indexer/chunker.d.ts +15 -0
- package/dist/indexer/chunker.d.ts.map +1 -0
- package/dist/indexer/chunker.js +26 -0
- package/dist/indexer/chunker.js.map +1 -0
- package/dist/indexer/classHeader.d.ts +7 -0
- package/dist/indexer/classHeader.d.ts.map +1 -0
- package/dist/indexer/classHeader.js +37 -0
- package/dist/indexer/classHeader.js.map +1 -0
- package/dist/indexer/deps.d.ts +66 -0
- package/dist/indexer/deps.d.ts.map +1 -0
- package/dist/indexer/deps.js +409 -0
- package/dist/indexer/deps.js.map +1 -0
- package/dist/indexer/hasher.d.ts +17 -0
- package/dist/indexer/hasher.d.ts.map +1 -0
- package/dist/indexer/hasher.js +38 -0
- package/dist/indexer/hasher.js.map +1 -0
- package/dist/indexer/parser.d.ts +18 -0
- package/dist/indexer/parser.d.ts.map +1 -0
- package/dist/indexer/parser.js +355 -0
- package/dist/indexer/parser.js.map +1 -0
- package/dist/indexer/scanner.d.ts +18 -0
- package/dist/indexer/scanner.d.ts.map +1 -0
- package/dist/indexer/scanner.js +37 -0
- package/dist/indexer/scanner.js.map +1 -0
- package/dist/indexer/strategy.d.ts +11 -0
- package/dist/indexer/strategy.d.ts.map +1 -0
- package/dist/indexer/strategy.js +15 -0
- package/dist/indexer/strategy.js.map +1 -0
- package/dist/indexer/tests.d.ts +15 -0
- package/dist/indexer/tests.d.ts.map +1 -0
- package/dist/indexer/tests.js +68 -0
- package/dist/indexer/tests.js.map +1 -0
- package/dist/indexer/todos.d.ts +9 -0
- package/dist/indexer/todos.d.ts.map +1 -0
- package/dist/indexer/todos.js +29 -0
- package/dist/indexer/todos.js.map +1 -0
- package/dist/llm/anthropic.d.ts +8 -0
- package/dist/llm/anthropic.d.ts.map +1 -0
- package/dist/llm/anthropic.js +76 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/factory.d.ts +7 -0
- package/dist/llm/factory.d.ts.map +1 -0
- package/dist/llm/factory.js +39 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/ollama.d.ts +8 -0
- package/dist/llm/ollama.d.ts.map +1 -0
- package/dist/llm/ollama.js +83 -0
- package/dist/llm/ollama.js.map +1 -0
- package/dist/llm/openai.d.ts +8 -0
- package/dist/llm/openai.d.ts.map +1 -0
- package/dist/llm/openai.js +68 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/provider.d.ts +29 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +3 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/search/bm25.d.ts +3 -0
- package/dist/search/bm25.d.ts.map +1 -0
- package/dist/search/bm25.js +102 -0
- package/dist/search/bm25.js.map +1 -0
- package/dist/search/formatter.d.ts +43 -0
- package/dist/search/formatter.d.ts.map +1 -0
- package/dist/search/formatter.js +208 -0
- package/dist/search/formatter.js.map +1 -0
- package/dist/search/hybrid.d.ts +10 -0
- package/dist/search/hybrid.d.ts.map +1 -0
- package/dist/search/hybrid.js +53 -0
- package/dist/search/hybrid.js.map +1 -0
- package/dist/search/merge.d.ts +33 -0
- package/dist/search/merge.d.ts.map +1 -0
- package/dist/search/merge.js +158 -0
- package/dist/search/merge.js.map +1 -0
- package/dist/search/mmr.d.ts +23 -0
- package/dist/search/mmr.d.ts.map +1 -0
- package/dist/search/mmr.js +95 -0
- package/dist/search/mmr.js.map +1 -0
- package/dist/search/rerank.d.ts +15 -0
- package/dist/search/rerank.d.ts.map +1 -0
- package/dist/search/rerank.js +76 -0
- package/dist/search/rerank.js.map +1 -0
- package/dist/search/signature.d.ts +42 -0
- package/dist/search/signature.d.ts.map +1 -0
- package/dist/search/signature.js +112 -0
- package/dist/search/signature.js.map +1 -0
- package/dist/search/vector.d.ts +41 -0
- package/dist/search/vector.d.ts.map +1 -0
- package/dist/search/vector.js +185 -0
- package/dist/search/vector.js.map +1 -0
- package/dist/storage/cache.d.ts +30 -0
- package/dist/storage/cache.d.ts.map +1 -0
- package/dist/storage/cache.js +160 -0
- package/dist/storage/cache.js.map +1 -0
- package/dist/storage/knowledge.d.ts +17 -0
- package/dist/storage/knowledge.d.ts.map +1 -0
- package/dist/storage/knowledge.js +58 -0
- package/dist/storage/knowledge.js.map +1 -0
- package/dist/storage/repository.d.ts +27 -0
- package/dist/storage/repository.d.ts.map +1 -0
- package/dist/storage/repository.js +95 -0
- package/dist/storage/repository.js.map +1 -0
- package/dist/storage/session.d.ts +38 -0
- package/dist/storage/session.d.ts.map +1 -0
- package/dist/storage/session.js +100 -0
- package/dist/storage/session.js.map +1 -0
- package/dist/storage/summaries.d.ts +19 -0
- package/dist/storage/summaries.d.ts.map +1 -0
- package/dist/storage/summaries.js +66 -0
- package/dist/storage/summaries.js.map +1 -0
- package/dist/storage/usage.d.ts +35 -0
- package/dist/storage/usage.d.ts.map +1 -0
- package/dist/storage/usage.js +55 -0
- package/dist/storage/usage.js.map +1 -0
- package/dist/utils/git.d.ts +15 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +38 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/tokenizer.d.ts +24 -0
- package/dist/utils/tokenizer.d.ts.map +1 -0
- package/dist/utils/tokenizer.js +52 -0
- package/dist/utils/tokenizer.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DEFAULT_INSTRUCTIONS = exports.MARKER_END = exports.MARKER_START = void 0;
|
|
7
|
+
exports.runInitAgent = runInitAgent;
|
|
8
|
+
exports.buildGeneratedBlock = buildGeneratedBlock;
|
|
9
|
+
exports.detectNpmScripts = detectNpmScripts;
|
|
10
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
11
|
+
const fs_1 = __importDefault(require("fs"));
|
|
12
|
+
const path_1 = __importDefault(require("path"));
|
|
13
|
+
const config_1 = require("../core/config");
|
|
14
|
+
const deps_1 = require("../indexer/deps");
|
|
15
|
+
const repository_1 = require("../storage/repository");
|
|
16
|
+
const summaries_1 = require("../storage/summaries");
|
|
17
|
+
// ─── Markers ──────────────────────────────────────────────────────────────────
|
|
18
|
+
exports.MARKER_START = "<!-- vemora:generated:start -->";
|
|
19
|
+
exports.MARKER_END = "<!-- vemora:generated:end -->";
|
|
20
|
+
// ─── Default instructions ─────────────────────────────────────────────────────
|
|
21
|
+
exports.DEFAULT_INSTRUCTIONS = `## Working with this codebase
|
|
22
|
+
|
|
23
|
+
- **Before reading any file**, check the Key Exports table below to locate the relevant symbol.
|
|
24
|
+
- **Before querying**, try \`vemora query\` first — open a file only if the returned context is insufficient.
|
|
25
|
+
- **Before deep-diving a file or symbol**, use \`vemora focus\` — it aggregates implementation, deps, callers, tests, and knowledge in one call.
|
|
26
|
+
- **Before modifying a file**, check its blast radius: \`vemora deps <file> --root . --reverse-depth 2\`.
|
|
27
|
+
- **Before renaming a symbol or changing its API**, check who uses it: \`vemora usages <SymbolName> --root .\`.
|
|
28
|
+
- **After making changes**, always run the build/test command to verify correctness before declaring done.
|
|
29
|
+
- **Scope discipline**: only make changes directly requested. Do not refactor surrounding code, add comments, or improve things that were not explicitly asked.
|
|
30
|
+
- **Save non-obvious findings** with \`vemora remember\` when you discover a gotcha, an architectural decision, or a pattern worth preserving for future sessions. Do not save things already obvious from reading the code.
|
|
31
|
+
|
|
32
|
+
## Session setup
|
|
33
|
+
|
|
34
|
+
At the **start of each session**, load the project primer:
|
|
35
|
+
|
|
36
|
+
\`\`\`bash
|
|
37
|
+
vemora brief --root .
|
|
38
|
+
\`\`\`
|
|
39
|
+
|
|
40
|
+
For a live index, also run this in a background terminal:
|
|
41
|
+
|
|
42
|
+
\`\`\`bash
|
|
43
|
+
vemora index --root . --watch
|
|
44
|
+
\`\`\`
|
|
45
|
+
|
|
46
|
+
Without it, re-index manually after significant changes:
|
|
47
|
+
|
|
48
|
+
\`\`\`bash
|
|
49
|
+
vemora index --root . --no-embed
|
|
50
|
+
\`\`\`
|
|
51
|
+
|
|
52
|
+
## Session memory
|
|
53
|
+
|
|
54
|
+
During the session, **proactively save** anything non-obvious that future sessions would benefit from knowing:
|
|
55
|
+
|
|
56
|
+
\`\`\`bash
|
|
57
|
+
vemora remember "text" --root . # category is auto-classified by the LLM
|
|
58
|
+
\`\`\`
|
|
59
|
+
|
|
60
|
+
**Save:** why a design decision was made, a non-obvious constraint, a bug and its root cause, an approved pattern.
|
|
61
|
+
**Do not save:** things obvious from reading the code, file structure, recent changes (use \`git log\`), or anything already in the index.
|
|
62
|
+
|
|
63
|
+
## Quick reference
|
|
64
|
+
|
|
65
|
+
Use this decision tree to choose the right command:
|
|
66
|
+
|
|
67
|
+
| Situation | Command |
|
|
68
|
+
|---|---|
|
|
69
|
+
| Session start — re-establish context | \`brief --root .\` |
|
|
70
|
+
| User asks about a function, class, or file | \`focus <file-or-symbol> --root .\` |
|
|
71
|
+
| User asks a concept/how-does-X-work question | \`context --root . --query "<question>"\` |
|
|
72
|
+
| User asks to fix / refactor / add code | \`context --root . --query "<task>" --keyword\`, then check for \`*.test.ts\` before editing |
|
|
73
|
+
| Complex multi-step task | \`plan "<task>" --root . --confirm --synthesize\` |
|
|
74
|
+
| Security / performance / bug audit | \`audit --root . --type security,bugs\` |
|
|
75
|
+
| Quick static scan — no API key needed | \`triage --root . --type bugs,security\` |
|
|
76
|
+
| Output is too long for your context window | add \`--budget 2000\` (or lower) to any command |
|
|
77
|
+
| No embeddings available / fast keyword search | add \`--keyword\` to any \`query\` or \`context\` call |
|
|
78
|
+
| Need to understand who imports a file | \`deps <file> --root .\` |
|
|
79
|
+
| Need to see the full blast radius of a change | \`deps <file> --root . --reverse-depth 3\` |
|
|
80
|
+
| Need to find who calls a specific symbol | \`usages <SymbolName> --root .\` |`;
|
|
81
|
+
// ─── Main command ─────────────────────────────────────────────────────────────
|
|
82
|
+
async function runInitAgent(rootDir, options = {}) {
|
|
83
|
+
const ALL_AGENTS = ["claude", "copilot", "cursor", "windsurf", "gemini"];
|
|
84
|
+
const targets = options.agents ?? ALL_AGENTS;
|
|
85
|
+
const force = options.force ?? false;
|
|
86
|
+
const config = (0, config_1.loadConfig)(rootDir);
|
|
87
|
+
const repo = new repository_1.RepositoryStorage(rootDir);
|
|
88
|
+
const summaryStorage = new summaries_1.SummaryStorage(rootDir);
|
|
89
|
+
// ── Load index data ──────────────────────────────────────────────────────────
|
|
90
|
+
const symbols = repo.loadSymbols();
|
|
91
|
+
const depGraph = repo.loadDeps();
|
|
92
|
+
const fileSummaries = summaryStorage.hasFileSummaries()
|
|
93
|
+
? summaryStorage.loadFileSummaries()
|
|
94
|
+
: {};
|
|
95
|
+
const projectSummary = summaryStorage.loadProjectSummary();
|
|
96
|
+
// ── Derived data ─────────────────────────────────────────────────────────────
|
|
97
|
+
// Entry points: files that import others but are not imported by anyone.
|
|
98
|
+
const importedByMap = (0, deps_1.computeImportedBy)(depGraph);
|
|
99
|
+
const entryPoints = Object.keys(depGraph)
|
|
100
|
+
.filter((f) => !importedByMap.has(f) && depGraph[f].imports.length > 0)
|
|
101
|
+
.slice(0, 10);
|
|
102
|
+
// Key exports: exported symbols from source files only (exclude docs/, tests/).
|
|
103
|
+
const exportedSymbols = Object.entries(symbols)
|
|
104
|
+
.filter(([, s]) => s.exported && s.file.startsWith("src/"))
|
|
105
|
+
.sort((a, b) => a[1].type.localeCompare(b[1].type) || a[0].localeCompare(b[0]))
|
|
106
|
+
.slice(0, 60);
|
|
107
|
+
// npm scripts from package.json (build, test, dev commands).
|
|
108
|
+
const npmScripts = detectNpmScripts(rootDir);
|
|
109
|
+
// ── Build generated block ────────────────────────────────────────────────────
|
|
110
|
+
const block = buildGeneratedBlock(config.projectName, projectSummary?.overview ?? null, npmScripts, entryPoints, fileSummaries, exportedSymbols);
|
|
111
|
+
// ── Process each target ──────────────────────────────────────────────────────
|
|
112
|
+
for (const agent of targets) {
|
|
113
|
+
writeAgentFile(agent, rootDir, config.projectName, block, force);
|
|
114
|
+
}
|
|
115
|
+
// ── Claude Code hooks ────────────────────────────────────────────────────────
|
|
116
|
+
if (options.hooks && targets.includes("claude")) {
|
|
117
|
+
writeClaudeHooks(rootDir, force);
|
|
118
|
+
}
|
|
119
|
+
if (!projectSummary) {
|
|
120
|
+
console.log(chalk_1.default.gray(" Tip: run `vemora summarize` to add a project overview."));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// ─── Per-agent file writers ───────────────────────────────────────────────────
|
|
124
|
+
function writeAgentFile(agent, rootDir, projectName, block, force) {
|
|
125
|
+
switch (agent) {
|
|
126
|
+
case "claude":
|
|
127
|
+
writeClaudeFile(rootDir, projectName, block, force);
|
|
128
|
+
break;
|
|
129
|
+
case "copilot":
|
|
130
|
+
writeCopilotFile(rootDir, block, force);
|
|
131
|
+
break;
|
|
132
|
+
case "cursor":
|
|
133
|
+
writeCursorFile(rootDir, block, force);
|
|
134
|
+
break;
|
|
135
|
+
case "windsurf":
|
|
136
|
+
writeWindsurfFile(rootDir, block, force);
|
|
137
|
+
break;
|
|
138
|
+
case "gemini":
|
|
139
|
+
writeGeminiFile(rootDir, projectName, block, force);
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const CLAUDE_EXTRA_INSTRUCTIONS = `
|
|
144
|
+
## Claude Code memory
|
|
145
|
+
|
|
146
|
+
In addition to \`vemora remember\`, Claude Code has its own persistent memory system.
|
|
147
|
+
Use it to save user preferences, feedback, and context that goes beyond the codebase itself:
|
|
148
|
+
|
|
149
|
+
- Save user preferences, working style, and feedback that should persist across sessions.
|
|
150
|
+
- At session end, write any non-obvious discoveries or decisions that aren't already captured by \`vemora remember\`.
|
|
151
|
+
- Read memory at session start to re-establish context without asking the user to repeat themselves.
|
|
152
|
+
`;
|
|
153
|
+
function writeClaudeFile(rootDir, projectName, block, force) {
|
|
154
|
+
const outputPath = path_1.default.join(rootDir, "CLAUDE.md");
|
|
155
|
+
const label = "Claude Code: CLAUDE.md";
|
|
156
|
+
const fullInstructions = exports.DEFAULT_INSTRUCTIONS + CLAUDE_EXTRA_INSTRUCTIONS;
|
|
157
|
+
if (!fs_1.default.existsSync(outputPath)) {
|
|
158
|
+
const content = `# ${projectName}\n\n${fullInstructions}\n\n${block}\n`;
|
|
159
|
+
fs_1.default.writeFileSync(outputPath, content, "utf-8");
|
|
160
|
+
console.log(chalk_1.default.green(`✓ ${label} created`));
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
const result = mergeOrOverwrite(outputPath, `# ${projectName}\n\n${fullInstructions}\n\n${block}\n`, block, force, label);
|
|
164
|
+
if (!result)
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function writeCopilotFile(rootDir, block, force) {
|
|
169
|
+
const outputPath = path_1.default.join(rootDir, ".github", "copilot-instructions.md");
|
|
170
|
+
const label = "Copilot: .github/copilot-instructions.md";
|
|
171
|
+
if (!fs_1.default.existsSync(outputPath)) {
|
|
172
|
+
fs_1.default.mkdirSync(path_1.default.dirname(outputPath), { recursive: true });
|
|
173
|
+
const content = `${exports.DEFAULT_INSTRUCTIONS}\n\n${block}\n`;
|
|
174
|
+
fs_1.default.writeFileSync(outputPath, content, "utf-8");
|
|
175
|
+
console.log(chalk_1.default.green(`✓ ${label} created`));
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
mergeOrOverwrite(outputPath, `${exports.DEFAULT_INSTRUCTIONS}\n\n${block}\n`, block, force, label);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function writeCursorFile(rootDir, block, force) {
|
|
182
|
+
const outputPath = path_1.default.join(rootDir, ".cursor", "rules", "vemora.mdc");
|
|
183
|
+
const label = "Cursor: .cursor/rules/vemora.mdc";
|
|
184
|
+
const frontmatter = "---\ndescription: vemora codebase context\nalwaysApply: true\n---";
|
|
185
|
+
if (!fs_1.default.existsSync(outputPath)) {
|
|
186
|
+
fs_1.default.mkdirSync(path_1.default.dirname(outputPath), { recursive: true });
|
|
187
|
+
const content = `${frontmatter}\n\n${exports.DEFAULT_INSTRUCTIONS}\n\n${block}\n`;
|
|
188
|
+
fs_1.default.writeFileSync(outputPath, content, "utf-8");
|
|
189
|
+
console.log(chalk_1.default.green(`✓ ${label} created`));
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
const existing = fs_1.default.readFileSync(outputPath, "utf-8");
|
|
193
|
+
const startIdx = existing.indexOf(exports.MARKER_START);
|
|
194
|
+
const endIdx = existing.indexOf(exports.MARKER_END);
|
|
195
|
+
if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
|
|
196
|
+
// Preserve everything before markers (includes frontmatter)
|
|
197
|
+
const before = existing.slice(0, startIdx);
|
|
198
|
+
const after = existing.slice(endIdx + exports.MARKER_END.length);
|
|
199
|
+
fs_1.default.writeFileSync(outputPath, before + block + after, "utf-8");
|
|
200
|
+
console.log(chalk_1.default.green(`✓ ${label} updated (merged)`));
|
|
201
|
+
}
|
|
202
|
+
else if (force) {
|
|
203
|
+
const content = `${frontmatter}\n\n${exports.DEFAULT_INSTRUCTIONS}\n\n${block}\n`;
|
|
204
|
+
fs_1.default.writeFileSync(outputPath, content, "utf-8");
|
|
205
|
+
console.log(chalk_1.default.green(`✓ ${label} overwritten`));
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
printNoMarkersWarning(label);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function writeGeminiFile(rootDir, projectName, block, force) {
|
|
213
|
+
const outputPath = path_1.default.join(rootDir, "GEMINI.md");
|
|
214
|
+
const label = "Gemini: GEMINI.md";
|
|
215
|
+
if (!fs_1.default.existsSync(outputPath)) {
|
|
216
|
+
const content = `# ${projectName}\n\n${exports.DEFAULT_INSTRUCTIONS}\n\n${block}\n`;
|
|
217
|
+
fs_1.default.writeFileSync(outputPath, content, "utf-8");
|
|
218
|
+
console.log(chalk_1.default.green(`✓ ${label} created`));
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
mergeOrOverwrite(outputPath, `# ${projectName}\n\n${exports.DEFAULT_INSTRUCTIONS}\n\n${block}\n`, block, force, label);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
function writeWindsurfFile(rootDir, block, force) {
|
|
225
|
+
const outputPath = path_1.default.join(rootDir, ".windsurfrules");
|
|
226
|
+
const label = "Windsurf: .windsurfrules";
|
|
227
|
+
if (!fs_1.default.existsSync(outputPath)) {
|
|
228
|
+
const content = `${exports.DEFAULT_INSTRUCTIONS}\n\n${block}\n`;
|
|
229
|
+
fs_1.default.writeFileSync(outputPath, content, "utf-8");
|
|
230
|
+
console.log(chalk_1.default.green(`✓ ${label} created`));
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
mergeOrOverwrite(outputPath, `${exports.DEFAULT_INSTRUCTIONS}\n\n${block}\n`, block, force, label);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// ─── Shared helpers ───────────────────────────────────────────────────────────
|
|
237
|
+
/**
|
|
238
|
+
* Merge block into existing file between markers, or overwrite/warn.
|
|
239
|
+
* Returns true if file was written, false if skipped.
|
|
240
|
+
*/
|
|
241
|
+
function mergeOrOverwrite(outputPath, newContent, block, force, label) {
|
|
242
|
+
const existing = fs_1.default.readFileSync(outputPath, "utf-8");
|
|
243
|
+
const startIdx = existing.indexOf(exports.MARKER_START);
|
|
244
|
+
const endIdx = existing.indexOf(exports.MARKER_END);
|
|
245
|
+
if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
|
|
246
|
+
const before = existing.slice(0, startIdx);
|
|
247
|
+
const after = existing.slice(endIdx + exports.MARKER_END.length);
|
|
248
|
+
fs_1.default.writeFileSync(outputPath, before + block + after, "utf-8");
|
|
249
|
+
console.log(chalk_1.default.green(`✓ ${label} updated (merged)`));
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
if (force) {
|
|
253
|
+
fs_1.default.writeFileSync(outputPath, newContent, "utf-8");
|
|
254
|
+
console.log(chalk_1.default.green(`✓ ${label} overwritten`));
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
printNoMarkersWarning(label);
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
function printNoMarkersWarning(label) {
|
|
261
|
+
console.log(chalk_1.default.yellow(`${label} exists but has no vemora markers.\n` +
|
|
262
|
+
" • Run with --force to overwrite it entirely.\n" +
|
|
263
|
+
" • Or manually add the markers to enable future merges:\n" +
|
|
264
|
+
` ${exports.MARKER_START}\n` +
|
|
265
|
+
` ${exports.MARKER_END}`));
|
|
266
|
+
}
|
|
267
|
+
// ─── Claude Code hooks ────────────────────────────────────────────────────────
|
|
268
|
+
/**
|
|
269
|
+
* Writes (or merges) vemora hook entries into .claude/settings.json.
|
|
270
|
+
*
|
|
271
|
+
* Two hooks are registered:
|
|
272
|
+
* - PreCompact — emergency knowledge save before Claude compacts the context
|
|
273
|
+
* - Stop — brief reminder to run `vemora remember` after each session
|
|
274
|
+
*
|
|
275
|
+
* Existing hooks unrelated to vemora are preserved.
|
|
276
|
+
*/
|
|
277
|
+
function writeClaudeHooks(rootDir, force) {
|
|
278
|
+
const settingsPath = path_1.default.join(rootDir, ".claude", "settings.json");
|
|
279
|
+
const label = "Claude Code hooks: .claude/settings.json";
|
|
280
|
+
// The PreCompact hook pipes the most recent assistant message into
|
|
281
|
+
// `vemora remember` so that any decision mentioned just before compaction
|
|
282
|
+
// is persisted. We cap input to 1000 chars to stay within CLI limits.
|
|
283
|
+
const vemoraHooks = {
|
|
284
|
+
PreCompact: [
|
|
285
|
+
{
|
|
286
|
+
matcher: "",
|
|
287
|
+
hooks: [
|
|
288
|
+
{
|
|
289
|
+
type: "command",
|
|
290
|
+
command: "echo \"Pre-compact save: run 'vemora remember <decision> --root . --category decision' to preserve any key decision before context is compressed.\"",
|
|
291
|
+
},
|
|
292
|
+
],
|
|
293
|
+
},
|
|
294
|
+
],
|
|
295
|
+
};
|
|
296
|
+
let existing = {};
|
|
297
|
+
if (fs_1.default.existsSync(settingsPath)) {
|
|
298
|
+
if (!force) {
|
|
299
|
+
// Merge: add only the hooks that aren't already present
|
|
300
|
+
try {
|
|
301
|
+
existing = JSON.parse(fs_1.default.readFileSync(settingsPath, "utf-8"));
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
existing = {};
|
|
305
|
+
}
|
|
306
|
+
const existingHooks = (existing.hooks ?? {});
|
|
307
|
+
// Only add PreCompact if not already set
|
|
308
|
+
if (existingHooks.PreCompact) {
|
|
309
|
+
console.log(chalk_1.default.yellow(` ${label} — PreCompact hook already exists, skipping. Use --force to overwrite.`));
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
existing.hooks = { ...existingHooks, ...vemoraHooks };
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
try {
|
|
316
|
+
existing = JSON.parse(fs_1.default.readFileSync(settingsPath, "utf-8"));
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
existing = {};
|
|
320
|
+
}
|
|
321
|
+
existing.hooks = {
|
|
322
|
+
...(existing.hooks ?? {}),
|
|
323
|
+
...vemoraHooks,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
existing = { hooks: vemoraHooks };
|
|
329
|
+
}
|
|
330
|
+
fs_1.default.mkdirSync(path_1.default.dirname(settingsPath), { recursive: true });
|
|
331
|
+
const tmp = settingsPath + ".tmp";
|
|
332
|
+
fs_1.default.writeFileSync(tmp, JSON.stringify(existing, null, 2), "utf-8");
|
|
333
|
+
fs_1.default.renameSync(tmp, settingsPath);
|
|
334
|
+
console.log(chalk_1.default.green(`✓ ${label} updated`));
|
|
335
|
+
}
|
|
336
|
+
// ─── Block builder ────────────────────────────────────────────────────────────
|
|
337
|
+
function buildGeneratedBlock(_projectName, projectOverview, npmScripts, entryPoints, fileSummaries, exportedSymbols) {
|
|
338
|
+
const lines = [];
|
|
339
|
+
lines.push(exports.MARKER_START);
|
|
340
|
+
lines.push("");
|
|
341
|
+
// Project overview
|
|
342
|
+
lines.push("## Project Overview");
|
|
343
|
+
lines.push("");
|
|
344
|
+
lines.push(projectOverview ??
|
|
345
|
+
"_(Run `vemora summarize` to generate an AI-written project overview.)_");
|
|
346
|
+
lines.push("");
|
|
347
|
+
// Commands
|
|
348
|
+
if (Object.keys(npmScripts).length > 0) {
|
|
349
|
+
lines.push("## Commands");
|
|
350
|
+
lines.push("");
|
|
351
|
+
lines.push("```bash");
|
|
352
|
+
for (const [name, cmd] of Object.entries(npmScripts)) {
|
|
353
|
+
lines.push(`npm run ${name.padEnd(16)} # ${cmd}`);
|
|
354
|
+
}
|
|
355
|
+
lines.push("```");
|
|
356
|
+
lines.push("");
|
|
357
|
+
}
|
|
358
|
+
// Entry points
|
|
359
|
+
if (entryPoints.length > 0) {
|
|
360
|
+
lines.push("## Entry Points");
|
|
361
|
+
lines.push("");
|
|
362
|
+
for (const ep of entryPoints) {
|
|
363
|
+
const summary = fileSummaries[ep]?.summary;
|
|
364
|
+
lines.push(summary ? `- \`${ep}\` — ${summary}` : `- \`${ep}\``);
|
|
365
|
+
}
|
|
366
|
+
lines.push("");
|
|
367
|
+
}
|
|
368
|
+
// Key exports table
|
|
369
|
+
if (exportedSymbols.length > 0) {
|
|
370
|
+
lines.push("## Key Exports");
|
|
371
|
+
lines.push("");
|
|
372
|
+
lines.push("| Symbol | Type | File |");
|
|
373
|
+
lines.push("|---|---|---|");
|
|
374
|
+
for (const [name, sym] of exportedSymbols) {
|
|
375
|
+
lines.push(`| \`${name}\` | ${sym.type} | \`${sym.file}\` |`);
|
|
376
|
+
}
|
|
377
|
+
lines.push("");
|
|
378
|
+
}
|
|
379
|
+
// vemora usage instructions
|
|
380
|
+
lines.push("## Codebase Search (vemora)");
|
|
381
|
+
lines.push("");
|
|
382
|
+
lines.push("This project is indexed with `vemora`. Before working on unfamiliar code, use it to retrieve only the relevant context:");
|
|
383
|
+
lines.push("");
|
|
384
|
+
lines.push("```bash");
|
|
385
|
+
lines.push("# Session primer — load project overview + critical knowledge (~170 tokens)");
|
|
386
|
+
lines.push("vemora brief --root .");
|
|
387
|
+
lines.push("");
|
|
388
|
+
lines.push("# All context about a file or symbol in one call (impl + deps + callers + tests + knowledge)");
|
|
389
|
+
lines.push("vemora focus src/path/to/file.ts --root .");
|
|
390
|
+
lines.push("vemora focus SymbolName --root .");
|
|
391
|
+
lines.push("");
|
|
392
|
+
lines.push("# Semantic search — returns the most relevant code chunks");
|
|
393
|
+
lines.push('vemora query "your question" --root .');
|
|
394
|
+
lines.push('vemora query "your question" --root . --keyword # no embeddings needed');
|
|
395
|
+
lines.push('vemora query "your question" --root . --budget 3000 # cap token output');
|
|
396
|
+
lines.push("");
|
|
397
|
+
lines.push("# One-shot answer: retrieve context and call the configured LLM");
|
|
398
|
+
lines.push('vemora ask "your question" --root .');
|
|
399
|
+
lines.push("");
|
|
400
|
+
lines.push("# Generate a full context block to paste into any LLM");
|
|
401
|
+
lines.push('vemora context --root . --query "your question" > context.md');
|
|
402
|
+
lines.push("vemora context --root . --file src/path/to/file.ts");
|
|
403
|
+
lines.push("");
|
|
404
|
+
lines.push("# Complex multi-step task: pro LLM plans, smaller LLM executes each step");
|
|
405
|
+
lines.push('vemora plan "add rate limiting to the API layer" --root . --confirm --synthesize');
|
|
406
|
+
lines.push("");
|
|
407
|
+
lines.push("# Systematic LLM audit for security / performance / bugs");
|
|
408
|
+
lines.push("vemora audit --root . --type security,bugs");
|
|
409
|
+
lines.push("vemora audit --root . --since HEAD~1 # only changed files");
|
|
410
|
+
lines.push("");
|
|
411
|
+
lines.push("# Zero-LLM static scan — no API key needed");
|
|
412
|
+
lines.push("vemora triage --root . --type bugs,security");
|
|
413
|
+
lines.push("");
|
|
414
|
+
lines.push("# Dependency graph");
|
|
415
|
+
lines.push("vemora deps src/path/to/file.ts --root . --reverse-depth 2");
|
|
416
|
+
lines.push("vemora usages <SymbolName> --root .");
|
|
417
|
+
lines.push("");
|
|
418
|
+
lines.push("# Save a persistent note — category is auto-classified by the LLM");
|
|
419
|
+
lines.push('vemora remember "text" --root .');
|
|
420
|
+
lines.push("");
|
|
421
|
+
lines.push("# List saved knowledge entries");
|
|
422
|
+
lines.push("vemora knowledge list --root .");
|
|
423
|
+
lines.push("```");
|
|
424
|
+
lines.push("");
|
|
425
|
+
lines.push(`_Generated by \`vemora init-agent\` — ${new Date().toISOString()}_`);
|
|
426
|
+
lines.push("");
|
|
427
|
+
lines.push(exports.MARKER_END);
|
|
428
|
+
return lines.join("\n");
|
|
429
|
+
}
|
|
430
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
431
|
+
/**
|
|
432
|
+
* Reads npm scripts from package.json in rootDir.
|
|
433
|
+
* Returns an empty object if no package.json or no scripts field.
|
|
434
|
+
*/
|
|
435
|
+
function detectNpmScripts(rootDir) {
|
|
436
|
+
try {
|
|
437
|
+
const pkgPath = path_1.default.join(rootDir, "package.json");
|
|
438
|
+
if (!fs_1.default.existsSync(pkgPath))
|
|
439
|
+
return {};
|
|
440
|
+
const pkg = JSON.parse(fs_1.default.readFileSync(pkgPath, "utf-8"));
|
|
441
|
+
return pkg.scripts ?? {};
|
|
442
|
+
}
|
|
443
|
+
catch {
|
|
444
|
+
return {};
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
//# sourceMappingURL=init-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-agent.js","sourceRoot":"","sources":["../../src/commands/init-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAgBA,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6F5D"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.runInit = runInit;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const config_1 = require("../core/config");
|
|
11
|
+
async function runInit(rootDir) {
|
|
12
|
+
console.log(chalk_1.default.bold("Initializing vemora..."));
|
|
13
|
+
console.log(`Project root: ${chalk_1.default.cyan(rootDir)}`);
|
|
14
|
+
console.log();
|
|
15
|
+
const memoryDir = path_1.default.join(rootDir, config_1.AI_MEMORY_DIR);
|
|
16
|
+
const indexDir = path_1.default.join(memoryDir, config_1.INDEX_DIR);
|
|
17
|
+
const summariesDir = path_1.default.join(memoryDir, config_1.SUMMARIES_DIR);
|
|
18
|
+
// ── 1. Create directory structure ─────────────────────────────────────────
|
|
19
|
+
fs_1.default.mkdirSync(indexDir, { recursive: true });
|
|
20
|
+
fs_1.default.mkdirSync(summariesDir, { recursive: true });
|
|
21
|
+
console.log(chalk_1.default.green("✓") +
|
|
22
|
+
` Created ${chalk_1.default.gray(config_1.AI_MEMORY_DIR + "/index/")} and ${chalk_1.default.gray(config_1.AI_MEMORY_DIR + "/summaries/")}`);
|
|
23
|
+
// ── 2. config.json ────────────────────────────────────────────────────────
|
|
24
|
+
const configPath = path_1.default.join(memoryDir, config_1.CONFIG_FILE);
|
|
25
|
+
if (!fs_1.default.existsSync(configPath)) {
|
|
26
|
+
const projectName = detectProjectName(rootDir);
|
|
27
|
+
const config = (0, config_1.getDefaultConfig)(rootDir, projectName);
|
|
28
|
+
(0, config_1.saveConfig)(config);
|
|
29
|
+
console.log(chalk_1.default.green("✓") + ` Created ${chalk_1.default.gray(".vemora/config.json")}`);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
console.log(chalk_1.default.yellow("~") +
|
|
33
|
+
` ${chalk_1.default.gray(".vemora/config.json")} already exists, skipping`);
|
|
34
|
+
}
|
|
35
|
+
// ── 3. metadata.json ──────────────────────────────────────────────────────
|
|
36
|
+
const metaPath = path_1.default.join(memoryDir, config_1.METADATA_FILE);
|
|
37
|
+
if (!fs_1.default.existsSync(metaPath)) {
|
|
38
|
+
const config = (0, config_1.loadConfig)(rootDir);
|
|
39
|
+
const meta = {
|
|
40
|
+
projectId: config.projectId,
|
|
41
|
+
projectName: config.projectName,
|
|
42
|
+
lastIndexed: null,
|
|
43
|
+
indexedFiles: 0,
|
|
44
|
+
totalChunks: 0,
|
|
45
|
+
totalSymbols: 0,
|
|
46
|
+
totalDepEdges: 0,
|
|
47
|
+
embeddingProvider: config.embedding.provider,
|
|
48
|
+
embeddingModel: config.embedding.model,
|
|
49
|
+
};
|
|
50
|
+
fs_1.default.writeFileSync(metaPath, JSON.stringify(meta, null, 2));
|
|
51
|
+
console.log(chalk_1.default.green("✓") + ` Created ${chalk_1.default.gray(".vemora/metadata.json")}`);
|
|
52
|
+
}
|
|
53
|
+
// ── 4. Empty index files ──────────────────────────────────────────────────
|
|
54
|
+
const indexFiles = [
|
|
55
|
+
[path_1.default.join(indexDir, "files.json"), "{}"],
|
|
56
|
+
[path_1.default.join(indexDir, "chunks.json"), "[]"],
|
|
57
|
+
[path_1.default.join(indexDir, "symbols.json"), "{}"],
|
|
58
|
+
[path_1.default.join(indexDir, "callgraph.json"), "{}"],
|
|
59
|
+
];
|
|
60
|
+
for (const [filePath, emptyVal] of indexFiles) {
|
|
61
|
+
if (!fs_1.default.existsSync(filePath)) {
|
|
62
|
+
fs_1.default.writeFileSync(filePath, emptyVal, "utf-8");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
console.log(chalk_1.default.green("✓") +
|
|
66
|
+
` Created ${chalk_1.default.gray(".vemora/index/{files,chunks,symbols,callgraph}.json")}`);
|
|
67
|
+
// ── 5. .gitignore ─────────────────────────────────────────────────────────
|
|
68
|
+
await ensureGitignore(rootDir);
|
|
69
|
+
// ── Summary ───────────────────────────────────────────────────────────────
|
|
70
|
+
console.log();
|
|
71
|
+
console.log(chalk_1.default.bold.green("Done!"));
|
|
72
|
+
console.log();
|
|
73
|
+
console.log("Next steps:");
|
|
74
|
+
console.log(` 1. Review ${chalk_1.default.cyan(".vemora/config.json")} — adjust include/exclude patterns`);
|
|
75
|
+
console.log(` 2. Configure embedding provider (default: OpenAI via ${chalk_1.default.cyan("OPENAI_API_KEY")} env)`);
|
|
76
|
+
console.log(` 3. Run ${chalk_1.default.cyan("vemora index")} to build the index`);
|
|
77
|
+
console.log(` 4. Run ${chalk_1.default.cyan('vemora query "your question"')} to search`);
|
|
78
|
+
console.log();
|
|
79
|
+
console.log(chalk_1.default.gray(`Note: .vemora-cache/ is local-only and excluded from git.`));
|
|
80
|
+
}
|
|
81
|
+
function detectProjectName(rootDir) {
|
|
82
|
+
try {
|
|
83
|
+
const pkgPath = path_1.default.join(rootDir, "package.json");
|
|
84
|
+
if (fs_1.default.existsSync(pkgPath)) {
|
|
85
|
+
const pkg = JSON.parse(fs_1.default.readFileSync(pkgPath, "utf-8"));
|
|
86
|
+
if (pkg.name)
|
|
87
|
+
return pkg.name;
|
|
88
|
+
}
|
|
89
|
+
// Try pyproject.toml or Cargo.toml for non-JS projects
|
|
90
|
+
const pyproject = path_1.default.join(rootDir, "pyproject.toml");
|
|
91
|
+
if (fs_1.default.existsSync(pyproject)) {
|
|
92
|
+
const content = fs_1.default.readFileSync(pyproject, "utf-8");
|
|
93
|
+
const m = content.match(/^name\s*=\s*"([^"]+)"/m);
|
|
94
|
+
if (m)
|
|
95
|
+
return m[1];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// ignore
|
|
100
|
+
}
|
|
101
|
+
return path_1.default.basename(rootDir);
|
|
102
|
+
}
|
|
103
|
+
async function ensureGitignore(rootDir) {
|
|
104
|
+
const gitignorePath = path_1.default.join(rootDir, ".gitignore");
|
|
105
|
+
const entry = config_1.AI_MEMORY_CACHE_DIR + "/";
|
|
106
|
+
if (!fs_1.default.existsSync(gitignorePath)) {
|
|
107
|
+
fs_1.default.writeFileSync(gitignorePath, `# vemora local embedding cache\n${entry}\n`, "utf-8");
|
|
108
|
+
console.log(chalk_1.default.green("✓") +
|
|
109
|
+
` Created ${chalk_1.default.gray(".gitignore")} with ${chalk_1.default.gray(entry)}`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const existing = fs_1.default.readFileSync(gitignorePath, "utf-8");
|
|
113
|
+
if (existing.includes(config_1.AI_MEMORY_CACHE_DIR)) {
|
|
114
|
+
console.log(chalk_1.default.yellow("~") +
|
|
115
|
+
` ${chalk_1.default.gray(".gitignore")} already excludes ${chalk_1.default.gray(entry)}`);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
fs_1.default.appendFileSync(gitignorePath, `\n# vemora local embedding cache\n${entry}\n`, "utf-8");
|
|
119
|
+
console.log(chalk_1.default.green("✓") +
|
|
120
|
+
` Added ${chalk_1.default.gray(entry)} to ${chalk_1.default.gray(".gitignore")}`);
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface KnowledgeListOptions {
|
|
2
|
+
category?: string;
|
|
3
|
+
file?: string;
|
|
4
|
+
symbol?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function runKnowledgeList(rootDir: string, options?: KnowledgeListOptions): Promise<void>;
|
|
7
|
+
export declare function runKnowledgeForget(rootDir: string, id: string): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=knowledge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/commands/knowledge.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAkGf;AAID,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,IAAI,CAAC,CAoBf"}
|