@soleri/cli 9.0.2 → 9.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/agent.js +116 -3
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/create.js +6 -2
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/hooks.js +36 -13
- package/dist/commands/hooks.js.map +1 -1
- package/dist/commands/install.d.ts +1 -0
- package/dist/commands/install.js +61 -12
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/pack.js +0 -1
- package/dist/commands/pack.js.map +1 -1
- package/dist/commands/staging.d.ts +2 -0
- package/dist/commands/staging.js +175 -0
- package/dist/commands/staging.js.map +1 -0
- package/dist/hook-packs/full/manifest.json +2 -2
- package/dist/hook-packs/installer.d.ts +4 -11
- package/dist/hook-packs/installer.js +197 -23
- package/dist/hook-packs/installer.js.map +1 -1
- package/dist/hook-packs/installer.ts +223 -38
- package/dist/hook-packs/registry.d.ts +16 -13
- package/dist/hook-packs/registry.js +11 -18
- package/dist/hook-packs/registry.js.map +1 -1
- package/dist/hook-packs/registry.ts +31 -30
- package/dist/hook-packs/yolo-safety/manifest.json +23 -0
- package/dist/hook-packs/yolo-safety/scripts/anti-deletion.sh +214 -0
- package/dist/hooks/templates.js +1 -1
- package/dist/hooks/templates.js.map +1 -1
- package/dist/main.js +2 -0
- package/dist/main.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/create.test.ts +6 -2
- package/src/__tests__/hook-packs.test.ts +67 -25
- package/src/__tests__/wizard-e2e.mjs +153 -58
- package/src/commands/agent.ts +146 -3
- package/src/commands/create.ts +8 -2
- package/src/commands/hooks.ts +36 -31
- package/src/commands/install.ts +65 -22
- package/src/commands/pack.ts +0 -1
- package/src/commands/staging.ts +208 -0
- package/src/hook-packs/full/manifest.json +2 -2
- package/src/hook-packs/installer.ts +223 -38
- package/src/hook-packs/registry.ts +31 -30
- package/src/hook-packs/yolo-safety/manifest.json +23 -0
- package/src/hook-packs/yolo-safety/scripts/anti-deletion.sh +214 -0
- package/src/hooks/templates.ts +1 -1
- package/src/main.ts +2 -0
- package/dist/commands/cognee.d.ts +0 -10
- package/dist/commands/cognee.js +0 -364
- package/dist/commands/cognee.js.map +0 -1
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Anti-Deletion Staging Hook for Claude Code (Soleri Hook Pack: yolo-safety)
|
|
3
|
+
# PreToolUse -> Bash: intercepts rm, rmdir, mv (of project dirs), git clean, reset --hard
|
|
4
|
+
# Copies target files to ~/.soleri/staging/<timestamp>/ then blocks the command.
|
|
5
|
+
#
|
|
6
|
+
# Catastrophic commands (rm -rf /, rm -rf ~) should stay in deny rules —
|
|
7
|
+
# this hook handles targeted deletes only.
|
|
8
|
+
#
|
|
9
|
+
# Dependencies: jq (required), perl (optional, for heredoc stripping)
|
|
10
|
+
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
|
|
13
|
+
STAGING_ROOT="$HOME/.soleri/staging"
|
|
14
|
+
PROJECTS_DIR="$HOME/projects"
|
|
15
|
+
INPUT=$(cat)
|
|
16
|
+
|
|
17
|
+
# Extract the command from stdin JSON
|
|
18
|
+
CMD=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
19
|
+
|
|
20
|
+
# No command found — let it through
|
|
21
|
+
if [ -z "$CMD" ]; then
|
|
22
|
+
exit 0
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
# --- Strip heredocs and quoted strings to avoid false positives ---
|
|
26
|
+
# Commands like: gh issue comment --body "$(cat <<'EOF' ... rmdir ... EOF)"
|
|
27
|
+
# contain destructive keywords in text, not as actual commands.
|
|
28
|
+
|
|
29
|
+
# Remove heredoc blocks: <<'EOF'...EOF and <<EOF...EOF (multiline)
|
|
30
|
+
STRIPPED=$(echo "$CMD" | perl -0777 -pe "s/<<'?\\w+'?.*?^\\w+$//gms" 2>/dev/null || echo "$CMD")
|
|
31
|
+
# Remove double-quoted strings (greedy but good enough for this check)
|
|
32
|
+
STRIPPED=$(echo "$STRIPPED" | sed -E 's/"[^"]*"//g' 2>/dev/null || echo "$STRIPPED")
|
|
33
|
+
# Remove single-quoted strings
|
|
34
|
+
STRIPPED=$(echo "$STRIPPED" | sed -E "s/'[^']*'//g" 2>/dev/null || echo "$STRIPPED")
|
|
35
|
+
|
|
36
|
+
# --- Detect destructive commands (on stripped command only) ---
|
|
37
|
+
|
|
38
|
+
IS_RM=false
|
|
39
|
+
IS_RMDIR=false
|
|
40
|
+
IS_MV_PROJECT=false
|
|
41
|
+
IS_GIT_CLEAN=false
|
|
42
|
+
IS_RESET_HARD=false
|
|
43
|
+
IS_GIT_CHECKOUT_DOT=false
|
|
44
|
+
IS_GIT_RESTORE_DOT=false
|
|
45
|
+
|
|
46
|
+
# Check for rm commands (but not git rm which is safe — it stages, doesn't destroy)
|
|
47
|
+
if echo "$STRIPPED" | grep -qE '(^|\s|;|&&|\|\|)rm\s'; then
|
|
48
|
+
if ! echo "$STRIPPED" | grep -qE '(^|\s)git\s+rm\s'; then
|
|
49
|
+
IS_RM=true
|
|
50
|
+
fi
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
# Check for rmdir commands
|
|
54
|
+
if echo "$STRIPPED" | grep -qE '(^|\s|;|&&|\|\|)rmdir\s'; then
|
|
55
|
+
IS_RMDIR=true
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
# Check for mv commands that move project directories or git repos
|
|
59
|
+
if echo "$STRIPPED" | grep -qE '(^|\s|;|&&|\|\|)mv\s'; then
|
|
60
|
+
MV_SOURCES=$(echo "$STRIPPED" | sed -E 's/^.*\bmv\s+//' | sed -E 's/-(f|i|n|v)\s+//g')
|
|
61
|
+
if echo "$MV_SOURCES" | grep -qE "(~/projects|$HOME/projects|\\\$HOME/projects|\\.git)"; then
|
|
62
|
+
IS_MV_PROJECT=true
|
|
63
|
+
fi
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
# Check for git clean
|
|
67
|
+
if echo "$STRIPPED" | grep -qE '(^|\s|;|&&|\|\|)git\s+clean\b'; then
|
|
68
|
+
IS_GIT_CLEAN=true
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
# Check for git reset --hard
|
|
72
|
+
if echo "$STRIPPED" | grep -qE '(^|\s|;|&&|\|\|)git\s+reset\s+--hard'; then
|
|
73
|
+
IS_RESET_HARD=true
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
# Check for git checkout -- . (restores all files, discards changes)
|
|
77
|
+
if echo "$STRIPPED" | grep -qE '(^|\s|;|&&|\|\|)git\s+checkout\s+--\s+\.'; then
|
|
78
|
+
IS_GIT_CHECKOUT_DOT=true
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
# Check for git restore . (restores all files, discards changes)
|
|
82
|
+
if echo "$STRIPPED" | grep -qE '(^|\s|;|&&|\|\|)git\s+restore\s+\.'; then
|
|
83
|
+
IS_GIT_RESTORE_DOT=true
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
# Not a destructive command — let it through
|
|
87
|
+
if [ "$IS_RM" = false ] && [ "$IS_RMDIR" = false ] && [ "$IS_MV_PROJECT" = false ] && \
|
|
88
|
+
[ "$IS_GIT_CLEAN" = false ] && [ "$IS_RESET_HARD" = false ] && \
|
|
89
|
+
[ "$IS_GIT_CHECKOUT_DOT" = false ] && [ "$IS_GIT_RESTORE_DOT" = false ]; then
|
|
90
|
+
exit 0
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
# --- Handle git clean (block outright) ---
|
|
94
|
+
|
|
95
|
+
if [ "$IS_GIT_CLEAN" = true ]; then
|
|
96
|
+
jq -n '{
|
|
97
|
+
continue: false,
|
|
98
|
+
stopReason: "BLOCKED: git clean would remove untracked files. Use git stash --include-untracked to save them first, or ask the user to run git clean manually."
|
|
99
|
+
}'
|
|
100
|
+
exit 0
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
# --- Handle git reset --hard (block outright) ---
|
|
104
|
+
|
|
105
|
+
if [ "$IS_RESET_HARD" = true ]; then
|
|
106
|
+
jq -n '{
|
|
107
|
+
continue: false,
|
|
108
|
+
stopReason: "BLOCKED: git reset --hard would discard uncommitted changes. Use git stash to save them first, or ask the user to run this manually."
|
|
109
|
+
}'
|
|
110
|
+
exit 0
|
|
111
|
+
fi
|
|
112
|
+
|
|
113
|
+
# --- Handle git checkout -- . (block outright) ---
|
|
114
|
+
|
|
115
|
+
if [ "$IS_GIT_CHECKOUT_DOT" = true ]; then
|
|
116
|
+
jq -n '{
|
|
117
|
+
continue: false,
|
|
118
|
+
stopReason: "BLOCKED: git checkout -- . would discard all uncommitted changes. Use git stash to save them first, or ask the user to run this manually."
|
|
119
|
+
}'
|
|
120
|
+
exit 0
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
# --- Handle git restore . (block outright) ---
|
|
124
|
+
|
|
125
|
+
if [ "$IS_GIT_RESTORE_DOT" = true ]; then
|
|
126
|
+
jq -n '{
|
|
127
|
+
continue: false,
|
|
128
|
+
stopReason: "BLOCKED: git restore . would discard all uncommitted changes. Use git stash to save them first, or ask the user to run this manually."
|
|
129
|
+
}'
|
|
130
|
+
exit 0
|
|
131
|
+
fi
|
|
132
|
+
|
|
133
|
+
# --- Handle mv of project directories (block outright) ---
|
|
134
|
+
|
|
135
|
+
if [ "$IS_MV_PROJECT" = true ]; then
|
|
136
|
+
jq -n '{
|
|
137
|
+
continue: false,
|
|
138
|
+
stopReason: "BLOCKED: mv of a project directory or git repo detected. Moving project directories can cause data loss if the operation fails midway. Ask the user to run this manually, or use cp + verify + rm instead."
|
|
139
|
+
}'
|
|
140
|
+
exit 0
|
|
141
|
+
fi
|
|
142
|
+
|
|
143
|
+
# --- Handle rmdir (block outright) ---
|
|
144
|
+
|
|
145
|
+
if [ "$IS_RMDIR" = true ]; then
|
|
146
|
+
jq -n '{
|
|
147
|
+
continue: false,
|
|
148
|
+
stopReason: "BLOCKED: rmdir detected. Removing directories can break project structure. Ask the user to confirm this operation manually."
|
|
149
|
+
}'
|
|
150
|
+
exit 0
|
|
151
|
+
fi
|
|
152
|
+
|
|
153
|
+
# --- Handle rm commands — copy to staging, then block ---
|
|
154
|
+
|
|
155
|
+
# Create timestamped staging directory
|
|
156
|
+
TIMESTAMP=$(date +%Y-%m-%d_%H%M%S)
|
|
157
|
+
STAGE_DIR="$STAGING_ROOT/$TIMESTAMP"
|
|
158
|
+
|
|
159
|
+
# Extract file paths from the rm command
|
|
160
|
+
# Strip rm and its flags, keeping only the file arguments
|
|
161
|
+
FILES=$(echo "$CMD" | sed -E 's/^.*\brm\s+//' | sed -E 's/-(r|f|rf|fr|v|i|rv|fv|rfv|frv)\s+//g' | tr ' ' '\n' | grep -v '^-' | grep -v '^$')
|
|
162
|
+
|
|
163
|
+
if [ -z "$FILES" ]; then
|
|
164
|
+
jq -n '{
|
|
165
|
+
continue: false,
|
|
166
|
+
stopReason: "BLOCKED: rm command detected but could not parse file targets. Please specify files explicitly."
|
|
167
|
+
}'
|
|
168
|
+
exit 0
|
|
169
|
+
fi
|
|
170
|
+
|
|
171
|
+
STAGED=()
|
|
172
|
+
MISSING=()
|
|
173
|
+
|
|
174
|
+
mkdir -p "$STAGE_DIR"
|
|
175
|
+
|
|
176
|
+
while IFS= read -r filepath; do
|
|
177
|
+
# Expand path (handle ~, relative paths)
|
|
178
|
+
expanded=$(eval echo "$filepath" 2>/dev/null || echo "$filepath")
|
|
179
|
+
|
|
180
|
+
if [ -e "$expanded" ]; then
|
|
181
|
+
# Preserve directory structure in staging
|
|
182
|
+
target_dir="$STAGE_DIR/$(dirname "$expanded")"
|
|
183
|
+
mkdir -p "$target_dir"
|
|
184
|
+
# COPY instead of MOVE — originals stay intact, staging is a backup
|
|
185
|
+
if [ -d "$expanded" ]; then
|
|
186
|
+
cp -R "$expanded" "$target_dir/" 2>/dev/null && STAGED+=("$expanded") || MISSING+=("$expanded")
|
|
187
|
+
else
|
|
188
|
+
cp "$expanded" "$target_dir/" 2>/dev/null && STAGED+=("$expanded") || MISSING+=("$expanded")
|
|
189
|
+
fi
|
|
190
|
+
else
|
|
191
|
+
MISSING+=("$expanded")
|
|
192
|
+
fi
|
|
193
|
+
done <<< "$FILES"
|
|
194
|
+
|
|
195
|
+
# Build response
|
|
196
|
+
STAGED_COUNT=${#STAGED[@]}
|
|
197
|
+
MISSING_COUNT=${#MISSING[@]}
|
|
198
|
+
|
|
199
|
+
if [ "$STAGED_COUNT" -eq 0 ] && [ "$MISSING_COUNT" -gt 0 ]; then
|
|
200
|
+
# All files were missing — let the rm fail naturally
|
|
201
|
+
rmdir "$STAGE_DIR" 2>/dev/null || true
|
|
202
|
+
exit 0
|
|
203
|
+
fi
|
|
204
|
+
|
|
205
|
+
STAGED_LIST=$(printf '%s, ' "${STAGED[@]}" | sed 's/, $//')
|
|
206
|
+
|
|
207
|
+
jq -n \
|
|
208
|
+
--arg staged "$STAGED_LIST" \
|
|
209
|
+
--arg dir "$STAGE_DIR" \
|
|
210
|
+
--argjson count "$STAGED_COUNT" \
|
|
211
|
+
'{
|
|
212
|
+
continue: false,
|
|
213
|
+
stopReason: ("BLOCKED & BACKED UP: " + ($count | tostring) + " item(s) copied to " + $dir + " — files: " + $staged + ". The originals are untouched. To proceed with deletion, ask the user to run the rm command manually.")
|
|
214
|
+
}'
|
package/src/hooks/templates.ts
CHANGED
|
@@ -119,7 +119,7 @@ function generateClaudeCodeSettings(dir?: string): Record<string, string> {
|
|
|
119
119
|
hooks: [
|
|
120
120
|
{
|
|
121
121
|
type: 'command',
|
|
122
|
-
command: `echo "[${agentId}] session started — register project: ${agentId}_core op:
|
|
122
|
+
command: `echo "[${agentId}] session started — register project: ${agentId}_core op:session_start params:{ projectPath: \\".\\" }" && echo "Check for active plans: ${agentId}_core op:get_plan"`,
|
|
123
123
|
},
|
|
124
124
|
],
|
|
125
125
|
},
|
package/src/main.ts
CHANGED
|
@@ -20,6 +20,7 @@ import { registerPack } from './commands/pack.js';
|
|
|
20
20
|
import { registerSkills } from './commands/skills.js';
|
|
21
21
|
import { registerAgent } from './commands/agent.js';
|
|
22
22
|
import { registerTelegram } from './commands/telegram.js';
|
|
23
|
+
import { registerStaging } from './commands/staging.js';
|
|
23
24
|
|
|
24
25
|
const require = createRequire(import.meta.url);
|
|
25
26
|
const { version } = require('../package.json');
|
|
@@ -80,4 +81,5 @@ registerPack(program);
|
|
|
80
81
|
registerSkills(program);
|
|
81
82
|
registerAgent(program);
|
|
82
83
|
registerTelegram(program);
|
|
84
|
+
registerStaging(program);
|
|
83
85
|
program.parse();
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cognee vector search management — enable, disable, setup, status.
|
|
3
|
-
*
|
|
4
|
-
* `soleri cognee enable` — Wire Cognee into the agent runtime
|
|
5
|
-
* `soleri cognee disable` — Remove Cognee integration from the agent
|
|
6
|
-
* `soleri cognee setup` — Interactive config wizard (base URL, embedding, auth)
|
|
7
|
-
* `soleri cognee status` — Check Cognee configuration and sidecar health
|
|
8
|
-
*/
|
|
9
|
-
import type { Command } from 'commander';
|
|
10
|
-
export declare function registerCognee(program: Command): void;
|
package/dist/commands/cognee.js
DELETED
|
@@ -1,364 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cognee vector search management — enable, disable, setup, status.
|
|
3
|
-
*
|
|
4
|
-
* `soleri cognee enable` — Wire Cognee into the agent runtime
|
|
5
|
-
* `soleri cognee disable` — Remove Cognee integration from the agent
|
|
6
|
-
* `soleri cognee setup` — Interactive config wizard (base URL, embedding, auth)
|
|
7
|
-
* `soleri cognee status` — Check Cognee configuration and sidecar health
|
|
8
|
-
*/
|
|
9
|
-
import { join } from 'node:path';
|
|
10
|
-
import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync, unlinkSync, } from 'node:fs';
|
|
11
|
-
import { homedir } from 'node:os';
|
|
12
|
-
import * as p from '@clack/prompts';
|
|
13
|
-
import { generateEntryPoint } from '@soleri/forge/lib';
|
|
14
|
-
import { detectAgent } from '../utils/agent-context.js';
|
|
15
|
-
// Docker Compose file name (copied into agent project on enable)
|
|
16
|
-
const COGNEE_COMPOSE_FILE = 'docker-compose.cognee.yml';
|
|
17
|
-
// npm scripts added on enable
|
|
18
|
-
const COGNEE_SCRIPTS = {
|
|
19
|
-
'cognee:up': `docker compose -f ${COGNEE_COMPOSE_FILE} up -d`,
|
|
20
|
-
'cognee:down': `docker compose -f ${COGNEE_COMPOSE_FILE} down`,
|
|
21
|
-
'cognee:logs': `docker compose -f ${COGNEE_COMPOSE_FILE} logs -f cognee`,
|
|
22
|
-
};
|
|
23
|
-
// ─── Registration ───────────────────────────────────────────────────
|
|
24
|
-
export function registerCognee(program) {
|
|
25
|
-
const cmd = program
|
|
26
|
-
.command('cognee')
|
|
27
|
-
.description('Manage Cognee vector search integration for the current agent');
|
|
28
|
-
// ─── enable ─────────────────────────────────────────────────────
|
|
29
|
-
cmd
|
|
30
|
-
.command('enable')
|
|
31
|
-
.description('Enable Cognee vector search for the current agent')
|
|
32
|
-
.action(() => {
|
|
33
|
-
const ctx = detectAgent();
|
|
34
|
-
if (!ctx) {
|
|
35
|
-
p.log.error('No agent project detected in current directory.');
|
|
36
|
-
process.exit(1);
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
// Check if already enabled
|
|
40
|
-
const pkgPath = join(ctx.agentPath, 'package.json');
|
|
41
|
-
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
42
|
-
if (pkg.soleri?.cognee === true) {
|
|
43
|
-
p.log.warn('Cognee is already enabled for this agent.');
|
|
44
|
-
p.log.info('Run `soleri cognee setup` to configure it.');
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
// Reconstruct AgentConfig and regenerate entry point with cognee: true
|
|
48
|
-
const config = readAgentConfig(ctx.agentPath, ctx.agentId);
|
|
49
|
-
if (!config) {
|
|
50
|
-
p.log.error('Could not read agent config from persona.ts and entry point.');
|
|
51
|
-
process.exit(1);
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
const s = p.spinner();
|
|
55
|
-
// 1. Regenerate entry point with cognee: true
|
|
56
|
-
s.start('Regenerating entry point with Cognee integration...');
|
|
57
|
-
const entryPointCode = generateEntryPoint({ ...config, cognee: true });
|
|
58
|
-
writeFileSync(join(ctx.agentPath, 'src', 'index.ts'), entryPointCode, 'utf-8');
|
|
59
|
-
s.stop('Entry point regenerated with Cognee integration');
|
|
60
|
-
// 2. Copy docker-compose.cognee.yml if available
|
|
61
|
-
const sourceCompose = join(ctx.agentPath, '..', '..', 'docker', COGNEE_COMPOSE_FILE);
|
|
62
|
-
const targetCompose = join(ctx.agentPath, COGNEE_COMPOSE_FILE);
|
|
63
|
-
if (existsSync(sourceCompose) && !existsSync(targetCompose)) {
|
|
64
|
-
copyFileSync(sourceCompose, targetCompose);
|
|
65
|
-
p.log.info(`Copied ${COGNEE_COMPOSE_FILE} to agent project`);
|
|
66
|
-
}
|
|
67
|
-
else if (!existsSync(targetCompose)) {
|
|
68
|
-
p.log.warn(`${COGNEE_COMPOSE_FILE} not found — create one manually or run Cognee externally`);
|
|
69
|
-
}
|
|
70
|
-
// 3. Update package.json
|
|
71
|
-
let pkgChanged = false;
|
|
72
|
-
if (!pkg.soleri)
|
|
73
|
-
pkg.soleri = {};
|
|
74
|
-
pkg.soleri.cognee = true;
|
|
75
|
-
pkgChanged = true;
|
|
76
|
-
if (!pkg.scripts)
|
|
77
|
-
pkg.scripts = {};
|
|
78
|
-
for (const [name, script] of Object.entries(COGNEE_SCRIPTS)) {
|
|
79
|
-
if (!pkg.scripts[name]) {
|
|
80
|
-
pkg.scripts[name] = script;
|
|
81
|
-
pkgChanged = true;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
if (pkgChanged) {
|
|
85
|
-
writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n', 'utf-8');
|
|
86
|
-
p.log.info('Updated package.json with cognee flag and scripts');
|
|
87
|
-
}
|
|
88
|
-
p.log.success('Cognee enabled!');
|
|
89
|
-
p.log.info('Next steps:');
|
|
90
|
-
p.log.info(' 1. Run `soleri cognee setup` to configure base URL and auth');
|
|
91
|
-
p.log.info(' 2. Run `npm run cognee:up` to start the Cognee sidecar');
|
|
92
|
-
p.log.info(' 3. Rebuild: `npm run build`');
|
|
93
|
-
});
|
|
94
|
-
// ─── setup ──────────────────────────────────────────────────────
|
|
95
|
-
cmd
|
|
96
|
-
.command('setup')
|
|
97
|
-
.description('Interactive Cognee configuration wizard')
|
|
98
|
-
.action(async () => {
|
|
99
|
-
const ctx = detectAgent();
|
|
100
|
-
if (!ctx) {
|
|
101
|
-
p.log.error('No agent project detected in current directory.');
|
|
102
|
-
process.exit(1);
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
// Check if enabled
|
|
106
|
-
const pkgPath = join(ctx.agentPath, 'package.json');
|
|
107
|
-
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
108
|
-
if (!pkg.soleri?.cognee) {
|
|
109
|
-
p.log.error('Cognee is not enabled. Run `soleri cognee enable` first.');
|
|
110
|
-
process.exit(1);
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
p.intro(`Cognee Setup for ${ctx.agentId}`);
|
|
114
|
-
// Step 1: Base URL
|
|
115
|
-
p.log.step('Step 1: Cognee API endpoint');
|
|
116
|
-
const baseUrl = await p.text({
|
|
117
|
-
message: 'Cognee API base URL:',
|
|
118
|
-
placeholder: 'http://localhost:8000',
|
|
119
|
-
defaultValue: 'http://localhost:8000',
|
|
120
|
-
});
|
|
121
|
-
if (p.isCancel(baseUrl)) {
|
|
122
|
-
p.cancel('Setup cancelled.');
|
|
123
|
-
process.exit(0);
|
|
124
|
-
}
|
|
125
|
-
// Step 2: Embedding provider
|
|
126
|
-
p.log.step('Step 2: Embedding provider');
|
|
127
|
-
const embeddingProvider = await p.select({
|
|
128
|
-
message: 'Which embedding provider?',
|
|
129
|
-
options: [
|
|
130
|
-
{ value: 'ollama', label: 'Ollama (local, free — nomic-embed-text)' },
|
|
131
|
-
{ value: 'openai', label: 'OpenAI (text-embedding-3-small)' },
|
|
132
|
-
{ value: 'env', label: 'Use environment variables (skip)' },
|
|
133
|
-
],
|
|
134
|
-
});
|
|
135
|
-
if (p.isCancel(embeddingProvider)) {
|
|
136
|
-
p.cancel('Setup cancelled.');
|
|
137
|
-
process.exit(0);
|
|
138
|
-
}
|
|
139
|
-
// Step 3: API token (optional)
|
|
140
|
-
p.log.step('Step 3: Authentication (optional)');
|
|
141
|
-
p.log.message(' Leave empty for local Cognee (AUTH_REQUIRED=false)');
|
|
142
|
-
const apiToken = await p.text({
|
|
143
|
-
message: 'Cognee API token:',
|
|
144
|
-
placeholder: '(empty for local, no auth)',
|
|
145
|
-
defaultValue: '',
|
|
146
|
-
});
|
|
147
|
-
if (p.isCancel(apiToken)) {
|
|
148
|
-
p.cancel('Setup cancelled.');
|
|
149
|
-
process.exit(0);
|
|
150
|
-
}
|
|
151
|
-
// Step 4: Dataset name
|
|
152
|
-
p.log.step('Step 4: Dataset');
|
|
153
|
-
const dataset = await p.text({
|
|
154
|
-
message: 'Dataset name for this agent:',
|
|
155
|
-
placeholder: ctx.agentId,
|
|
156
|
-
defaultValue: ctx.agentId,
|
|
157
|
-
});
|
|
158
|
-
if (p.isCancel(dataset)) {
|
|
159
|
-
p.cancel('Setup cancelled.');
|
|
160
|
-
process.exit(0);
|
|
161
|
-
}
|
|
162
|
-
// Save config
|
|
163
|
-
const configDir = join(homedir(), `.${ctx.agentId}`);
|
|
164
|
-
mkdirSync(configDir, { recursive: true });
|
|
165
|
-
const configPath = join(configDir, 'cognee.json');
|
|
166
|
-
const cogneeConfig = {
|
|
167
|
-
baseUrl: baseUrl.trim(),
|
|
168
|
-
embeddingProvider: embeddingProvider === 'env' ? 'ollama' : embeddingProvider,
|
|
169
|
-
...(apiToken ? { apiToken } : {}),
|
|
170
|
-
dataset: dataset.trim(),
|
|
171
|
-
};
|
|
172
|
-
writeFileSync(configPath, JSON.stringify(cogneeConfig, null, 2) + '\n', 'utf-8');
|
|
173
|
-
p.outro(`Configuration saved to ${configPath}`);
|
|
174
|
-
console.log('');
|
|
175
|
-
p.log.info(' Start Cognee: npm run cognee:up');
|
|
176
|
-
p.log.info(' Check status: soleri cognee status');
|
|
177
|
-
console.log('');
|
|
178
|
-
});
|
|
179
|
-
// ─── disable ────────────────────────────────────────────────────
|
|
180
|
-
cmd
|
|
181
|
-
.command('disable')
|
|
182
|
-
.description('Remove Cognee vector search from the current agent')
|
|
183
|
-
.action(async () => {
|
|
184
|
-
const ctx = detectAgent();
|
|
185
|
-
if (!ctx) {
|
|
186
|
-
p.log.error('No agent project detected in current directory.');
|
|
187
|
-
process.exit(1);
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
const pkgPath = join(ctx.agentPath, 'package.json');
|
|
191
|
-
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
192
|
-
if (!pkg.soleri?.cognee) {
|
|
193
|
-
p.log.warn('Cognee is not enabled for this agent.');
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
const confirmed = await p.confirm({
|
|
197
|
-
message: `Disable Cognee vector search for ${ctx.agentId}? (Vault FTS5 search continues to work)`,
|
|
198
|
-
});
|
|
199
|
-
if (p.isCancel(confirmed) || !confirmed) {
|
|
200
|
-
p.cancel('Cancelled.');
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
// 1. Regenerate entry point without cognee
|
|
204
|
-
const config = readAgentConfig(ctx.agentPath, ctx.agentId);
|
|
205
|
-
if (config) {
|
|
206
|
-
const s = p.spinner();
|
|
207
|
-
s.start('Regenerating entry point without Cognee...');
|
|
208
|
-
const entryPointCode = generateEntryPoint({ ...config, cognee: false });
|
|
209
|
-
writeFileSync(join(ctx.agentPath, 'src', 'index.ts'), entryPointCode, 'utf-8');
|
|
210
|
-
s.stop('Entry point regenerated without Cognee');
|
|
211
|
-
}
|
|
212
|
-
// 2. Remove docker-compose
|
|
213
|
-
const composePath = join(ctx.agentPath, COGNEE_COMPOSE_FILE);
|
|
214
|
-
if (existsSync(composePath)) {
|
|
215
|
-
unlinkSync(composePath);
|
|
216
|
-
p.log.info('Removed docker-compose.cognee.yml');
|
|
217
|
-
}
|
|
218
|
-
// 3. Update package.json
|
|
219
|
-
let changed = false;
|
|
220
|
-
if (pkg.soleri?.cognee) {
|
|
221
|
-
pkg.soleri.cognee = false;
|
|
222
|
-
changed = true;
|
|
223
|
-
}
|
|
224
|
-
for (const name of Object.keys(COGNEE_SCRIPTS)) {
|
|
225
|
-
if (pkg.scripts?.[name]) {
|
|
226
|
-
delete pkg.scripts[name];
|
|
227
|
-
changed = true;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
if (changed) {
|
|
231
|
-
writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n', 'utf-8');
|
|
232
|
-
p.log.info('Removed cognee scripts from package.json');
|
|
233
|
-
}
|
|
234
|
-
p.log.success('Cognee disabled. Vault FTS5 search still works.');
|
|
235
|
-
p.log.info('Run `npm run build` to rebuild.');
|
|
236
|
-
});
|
|
237
|
-
// ─── status ─────────────────────────────────────────────────────
|
|
238
|
-
cmd
|
|
239
|
-
.command('status')
|
|
240
|
-
.description('Check Cognee configuration and sidecar health')
|
|
241
|
-
.action(async () => {
|
|
242
|
-
const ctx = detectAgent();
|
|
243
|
-
if (!ctx) {
|
|
244
|
-
p.log.error('No agent project detected in current directory.');
|
|
245
|
-
process.exit(1);
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
const pkgPath = join(ctx.agentPath, 'package.json');
|
|
249
|
-
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
250
|
-
const enabled = pkg.soleri?.cognee === true;
|
|
251
|
-
console.log(`\n Agent: ${ctx.agentId}`);
|
|
252
|
-
console.log(` Cognee: ${enabled ? 'enabled' : 'disabled'}`);
|
|
253
|
-
if (!enabled) {
|
|
254
|
-
console.log('\n Run `soleri cognee enable` to add vector search.');
|
|
255
|
-
console.log('');
|
|
256
|
-
return;
|
|
257
|
-
}
|
|
258
|
-
// Check Docker Compose file
|
|
259
|
-
const composePath = join(ctx.agentPath, COGNEE_COMPOSE_FILE);
|
|
260
|
-
console.log(` Docker Compose: ${existsSync(composePath) ? 'present' : 'missing'}`);
|
|
261
|
-
// Check npm scripts
|
|
262
|
-
const hasScripts = Object.keys(COGNEE_SCRIPTS).every((s) => !!pkg.scripts?.[s]);
|
|
263
|
-
console.log(` Scripts: ${hasScripts ? 'all present' : 'some missing'}`);
|
|
264
|
-
// Check config file
|
|
265
|
-
const configPath = join(homedir(), `.${ctx.agentId}`, 'cognee.json');
|
|
266
|
-
if (existsSync(configPath)) {
|
|
267
|
-
try {
|
|
268
|
-
const config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
269
|
-
console.log(` Config: ${configPath}`);
|
|
270
|
-
console.log(` Base URL: ${config.baseUrl ?? 'not set'}`);
|
|
271
|
-
console.log(` Embedding: ${config.embeddingProvider ?? 'not set'}`);
|
|
272
|
-
console.log(` Dataset: ${config.dataset ?? ctx.agentId}`);
|
|
273
|
-
console.log(` API token: ${config.apiToken ? 'set' : 'not set (local mode)'}`);
|
|
274
|
-
}
|
|
275
|
-
catch {
|
|
276
|
-
console.log(` Config: ${configPath} (invalid JSON)`);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
else {
|
|
280
|
-
console.log(` Config: not found at ${configPath}`);
|
|
281
|
-
console.log(' Run `soleri cognee setup` to configure.');
|
|
282
|
-
}
|
|
283
|
-
// Try health check
|
|
284
|
-
const baseUrl = process.env.COGNEE_BASE_URL ??
|
|
285
|
-
(existsSync(configPath)
|
|
286
|
-
? JSON.parse(readFileSync(configPath, 'utf-8')).baseUrl
|
|
287
|
-
: 'http://localhost:8000');
|
|
288
|
-
try {
|
|
289
|
-
const controller = new AbortController();
|
|
290
|
-
const timeout = setTimeout(() => controller.abort(), 5000);
|
|
291
|
-
const res = await fetch(`${baseUrl}/`, { signal: controller.signal });
|
|
292
|
-
clearTimeout(timeout);
|
|
293
|
-
console.log(` Sidecar: ${res.ok ? 'running' : `HTTP ${res.status}`} at ${baseUrl}`);
|
|
294
|
-
}
|
|
295
|
-
catch {
|
|
296
|
-
console.log(` Sidecar: not reachable at ${baseUrl}`);
|
|
297
|
-
}
|
|
298
|
-
// Overall status
|
|
299
|
-
const ready = enabled && existsSync(configPath);
|
|
300
|
-
console.log(`\n Status: ${ready ? 'configured' : 'needs configuration'}`);
|
|
301
|
-
if (!existsSync(configPath)) {
|
|
302
|
-
console.log(' Next: Run `soleri cognee setup`');
|
|
303
|
-
}
|
|
304
|
-
else {
|
|
305
|
-
console.log(' Next: Run `npm run cognee:up` to start the sidecar');
|
|
306
|
-
}
|
|
307
|
-
console.log('');
|
|
308
|
-
});
|
|
309
|
-
}
|
|
310
|
-
// ─── Helpers ──────────────────────────────────────────────────────────
|
|
311
|
-
function readAgentConfig(agentPath, agentId) {
|
|
312
|
-
const personaCandidates = [
|
|
313
|
-
join(agentPath, 'src', 'identity', 'persona.ts'),
|
|
314
|
-
join(agentPath, 'src', 'activation', 'persona.ts'),
|
|
315
|
-
];
|
|
316
|
-
const personaPath = personaCandidates.find((candidate) => existsSync(candidate));
|
|
317
|
-
if (!personaPath)
|
|
318
|
-
return null;
|
|
319
|
-
const personaSrc = readFileSync(personaPath, 'utf-8');
|
|
320
|
-
const name = extractStringField(personaSrc, 'name') ?? agentId;
|
|
321
|
-
const role = extractStringField(personaSrc, 'role') ?? '';
|
|
322
|
-
const description = extractStringField(personaSrc, 'description') ?? '';
|
|
323
|
-
const tone = extractStringField(personaSrc, 'tone') ?? 'pragmatic';
|
|
324
|
-
const greeting = extractStringField(personaSrc, 'greeting') ?? `Hello! I'm ${name}.`;
|
|
325
|
-
const principles = extractArrayField(personaSrc, 'principles');
|
|
326
|
-
const indexPath = join(agentPath, 'src', 'index.ts');
|
|
327
|
-
const domains = existsSync(indexPath) ? extractDomains(readFileSync(indexPath, 'utf-8')) : [];
|
|
328
|
-
const pkg = JSON.parse(readFileSync(join(agentPath, 'package.json'), 'utf-8'));
|
|
329
|
-
return {
|
|
330
|
-
id: agentId,
|
|
331
|
-
name,
|
|
332
|
-
role,
|
|
333
|
-
description,
|
|
334
|
-
domains,
|
|
335
|
-
principles,
|
|
336
|
-
tone,
|
|
337
|
-
greeting,
|
|
338
|
-
outputDir: agentPath,
|
|
339
|
-
hookPacks: [],
|
|
340
|
-
model: pkg.soleri?.model ?? 'claude-code-sonnet-4',
|
|
341
|
-
setupTarget: pkg.soleri?.setupTarget ?? 'claude',
|
|
342
|
-
telegram: pkg.soleri?.telegram ?? false,
|
|
343
|
-
cognee: pkg.soleri?.cognee ?? false,
|
|
344
|
-
};
|
|
345
|
-
}
|
|
346
|
-
function extractStringField(src, field) {
|
|
347
|
-
const re = new RegExp(`${field}:\\s*'([^']*)'`);
|
|
348
|
-
const m = src.match(re);
|
|
349
|
-
return m ? m[1].replace(/\\'/g, "'") : undefined;
|
|
350
|
-
}
|
|
351
|
-
function extractArrayField(src, field) {
|
|
352
|
-
const re = new RegExp(`${field}:\\s*\\[([\\s\\S]*?)\\]`);
|
|
353
|
-
const m = src.match(re);
|
|
354
|
-
if (!m)
|
|
355
|
-
return [];
|
|
356
|
-
return [...m[1].matchAll(/'([^']*)'/g)].map((x) => x[1]);
|
|
357
|
-
}
|
|
358
|
-
function extractDomains(indexSrc) {
|
|
359
|
-
const m = indexSrc.match(/createDomainFacades\(runtime,\s*['"][^'"]+['"]\s*,\s*\[([\s\S]*?)\]\)/);
|
|
360
|
-
if (!m)
|
|
361
|
-
return [];
|
|
362
|
-
return [...m[1].matchAll(/['"]([^'"]+)['"]/g)].map((x) => x[1]);
|
|
363
|
-
}
|
|
364
|
-
//# sourceMappingURL=cognee.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cognee.js","sourceRoot":"","sources":["../../src/commands/cognee.ts"],"names":[],"mappings":"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"}
|