@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.
- package/LICENSE +22 -0
- package/README.md +133 -0
- package/dist/commands/backlinks.d.ts +3 -0
- package/dist/commands/backlinks.d.ts.map +1 -0
- package/dist/commands/backlinks.js +65 -0
- package/dist/commands/backlinks.js.map +1 -0
- package/dist/commands/capture.d.ts +3 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +90 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +84 -0
- package/dist/commands/config.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 +44 -0
- package/dist/commands/get.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 +35 -0
- package/dist/commands/init.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 +57 -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 +64 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/stats.d.ts +3 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +44 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/sync.d.ts +3 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +41 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +69 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/config.d.ts +15 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +77 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/database.d.ts +28 -0
- package/dist/utils/database.d.ts.map +1 -0
- package/dist/utils/database.js +261 -0
- package/dist/utils/database.js.map +1 -0
- package/dist/utils/parser.d.ts +19 -0
- package/dist/utils/parser.d.ts.map +1 -0
- package/dist/utils/parser.js +159 -0
- package/dist/utils/parser.js.map +1 -0
- package/dist/utils/template.d.ts +17 -0
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/utils/template.js +100 -0
- package/dist/utils/template.js.map +1 -0
- package/dist/utils/vault.d.ts +32 -0
- package/dist/utils/vault.d.ts.map +1 -0
- package/dist/utils/vault.js +194 -0
- package/dist/utils/vault.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|