@novis10813/secondbrain-cli 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.
Files changed (67) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +133 -0
  3. package/dist/commands/backlinks.d.ts +3 -0
  4. package/dist/commands/backlinks.d.ts.map +1 -0
  5. package/dist/commands/backlinks.js +65 -0
  6. package/dist/commands/backlinks.js.map +1 -0
  7. package/dist/commands/capture.d.ts +3 -0
  8. package/dist/commands/capture.d.ts.map +1 -0
  9. package/dist/commands/capture.js +90 -0
  10. package/dist/commands/capture.js.map +1 -0
  11. package/dist/commands/config.d.ts +3 -0
  12. package/dist/commands/config.d.ts.map +1 -0
  13. package/dist/commands/config.js +84 -0
  14. package/dist/commands/config.js.map +1 -0
  15. package/dist/commands/get.d.ts +3 -0
  16. package/dist/commands/get.d.ts.map +1 -0
  17. package/dist/commands/get.js +44 -0
  18. package/dist/commands/get.js.map +1 -0
  19. package/dist/commands/init.d.ts +3 -0
  20. package/dist/commands/init.d.ts.map +1 -0
  21. package/dist/commands/init.js +35 -0
  22. package/dist/commands/init.js.map +1 -0
  23. package/dist/commands/orphans.d.ts +3 -0
  24. package/dist/commands/orphans.d.ts.map +1 -0
  25. package/dist/commands/orphans.js +57 -0
  26. package/dist/commands/orphans.js.map +1 -0
  27. package/dist/commands/search.d.ts +3 -0
  28. package/dist/commands/search.d.ts.map +1 -0
  29. package/dist/commands/search.js +64 -0
  30. package/dist/commands/search.js.map +1 -0
  31. package/dist/commands/stats.d.ts +3 -0
  32. package/dist/commands/stats.d.ts.map +1 -0
  33. package/dist/commands/stats.js +44 -0
  34. package/dist/commands/stats.js.map +1 -0
  35. package/dist/commands/sync.d.ts +3 -0
  36. package/dist/commands/sync.d.ts.map +1 -0
  37. package/dist/commands/sync.js +41 -0
  38. package/dist/commands/sync.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +35 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/types/index.d.ts +69 -0
  44. package/dist/types/index.d.ts.map +1 -0
  45. package/dist/types/index.js +3 -0
  46. package/dist/types/index.js.map +1 -0
  47. package/dist/utils/config.d.ts +15 -0
  48. package/dist/utils/config.d.ts.map +1 -0
  49. package/dist/utils/config.js +77 -0
  50. package/dist/utils/config.js.map +1 -0
  51. package/dist/utils/database.d.ts +28 -0
  52. package/dist/utils/database.d.ts.map +1 -0
  53. package/dist/utils/database.js +261 -0
  54. package/dist/utils/database.js.map +1 -0
  55. package/dist/utils/parser.d.ts +19 -0
  56. package/dist/utils/parser.d.ts.map +1 -0
  57. package/dist/utils/parser.js +159 -0
  58. package/dist/utils/parser.js.map +1 -0
  59. package/dist/utils/template.d.ts +17 -0
  60. package/dist/utils/template.d.ts.map +1 -0
  61. package/dist/utils/template.js +100 -0
  62. package/dist/utils/template.js.map +1 -0
  63. package/dist/utils/vault.d.ts +32 -0
  64. package/dist/utils/vault.d.ts.map +1 -0
  65. package/dist/utils/vault.js +194 -0
  66. package/dist/utils/vault.js.map +1 -0
  67. package/package.json +53 -0
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSearchCommand = createSearchCommand;
4
+ const commander_1 = require("commander");
5
+ const config_js_1 = require("../utils/config.js");
6
+ const vault_js_1 = require("../utils/vault.js");
7
+ function createSearchCommand() {
8
+ const command = new commander_1.Command('search')
9
+ .description('Search notes')
10
+ .argument('<query>', 'Search query')
11
+ .option('-t, --tags <tags>', 'Filter by tags (comma-separated)')
12
+ .option('-l, --limit <limit>', 'Maximum results', '20')
13
+ .option('-f, --format <format>', 'Output format (json|text)', 'json')
14
+ .action((query, options) => {
15
+ try {
16
+ const vaultPath = config_js_1.ConfigManager.findVaultPath();
17
+ if (!vaultPath) {
18
+ console.error('❌ Not in a SecondBrain vault. Run `sb init` first.');
19
+ process.exit(1);
20
+ }
21
+ const configManager = new config_js_1.ConfigManager(vaultPath);
22
+ const config = configManager.getConfig();
23
+ const vault = new vault_js_1.VaultManager(config);
24
+ const tags = options.tags ? options.tags.split(',').map((t) => t.trim()) : undefined;
25
+ const limit = parseInt(options.limit);
26
+ const notes = vault.searchNotes(query, tags, limit);
27
+ if (options.format === 'json') {
28
+ const results = notes.map(note => ({
29
+ id: note.id,
30
+ title: note.title,
31
+ path: note.path,
32
+ excerpt: note.content.substring(0, 200) + (note.content.length > 200 ? '...' : ''),
33
+ tags: note.tags,
34
+ linksCount: note.links.length,
35
+ backlinksCount: note.backlinks.length
36
+ }));
37
+ console.log(JSON.stringify({
38
+ query,
39
+ filters: { tags, limit },
40
+ results,
41
+ total: results.length
42
+ }, null, 2));
43
+ }
44
+ else {
45
+ // Text format
46
+ console.log(`Search results for "${query}":\n`);
47
+ notes.forEach((note, i) => {
48
+ console.log(`${i + 1}. ${note.title}`);
49
+ console.log(` Path: ${note.path}`);
50
+ console.log(` Tags: ${note.tags.join(', ') || 'none'}`);
51
+ console.log(` ID: ${note.id}`);
52
+ console.log();
53
+ });
54
+ }
55
+ vault.close();
56
+ }
57
+ catch (error) {
58
+ console.error('❌ Search failed:', error instanceof Error ? error.message : String(error));
59
+ process.exit(1);
60
+ }
61
+ });
62
+ return command;
63
+ }
64
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createStatsCommand(): Command;
3
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,kBAAkB,IAAI,OAAO,CAwC5C"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStatsCommand = createStatsCommand;
4
+ const commander_1 = require("commander");
5
+ const config_js_1 = require("../utils/config.js");
6
+ const vault_js_1 = require("../utils/vault.js");
7
+ function createStatsCommand() {
8
+ const command = new commander_1.Command('stats')
9
+ .description('Show vault statistics')
10
+ .option('-f, --format <format>', 'Output format (json|text)', 'text')
11
+ .action((options) => {
12
+ try {
13
+ const vaultPath = config_js_1.ConfigManager.findVaultPath();
14
+ if (!vaultPath) {
15
+ console.error('❌ Not in a SecondBrain vault. Run `sb init` first.');
16
+ process.exit(1);
17
+ }
18
+ const configManager = new config_js_1.ConfigManager(vaultPath);
19
+ const config = configManager.getConfig();
20
+ const vault = new vault_js_1.VaultManager(config);
21
+ const stats = vault.getStats();
22
+ if (options.format === 'json') {
23
+ console.log(JSON.stringify(stats, null, 2));
24
+ }
25
+ else {
26
+ console.log('📊 Vault Statistics\n');
27
+ console.log('Total notes:', stats.totalNotes);
28
+ console.log('Total links:', stats.totalLinks);
29
+ console.log('Orphan notes:', stats.orphans);
30
+ if (stats.orphans > 0) {
31
+ console.log();
32
+ console.log('⚠️ Run `sb orphans` to see disconnected notes');
33
+ }
34
+ }
35
+ vault.close();
36
+ }
37
+ catch (error) {
38
+ console.error('❌ Failed to get stats:', error instanceof Error ? error.message : String(error));
39
+ process.exit(1);
40
+ }
41
+ });
42
+ return command;
43
+ }
44
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":";;AAIA,gDAwCC;AA5CD,yCAAoC;AACpC,kDAAmD;AACnD,gDAAiD;AAEjD,SAAgB,kBAAkB;IAChC,MAAM,OAAO,GAAG,IAAI,mBAAO,CAAC,OAAO,CAAC;SACjC,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,CAAC;SACpE,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,yBAAa,CAAC,aAAa,EAAE,CAAC;YAChD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;gBACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,aAAa,GAAG,IAAI,yBAAa,CAAC,SAAS,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,IAAI,uBAAY,CAAC,MAAM,CAAC,CAAC;YAEvC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAE/B,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gBAE5C,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;oBACtB,OAAO,CAAC,GAAG,EAAE,CAAC;oBACd,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;YAED,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createSyncCommand(): Command;
3
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,iBAAiB,IAAI,OAAO,CAuC3C"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSyncCommand = createSyncCommand;
4
+ const commander_1 = require("commander");
5
+ const config_js_1 = require("../utils/config.js");
6
+ const vault_js_1 = require("../utils/vault.js");
7
+ function createSyncCommand() {
8
+ const command = new commander_1.Command('sync')
9
+ .description('Sync vault with database index')
10
+ .action(async () => {
11
+ try {
12
+ const vaultPath = config_js_1.ConfigManager.findVaultPath();
13
+ if (!vaultPath) {
14
+ console.error('❌ Not in a SecondBrain vault. Run `sb init` first.');
15
+ process.exit(1);
16
+ }
17
+ const configManager = new config_js_1.ConfigManager(vaultPath);
18
+ const config = configManager.getConfig();
19
+ const vault = new vault_js_1.VaultManager(config);
20
+ console.log('🔄 Syncing vault...');
21
+ const result = await vault.sync();
22
+ console.log('✅ Sync complete!');
23
+ console.log(`Added: ${result.added}`);
24
+ console.log(`Updated: ${result.updated}`);
25
+ console.log(`Removed: ${result.removed}`);
26
+ const stats = vault.getStats();
27
+ console.log();
28
+ console.log('Vault stats:');
29
+ console.log(`Total notes: ${stats.totalNotes}`);
30
+ console.log(`Total links: ${stats.totalLinks}`);
31
+ console.log(`Orphan notes: ${stats.orphans}`);
32
+ vault.close();
33
+ }
34
+ catch (error) {
35
+ console.error('❌ Sync failed:', error instanceof Error ? error.message : String(error));
36
+ process.exit(1);
37
+ }
38
+ });
39
+ return command;
40
+ }
41
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":";;AAIA,8CAuCC;AA3CD,yCAAoC;AACpC,kDAAmD;AACnD,gDAAiD;AAEjD,SAAgB,iBAAiB;IAC/B,MAAM,OAAO,GAAG,IAAI,mBAAO,CAAC,MAAM,CAAC;SAChC,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,yBAAa,CAAC,aAAa,EAAE,CAAC;YAChD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;gBACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,aAAa,GAAG,IAAI,yBAAa,CAAC,SAAS,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,IAAI,uBAAY,CAAC,MAAM,CAAC,CAAC;YAEvC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YAEnC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YAElC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAE1C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAE9C,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bun
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env bun
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const init_js_1 = require("./commands/init.js");
6
+ const capture_js_1 = require("./commands/capture.js");
7
+ const search_js_1 = require("./commands/search.js");
8
+ const get_js_1 = require("./commands/get.js");
9
+ const backlinks_js_1 = require("./commands/backlinks.js");
10
+ const sync_js_1 = require("./commands/sync.js");
11
+ const stats_js_1 = require("./commands/stats.js");
12
+ const orphans_js_1 = require("./commands/orphans.js");
13
+ const config_js_1 = require("./commands/config.js");
14
+ const pkg = require("../package.json");
15
+ const program = new commander_1.Command();
16
+ program
17
+ .name('sb')
18
+ .description('SecondBrain CLI - A tool for LLM agents to manage Obsidian vaults')
19
+ .version(pkg.version);
20
+ // Add commands
21
+ program.addCommand((0, init_js_1.createInitCommand)());
22
+ program.addCommand((0, capture_js_1.createCaptureCommand)());
23
+ program.addCommand((0, search_js_1.createSearchCommand)());
24
+ program.addCommand((0, get_js_1.createGetCommand)());
25
+ program.addCommand((0, backlinks_js_1.createBacklinksCommand)());
26
+ program.addCommand((0, sync_js_1.createSyncCommand)());
27
+ program.addCommand((0, stats_js_1.createStatsCommand)());
28
+ program.addCommand((0, orphans_js_1.createOrphansCommand)());
29
+ program.addCommand((0, config_js_1.createConfigCommand)());
30
+ // Default action - show help
31
+ if (process.argv.length === 2) {
32
+ program.help();
33
+ }
34
+ program.parse();
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,gDAAuD;AACvD,sDAA6D;AAC7D,oDAA2D;AAC3D,8CAAqD;AACrD,0DAAiE;AACjE,gDAAuD;AACvD,kDAAyD;AACzD,sDAA6D;AAC7D,oDAA2D;AAC3D,uCAAwC;AAExC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,mEAAmE,CAAC;KAChF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,eAAe;AACf,OAAO,CAAC,UAAU,CAAC,IAAA,2BAAiB,GAAE,CAAC,CAAC;AACxC,OAAO,CAAC,UAAU,CAAC,IAAA,iCAAoB,GAAE,CAAC,CAAC;AAC3C,OAAO,CAAC,UAAU,CAAC,IAAA,+BAAmB,GAAE,CAAC,CAAC;AAC1C,OAAO,CAAC,UAAU,CAAC,IAAA,yBAAgB,GAAE,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,IAAA,qCAAsB,GAAE,CAAC,CAAC;AAC7C,OAAO,CAAC,UAAU,CAAC,IAAA,2BAAiB,GAAE,CAAC,CAAC;AACxC,OAAO,CAAC,UAAU,CAAC,IAAA,6BAAkB,GAAE,CAAC,CAAC;AACzC,OAAO,CAAC,UAAU,CAAC,IAAA,iCAAoB,GAAE,CAAC,CAAC;AAC3C,OAAO,CAAC,UAAU,CAAC,IAAA,+BAAmB,GAAE,CAAC,CAAC;AAE1C,6BAA6B;AAC7B,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IAC9B,OAAO,CAAC,IAAI,EAAE,CAAC;AACjB,CAAC;AAED,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,69 @@
1
+ export interface Note {
2
+ id: string;
3
+ path: string;
4
+ title: string;
5
+ content: string;
6
+ frontmatter: Record<string, unknown>;
7
+ tags: string[];
8
+ links: string[];
9
+ backlinks: string[];
10
+ hash: string;
11
+ createdAt: string;
12
+ modifiedAt: string;
13
+ }
14
+ export interface SearchResult {
15
+ id: string;
16
+ title: string;
17
+ path: string;
18
+ excerpt: string;
19
+ tags: string[];
20
+ linksCount: number;
21
+ backlinksCount: number;
22
+ score: number;
23
+ }
24
+ export interface SearchResponse {
25
+ query: string;
26
+ filters: SearchFilters;
27
+ results: SearchResult[];
28
+ total: number;
29
+ }
30
+ export interface SearchFilters {
31
+ tags?: string[];
32
+ path?: string;
33
+ limit?: number;
34
+ }
35
+ export interface Config {
36
+ vaultPath: string;
37
+ dailyNotesFolder: string;
38
+ templatesFolder: string;
39
+ dbPath: string;
40
+ }
41
+ export interface Template {
42
+ name: string;
43
+ path: string;
44
+ content: string;
45
+ frontmatter: Record<string, unknown>;
46
+ requiredFields: string[];
47
+ }
48
+ export interface LintIssue {
49
+ noteId: string;
50
+ type: 'missing-tags' | 'missing-title' | 'missing-frontmatter' | 'broken-link' | 'orphan-note';
51
+ severity: 'error' | 'warning' | 'info';
52
+ message: string;
53
+ path: string;
54
+ }
55
+ export interface GraphNode {
56
+ id: string;
57
+ title: string;
58
+ path: string;
59
+ tags: string[];
60
+ }
61
+ export interface GraphEdge {
62
+ source: string;
63
+ target: string;
64
+ }
65
+ export interface GraphData {
66
+ nodes: GraphNode[];
67
+ edges: GraphEdge[];
68
+ }
69
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,cAAc,GAAG,eAAe,GAAG,qBAAqB,GAAG,aAAa,GAAG,aAAa,CAAC;IAC/F,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import type { Config } from '../types/index.js';
2
+ export declare class ConfigManager {
3
+ private vaultPath;
4
+ constructor(vaultPath?: string);
5
+ get configPath(): string;
6
+ get dbPath(): string;
7
+ isInitialized(): boolean;
8
+ init(): Config;
9
+ loadConfig(): Config | null;
10
+ saveConfig(config: Config): void;
11
+ getConfig(): Config;
12
+ updateConfig(updates: Partial<Config>): void;
13
+ static findVaultPath(startPath?: string): string | null;
14
+ }
15
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKhD,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,GAAE,MAAsB;IAI7C,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,aAAa,IAAI,OAAO;IAIxB,IAAI,IAAI,MAAM;IAmBd,UAAU,IAAI,MAAM,GAAG,IAAI;IAa3B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIhC,SAAS,IAAI,MAAM;IAQnB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI;IAM5C,MAAM,CAAC,aAAa,CAAC,SAAS,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI;CAYvE"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfigManager = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const CONFIG_FILE = '.secondbrain/config.json';
7
+ const DB_FILE = '.secondbrain/index.db';
8
+ class ConfigManager {
9
+ vaultPath;
10
+ constructor(vaultPath = process.cwd()) {
11
+ this.vaultPath = vaultPath;
12
+ }
13
+ get configPath() {
14
+ return (0, path_1.join)(this.vaultPath, CONFIG_FILE);
15
+ }
16
+ get dbPath() {
17
+ return (0, path_1.join)(this.vaultPath, DB_FILE);
18
+ }
19
+ isInitialized() {
20
+ return (0, fs_1.existsSync)(this.configPath);
21
+ }
22
+ init() {
23
+ // Create .secondbrain directory
24
+ const sbDir = (0, path_1.join)(this.vaultPath, '.secondbrain');
25
+ if (!(0, fs_1.existsSync)(sbDir)) {
26
+ (0, fs_1.mkdirSync)(sbDir, { recursive: true });
27
+ }
28
+ // Create default config
29
+ const config = {
30
+ vaultPath: this.vaultPath,
31
+ dailyNotesFolder: 'Daily',
32
+ templatesFolder: 'Templates',
33
+ dbPath: this.dbPath
34
+ };
35
+ this.saveConfig(config);
36
+ return config;
37
+ }
38
+ loadConfig() {
39
+ if (!this.isInitialized()) {
40
+ return null;
41
+ }
42
+ try {
43
+ const content = (0, fs_1.readFileSync)(this.configPath, 'utf-8');
44
+ return JSON.parse(content);
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ saveConfig(config) {
51
+ (0, fs_1.writeFileSync)(this.configPath, JSON.stringify(config, null, 2));
52
+ }
53
+ getConfig() {
54
+ const config = this.loadConfig();
55
+ if (!config) {
56
+ throw new Error('Vault not initialized. Run `sb init` first.');
57
+ }
58
+ return config;
59
+ }
60
+ updateConfig(updates) {
61
+ const config = this.getConfig();
62
+ Object.assign(config, updates);
63
+ this.saveConfig(config);
64
+ }
65
+ static findVaultPath(startPath = process.cwd()) {
66
+ let currentPath = startPath;
67
+ while (currentPath !== (0, path_1.dirname)(currentPath)) {
68
+ if ((0, fs_1.existsSync)((0, path_1.join)(currentPath, '.secondbrain', 'config.json'))) {
69
+ return currentPath;
70
+ }
71
+ currentPath = (0, path_1.dirname)(currentPath);
72
+ }
73
+ return null;
74
+ }
75
+ }
76
+ exports.ConfigManager = ConfigManager;
77
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Note, Config, GraphData } from '../types/index.js';
2
+ export declare class DatabaseManager {
3
+ private db;
4
+ private config;
5
+ constructor(config: Config);
6
+ private initTables;
7
+ close(): void;
8
+ upsertNote(note: Note): void;
9
+ private updateLinks;
10
+ getNoteById(id: string): Note | null;
11
+ getNoteByPath(path: string): Note | null;
12
+ getNoteByTitle(title: string): Note | null;
13
+ searchNotes(query: string, tags?: string[], limit?: number): Note[];
14
+ getBacklinks(noteId: string): Note[];
15
+ getOrphans(): Note[];
16
+ getAllNotes(): Note[];
17
+ deleteNoteByPath(path: string): void;
18
+ getStats(): {
19
+ totalNotes: number;
20
+ totalLinks: number;
21
+ orphans: number;
22
+ };
23
+ getGraphData(): GraphData;
24
+ private rowToNote;
25
+ private getNotesWithLinksBatch;
26
+ private rowsToNotes;
27
+ }
28
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/utils/database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGjE,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAM1B,OAAO,CAAC,UAAU;IAoClB,KAAK,IAAI,IAAI;IAKb,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IA8B5B,OAAO,CAAC,WAAW;IA2CnB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAMpC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAMxC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAM1C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,MAAW,GAAG,IAAI,EAAE;IAgBvE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE;IAUpC,UAAU,IAAI,IAAI,EAAE;IAWpB,WAAW,IAAI,IAAI,EAAE;IAKrB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIpC,QAAQ,IAAI;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAQvE,YAAY,IAAI,SAAS;IAkBzB,OAAO,CAAC,SAAS;IAmBjB,OAAO,CAAC,sBAAsB;IA4C9B,OAAO,CAAC,WAAW;CA6BpB"}