@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
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 novis10813
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
package/README.md ADDED
@@ -0,0 +1,133 @@
1
+ # SecondBrain CLI
2
+
3
+ 一個專為 LLM Agent 設計的 Obsidian Vault CLI 工具。
4
+
5
+ ## 功能特色
6
+
7
+ - **Dual-Storage 架構**: SQLite 索引 + 原始 Markdown 檔案
8
+ - **完整的連結系統**: 支援 `[[wikilinks]]`、backlinks、orphans 偵測
9
+ - **Agent-First 設計**: JSON 輸出、結構化資料、CLI 可 pipe
10
+ - **Obsidian 相容**: 100% 相容現有 Obsidian vault
11
+ - **標準化 Capture**: Template 系統強制 Agent 遵守格式
12
+
13
+ ## 安裝
14
+
15
+ ```bash
16
+ # npm registry(公開套件)
17
+ npm install -g @novis10813/secondbrain-cli
18
+ ```
19
+
20
+ > 注意:此 CLI 目前使用 `bun:sqlite`,因此執行時需要 **Bun runtime**。如果你用 `npm` 安裝但系統沒有 `bun`,`sb` 會無法執行。
21
+
22
+ 如果你用 `bun` 從 GitHub 安裝並看到 `Blocked ... postinstall/prepare`,需要先信任再重裝一次:
23
+
24
+ ```bash
25
+ bun pm -g trust @novis10813/secondbrain-cli
26
+ bun add -g github:novis10813/secondbrain-cli#<tag>
27
+ ```
28
+
29
+ ## 快速開始
30
+
31
+ ```bash
32
+ # 在 Obsidian vault 目錄初始化
33
+ cd ~/my-obsidian-vault
34
+ sb init
35
+
36
+ # 同步現有筆記
37
+ sb sync
38
+
39
+ # 建立新筆記
40
+ sb capture "這是筆記內容" --title="我的筆記" --tags="idea,work"
41
+
42
+ # 搜尋筆記
43
+ sb search "API 設計" --tags="tech" --format=json
44
+
45
+ # 取得 backlinks
46
+ sb backlinks <note-id>
47
+
48
+ # 找孤兒筆記
49
+ sb orphans
50
+ ```
51
+
52
+ ## CLI 指令
53
+
54
+ ### 初始化與設定
55
+
56
+ ```bash
57
+ sb init # 初始化 vault
58
+ sb config list # 查看設定
59
+ sb config get dailyNotesFolder # 取得特定設定
60
+ sb config set dailyNotesFolder Daily # 修改設定
61
+ ```
62
+
63
+ ### 筆記管理
64
+
65
+ ```bash
66
+ sb capture "內容" \ # 建立筆記
67
+ --title="標題" \
68
+ --tags="tag1,tag2" \
69
+ --template="meeting"
70
+
71
+ sb search "關鍵字" \ # 搜尋
72
+ --tags="work" \
73
+ --limit=10 \
74
+ --format=json
75
+
76
+ sb get <note-id> # 取得單一筆記
77
+ sb backlinks <note-id> # 取得 backlinks
78
+ ```
79
+
80
+ ### Vault 維護
81
+
82
+ ```bash
83
+ sb sync # 同步索引
84
+ sb stats # 統計資訊
85
+ sb orphans # 孤兒筆記
86
+ ```
87
+
88
+ ## 資料架構
89
+
90
+ ```
91
+ /your-vault/
92
+ ├── Projects/
93
+ │ └── api-design.md # 原始 Markdown
94
+ ├── Daily/
95
+ │ └── 2024-01-15.md
96
+ └── .secondbrain/
97
+ ├── config.json # 設定檔
98
+ └── index.db # SQLite 索引
99
+ ```
100
+
101
+ ## 開發
102
+
103
+ ```bash
104
+ # 安裝依賴
105
+ bun install
106
+
107
+ # 開發模式
108
+ bun run dev
109
+
110
+ # 建置
111
+ bun run build
112
+
113
+ # 執行測試
114
+ bun test
115
+ ```
116
+
117
+ ## License
118
+
119
+ MIT
120
+
121
+ ## 發佈(npm registry)
122
+
123
+ 1) 建立 GitHub Personal Access Token(classic 或 fine-grained 皆可)
124
+
125
+ - **最低需要**: `write:packages`(發佈)、`read:packages`(安裝)
126
+ - 如果 repo 是 private,通常也需要能讀取 repo 的權限(依你的帳號/組織設定而定)
127
+
128
+ 2) 登入 npm registry 並發佈
129
+
130
+ ```bash
131
+ npm login
132
+ npm publish --access public
133
+ ```
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createBacklinksCommand(): Command;
3
+ //# sourceMappingURL=backlinks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlinks.d.ts","sourceRoot":"","sources":["../../src/commands/backlinks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,sBAAsB,IAAI,OAAO,CA4DhD"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBacklinksCommand = createBacklinksCommand;
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 createBacklinksCommand() {
8
+ const command = new commander_1.Command('backlinks')
9
+ .description('Get backlinks for a note')
10
+ .argument('<id>', 'Note ID')
11
+ .option('-f, --format <format>', 'Output format (json|text)', 'json')
12
+ .action((id, options) => {
13
+ try {
14
+ const vaultPath = config_js_1.ConfigManager.findVaultPath();
15
+ if (!vaultPath) {
16
+ console.error('❌ Not in a SecondBrain vault. Run `sb init` first.');
17
+ process.exit(1);
18
+ }
19
+ const configManager = new config_js_1.ConfigManager(vaultPath);
20
+ const config = configManager.getConfig();
21
+ const vault = new vault_js_1.VaultManager(config);
22
+ // First check if note exists
23
+ const note = vault.getNoteById(id);
24
+ if (!note) {
25
+ console.error('❌ Note not found');
26
+ process.exit(1);
27
+ }
28
+ const backlinks = vault.getBacklinks(id);
29
+ if (options.format === 'json') {
30
+ console.log(JSON.stringify({
31
+ noteId: id,
32
+ noteTitle: note.title,
33
+ backlinkCount: backlinks.length,
34
+ backlinks: backlinks.map(b => ({
35
+ id: b.id,
36
+ title: b.title,
37
+ path: b.path,
38
+ tags: b.tags
39
+ }))
40
+ }, null, 2));
41
+ }
42
+ else {
43
+ console.log(`Backlinks for "${note.title}":\n`);
44
+ if (backlinks.length === 0) {
45
+ console.log('No backlinks found');
46
+ }
47
+ else {
48
+ backlinks.forEach((b, i) => {
49
+ console.log(`${i + 1}. ${b.title}`);
50
+ console.log(` Path: ${b.path}`);
51
+ console.log(` ID: ${b.id}`);
52
+ console.log();
53
+ });
54
+ }
55
+ }
56
+ vault.close();
57
+ }
58
+ catch (error) {
59
+ console.error('❌ Failed to get backlinks:', error instanceof Error ? error.message : String(error));
60
+ process.exit(1);
61
+ }
62
+ });
63
+ return command;
64
+ }
65
+ //# sourceMappingURL=backlinks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlinks.js","sourceRoot":"","sources":["../../src/commands/backlinks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createCaptureCommand(): Command;
3
+ //# sourceMappingURL=capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,oBAAoB,IAAI,OAAO,CA6F9C"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCaptureCommand = createCaptureCommand;
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
+ const parser_js_1 = require("../utils/parser.js");
8
+ function createCaptureCommand() {
9
+ const command = new commander_1.Command('capture')
10
+ .description('Capture a new note')
11
+ .argument('<content>', 'Note content')
12
+ .option('-t, --title <title>', 'Note title')
13
+ .option('--tags <tags>', 'Comma-separated tags')
14
+ .option('--template <template>', 'Template name')
15
+ .option('--path <path>', 'Custom file path')
16
+ .action(async (content, options) => {
17
+ try {
18
+ const body = content ?? '';
19
+ const vaultPath = config_js_1.ConfigManager.findVaultPath();
20
+ if (!vaultPath) {
21
+ console.error('❌ Not in a SecondBrain vault. Run `sb init` first.');
22
+ process.exit(1);
23
+ }
24
+ const configManager = new config_js_1.ConfigManager(vaultPath);
25
+ const config = configManager.getConfig();
26
+ const vault = new vault_js_1.VaultManager(config);
27
+ let notePath;
28
+ let noteContent;
29
+ let frontmatter = {};
30
+ // Handle tags
31
+ const tags = options.tags ? options.tags.split(',').map((t) => t.trim()) : [];
32
+ // Handle template
33
+ if (options.template) {
34
+ const templatePath = vault.getTemplatePath(options.template);
35
+ const templateContent = vault.readNote(templatePath);
36
+ if (templateContent) {
37
+ const parsed = parser_js_1.NoteParser.parse(templateContent);
38
+ frontmatter = parsed.frontmatter;
39
+ // Merge tags
40
+ if (parsed.tags.length > 0) {
41
+ tags.push(...parsed.tags);
42
+ }
43
+ }
44
+ }
45
+ // Determine title
46
+ const title = options.title || new Date().toISOString();
47
+ // Determine path
48
+ if (options.path) {
49
+ notePath = options.path.endsWith('.md') ? options.path : `${options.path}.md`;
50
+ }
51
+ else {
52
+ // Default: use title as filename
53
+ const safeTitle = title.replace(/[^a-z0-9]/gi, '-').toLowerCase();
54
+ notePath = `${safeTitle}.md`;
55
+ }
56
+ // Generate content
57
+ frontmatter.tags = [...new Set(tags)]; // Remove duplicates
58
+ noteContent = parser_js_1.NoteParser.generateNoteContent(title, body, frontmatter);
59
+ // Write note
60
+ vault.writeNote(notePath, noteContent);
61
+ // Sync single note to database (optimized - no full vault scan)
62
+ const noteFileContent = vault.readNote(notePath);
63
+ if (noteFileContent) {
64
+ const hash = parser_js_1.NoteParser.computeHash(noteFileContent);
65
+ const note = await vault.createNoteFromFile(notePath, noteFileContent, hash);
66
+ vault.upsertNote(note);
67
+ }
68
+ const note = vault.getNoteByPath(notePath);
69
+ console.log('✅ Note captured!');
70
+ console.log('Path:', notePath);
71
+ if (note) {
72
+ console.log('ID:', note.id);
73
+ console.log(JSON.stringify({
74
+ success: true,
75
+ id: note.id,
76
+ path: notePath,
77
+ title,
78
+ tags
79
+ }, null, 2));
80
+ }
81
+ vault.close();
82
+ }
83
+ catch (error) {
84
+ console.error('❌ Failed to capture note:', error instanceof Error ? error.message : String(error));
85
+ process.exit(1);
86
+ }
87
+ });
88
+ return command;
89
+ }
90
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createConfigCommand(): Command;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,mBAAmB,IAAI,OAAO,CAuF7C"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createConfigCommand = createConfigCommand;
4
+ const commander_1 = require("commander");
5
+ const config_js_1 = require("../utils/config.js");
6
+ function createConfigCommand() {
7
+ const command = new commander_1.Command('config')
8
+ .description('Manage configuration')
9
+ .addCommand(new commander_1.Command('get')
10
+ .description('Get configuration value')
11
+ .argument('<key>', 'Configuration key')
12
+ .action((key) => {
13
+ try {
14
+ const vaultPath = config_js_1.ConfigManager.findVaultPath();
15
+ if (!vaultPath) {
16
+ console.error('❌ Not in a SecondBrain vault. Run `sb init` first.');
17
+ process.exit(1);
18
+ }
19
+ const configManager = new config_js_1.ConfigManager(vaultPath);
20
+ const config = configManager.getConfig();
21
+ if (key in config) {
22
+ console.log(config[key]);
23
+ }
24
+ else {
25
+ console.error(`❌ Unknown config key: ${key}`);
26
+ console.log('Available keys: vaultPath, dailyNotesFolder, templatesFolder, dbPath');
27
+ process.exit(1);
28
+ }
29
+ }
30
+ catch (error) {
31
+ console.error('❌ Failed to get config:', error instanceof Error ? error.message : String(error));
32
+ process.exit(1);
33
+ }
34
+ }))
35
+ .addCommand(new commander_1.Command('set')
36
+ .description('Set configuration value')
37
+ .argument('<key>', 'Configuration key')
38
+ .argument('<value>', 'Configuration value')
39
+ .action((key, value) => {
40
+ try {
41
+ const vaultPath = config_js_1.ConfigManager.findVaultPath();
42
+ if (!vaultPath) {
43
+ console.error('❌ Not in a SecondBrain vault. Run `sb init` first.');
44
+ process.exit(1);
45
+ }
46
+ const configManager = new config_js_1.ConfigManager(vaultPath);
47
+ const validKeys = ['dailyNotesFolder', 'templatesFolder'];
48
+ if (!validKeys.includes(key)) {
49
+ console.error(`❌ Cannot set config key: ${key}`);
50
+ console.log(`Editable keys: ${validKeys.join(', ')}`);
51
+ process.exit(1);
52
+ }
53
+ configManager.updateConfig({ [key]: value });
54
+ console.log(`✅ Set ${key} = ${value}`);
55
+ }
56
+ catch (error) {
57
+ console.error('❌ Failed to set config:', error instanceof Error ? error.message : String(error));
58
+ process.exit(1);
59
+ }
60
+ }))
61
+ .addCommand(new commander_1.Command('list')
62
+ .description('List all configuration')
63
+ .action(() => {
64
+ try {
65
+ const vaultPath = config_js_1.ConfigManager.findVaultPath();
66
+ if (!vaultPath) {
67
+ console.error('❌ Not in a SecondBrain vault. Run `sb init` first.');
68
+ process.exit(1);
69
+ }
70
+ const configManager = new config_js_1.ConfigManager(vaultPath);
71
+ const config = configManager.getConfig();
72
+ console.log('Configuration:\n');
73
+ Object.entries(config).forEach(([key, value]) => {
74
+ console.log(`${key}: ${value}`);
75
+ });
76
+ }
77
+ catch (error) {
78
+ console.error('❌ Failed to list config:', error instanceof Error ? error.message : String(error));
79
+ process.exit(1);
80
+ }
81
+ }));
82
+ return command;
83
+ }
84
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createGetCommand(): Command;
3
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../src/commands/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,gBAAgB,IAAI,OAAO,CAwC1C"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createGetCommand = createGetCommand;
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 createGetCommand() {
8
+ const command = new commander_1.Command('get')
9
+ .description('Get a note by ID')
10
+ .argument('<id>', 'Note ID')
11
+ .option('-f, --format <format>', 'Output format (json|text)', 'json')
12
+ .action((id, options) => {
13
+ try {
14
+ const vaultPath = config_js_1.ConfigManager.findVaultPath();
15
+ if (!vaultPath) {
16
+ console.error('❌ Not in a SecondBrain vault. Run `sb init` first.');
17
+ process.exit(1);
18
+ }
19
+ const configManager = new config_js_1.ConfigManager(vaultPath);
20
+ const config = configManager.getConfig();
21
+ const vault = new vault_js_1.VaultManager(config);
22
+ const note = vault.getNoteById(id);
23
+ if (!note) {
24
+ console.error('❌ Note not found');
25
+ process.exit(1);
26
+ }
27
+ if (options.format === 'json') {
28
+ console.log(JSON.stringify(note, null, 2));
29
+ }
30
+ else {
31
+ console.log(note.title);
32
+ console.log('─'.repeat(40));
33
+ console.log(note.content);
34
+ }
35
+ vault.close();
36
+ }
37
+ catch (error) {
38
+ console.error('❌ Failed to get note:', error instanceof Error ? error.message : String(error));
39
+ process.exit(1);
40
+ }
41
+ });
42
+ return command;
43
+ }
44
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/commands/get.ts"],"names":[],"mappings":";;AAIA,4CAwCC;AA5CD,yCAAoC;AACpC,kDAAmD;AACnD,gDAAiD;AAEjD,SAAgB,gBAAgB;IAC9B,MAAM,OAAO,GAAG,IAAI,mBAAO,CAAC,KAAK,CAAC;SAC/B,WAAW,CAAC,kBAAkB,CAAC;SAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;SAC3B,MAAM,CAAC,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,CAAC;SACpE,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE;QACtB,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,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAEnC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;YAED,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/F,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 createInitCommand(): Command;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,iBAAiB,IAAI,OAAO,CA+B3C"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createInitCommand = createInitCommand;
4
+ const commander_1 = require("commander");
5
+ const config_js_1 = require("../utils/config.js");
6
+ function createInitCommand() {
7
+ const command = new commander_1.Command('init')
8
+ .description('Initialize a new SecondBrain vault')
9
+ .option('-p, --path <path>', 'Vault path', process.cwd())
10
+ .action((options) => {
11
+ try {
12
+ const configManager = new config_js_1.ConfigManager(options.path);
13
+ if (configManager.isInitialized()) {
14
+ console.log('⚠️ Vault already initialized at:', options.path);
15
+ return;
16
+ }
17
+ const config = configManager.init();
18
+ console.log('✅ SecondBrain vault initialized!');
19
+ console.log('Vault path:', config.vaultPath);
20
+ console.log('Daily notes:', config.dailyNotesFolder);
21
+ console.log('Templates:', config.templatesFolder);
22
+ console.log();
23
+ console.log('Next steps:');
24
+ console.log(' 1. Create notes in your vault');
25
+ console.log(' 2. Run `sb sync` to index existing notes');
26
+ console.log(' 3. Use `sb capture` to create new notes');
27
+ }
28
+ catch (error) {
29
+ console.error('❌ Failed to initialize vault:', error instanceof Error ? error.message : String(error));
30
+ process.exit(1);
31
+ }
32
+ });
33
+ return command;
34
+ }
35
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;AAGA,8CA+BC;AAlCD,yCAAoC;AACpC,kDAAmD;AAEnD,SAAgB,iBAAiB;IAC/B,MAAM,OAAO,GAAG,IAAI,mBAAO,CAAC,MAAM,CAAC;SAChC,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,mBAAmB,EAAE,YAAY,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SACxD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,yBAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAEtD,IAAI,aAAa,CAAC,aAAa,EAAE,EAAE,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC/D,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;YAEpC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACvG,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 createOrphansCommand(): Command;
3
+ //# sourceMappingURL=orphans.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphans.d.ts","sourceRoot":"","sources":["../../src/commands/orphans.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,oBAAoB,IAAI,OAAO,CAmD9C"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createOrphansCommand = createOrphansCommand;
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 createOrphansCommand() {
8
+ const command = new commander_1.Command('orphans')
9
+ .description('Find notes with no links (orphans)')
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 orphans = vault.getOrphans();
22
+ if (options.format === 'json') {
23
+ console.log(JSON.stringify({
24
+ count: orphans.length,
25
+ orphans: orphans.map(o => ({
26
+ id: o.id,
27
+ title: o.title,
28
+ path: o.path,
29
+ tags: o.tags
30
+ }))
31
+ }, null, 2));
32
+ }
33
+ else {
34
+ if (orphans.length === 0) {
35
+ console.log('✅ No orphan notes found. All notes are connected!');
36
+ }
37
+ else {
38
+ console.log(`⚠️ Found ${orphans.length} orphan note(s):\n`);
39
+ orphans.forEach((note, i) => {
40
+ console.log(`${i + 1}. ${note.title}`);
41
+ console.log(` Path: ${note.path}`);
42
+ console.log(` ID: ${note.id}`);
43
+ console.log(` Tags: ${note.tags.join(', ') || 'none'}`);
44
+ console.log();
45
+ });
46
+ }
47
+ }
48
+ vault.close();
49
+ }
50
+ catch (error) {
51
+ console.error('❌ Failed to get orphans:', error instanceof Error ? error.message : String(error));
52
+ process.exit(1);
53
+ }
54
+ });
55
+ return command;
56
+ }
57
+ //# sourceMappingURL=orphans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphans.js","sourceRoot":"","sources":["../../src/commands/orphans.ts"],"names":[],"mappings":";;AAIA,oDAmDC;AAvDD,yCAAoC;AACpC,kDAAmD;AACnD,gDAAiD;AAEjD,SAAgB,oBAAoB;IAClC,MAAM,OAAO,GAAG,IAAI,mBAAO,CAAC,SAAS,CAAC;SACnC,WAAW,CAAC,oCAAoC,CAAC;SACjD,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,OAAO,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;YAEnC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;oBACzB,KAAK,EAAE,OAAO,CAAC,MAAM;oBACrB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBACzB,EAAE,EAAE,CAAC,CAAC,EAAE;wBACR,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;qBACb,CAAC,CAAC;iBACJ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;gBACnE,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,MAAM,oBAAoB,CAAC,CAAC;oBAC7D,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;wBAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;wBACvC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;wBACrC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;wBACjC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;wBAC1D,OAAO,CAAC,GAAG,EAAE,CAAC;oBAChB,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAClG,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 createSearchCommand(): Command;
3
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,mBAAmB,IAAI,OAAO,CA6D7C"}