@kilospark/nairo 0.0.1
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/api.d.ts +16 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +102 -0
- package/dist/api.js.map +1 -0
- package/dist/auth-browser.d.ts +5 -0
- package/dist/auth-browser.d.ts.map +1 -0
- package/dist/auth-browser.js +217 -0
- package/dist/auth-browser.js.map +1 -0
- package/dist/commands/bootstrap.d.ts +5 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/bootstrap.js +363 -0
- package/dist/commands/bootstrap.js.map +1 -0
- package/dist/commands/delete.d.ts +4 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +64 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/export.d.ts +4 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +25 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/hook.d.ts +4 -0
- package/dist/commands/hook.d.ts.map +1 -0
- package/dist/commands/hook.js +242 -0
- package/dist/commands/hook.js.map +1 -0
- package/dist/commands/import.d.ts +2 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +210 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/install.d.ts +9 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +282 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +90 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +24 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/search.d.ts +4 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +42 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/signup.d.ts +2 -0
- package/dist/commands/signup.d.ts.map +1 -0
- package/dist/commands/signup.js +6 -0
- package/dist/commands/signup.js.map +1 -0
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +35 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/prompt.d.ts +10 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +37 -0
- package/dist/prompt.js.map +1 -0
- package/dist/tools/configure.d.ts +9 -0
- package/dist/tools/configure.d.ts.map +1 -0
- package/dist/tools/configure.js +326 -0
- package/dist/tools/configure.js.map +1 -0
- package/dist/tools/detect.d.ts +7 -0
- package/dist/tools/detect.d.ts.map +1 -0
- package/dist/tools/detect.js +125 -0
- package/dist/tools/detect.js.map +1 -0
- package/package.json +24 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
2
|
+
import { gzipSync } from "node:zlib";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { basename, join } from "node:path";
|
|
5
|
+
import { getConfig } from "../config.js";
|
|
6
|
+
import { apiClient } from "../api.js";
|
|
7
|
+
import { prompt } from "../prompt.js";
|
|
8
|
+
const SCAN_FILES = [
|
|
9
|
+
"README.md",
|
|
10
|
+
"package.json",
|
|
11
|
+
"pyproject.toml",
|
|
12
|
+
"go.mod",
|
|
13
|
+
"tsconfig.json",
|
|
14
|
+
"CONTRIBUTING.md",
|
|
15
|
+
"CLAUDE.md",
|
|
16
|
+
"Cargo.toml",
|
|
17
|
+
"turbo.json",
|
|
18
|
+
"pnpm-workspace.yaml",
|
|
19
|
+
"lerna.json",
|
|
20
|
+
"nx.json",
|
|
21
|
+
"drizzle.config.ts",
|
|
22
|
+
"drizzle.config.js",
|
|
23
|
+
"Dockerfile",
|
|
24
|
+
"docker-compose.yml",
|
|
25
|
+
"docker-compose.yaml",
|
|
26
|
+
".github/workflows/ci.yml",
|
|
27
|
+
".github/workflows/ci.yaml",
|
|
28
|
+
];
|
|
29
|
+
const SCAN_GLOBS = [
|
|
30
|
+
".eslintrc",
|
|
31
|
+
".eslintrc.js",
|
|
32
|
+
".eslintrc.json",
|
|
33
|
+
".eslintrc.yml",
|
|
34
|
+
".eslintrc.yaml",
|
|
35
|
+
"eslint.config.js",
|
|
36
|
+
"eslint.config.mjs",
|
|
37
|
+
"eslint.config.cjs",
|
|
38
|
+
];
|
|
39
|
+
/** Directories to scan for workspace package config files */
|
|
40
|
+
const WORKSPACE_DIRS = ["apps", "packages", "services", "libs", "modules"];
|
|
41
|
+
function isYes(value) {
|
|
42
|
+
const v = value.trim().toLowerCase();
|
|
43
|
+
return v === "y" || v === "yes";
|
|
44
|
+
}
|
|
45
|
+
function tryReadFile(filePath) {
|
|
46
|
+
try {
|
|
47
|
+
if (existsSync(filePath)) {
|
|
48
|
+
const content = readFileSync(filePath, "utf-8");
|
|
49
|
+
return content.trim() ? content : null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// skip unreadable files
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
function scanProjectFiles(cwd) {
|
|
58
|
+
const files = [];
|
|
59
|
+
const seen = new Set();
|
|
60
|
+
function addFile(name, content) {
|
|
61
|
+
if (!seen.has(name)) {
|
|
62
|
+
seen.add(name);
|
|
63
|
+
files.push({ name, content });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Scan known root files
|
|
67
|
+
for (const name of [...SCAN_FILES, ...SCAN_GLOBS]) {
|
|
68
|
+
const content = tryReadFile(join(cwd, name));
|
|
69
|
+
if (content !== null)
|
|
70
|
+
addFile(name, content);
|
|
71
|
+
}
|
|
72
|
+
// Scan workspace package directories (monorepo support)
|
|
73
|
+
for (const wsDir of WORKSPACE_DIRS) {
|
|
74
|
+
const wsDirPath = join(cwd, wsDir);
|
|
75
|
+
if (!existsSync(wsDirPath))
|
|
76
|
+
continue;
|
|
77
|
+
try {
|
|
78
|
+
const packages = readdirSync(wsDirPath);
|
|
79
|
+
for (const pkg of packages) {
|
|
80
|
+
const pkgDir = join(wsDirPath, pkg);
|
|
81
|
+
for (const name of ["package.json", "README.md", "CLAUDE.md", "tsconfig.json", "Cargo.toml", "pyproject.toml"]) {
|
|
82
|
+
const content = tryReadFile(join(pkgDir, name));
|
|
83
|
+
if (content !== null)
|
|
84
|
+
addFile(`${wsDir}/${pkg}/${name}`, content);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// skip
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Scan docs/adr/* and docs/decisions/*
|
|
93
|
+
for (const docsDir of ["docs/adr", "docs/decisions"]) {
|
|
94
|
+
const dirPath = join(cwd, docsDir);
|
|
95
|
+
if (!existsSync(dirPath))
|
|
96
|
+
continue;
|
|
97
|
+
try {
|
|
98
|
+
const entries = readdirSync(dirPath);
|
|
99
|
+
for (const entry of entries) {
|
|
100
|
+
const content = tryReadFile(join(dirPath, entry));
|
|
101
|
+
if (content !== null)
|
|
102
|
+
addFile(`${docsDir}/${entry}`, content);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// skip
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return files;
|
|
110
|
+
}
|
|
111
|
+
function scanPreferenceSources(cwd) {
|
|
112
|
+
const sources = [];
|
|
113
|
+
const home = homedir();
|
|
114
|
+
// Claude Code conversation transcripts for this project
|
|
115
|
+
const projectDirName = cwd.replace(/\//g, "-");
|
|
116
|
+
const claudeProjectDir = join(home, ".claude", "projects", projectDirName);
|
|
117
|
+
if (existsSync(claudeProjectDir)) {
|
|
118
|
+
const transcripts = [];
|
|
119
|
+
try {
|
|
120
|
+
const entries = readdirSync(claudeProjectDir);
|
|
121
|
+
// Get .jsonl files, sorted by mtime descending, take most recent 5
|
|
122
|
+
const jsonlFiles = entries
|
|
123
|
+
.filter((e) => e.endsWith(".jsonl"))
|
|
124
|
+
.map((e) => ({
|
|
125
|
+
name: e,
|
|
126
|
+
path: join(claudeProjectDir, e),
|
|
127
|
+
mtime: statSync(join(claudeProjectDir, e)).mtimeMs,
|
|
128
|
+
size: statSync(join(claudeProjectDir, e)).size,
|
|
129
|
+
}))
|
|
130
|
+
.filter((e) => e.size > 1000) // skip tiny/empty sessions
|
|
131
|
+
.sort((a, b) => b.mtime - a.mtime)
|
|
132
|
+
.slice(0, 5);
|
|
133
|
+
for (const f of jsonlFiles) {
|
|
134
|
+
const content = tryReadFile(f.path);
|
|
135
|
+
if (content) {
|
|
136
|
+
// Keep only last 2000 lines per transcript to stay within payload limits
|
|
137
|
+
const lines = content.split("\n");
|
|
138
|
+
const trimmed = lines.length > 2000
|
|
139
|
+
? lines.slice(-2000).join("\n")
|
|
140
|
+
: content;
|
|
141
|
+
transcripts.push({
|
|
142
|
+
archivePath: `claude/${f.name}`,
|
|
143
|
+
originalPath: f.path,
|
|
144
|
+
content: trimmed,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// skip
|
|
151
|
+
}
|
|
152
|
+
if (transcripts.length > 0) {
|
|
153
|
+
sources.push({ label: "claude", files: transcripts });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Freeform preference files (CLAUDE.md, .cursorrules, etc.)
|
|
157
|
+
// Wrap them as synthetic Claude JSONL so the parser handles them
|
|
158
|
+
const prefFiles = [];
|
|
159
|
+
function addPrefFile(name, content, originalPath) {
|
|
160
|
+
// Wrap as a single-message JSONL so parseClaudeJSONL picks it up
|
|
161
|
+
const jsonl = JSON.stringify({
|
|
162
|
+
type: "user",
|
|
163
|
+
message: { role: "user", content: `[Preferences from ${name}]:\n${content}` },
|
|
164
|
+
});
|
|
165
|
+
prefFiles.push({ archivePath: `preferences/${name}`, originalPath, content: jsonl });
|
|
166
|
+
}
|
|
167
|
+
const globalClaude = tryReadFile(join(home, ".claude", "CLAUDE.md"));
|
|
168
|
+
if (globalClaude)
|
|
169
|
+
addPrefFile("global-claude.md", globalClaude, join(home, ".claude", "CLAUDE.md"));
|
|
170
|
+
const projectClaude = tryReadFile(join(cwd, ".claude", "CLAUDE.md"));
|
|
171
|
+
if (projectClaude)
|
|
172
|
+
addPrefFile("project-claude.md", projectClaude, join(cwd, ".claude", "CLAUDE.md"));
|
|
173
|
+
const cursorrules = tryReadFile(join(cwd, ".cursorrules"));
|
|
174
|
+
if (cursorrules)
|
|
175
|
+
addPrefFile("cursorrules", cursorrules, join(cwd, ".cursorrules"));
|
|
176
|
+
const cursorRulesDir = join(cwd, ".cursor", "rules");
|
|
177
|
+
if (existsSync(cursorRulesDir)) {
|
|
178
|
+
try {
|
|
179
|
+
for (const entry of readdirSync(cursorRulesDir)) {
|
|
180
|
+
const content = tryReadFile(join(cursorRulesDir, entry));
|
|
181
|
+
if (content)
|
|
182
|
+
addPrefFile(`cursor-rule-${entry}`, content, join(cursorRulesDir, entry));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch { /* skip */ }
|
|
186
|
+
}
|
|
187
|
+
const cursorGlobalDir = join(home, ".cursor", "rules");
|
|
188
|
+
if (existsSync(cursorGlobalDir)) {
|
|
189
|
+
try {
|
|
190
|
+
for (const entry of readdirSync(cursorGlobalDir)) {
|
|
191
|
+
const content = tryReadFile(join(cursorGlobalDir, entry));
|
|
192
|
+
if (content)
|
|
193
|
+
addPrefFile(`cursor-global-${entry}`, content, join(cursorGlobalDir, entry));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch { /* skip */ }
|
|
197
|
+
}
|
|
198
|
+
const copilot = tryReadFile(join(cwd, ".github", "copilot-instructions.md"));
|
|
199
|
+
if (copilot)
|
|
200
|
+
addPrefFile("copilot-instructions.md", copilot, join(cwd, ".github", "copilot-instructions.md"));
|
|
201
|
+
const windsurf = tryReadFile(join(cwd, ".windsurfrules"));
|
|
202
|
+
if (windsurf)
|
|
203
|
+
addPrefFile("windsurfrules", windsurf, join(cwd, ".windsurfrules"));
|
|
204
|
+
if (prefFiles.length > 0) {
|
|
205
|
+
sources.push({ label: "claude", files: prefFiles });
|
|
206
|
+
}
|
|
207
|
+
return sources;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Build a gzip-compressed import archive from preference sources.
|
|
211
|
+
*/
|
|
212
|
+
function buildImportArchive(sources) {
|
|
213
|
+
const manifest = {
|
|
214
|
+
sources: sources.map((s) => ({
|
|
215
|
+
label: s.label,
|
|
216
|
+
rootPath: "",
|
|
217
|
+
files: s.files.map((f) => ({
|
|
218
|
+
archivePath: f.archivePath,
|
|
219
|
+
originalPath: f.originalPath,
|
|
220
|
+
})),
|
|
221
|
+
})),
|
|
222
|
+
};
|
|
223
|
+
const files = {};
|
|
224
|
+
for (const source of sources) {
|
|
225
|
+
for (const f of source.files) {
|
|
226
|
+
files[f.archivePath] = f.content;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
const payload = JSON.stringify({ manifest, files });
|
|
230
|
+
return Buffer.from(gzipSync(Buffer.from(payload, "utf-8")));
|
|
231
|
+
}
|
|
232
|
+
// ---------------------------------------------------------------------------
|
|
233
|
+
// Main bootstrap command
|
|
234
|
+
// ---------------------------------------------------------------------------
|
|
235
|
+
export async function bootstrapCommand(options) {
|
|
236
|
+
getConfig();
|
|
237
|
+
const cwd = process.cwd();
|
|
238
|
+
const projectName = options.project ?? basename(cwd);
|
|
239
|
+
console.log(`Bootstrapping project: ${projectName}\n`);
|
|
240
|
+
// Step 1: Find or create project
|
|
241
|
+
let projectId;
|
|
242
|
+
try {
|
|
243
|
+
const projectsResp = await apiClient("/api/projects");
|
|
244
|
+
const existing = projectsResp.projects.find((p) => p.name === projectName);
|
|
245
|
+
if (existing) {
|
|
246
|
+
projectId = existing.id;
|
|
247
|
+
console.log(`Using existing project: ${projectName} (${projectId})\n`);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
const created = await apiClient("/api/projects", {
|
|
251
|
+
method: "POST",
|
|
252
|
+
body: { name: projectName },
|
|
253
|
+
});
|
|
254
|
+
projectId = created.project.id;
|
|
255
|
+
console.log(`Created project: ${projectName} (${projectId})\n`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
260
|
+
console.error(`Failed to set up project: ${message}`);
|
|
261
|
+
process.exit(1);
|
|
262
|
+
}
|
|
263
|
+
// Step 2: Scan and analyze project files (rule-based, fast)
|
|
264
|
+
console.log("Scanning project files...");
|
|
265
|
+
const files = scanProjectFiles(cwd);
|
|
266
|
+
if (files.length > 0) {
|
|
267
|
+
console.log(`Found ${files.length} project file(s). Analyzing...`);
|
|
268
|
+
try {
|
|
269
|
+
const resp = await apiClient("/api/bootstrap", {
|
|
270
|
+
method: "POST",
|
|
271
|
+
body: { projectId, files },
|
|
272
|
+
});
|
|
273
|
+
const events = resp.events;
|
|
274
|
+
if (events.length > 0) {
|
|
275
|
+
console.log(`Extracted ${events.length} project convention(s).\n`);
|
|
276
|
+
let saved = 0;
|
|
277
|
+
for (const event of events) {
|
|
278
|
+
try {
|
|
279
|
+
await apiClient("/api/events", {
|
|
280
|
+
method: "POST",
|
|
281
|
+
body: {
|
|
282
|
+
projectId,
|
|
283
|
+
type: event.type,
|
|
284
|
+
summary: event.summary,
|
|
285
|
+
confidence: event.confidence,
|
|
286
|
+
trigger: event.trigger ?? "prompted",
|
|
287
|
+
source: event.source ?? "system",
|
|
288
|
+
confirmationStatus: "confirmed",
|
|
289
|
+
},
|
|
290
|
+
});
|
|
291
|
+
saved++;
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
// skip individual failures
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
console.log(`Saved ${saved} project convention(s).`);
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
console.log("No project conventions extracted.");
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
305
|
+
console.error(`Project analysis failed: ${message}`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// Step 3: Check for pre-existing user preferences
|
|
309
|
+
const prefSources = scanPreferenceSources(cwd);
|
|
310
|
+
const totalPrefFiles = prefSources.reduce((sum, s) => sum + s.files.length, 0);
|
|
311
|
+
if (totalPrefFiles === 0) {
|
|
312
|
+
console.log("\nNo pre-existing preferences found.");
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
// Show what was found
|
|
316
|
+
console.log(`\nFound ${totalPrefFiles} preference source(s):`);
|
|
317
|
+
for (const source of prefSources) {
|
|
318
|
+
for (const f of source.files) {
|
|
319
|
+
const sizeMB = (f.content.length / 1024 / 1024).toFixed(1);
|
|
320
|
+
console.log(` - ${f.archivePath} (${sizeMB} MB)`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// Single prompt
|
|
324
|
+
let importPrefs = options.yes;
|
|
325
|
+
if (!importPrefs) {
|
|
326
|
+
const answer = await prompt("\nImport pre-existing preferences? [Y/n]: ");
|
|
327
|
+
importPrefs = !answer.trim() || isYes(answer);
|
|
328
|
+
}
|
|
329
|
+
if (!importPrefs) {
|
|
330
|
+
console.log("Skipped preference import.");
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
// Step 4: Package and send to import pipeline
|
|
334
|
+
console.log("\nPackaging preferences for analysis...");
|
|
335
|
+
const archive = buildImportArchive(prefSources);
|
|
336
|
+
console.log(`Archive size: ${(archive.length / 1024).toFixed(0)} KB`);
|
|
337
|
+
try {
|
|
338
|
+
const config = getConfig();
|
|
339
|
+
const url = `${config.apiUrl}/api/import-memories`;
|
|
340
|
+
const response = await fetch(url, {
|
|
341
|
+
method: "POST",
|
|
342
|
+
headers: {
|
|
343
|
+
"Authorization": `Bearer ${config.apiKey}`,
|
|
344
|
+
"Content-Type": "application/gzip",
|
|
345
|
+
"x-nairo-project-id": projectId,
|
|
346
|
+
},
|
|
347
|
+
body: new Uint8Array(archive),
|
|
348
|
+
});
|
|
349
|
+
if (!response.ok) {
|
|
350
|
+
const data = await response.json().catch(() => ({}));
|
|
351
|
+
throw new Error(data.error || `HTTP ${response.status}`);
|
|
352
|
+
}
|
|
353
|
+
const result = await response.json();
|
|
354
|
+
console.log(`\nPreference import started (${result.fileCount} file(s)).`);
|
|
355
|
+
console.log("Memories will be extracted in the background and appear as pending events.");
|
|
356
|
+
console.log(`Import ID: ${result.importId}`);
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
360
|
+
console.error(`Preference import failed: ${message}`);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAaA,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CA2Ef"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { getConfig } from "../config.js";
|
|
2
|
+
import { apiClient } from "../api.js";
|
|
3
|
+
import { prompt } from "../prompt.js";
|
|
4
|
+
export async function deleteCommand(eventId, options) {
|
|
5
|
+
const config = getConfig();
|
|
6
|
+
if (options.all) {
|
|
7
|
+
// Delete all events — double confirmation
|
|
8
|
+
const answer1 = await prompt("Are you sure you want to delete ALL events? (yes/no): ");
|
|
9
|
+
if (answer1.toLowerCase() !== "yes") {
|
|
10
|
+
console.log("Cancelled.");
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const answer2 = await prompt("This cannot be undone. Type 'delete all' to confirm: ");
|
|
14
|
+
if (answer2 !== "delete all") {
|
|
15
|
+
console.log("Cancelled.");
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
// Get all projects, then delete all events from each
|
|
20
|
+
const projectsResp = await apiClient("/api/projects");
|
|
21
|
+
let totalDeleted = 0;
|
|
22
|
+
for (const project of projectsResp.projects) {
|
|
23
|
+
const eventsResp = await apiClient(`/api/events?projectId=${project.id}&limit=200`);
|
|
24
|
+
for (const event of eventsResp.events) {
|
|
25
|
+
try {
|
|
26
|
+
await apiClient(`/api/events/${event.id}`, { method: "DELETE" });
|
|
27
|
+
totalDeleted++;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// continue on individual failures
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
console.log(`Deleted ${totalDeleted} event(s).`);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
38
|
+
console.error(`Delete failed: ${message}`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (!eventId) {
|
|
44
|
+
console.error("Please provide an event ID, or use --all to delete all events.");
|
|
45
|
+
console.error("Usage: nairo delete <eventId>");
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
// Delete a single event
|
|
49
|
+
const answer = await prompt(`Are you sure you want to delete event ${eventId}? (y/n): `);
|
|
50
|
+
if (answer.toLowerCase() !== "y" && answer.toLowerCase() !== "yes") {
|
|
51
|
+
console.log("Cancelled.");
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
await apiClient(`/api/events/${eventId}`, { method: "DELETE" });
|
|
56
|
+
console.log(`Event ${eventId} deleted.`);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
60
|
+
console.error(`Delete failed: ${message}`);
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAYA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBhB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { writeFileSync } from "node:fs";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { getConfig } from "../config.js";
|
|
4
|
+
import { apiClient } from "../api.js";
|
|
5
|
+
export async function exportCommand(options) {
|
|
6
|
+
const config = getConfig();
|
|
7
|
+
const outputPath = options.output
|
|
8
|
+
? resolve(options.output)
|
|
9
|
+
: join(process.cwd(), "nairo-export.json");
|
|
10
|
+
console.log("Exporting data...\n");
|
|
11
|
+
try {
|
|
12
|
+
const data = await apiClient("/api/export");
|
|
13
|
+
writeFileSync(outputPath, JSON.stringify(data, null, 2), "utf-8");
|
|
14
|
+
console.log(`Export saved to: ${outputPath}`);
|
|
15
|
+
console.log(` Projects: ${data.projects.length}`);
|
|
16
|
+
console.log(` Events: ${data.events.length}`);
|
|
17
|
+
console.log(` Exported: ${data.exportedAt}`);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
21
|
+
console.error(`Export failed: ${message}`);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAStC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAEnC;IACC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM;QAC/B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QACzB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAE7C,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAEnC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAAa,aAAa,CAAC,CAAC;QAExD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAElE,OAAO,CAAC,GAAG,CAAC,oBAAoB,UAAU,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"AAuJA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAoCrD;AAMD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuCtD;AAMD,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA0BpD"}
|