@apart-tech/apart-intelligence 0.1.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/analyzers/python-analyzer.d.ts +3 -0
- package/dist/analyzers/python-analyzer.d.ts.map +1 -0
- package/dist/analyzers/python-analyzer.js +127 -0
- package/dist/analyzers/python-analyzer.js.map +1 -0
- package/dist/analyzers/types.d.ts +18 -0
- package/dist/analyzers/types.d.ts.map +1 -0
- package/dist/analyzers/types.js +2 -0
- package/dist/analyzers/types.js.map +1 -0
- package/dist/analyzers/typescript-analyzer.d.ts +3 -0
- package/dist/analyzers/typescript-analyzer.d.ts.map +1 -0
- package/dist/analyzers/typescript-analyzer.js +131 -0
- package/dist/analyzers/typescript-analyzer.js.map +1 -0
- package/dist/api-client/api-provider.d.ts +3 -0
- package/dist/api-client/api-provider.d.ts.map +1 -0
- package/dist/api-client/api-provider.js +85 -0
- package/dist/api-client/api-provider.js.map +1 -0
- package/dist/api-client/credentials.d.ts +6 -0
- package/dist/api-client/credentials.d.ts.map +1 -0
- package/dist/api-client/credentials.js +34 -0
- package/dist/api-client/credentials.js.map +1 -0
- package/dist/api-client/direct-provider.d.ts +3 -0
- package/dist/api-client/direct-provider.d.ts.map +1 -0
- package/dist/api-client/direct-provider.js +149 -0
- package/dist/api-client/direct-provider.js.map +1 -0
- package/dist/api-client/http-client.d.ts +11 -0
- package/dist/api-client/http-client.d.ts.map +1 -0
- package/dist/api-client/http-client.js +37 -0
- package/dist/api-client/http-client.js.map +1 -0
- package/dist/api-client/index.d.ts +5 -0
- package/dist/api-client/index.d.ts.map +1 -0
- package/dist/api-client/index.js +12 -0
- package/dist/api-client/index.js.map +1 -0
- package/dist/api-client/types.d.ts +93 -0
- package/dist/api-client/types.d.ts.map +1 -0
- package/dist/api-client/types.js +2 -0
- package/dist/api-client/types.js.map +1 -0
- package/dist/commands/add.d.ts +3 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +50 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/context.d.ts +3 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +40 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/delete.d.ts +3 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +45 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/domains.d.ts +3 -0
- package/dist/commands/domains.d.ts.map +1 -0
- package/dist/commands/domains.js +61 -0
- package/dist/commands/domains.js.map +1 -0
- package/dist/commands/drafts.d.ts +3 -0
- package/dist/commands/drafts.d.ts.map +1 -0
- package/dist/commands/drafts.js +29 -0
- package/dist/commands/drafts.js.map +1 -0
- package/dist/commands/duplicates.d.ts +3 -0
- package/dist/commands/duplicates.d.ts.map +1 -0
- package/dist/commands/duplicates.js +39 -0
- package/dist/commands/duplicates.js.map +1 -0
- package/dist/commands/get.d.ts +3 -0
- package/dist/commands/get.d.ts.map +1 -0
- package/dist/commands/get.js +43 -0
- package/dist/commands/get.js.map +1 -0
- package/dist/commands/graph.d.ts +3 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +368 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/health.d.ts +3 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +61 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +336 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/islands.d.ts +3 -0
- package/dist/commands/islands.d.ts.map +1 -0
- package/dist/commands/islands.js +70 -0
- package/dist/commands/islands.js.map +1 -0
- package/dist/commands/link.d.ts +3 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +40 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +72 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +3 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +18 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/map.d.ts +3 -0
- package/dist/commands/map.d.ts.map +1 -0
- package/dist/commands/map.js +127 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/commands/normalize.d.ts +3 -0
- package/dist/commands/normalize.d.ts.map +1 -0
- package/dist/commands/normalize.js +67 -0
- package/dist/commands/normalize.js.map +1 -0
- package/dist/commands/orphans.d.ts +3 -0
- package/dist/commands/orphans.d.ts.map +1 -0
- package/dist/commands/orphans.js +36 -0
- package/dist/commands/orphans.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +44 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +25 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/suggest-links.d.ts +3 -0
- package/dist/commands/suggest-links.d.ts.map +1 -0
- package/dist/commands/suggest-links.js +44 -0
- package/dist/commands/suggest-links.js.map +1 -0
- package/dist/commands/types.d.ts +3 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +30 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +55 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +79 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +21 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +7 -0
- package/dist/utils.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { writeFileSync, existsSync } from "fs";
|
|
2
|
+
import { join, resolve } from "path";
|
|
3
|
+
import { execSync } from "child_process";
|
|
4
|
+
import { randomBytes } from "crypto";
|
|
5
|
+
import chalk from "chalk";
|
|
6
|
+
import prompts from "prompts";
|
|
7
|
+
import { PrismaClient } from "@prisma/client";
|
|
8
|
+
import { withAccelerate } from "@prisma/extension-accelerate";
|
|
9
|
+
const LOGO = `
|
|
10
|
+
╔══════════════════════════════════════╗
|
|
11
|
+
║ ${chalk.bold("Apart Intelligence")} ║
|
|
12
|
+
║ ${chalk.dim("the knowledge graph for your")} ║
|
|
13
|
+
║ ${chalk.dim("company")} ║
|
|
14
|
+
╚══════════════════════════════════════╝
|
|
15
|
+
`;
|
|
16
|
+
export function initCommand(program) {
|
|
17
|
+
program
|
|
18
|
+
.command("init")
|
|
19
|
+
.description("Set up Apart Intelligence in the current directory")
|
|
20
|
+
.action(async () => {
|
|
21
|
+
console.log(LOGO);
|
|
22
|
+
// Check if already initialized
|
|
23
|
+
const configPath = join(process.cwd(), ".apart.yaml");
|
|
24
|
+
if (existsSync(configPath)) {
|
|
25
|
+
const { overwrite } = await prompts({
|
|
26
|
+
type: "confirm",
|
|
27
|
+
name: "overwrite",
|
|
28
|
+
message: "An .apart.yaml already exists. Overwrite?",
|
|
29
|
+
initial: false,
|
|
30
|
+
});
|
|
31
|
+
if (!overwrite) {
|
|
32
|
+
console.log(chalk.dim("Aborted."));
|
|
33
|
+
process.exit(0);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// ── Step 1: Database ────────────────────────────────────────────
|
|
37
|
+
console.log(chalk.bold("\n1. Database\n"));
|
|
38
|
+
const { dbChoice } = await prompts({
|
|
39
|
+
type: "select",
|
|
40
|
+
name: "dbChoice",
|
|
41
|
+
message: "How would you like to connect to a database?",
|
|
42
|
+
choices: [
|
|
43
|
+
{
|
|
44
|
+
title: "Bring your own PostgreSQL",
|
|
45
|
+
description: "Connect to an existing PostgreSQL instance with pgvector",
|
|
46
|
+
value: "byod",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
title: "Prisma Postgres (cloud)",
|
|
50
|
+
description: "Use a Prisma Postgres connection string",
|
|
51
|
+
value: "prisma",
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
});
|
|
55
|
+
if (dbChoice === undefined)
|
|
56
|
+
abort();
|
|
57
|
+
let databaseUrl;
|
|
58
|
+
if (dbChoice === "prisma") {
|
|
59
|
+
const { url } = await prompts({
|
|
60
|
+
type: "text",
|
|
61
|
+
name: "url",
|
|
62
|
+
message: "Prisma Postgres connection string:",
|
|
63
|
+
validate: (v) => v.startsWith("prisma+postgres://") || v.startsWith("prisma://")
|
|
64
|
+
? true
|
|
65
|
+
: "Must start with prisma+postgres:// or prisma://",
|
|
66
|
+
});
|
|
67
|
+
if (!url)
|
|
68
|
+
abort();
|
|
69
|
+
databaseUrl = url;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
const { url } = await prompts({
|
|
73
|
+
type: "text",
|
|
74
|
+
name: "url",
|
|
75
|
+
message: "PostgreSQL connection string:",
|
|
76
|
+
initial: "postgresql://localhost:5432/apart",
|
|
77
|
+
validate: (v) => v.startsWith("postgresql://") || v.startsWith("postgres://")
|
|
78
|
+
? true
|
|
79
|
+
: "Must start with postgresql:// or postgres://",
|
|
80
|
+
});
|
|
81
|
+
if (!url)
|
|
82
|
+
abort();
|
|
83
|
+
databaseUrl = url;
|
|
84
|
+
}
|
|
85
|
+
// ── Step 2: Test connection & set up schema ─────────────────────
|
|
86
|
+
console.log(chalk.dim("\nTesting database connection..."));
|
|
87
|
+
let db;
|
|
88
|
+
try {
|
|
89
|
+
if (databaseUrl.startsWith("prisma+postgres://") || databaseUrl.startsWith("prisma://")) {
|
|
90
|
+
process.env.DATABASE_URL = databaseUrl;
|
|
91
|
+
db = new PrismaClient().$extends(withAccelerate());
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
db = new PrismaClient({ datasourceUrl: databaseUrl });
|
|
95
|
+
}
|
|
96
|
+
await db.$connect();
|
|
97
|
+
console.log(chalk.green(" ✓ Connected"));
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
console.error(chalk.red(` ✗ Connection failed: ${err.message}`));
|
|
101
|
+
console.log(chalk.dim(" Check your connection string and try again."));
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
// Push schema
|
|
105
|
+
console.log(chalk.dim("Setting up database schema..."));
|
|
106
|
+
try {
|
|
107
|
+
const prismaSchemaDir = findPrismaSchema();
|
|
108
|
+
execSync(`npx prisma db push --skip-generate --accept-data-loss`, {
|
|
109
|
+
cwd: prismaSchemaDir,
|
|
110
|
+
stdio: "pipe",
|
|
111
|
+
env: { ...process.env, DATABASE_URL: databaseUrl },
|
|
112
|
+
});
|
|
113
|
+
console.log(chalk.green(" ✓ Schema synced"));
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
if (err.stderr?.toString().includes('type "vector" does not exist')) {
|
|
117
|
+
console.log(chalk.dim(" Enabling pgvector extension..."));
|
|
118
|
+
try {
|
|
119
|
+
const prismaSchemaDir = findPrismaSchema();
|
|
120
|
+
execSync(`echo "CREATE EXTENSION IF NOT EXISTS vector;" | npx prisma db execute --schema prisma/schema.prisma --stdin`, {
|
|
121
|
+
cwd: prismaSchemaDir,
|
|
122
|
+
stdio: "pipe",
|
|
123
|
+
env: { ...process.env, DATABASE_URL: databaseUrl },
|
|
124
|
+
});
|
|
125
|
+
execSync(`npx prisma db push --skip-generate --accept-data-loss`, {
|
|
126
|
+
cwd: prismaSchemaDir,
|
|
127
|
+
stdio: "pipe",
|
|
128
|
+
env: { ...process.env, DATABASE_URL: databaseUrl },
|
|
129
|
+
});
|
|
130
|
+
console.log(chalk.green(" ✓ pgvector enabled & schema synced"));
|
|
131
|
+
}
|
|
132
|
+
catch (innerErr) {
|
|
133
|
+
console.error(chalk.red(` ✗ Schema push failed: ${innerErr.message}`));
|
|
134
|
+
console.log(chalk.dim(" You may need to manually enable pgvector: CREATE EXTENSION IF NOT EXISTS vector;"));
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
console.error(chalk.red(` ✗ Schema push failed`));
|
|
140
|
+
console.log(chalk.dim(err.stderr?.toString().slice(0, 300) ?? err.message));
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// ── Step 3: Organization ────────────────────────────────────────
|
|
145
|
+
console.log(chalk.bold("\n2. Organization\n"));
|
|
146
|
+
const { orgName } = await prompts({
|
|
147
|
+
type: "text",
|
|
148
|
+
name: "orgName",
|
|
149
|
+
message: "Organization name:",
|
|
150
|
+
initial: "My Company",
|
|
151
|
+
});
|
|
152
|
+
if (!orgName)
|
|
153
|
+
abort();
|
|
154
|
+
const orgSlug = orgName
|
|
155
|
+
.toLowerCase()
|
|
156
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
157
|
+
.replace(/^-|-$/g, "");
|
|
158
|
+
// Reconnect with fresh client after schema push
|
|
159
|
+
if (databaseUrl.startsWith("prisma+postgres://") || databaseUrl.startsWith("prisma://")) {
|
|
160
|
+
process.env.DATABASE_URL = databaseUrl;
|
|
161
|
+
db = new PrismaClient().$extends(withAccelerate());
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
db = new PrismaClient({ datasourceUrl: databaseUrl });
|
|
165
|
+
}
|
|
166
|
+
let org;
|
|
167
|
+
try {
|
|
168
|
+
org = await db.organization.findFirst({ where: { slug: orgSlug } });
|
|
169
|
+
if (org) {
|
|
170
|
+
console.log(chalk.yellow(` Organization "${orgName}" already exists (${org.id})`));
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
org = await db.organization.create({
|
|
174
|
+
data: { name: orgName, slug: orgSlug },
|
|
175
|
+
});
|
|
176
|
+
console.log(chalk.green(` ✓ Organization created: ${org.id}`));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
console.error(chalk.red(` ✗ Failed to create organization: ${err.message}`));
|
|
181
|
+
process.exit(1);
|
|
182
|
+
}
|
|
183
|
+
// ── Step 4: API Key ─────────────────────────────────────────────
|
|
184
|
+
console.log(chalk.bold("\n3. API Key\n"));
|
|
185
|
+
const { createApiKey } = await prompts({
|
|
186
|
+
type: "confirm",
|
|
187
|
+
name: "createApiKey",
|
|
188
|
+
message: "Generate an API key for this organization?",
|
|
189
|
+
initial: true,
|
|
190
|
+
});
|
|
191
|
+
let apiKeyValue = null;
|
|
192
|
+
if (createApiKey) {
|
|
193
|
+
apiKeyValue = `apart_${randomBytes(24).toString("hex")}`;
|
|
194
|
+
const { createHash } = await import("crypto");
|
|
195
|
+
const keyHash = createHash("sha256").update(apiKeyValue).digest("hex");
|
|
196
|
+
try {
|
|
197
|
+
await db.apiKey.create({
|
|
198
|
+
data: {
|
|
199
|
+
name: `${orgName} — CLI`,
|
|
200
|
+
keyHash,
|
|
201
|
+
createdBy: "ai-init",
|
|
202
|
+
organizationId: org.id,
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
console.log(chalk.green(" ✓ API key created"));
|
|
206
|
+
console.log(chalk.bold(`\n ${apiKeyValue}\n`));
|
|
207
|
+
console.log(chalk.yellow(" Save this key — it won't be shown again."));
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
console.error(chalk.red(` ✗ Failed to create API key: ${err.message}`));
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// ── Step 5: Embeddings ──────────────────────────────────────────
|
|
214
|
+
console.log(chalk.bold("\n4. Embeddings\n"));
|
|
215
|
+
const { openaiKey } = await prompts({
|
|
216
|
+
type: "password",
|
|
217
|
+
name: "openaiKey",
|
|
218
|
+
message: "OpenAI API key (for embeddings):",
|
|
219
|
+
validate: (v) => v.startsWith("sk-") ? true : "Must start with sk-",
|
|
220
|
+
});
|
|
221
|
+
if (!openaiKey)
|
|
222
|
+
abort();
|
|
223
|
+
// ── Step 6: Seed domains ────────────────────────────────────────
|
|
224
|
+
console.log(chalk.bold("\n5. Knowledge Domains\n"));
|
|
225
|
+
const { seedDomains } = await prompts({
|
|
226
|
+
type: "confirm",
|
|
227
|
+
name: "seedDomains",
|
|
228
|
+
message: "Seed default domain taxonomy (strategy, people, products, etc.)?",
|
|
229
|
+
initial: true,
|
|
230
|
+
});
|
|
231
|
+
if (seedDomains) {
|
|
232
|
+
try {
|
|
233
|
+
const { DomainService, getTenantDb } = await import("@apart-tech/intelligence-core");
|
|
234
|
+
const tenantDb = getTenantDb(databaseUrl, { organizationId: org.id });
|
|
235
|
+
const domainService = new DomainService(tenantDb, { organizationId: org.id });
|
|
236
|
+
const result = await domainService.seed();
|
|
237
|
+
console.log(chalk.green(` ✓ ${result.created} domains seeded`));
|
|
238
|
+
}
|
|
239
|
+
catch (err) {
|
|
240
|
+
console.error(chalk.red(` ✗ Domain seeding failed: ${err.message}`));
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// ── Step 7: Write config files ──────────────────────────────────
|
|
244
|
+
console.log(chalk.bold("\n6. Writing config files\n"));
|
|
245
|
+
// .apart.yaml
|
|
246
|
+
const yamlContent = [
|
|
247
|
+
"# Apart Intelligence configuration",
|
|
248
|
+
"# Docs: https://github.com/aleksander-apart/the-collective",
|
|
249
|
+
"",
|
|
250
|
+
"embeddings:",
|
|
251
|
+
" provider: openai",
|
|
252
|
+
" model: text-embedding-3-small",
|
|
253
|
+
" dimensions: 1536",
|
|
254
|
+
"",
|
|
255
|
+
"search:",
|
|
256
|
+
" semanticWeight: 0.6",
|
|
257
|
+
" defaultLimit: 10",
|
|
258
|
+
" includeDrafts: false",
|
|
259
|
+
"",
|
|
260
|
+
"context:",
|
|
261
|
+
" maxDepth: 1",
|
|
262
|
+
" maxNodes: 20",
|
|
263
|
+
" minRelevance: 0.001",
|
|
264
|
+
"",
|
|
265
|
+
"mcp:",
|
|
266
|
+
" port: 3100",
|
|
267
|
+
" auth: none",
|
|
268
|
+
"",
|
|
269
|
+
].join("\n");
|
|
270
|
+
writeFileSync(configPath, yamlContent, "utf-8");
|
|
271
|
+
console.log(chalk.green(" ✓ .apart.yaml"));
|
|
272
|
+
// .env
|
|
273
|
+
const envPath = join(process.cwd(), ".env");
|
|
274
|
+
const envContent = [
|
|
275
|
+
`# Apart Intelligence — generated by ai init`,
|
|
276
|
+
`APART_DATABASE_URL=${databaseUrl}`,
|
|
277
|
+
`OPENAI_API_KEY=${openaiKey}`,
|
|
278
|
+
apiKeyValue ? `APART_API_KEY=${apiKeyValue}` : `# APART_API_KEY=`,
|
|
279
|
+
`APART_ORG_ID=${org.id}`,
|
|
280
|
+
"",
|
|
281
|
+
].join("\n");
|
|
282
|
+
if (existsSync(envPath)) {
|
|
283
|
+
const { overwriteEnv } = await prompts({
|
|
284
|
+
type: "confirm",
|
|
285
|
+
name: "overwriteEnv",
|
|
286
|
+
message: ".env already exists. Overwrite?",
|
|
287
|
+
initial: false,
|
|
288
|
+
});
|
|
289
|
+
if (overwriteEnv) {
|
|
290
|
+
writeFileSync(envPath, envContent, "utf-8");
|
|
291
|
+
console.log(chalk.green(" ✓ .env (overwritten)"));
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
const altPath = join(process.cwd(), ".env.apart");
|
|
295
|
+
writeFileSync(altPath, envContent, "utf-8");
|
|
296
|
+
console.log(chalk.green(` ✓ .env.apart (merge manually into .env)`));
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
writeFileSync(envPath, envContent, "utf-8");
|
|
301
|
+
console.log(chalk.green(" ✓ .env"));
|
|
302
|
+
}
|
|
303
|
+
// ── Done ────────────────────────────────────────────────────────
|
|
304
|
+
console.log(chalk.bold("\n✓ Setup complete!\n"));
|
|
305
|
+
console.log(" Get started:");
|
|
306
|
+
console.log(chalk.cyan(" ai add --type note --title 'My first note' 'Hello from Apart Intelligence!'"));
|
|
307
|
+
console.log(chalk.cyan(" ai search 'hello'"));
|
|
308
|
+
console.log(chalk.cyan(" ai map . # map a codebase"));
|
|
309
|
+
console.log(chalk.cyan(" ai graph # visualize the graph"));
|
|
310
|
+
console.log();
|
|
311
|
+
await db.$disconnect();
|
|
312
|
+
process.exit(0);
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
function abort() {
|
|
316
|
+
console.log(chalk.dim("\nAborted."));
|
|
317
|
+
process.exit(0);
|
|
318
|
+
}
|
|
319
|
+
function findPrismaSchema() {
|
|
320
|
+
const candidates = [
|
|
321
|
+
join(process.cwd(), "packages", "core"),
|
|
322
|
+
join(process.cwd(), "node_modules", "@apart-tech", "intelligence-core"),
|
|
323
|
+
resolve(new URL(".", import.meta.url).pathname, "..", "..", ".."),
|
|
324
|
+
];
|
|
325
|
+
for (const dir of candidates) {
|
|
326
|
+
if (existsSync(join(dir, "prisma", "schema.prisma"))) {
|
|
327
|
+
return dir;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
const pkgDir = resolve(new URL(".", import.meta.url).pathname, "..", "..", "..", "..", "core");
|
|
331
|
+
if (existsSync(join(pkgDir, "prisma", "schema.prisma"))) {
|
|
332
|
+
return pkgDir;
|
|
333
|
+
}
|
|
334
|
+
throw new Error("Could not find Prisma schema. Make sure @apart-tech/intelligence-core is installed.");
|
|
335
|
+
}
|
|
336
|
+
//# 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 @@
|
|
|
1
|
+
{"version":3,"file":"islands.d.ts","sourceRoot":"","sources":["../../src/commands/islands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,QA4F9C"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { loadConfig, getTenantDb, CleaningService } from "@apart-tech/intelligence-core";
|
|
3
|
+
import { resolveTenant } from "../utils.js";
|
|
4
|
+
export function islandsCommand(program) {
|
|
5
|
+
program
|
|
6
|
+
.command("islands")
|
|
7
|
+
.description("Detect disconnected clusters in the graph")
|
|
8
|
+
.option("--bridges", "Suggest links to bridge islands")
|
|
9
|
+
.option("--max-bridges <n>", "Max bridge suggestions", "10")
|
|
10
|
+
.option("-f, --format <format>", "Output format: text, json", "text")
|
|
11
|
+
.action(async (opts) => {
|
|
12
|
+
const config = loadConfig();
|
|
13
|
+
const tenant = resolveTenant(config);
|
|
14
|
+
const db = getTenantDb(config.database.url, tenant);
|
|
15
|
+
const cleaning = new CleaningService(db, tenant);
|
|
16
|
+
const islands = await cleaning.findIslands();
|
|
17
|
+
if (opts.format === "json") {
|
|
18
|
+
if (opts.bridges) {
|
|
19
|
+
const bridges = await cleaning.suggestBridges(parseInt(opts.maxBridges));
|
|
20
|
+
console.log(JSON.stringify({ islands, bridges }, null, 2));
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
console.log(JSON.stringify(islands, null, 2));
|
|
24
|
+
}
|
|
25
|
+
process.exit(0);
|
|
26
|
+
}
|
|
27
|
+
if (islands.length === 0) {
|
|
28
|
+
console.log(chalk.green("No disconnected clusters found."));
|
|
29
|
+
process.exit(0);
|
|
30
|
+
}
|
|
31
|
+
console.log(chalk.bold(`\nFound ${chalk.cyan(islands.length)} connected component(s):\n`));
|
|
32
|
+
for (const island of islands) {
|
|
33
|
+
const label = island.id === 1
|
|
34
|
+
? chalk.green(" (main)")
|
|
35
|
+
: island.size <= 3
|
|
36
|
+
? chalk.yellow(" (small)")
|
|
37
|
+
: "";
|
|
38
|
+
console.log(chalk.bold(` Component #${island.id}${label} — ${island.size} nodes`));
|
|
39
|
+
const preview = island.nodes.slice(0, 5);
|
|
40
|
+
for (const node of preview) {
|
|
41
|
+
console.log(` ${chalk.dim(node.id.slice(0, 8))} ${chalk.cyan(node.type)} ${node.title}`);
|
|
42
|
+
}
|
|
43
|
+
if (island.nodes.length > 5) {
|
|
44
|
+
console.log(chalk.dim(` ... and ${island.nodes.length - 5} more`));
|
|
45
|
+
}
|
|
46
|
+
console.log();
|
|
47
|
+
}
|
|
48
|
+
if (opts.bridges) {
|
|
49
|
+
const bridges = await cleaning.suggestBridges(parseInt(opts.maxBridges));
|
|
50
|
+
if (bridges.length === 0) {
|
|
51
|
+
console.log(chalk.dim("No bridge suggestions found.\n"));
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
console.log(chalk.bold("Suggested bridges between islands:\n"));
|
|
55
|
+
for (const bridge of bridges) {
|
|
56
|
+
const pct = (bridge.suggestion.similarity * 100).toFixed(1);
|
|
57
|
+
console.log(` ${chalk.magenta(`${pct}%`)} #${bridge.from.id} (${bridge.from.size} nodes) ↔ #${bridge.to.id} (${bridge.to.size} nodes)`);
|
|
58
|
+
console.log(` ${chalk.dim(bridge.suggestion.source.id.slice(0, 8))} ${bridge.suggestion.source.title}`);
|
|
59
|
+
console.log(` ${chalk.dim(bridge.suggestion.target.id.slice(0, 8))} ${bridge.suggestion.target.title}`);
|
|
60
|
+
console.log();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.log(chalk.dim("Use --bridges to suggest links between islands.\n"));
|
|
66
|
+
}
|
|
67
|
+
process.exit(0);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=islands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"islands.js","sourceRoot":"","sources":["../../src/commands/islands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,QA4C3C"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { loadServiceProvider } from "../api-client/index.js";
|
|
3
|
+
export function linkCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command("link")
|
|
6
|
+
.description("Link two nodes with a relationship")
|
|
7
|
+
.argument("<source>", "Source node ID")
|
|
8
|
+
.argument("<target>", "Target node ID")
|
|
9
|
+
.option("-r, --rel <type>", "Relationship type", "relates-to")
|
|
10
|
+
.option("-w, --weight <n>", "Edge weight", "1.0")
|
|
11
|
+
.option("--by <creator>", "Creator identifier", "cli")
|
|
12
|
+
.option("-f, --format <format>", "Output format: text, json", "text")
|
|
13
|
+
.action(async (source, target, opts) => {
|
|
14
|
+
const services = loadServiceProvider();
|
|
15
|
+
// Check if this is a new relationship type and hint existing ones
|
|
16
|
+
const existingTypes = await services.edges.listRelationshipTypes();
|
|
17
|
+
const typeNames = existingTypes.map((t) => t.relationshipType);
|
|
18
|
+
const isNew = !typeNames.includes(opts.rel);
|
|
19
|
+
const edge = await services.edges.create({
|
|
20
|
+
sourceNodeId: source,
|
|
21
|
+
targetNodeId: target,
|
|
22
|
+
relationshipType: opts.rel,
|
|
23
|
+
weight: parseFloat(opts.weight),
|
|
24
|
+
createdBy: opts.by,
|
|
25
|
+
});
|
|
26
|
+
if (opts.format === "json") {
|
|
27
|
+
console.log(JSON.stringify(edge, null, 2));
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
console.log(chalk.green("✓ Edge created"));
|
|
31
|
+
console.log(` ${source.slice(0, 8)} —[${opts.rel}]→ ${target.slice(0, 8)}`);
|
|
32
|
+
if (isNew) {
|
|
33
|
+
console.log(chalk.yellow(`\n Note: "${opts.rel}" is a new relationship type.`));
|
|
34
|
+
console.log(chalk.dim(` Existing types: ${typeNames.sort().join(", ")}`));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
process.exit(0);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,oCAAoC,CAAC;SACjD,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;SACtC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;SACtC,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,EAAE,YAAY,CAAC;SAC7D,MAAM,CAAC,kBAAkB,EAAE,aAAa,EAAE,KAAK,CAAC;SAChD,MAAM,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,KAAK,CAAC;SACrD,MAAM,CAAC,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,CAAC;SACpE,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,MAAc,EAAE,IAAI,EAAE,EAAE;QACrD,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;QAEvC,kEAAkE;QAClE,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC;QACnE,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE5C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;YACvC,YAAY,EAAE,MAAM;YACpB,YAAY,EAAE,MAAM;YACpB,gBAAgB,EAAE,IAAI,CAAC,GAAG;YAC1B,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;YAC/B,SAAS,EAAE,IAAI,CAAC,EAAE;SACnB,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAE7E,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,GAAG,+BAA+B,CAAC,CACpE,CAAC;gBACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,qBAAqB,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAC9D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,QAiF5C"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import prompts from "prompts";
|
|
3
|
+
import { saveCredentials, loadCredentials } from "../api-client/index.js";
|
|
4
|
+
export function loginCommand(program) {
|
|
5
|
+
program
|
|
6
|
+
.command("login")
|
|
7
|
+
.description("Log in to an Apart Intelligence server")
|
|
8
|
+
.option("-s, --server <url>", "Server URL")
|
|
9
|
+
.option("-k, --key <key>", "API key")
|
|
10
|
+
.action(async (opts) => {
|
|
11
|
+
const existing = loadCredentials();
|
|
12
|
+
let server = opts.server;
|
|
13
|
+
let apiKey = opts.key;
|
|
14
|
+
if (!server) {
|
|
15
|
+
const res = await prompts({
|
|
16
|
+
type: "text",
|
|
17
|
+
name: "server",
|
|
18
|
+
message: "Server URL",
|
|
19
|
+
initial: existing?.server ?? "http://localhost:3200",
|
|
20
|
+
});
|
|
21
|
+
server = res.server;
|
|
22
|
+
if (!server)
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
if (!apiKey) {
|
|
26
|
+
const res = await prompts({
|
|
27
|
+
type: "password",
|
|
28
|
+
name: "apiKey",
|
|
29
|
+
message: "API key",
|
|
30
|
+
});
|
|
31
|
+
apiKey = res.apiKey;
|
|
32
|
+
if (!apiKey)
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
// Validate by hitting the health endpoint
|
|
36
|
+
try {
|
|
37
|
+
const healthRes = await fetch(`${server.replace(/\/$/, "")}/api/health`);
|
|
38
|
+
if (!healthRes.ok) {
|
|
39
|
+
console.error(chalk.red(`Server not reachable: ${server}`));
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
45
|
+
console.error(chalk.red(`Cannot connect to server: ${message}`));
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
// Validate the API key by hitting an authed endpoint
|
|
49
|
+
try {
|
|
50
|
+
const authRes = await fetch(`${server.replace(/\/$/, "")}/api/nodes/types`, {
|
|
51
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
52
|
+
});
|
|
53
|
+
if (authRes.status === 401) {
|
|
54
|
+
console.error(chalk.red("Invalid API key"));
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
if (!authRes.ok) {
|
|
58
|
+
console.error(chalk.red(`Auth check failed: HTTP ${authRes.status}`));
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
64
|
+
console.error(chalk.red(`Auth check failed: ${message}`));
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
saveCredentials({ server: server.replace(/\/$/, ""), apiKey });
|
|
68
|
+
console.log(chalk.green("Logged in to " + server));
|
|
69
|
+
process.exit(0);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,QAa7C"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { deleteCredentials } from "../api-client/index.js";
|
|
3
|
+
export function logoutCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command("logout")
|
|
6
|
+
.description("Log out from the Apart Intelligence server")
|
|
7
|
+
.action(async () => {
|
|
8
|
+
const deleted = deleteCredentials();
|
|
9
|
+
if (deleted) {
|
|
10
|
+
console.log(chalk.green("Logged out"));
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
console.log(chalk.yellow("Not logged in"));
|
|
14
|
+
}
|
|
15
|
+
process.exit(0);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;QACpC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/commands/map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,QA6F1C"}
|