vault-forge 2.0.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 (224) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +336 -0
  3. package/dist/actions/dummy.d.ts +2 -0
  4. package/dist/actions/dummy.d.ts.map +1 -0
  5. package/dist/actions/dummy.js +3 -0
  6. package/dist/actions/dummy.js.map +1 -0
  7. package/dist/actions/mainAction.d.ts +5 -0
  8. package/dist/actions/mainAction.d.ts.map +1 -0
  9. package/dist/actions/mainAction.js +68 -0
  10. package/dist/actions/mainAction.js.map +1 -0
  11. package/dist/commands/ai.d.ts +3 -0
  12. package/dist/commands/ai.d.ts.map +1 -0
  13. package/dist/commands/ai.js +20 -0
  14. package/dist/commands/ai.js.map +1 -0
  15. package/dist/commands/ask.d.ts +3 -0
  16. package/dist/commands/ask.d.ts.map +1 -0
  17. package/dist/commands/ask.js +15 -0
  18. package/dist/commands/ask.js.map +1 -0
  19. package/dist/commands/completion.d.ts +34 -0
  20. package/dist/commands/completion.d.ts.map +1 -0
  21. package/dist/commands/completion.js +134 -0
  22. package/dist/commands/completion.js.map +1 -0
  23. package/dist/commands/diary.d.ts +3 -0
  24. package/dist/commands/diary.d.ts.map +1 -0
  25. package/dist/commands/diary.js +15 -0
  26. package/dist/commands/diary.js.map +1 -0
  27. package/dist/commands/dummy.d.ts +2 -0
  28. package/dist/commands/dummy.d.ts.map +1 -0
  29. package/dist/commands/dummy.js +3 -0
  30. package/dist/commands/dummy.js.map +1 -0
  31. package/dist/commands/find.d.ts +2 -0
  32. package/dist/commands/find.d.ts.map +1 -0
  33. package/dist/commands/find.js +3 -0
  34. package/dist/commands/find.js.map +1 -0
  35. package/dist/commands/init.d.ts +3 -0
  36. package/dist/commands/init.d.ts.map +1 -0
  37. package/dist/commands/init.js +46 -0
  38. package/dist/commands/init.js.map +1 -0
  39. package/dist/commands/search.d.ts +3 -0
  40. package/dist/commands/search.d.ts.map +1 -0
  41. package/dist/commands/search.js +29 -0
  42. package/dist/commands/search.js.map +1 -0
  43. package/dist/commands/tag.d.ts +3 -0
  44. package/dist/commands/tag.d.ts.map +1 -0
  45. package/dist/commands/tag.js +37 -0
  46. package/dist/commands/tag.js.map +1 -0
  47. package/dist/config/locales/en.d.ts +188 -0
  48. package/dist/config/locales/en.d.ts.map +1 -0
  49. package/dist/config/locales/en.js +190 -0
  50. package/dist/config/locales/en.js.map +1 -0
  51. package/dist/config/locales/ja.d.ts +188 -0
  52. package/dist/config/locales/ja.d.ts.map +1 -0
  53. package/dist/config/locales/ja.js +190 -0
  54. package/dist/config/locales/ja.js.map +1 -0
  55. package/dist/config/prompts/en.d.ts +6 -0
  56. package/dist/config/prompts/en.d.ts.map +1 -0
  57. package/dist/config/prompts/en.js +25 -0
  58. package/dist/config/prompts/en.js.map +1 -0
  59. package/dist/config/prompts/ja.d.ts +6 -0
  60. package/dist/config/prompts/ja.d.ts.map +1 -0
  61. package/dist/config/prompts/ja.js +25 -0
  62. package/dist/config/prompts/ja.js.map +1 -0
  63. package/dist/config/text.d.ts +195 -0
  64. package/dist/config/text.d.ts.map +1 -0
  65. package/dist/config/text.js +15 -0
  66. package/dist/config/text.js.map +1 -0
  67. package/dist/core/PromptLoader.d.ts +30 -0
  68. package/dist/core/PromptLoader.d.ts.map +1 -0
  69. package/dist/core/PromptLoader.js +187 -0
  70. package/dist/core/PromptLoader.js.map +1 -0
  71. package/dist/core/PromptSmith.d.ts +21 -0
  72. package/dist/core/PromptSmith.d.ts.map +1 -0
  73. package/dist/core/PromptSmith.js +197 -0
  74. package/dist/core/PromptSmith.js.map +1 -0
  75. package/dist/core/VaultForge.d.ts +17 -0
  76. package/dist/core/VaultForge.d.ts.map +1 -0
  77. package/dist/core/VaultForge.js +75 -0
  78. package/dist/core/VaultForge.js.map +1 -0
  79. package/dist/index.d.ts +3 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +28 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/lib/completion.d.ts +8 -0
  84. package/dist/lib/completion.d.ts.map +1 -0
  85. package/dist/lib/completion.js +55 -0
  86. package/dist/lib/completion.js.map +1 -0
  87. package/dist/lib/dummy.d.ts +2 -0
  88. package/dist/lib/dummy.d.ts.map +1 -0
  89. package/dist/lib/dummy.js +3 -0
  90. package/dist/lib/dummy.js.map +1 -0
  91. package/dist/lib/mainAction.d.ts +8 -0
  92. package/dist/lib/mainAction.d.ts.map +1 -0
  93. package/dist/lib/mainAction.js +126 -0
  94. package/dist/lib/mainAction.js.map +1 -0
  95. package/dist/lib/search.d.ts +4 -0
  96. package/dist/lib/search.d.ts.map +1 -0
  97. package/dist/lib/search.js +87 -0
  98. package/dist/lib/search.js.map +1 -0
  99. package/dist/lib/stdin.d.ts +10 -0
  100. package/dist/lib/stdin.d.ts.map +1 -0
  101. package/dist/lib/stdin.js +20 -0
  102. package/dist/lib/stdin.js.map +1 -0
  103. package/dist/services/AIModelService.d.ts +33 -0
  104. package/dist/services/AIModelService.d.ts.map +1 -0
  105. package/dist/services/AIModelService.js +116 -0
  106. package/dist/services/AIModelService.js.map +1 -0
  107. package/dist/services/AIOrchestratorService.d.ts +57 -0
  108. package/dist/services/AIOrchestratorService.d.ts.map +1 -0
  109. package/dist/services/AIOrchestratorService.js +164 -0
  110. package/dist/services/AIOrchestratorService.js.map +1 -0
  111. package/dist/services/ConfigService.d.ts +61 -0
  112. package/dist/services/ConfigService.d.ts.map +1 -0
  113. package/dist/services/ConfigService.js +132 -0
  114. package/dist/services/ConfigService.js.map +1 -0
  115. package/dist/services/ObsidianService.d.ts +97 -0
  116. package/dist/services/ObsidianService.d.ts.map +1 -0
  117. package/dist/services/ObsidianService.js +264 -0
  118. package/dist/services/ObsidianService.js.map +1 -0
  119. package/dist/services/TagService.d.ts +26 -0
  120. package/dist/services/TagService.d.ts.map +1 -0
  121. package/dist/services/TagService.js +73 -0
  122. package/dist/services/TagService.js.map +1 -0
  123. package/dist/services/UserInteraction.d.ts +100 -0
  124. package/dist/services/UserInteraction.d.ts.map +1 -0
  125. package/dist/services/UserInteraction.js +169 -0
  126. package/dist/services/UserInteraction.js.map +1 -0
  127. package/dist/services/XService.d.ts +15 -0
  128. package/dist/services/XService.d.ts.map +1 -0
  129. package/dist/services/XService.js +40 -0
  130. package/dist/services/XService.js.map +1 -0
  131. package/dist/services/ai/AIServiceFactory.d.ts +26 -0
  132. package/dist/services/ai/AIServiceFactory.d.ts.map +1 -0
  133. package/dist/services/ai/AIServiceFactory.js +69 -0
  134. package/dist/services/ai/AIServiceFactory.js.map +1 -0
  135. package/dist/services/ai/ClaudeService.d.ts +9 -0
  136. package/dist/services/ai/ClaudeService.d.ts.map +1 -0
  137. package/dist/services/ai/ClaudeService.js +59 -0
  138. package/dist/services/ai/ClaudeService.js.map +1 -0
  139. package/dist/services/ai/GeminiService.d.ts +9 -0
  140. package/dist/services/ai/GeminiService.d.ts.map +1 -0
  141. package/dist/services/ai/GeminiService.js +46 -0
  142. package/dist/services/ai/GeminiService.js.map +1 -0
  143. package/dist/services/ai/GroqService.d.ts +9 -0
  144. package/dist/services/ai/GroqService.d.ts.map +1 -0
  145. package/dist/services/ai/GroqService.js +53 -0
  146. package/dist/services/ai/GroqService.js.map +1 -0
  147. package/dist/services/ai/MockAIService.d.ts +8 -0
  148. package/dist/services/ai/MockAIService.d.ts.map +1 -0
  149. package/dist/services/ai/MockAIService.js +24 -0
  150. package/dist/services/ai/MockAIService.js.map +1 -0
  151. package/dist/services/ai/OpenAIService.d.ts +9 -0
  152. package/dist/services/ai/OpenAIService.d.ts.map +1 -0
  153. package/dist/services/ai/OpenAIService.js +51 -0
  154. package/dist/services/ai/OpenAIService.js.map +1 -0
  155. package/dist/strategies/BaseStrategy.d.ts +36 -0
  156. package/dist/strategies/BaseStrategy.d.ts.map +1 -0
  157. package/dist/strategies/BaseStrategy.js +110 -0
  158. package/dist/strategies/BaseStrategy.js.map +1 -0
  159. package/dist/strategies/DebugStrategy.d.ts +13 -0
  160. package/dist/strategies/DebugStrategy.d.ts.map +1 -0
  161. package/dist/strategies/DebugStrategy.js +16 -0
  162. package/dist/strategies/DebugStrategy.js.map +1 -0
  163. package/dist/strategies/DiaryStrategy.d.ts +19 -0
  164. package/dist/strategies/DiaryStrategy.d.ts.map +1 -0
  165. package/dist/strategies/DiaryStrategy.js +69 -0
  166. package/dist/strategies/DiaryStrategy.js.map +1 -0
  167. package/dist/strategies/GeneralStrategy.d.ts +8 -0
  168. package/dist/strategies/GeneralStrategy.d.ts.map +1 -0
  169. package/dist/strategies/GeneralStrategy.js +11 -0
  170. package/dist/strategies/GeneralStrategy.js.map +1 -0
  171. package/dist/strategies/InitStrategy.d.ts +19 -0
  172. package/dist/strategies/InitStrategy.d.ts.map +1 -0
  173. package/dist/strategies/InitStrategy.js +122 -0
  174. package/dist/strategies/InitStrategy.js.map +1 -0
  175. package/dist/strategies/SearchStrategy.d.ts +19 -0
  176. package/dist/strategies/SearchStrategy.d.ts.map +1 -0
  177. package/dist/strategies/SearchStrategy.js +112 -0
  178. package/dist/strategies/SearchStrategy.js.map +1 -0
  179. package/dist/strategies/XPostStrategy.d.ts +27 -0
  180. package/dist/strategies/XPostStrategy.d.ts.map +1 -0
  181. package/dist/strategies/XPostStrategy.js +119 -0
  182. package/dist/strategies/XPostStrategy.js.map +1 -0
  183. package/dist/templates/completion.bash +24 -0
  184. package/dist/templates/dailyNote.d.ts +2 -0
  185. package/dist/templates/dailyNote.d.ts.map +1 -0
  186. package/dist/templates/dailyNote.js +8 -0
  187. package/dist/templates/dailyNote.js.map +1 -0
  188. package/dist/templates/defaultPrompt.d.ts +2 -0
  189. package/dist/templates/defaultPrompt.d.ts.map +1 -0
  190. package/dist/templates/defaultPrompt.js +28 -0
  191. package/dist/templates/defaultPrompt.js.map +1 -0
  192. package/dist/templates/obsidianNote.d.ts +3 -0
  193. package/dist/templates/obsidianNote.d.ts.map +1 -0
  194. package/dist/templates/obsidianNote.js +17 -0
  195. package/dist/templates/obsidianNote.js.map +1 -0
  196. package/dist/templates/tokenUsage.d.ts +20 -0
  197. package/dist/templates/tokenUsage.d.ts.map +1 -0
  198. package/dist/templates/tokenUsage.js +50 -0
  199. package/dist/templates/tokenUsage.js.map +1 -0
  200. package/dist/test-tabtab.d.ts +2 -0
  201. package/dist/test-tabtab.d.ts.map +1 -0
  202. package/dist/test-tabtab.js +50 -0
  203. package/dist/test-tabtab.js.map +1 -0
  204. package/dist/types/constants.d.ts +16 -0
  205. package/dist/types/constants.d.ts.map +1 -0
  206. package/dist/types/constants.js +14 -0
  207. package/dist/types/constants.js.map +1 -0
  208. package/dist/types/interfaces.d.ts +56 -0
  209. package/dist/types/interfaces.d.ts.map +1 -0
  210. package/dist/types/interfaces.js +6 -0
  211. package/dist/types/interfaces.js.map +1 -0
  212. package/dist/types/schemas.d.ts +18 -0
  213. package/dist/types/schemas.d.ts.map +1 -0
  214. package/dist/types/schemas.js +13 -0
  215. package/dist/types/schemas.js.map +1 -0
  216. package/dist/utils/completion.d.ts +8 -0
  217. package/dist/utils/completion.d.ts.map +1 -0
  218. package/dist/utils/completion.js +58 -0
  219. package/dist/utils/completion.js.map +1 -0
  220. package/dist/utils/dummy.d.ts +2 -0
  221. package/dist/utils/dummy.d.ts.map +1 -0
  222. package/dist/utils/dummy.js +3 -0
  223. package/dist/utils/dummy.js.map +1 -0
  224. package/package.json +55 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 [Yoshinori Imada]
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.
package/README.md ADDED
@@ -0,0 +1,336 @@
1
+ [🇯🇵 日本語](README_ja.md)
2
+
3
+ <a id="top"></a>
4
+ # Vault-Forge v2.0
5
+
6
+ **Obsidian × Terminal × AI**
7
+ Vault-Forge is the CLI tool for accelerating intellectual production by directly manipulating your Obsidian Vault from the terminal and leveraging the power of Generative AI.
8
+
9
+ v2.0 features a revamped architecture with **Multi-AI Support**, **High-Speed Search**, and **Diary Functionality**.
10
+
11
+ ## Table of Contents
12
+
13
+ 1. [🚀 New Features in v2.0](#-new-features-in-v20)
14
+ 2. [📦 Installation and Setup](#-installation-and-setup)
15
+ 3. [📖 Command Guide](#-command-guide)
16
+ * [1. 📔 Diary & Memo (`vf diary`)](#1--diary--memo-vf-diary)
17
+ * [2. 🔍 Search (`vf search`)](#2--search-vf-search)
18
+ * [3. 🤖 AI Analysis & Generation (`vf ai`)](#3--ai-analysis--generation-vf-ai)
19
+ * [4. Recommended Alias Settings (`Aliases`)](#4-recommended-alias-settings-aliases)
20
+ 4. [🛠️ Customization (The Forge)](#️-customization-the-forge)
21
+ 5. [📊 Token Management](#-token-management)
22
+ 6. [⌨️ Shell Completion](#️-shell-completion)
23
+
24
+ ---
25
+
26
+ ## 🚀 New Features in v2.0
27
+
28
+ * **🧠 Multi-AI Support**: Freely switch between Gemini, OpenAI, Groq, and Claude for each mode.
29
+ * **📔 Diary Mode**: A lightning-fast memo function like `jrnl`. Create tasks and tags instantly from the CLI.
30
+ * **🔍 Search Mode**: Blazing fast search powered by `ripgrep`. Open files directly in Vim or Obsidian.
31
+ * **⚙️ Automated Configuration**: AI model lists and tags learn from your usage and are saved to `json`, growing your completion candidates.
32
+ * **📄 Obsidian First**: Prompts and settings are all managed as Obsidian notes.
33
+
34
+ [↑ Top](#top)
35
+ ---
36
+
37
+ ## 📦 Installation and Setup
38
+
39
+ ### 1. Prerequisites
40
+ * Node.js (v18 or higher recommended)
41
+ * Obsidian
42
+ * (Recommended) `ripgrep`: For using high-speed search mode (e.g., `brew install ripgrep`)
43
+
44
+ ### 2. Installation
45
+ Install as an npm package.
46
+
47
+ ```sh
48
+ npm install -g vault-forge
49
+ ```
50
+ ### Setup for Development Environment
51
+ If you are cloning the repository:
52
+ ```bash
53
+ git clone https://github.com/your-repo/vault-forge.git
54
+ cd vault-forge
55
+ npm install
56
+ npm run build
57
+ npm link # Link vf command globally
58
+ ```
59
+
60
+ ### 3. Environment Variables
61
+ Create a `.env` file in the project root (refer to `.env.example`).
62
+
63
+ ### 3.1 Setting Environment Variables
64
+
65
+ First, copy `.env.example` in the project root to create a `.env` file and configure the necessary settings.
66
+
67
+ ```bash
68
+ cp .env.example .env
69
+ nano .env # or edit with your favorite editor
70
+ ```
71
+ Set the following information in the `.env` file:
72
+ * `OBSIDIAN_VAULT_PATH`: The absolute path to your Obsidian Vault
73
+ * API keys for each AI provider (`OPENAI_API_KEY`, `GEMINI_API_KEY`, etc.)
74
+
75
+ ```sh
76
+ # Required: Absolute path to Obsidian Vault
77
+ OBSIDIAN_VAULT_PATH=/absolute/path/to/your/vault
78
+
79
+ # Optional: Language setting (ja/en)
80
+ APP_LANG=en
81
+
82
+ # Optional: Editor setting (effective only when ripgrep is used)
83
+ # Access md files via default editor instead of Obsidian.
84
+ EDITOR=code
85
+ # EDITOR=vim
86
+
87
+ # AI API Keys (Only set the ones you use)
88
+ GEMINI_API_KEY=...
89
+ OPENAI_API_KEY=...
90
+ GROQ_API_KEY=...
91
+ CLAUDE_API_KEY=...
92
+ ```
93
+
94
+ ### 4. Initialization (`vf init`)
95
+ Be sure to run this first. It generates necessary directories and configuration files within your Vault.
96
+
97
+ ```sh
98
+ vf init
99
+ ```
100
+
101
+ In interactive mode, you can configure the **AI Provider** and **Model** to use for each mode (general, debug, xpost).
102
+ The model names entered here are saved to `_AI_Prompts/ai-models.json` and will be displayed as options next time.
103
+
104
+ [↑ Top](#top)
105
+ ---
106
+
107
+ ## 📖 Command Guide
108
+
109
+ ### 1. 📔 Diary & Memo (`vf diary`)
110
+ Quickly append to Obsidian's Daily Note (`Daily/YYYY-MM-DD.md`). * **AI is not used.**
111
+
112
+ **Basic:**
113
+ ```sh
114
+ vf diary "Came up with a great idea"
115
+ # -> - **HH:MM** Came up with a great idea
116
+ ```
117
+
118
+ **Interactive Mode (no arguments):**
119
+ ```sh
120
+ vf diary
121
+ # -> Input prompt launches. Comfortable input experience.
122
+ ```
123
+
124
+ **Useful Features:**
125
+ * **Task Creation**: Use `-t` option, or include `#task` / `#todo` to save with a checkbox (`- [ ]`).
126
+ ```sh
127
+ vf diary -task "Buy milk" # -> [ ] Buy milk
128
+ vf diary -t "Buy milk" # -> [ ] Buy milk
129
+ vf diary "Drink milk #task" # -> [ ] Drink milk #task
130
+ ```
131
+ * **Headings**: Include `#h2` or `#heading2` to save as a Markdown heading.
132
+ ```sh
133
+ vf diary "About Project A #h2"
134
+ ```
135
+ * **Tags**: `#tag` is automatically extracted and recorded as a #tag in the Obsidian body.
136
+ ```sh
137
+ vf diary "Configured new CLI tool today #dev"
138
+ # -> **16:10** Configured new CLI tool today #dev
139
+ ```
140
+
141
+ ## 2. 🔍 Search (`vf search` `vf tag`)
142
+ High-speed search within the Vault. Alias `vf s` is also available. * **AI is not used.**
143
+
144
+ * Note: The search function only searches within the directory configured in `OBSIDIAN_VAULT_PATH=` in the .env file.
145
+
146
+ ```sh
147
+ vf search "search query"
148
+ vf s "search query"
149
+ ```
150
+ * **Editor Integration**:
151
+
152
+ If `ripgrep` is installed, it uses the editor configured in the `EDITOR` environment variable (e.g., `export EDITOR=code`) to open files in the Vault.
153
+
154
+ If `ripgrep` is not installed or `EDITOR` is not set, it opens in Obsidian.
155
+
156
+ ### About Tags:
157
+ **Tag Search:**
158
+ ```bash
159
+ vf tag test
160
+ ```
161
+ Searches for notes containing the `#test` tag "in the body".
162
+
163
+ ### 4.3 Diary & Memo (`vf diary`)
164
+
165
+ ```bash
166
+ vf diary "Configured new CLI tool today #dev"
167
+ ```
168
+ Appends to the Obsidian daily note. Use the `-t` option to add as a task.
169
+
170
+ By combining this tag function and search function, you can smoothly perform the cycle of:
171
+
172
+ Record with tag -> Search by tag -> Edit -> Input body -> Search body
173
+
174
+ directly from the terminal.
175
+
176
+
177
+ ### 3. 🤖 AI Analysis & Generation (`vf ai`)
178
+ Process text using AI. Behavior changes depending on the preset (mode).
179
+
180
+ **Basic:**
181
+ ```shell
182
+ vf ai "Ask AI something"
183
+ ```
184
+
185
+ **Specifying Preset (`-p` / `--preset`):**
186
+ * **general** (Default): General questions and text generation.
187
+ ```sh
188
+ vf ai --preset general --instruction "Ask AI something"
189
+ vf ai -p general -i "Ask AI something"
190
+ vf ai -p general "Ask AI something" # -i can be omitted
191
+ ```
192
+ * **debug**: Analyze error logs and code.
193
+ ```sh
194
+ vf ai -preset debug "[WARN] An error occurred! This is an error log..."
195
+ vf ai -p debug -f error.log "Analyze this error log"
196
+ cat error.log | vf ai -p debug # Can also be passed via pipe
197
+ ```
198
+ * **xpost**: Create X (Twitter) post drafts from memos and post them directly.
199
+ ```sh
200
+ vf ai -p xpost -f blog.md "With a humorous tone for engineers"
201
+
202
+ # In detached mode, drafts are saved to Vault and process exits (does not post automatically)
203
+ vf ai -p xpost -f blog.md --detach "With a humorous tone for engineers"
204
+ ```
205
+
206
+ **Options:**
207
+ * `-f, --file <path>`: Use file content as input.
208
+ * `-i, --instruction <text>`: Give additional instructions.
209
+ * `-d, --detach`: Run in background (results are saved to log file).
210
+ * `-m, --model <name>`: Temporarily change the model to use.
211
+
212
+ ### 4. Recommended Alias Settings (`Aliases`)
213
+ To use Vault-Forge even more conveniently, we recommend adding the following aliases to your shell configuration file (`.zshrc` or `.bashrc`).
214
+
215
+ ```bash
216
+ # Append to ~/.zshrc or ~/.bashrc
217
+
218
+ # Basic AI analysis (General preset)
219
+ alias ai='vf ai -p general'
220
+
221
+ # X (Twitter) post creation preset
222
+ alias xpost='vf ai -p xpost'
223
+
224
+ # Error log analysis preset
225
+ alias debug='vf ai -p debug'
226
+
227
+ # Create diary entry
228
+ alias diary='vf diary'
229
+
230
+ # Search
231
+ alias search='vf search'
232
+ ```
233
+
234
+ To apply the settings, restart your shell or run `source ~/.zshrc`.
235
+
236
+ ### 4.1 Application: Combining Aliases and Pipes
237
+
238
+ With recommended aliases, operation becomes even more intuitive.
239
+
240
+ **Create X post draft from blog article:**
241
+ ```bash
242
+ cat blog_draft.md | xpost "In a friendly tone"
243
+ ```
244
+
245
+ **Analyze Kubernetes logs:**
246
+ ```bash
247
+ kubectl logs my-pod | debug "Are there any abnormal logs?"
248
+ ```
249
+
250
+ **Create commit message draft from Git diff:**
251
+ ```bash
252
+ git diff | ai "Think of a commit message"
253
+ ```
254
+
255
+ [↑ Top](#top)
256
+ ---
257
+
258
+ ## 🛠️ Customization (The Forge)
259
+
260
+ The biggest feature of Vault-Forge is that **settings and prompts can be managed on Obsidian**.
261
+
262
+ ### Editing Prompts
263
+ Running `vf init` generates prompt files (Markdown) in `_AI_Prompts/prompts/en/` (or `ja/` depending on language setting) within your Vault.
264
+
265
+ By editing these in Obsidian, you can freely customize the AI's behavior.
266
+
267
+ **Example: `xpost.md`**
268
+
269
+ <img src="assets/customprompt-en.png" alt="Demo Image" width="600">
270
+
271
+ **Switching AI**:
272
+ * You can change the AI model used by directly describing it in the `model` field in the Obsidian header (Frontmatter).
273
+
274
+ <img src="assets/aimodel.png" alt="Demo Image" width="600">
275
+
276
+ * You can also change the model for that mode from the command line using `-m` or `--model` options.
277
+ ```sh
278
+ vf ai -m <TAB> # -> Press TAB to see model names as candidates
279
+ claude-haiku-4-5 gemini-2.0-flash ...
280
+ ```
281
+ * **Tag Completion**: Since model names are included in Obsidian tags during `vf init`, model names are completed when you type `#` on Obsidian.
282
+
283
+ (Please note not to include # when registering model names.)
284
+
285
+ ### Adding AI Models
286
+ If you want to use a new model (e.g., `gpt-7`), you can add it in one of the following ways:
287
+
288
+ 1. **Add via `vf init`**: Select `Custom` during model selection and enter manually.
289
+ 2. **Edit JSON**: Directly edit `_AI_Prompts/ai-models.json`.
290
+ 3. **Edit from Obsidian**: Directly edit the prompt in Obsidian.
291
+ 4. **Run via command**: Running with an unregistered model like `vf ai -m gpt-7 "test"` will automatically infer the provider and register it.
292
+ ```sh
293
+ vf ai -m gpt-7 "Can I use Gpt-7?"
294
+ ```
295
+ No need to rewrite code.
296
+
297
+ [↑ Top](#top)
298
+ ---
299
+
300
+ ## 📊 Token Management
301
+ AI usage is automatically recorded in `_AI_Prompts/TokenUsage/`.
302
+ It is visualized as Mermaid charts on Obsidian, so cost management is perfect.
303
+
304
+ <img src="assets/tokenusage.png" alt="Demo Image" width="400">
305
+
306
+ [↑ Top](#top)
307
+ ---
308
+
309
+ ## ⌨️ Shell Completion
310
+ Powerful completion is provided by `tabtab`.
311
+
312
+ ```sh
313
+ vf completion
314
+ ```
315
+
316
+ Normally, it is automatically set up at the end of `vf init`, but run the above command if you want to set it up manually.
317
+ This enables completion for commands, presets, options, and **hashtags recorded in `tags.json`**.
318
+
319
+
320
+ * **Command Completion**: `vf <TAB>` -> `ai`, `diary`, `search`, `tag`, `init`
321
+ * **Tag Completion**: `vf ai <TAB>` -> List of tags in Vault
322
+ * **Option Completion**: `vf ai -<TAB>` -> `-p`, `-m`, `-i`, `-f` ...
323
+ * **Value Completion**:
324
+ * `vf ai -p <TAB>` -> `general`, `debug`, `xpost`
325
+ * `vf ai -m <TAB>` -> `gpt-4`, `gemini-pro` ...
326
+ * `vf ai -f <TAB>` -> List of files in current directory
327
+
328
+ [↑ Top](#top)
329
+ ---
330
+
331
+ ### 🤝 Contributing
332
+
333
+ Bug reports and feature suggestions are welcome via Issue or Pull Request.
334
+
335
+ ### 📜 License
336
+ MIT License
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dummy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dummy.d.ts","sourceRoot":"","sources":["../../src/actions/dummy.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export {};
2
+ // dummy file to create directory
3
+ //# sourceMappingURL=dummy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dummy.js","sourceRoot":"","sources":["../../src/actions/dummy.ts"],"names":[],"mappings":";AAAA,iCAAiC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 内部でタグの # を復元して実行するメインアクション
3
+ */
4
+ export declare function mainAction(inputArg: string | undefined, options: any): Promise<void>;
5
+ //# sourceMappingURL=mainAction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mainAction.d.ts","sourceRoot":"","sources":["../../src/actions/mainAction.ts"],"names":[],"mappings":"AAcA;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,GAAG,iBA2D1E"}
@@ -0,0 +1,68 @@
1
+ import { spawn } from 'child_process';
2
+ import * as path from 'path';
3
+ import * as fsSync from 'fs';
4
+ import { VaultForge } from '../core/VaultForge.js';
5
+ import { AppMode } from '../types/constants.js';
6
+ import { AIModelService } from '../services/AIModelService.js';
7
+ import { getCandidates } from '../utils/completion.js';
8
+ import { fileURLToPath } from 'url';
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = path.dirname(__filename);
11
+ const masterModelsPath = path.join(__dirname, '../config/ai-models.json');
12
+ /**
13
+ * 内部でタグの # を復元して実行するメインアクション
14
+ */
15
+ export async function mainAction(inputArg, options) {
16
+ try {
17
+ if (options.detach) {
18
+ const args = process.argv.slice(2).filter(arg => arg !== '-d' && arg !== '--detach');
19
+ const subprocess = spawn(process.argv[0] || 'node', [process.argv[1] || '', ...args], { detached: true, stdio: 'ignore' });
20
+ subprocess.unref();
21
+ process.exit(0);
22
+ }
23
+ const vaultPath = process.env.OBSIDIAN_VAULT_PATH;
24
+ const aiModelService = new AIModelService(vaultPath);
25
+ const validCandidates = getCandidates();
26
+ let detectedModel = null;
27
+ const userModelsPath = path.join(vaultPath, '_AI_Prompts', 'ai-models.json');
28
+ let allModelsData = {};
29
+ if (fsSync.existsSync(userModelsPath)) {
30
+ allModelsData = JSON.parse(fsSync.readFileSync(userModelsPath, 'utf-8'));
31
+ }
32
+ if (options.model) {
33
+ const modelName = options.model;
34
+ for (const [provider, models] of Object.entries(allModelsData)) {
35
+ if (Array.isArray(models) && models.includes(modelName)) {
36
+ detectedModel = { provider, model: modelName };
37
+ break;
38
+ }
39
+ }
40
+ if (!detectedModel) {
41
+ detectedModel = { provider: '', model: modelName };
42
+ }
43
+ }
44
+ const processedInput = (inputArg || "").split(' ').map(word => {
45
+ if (validCandidates.includes(word)) {
46
+ return `#${word}`;
47
+ }
48
+ return word;
49
+ }).join(' ');
50
+ const config = {
51
+ vaultPath: vaultPath,
52
+ inputData: processedInput,
53
+ mode: options.mode || AppMode.GENERAL,
54
+ instruction: options.instruction,
55
+ overrideModel: detectedModel || undefined
56
+ };
57
+ const app = new VaultForge(config);
58
+ await app.run();
59
+ if (detectedModel && detectedModel.provider) {
60
+ const modelInfo = detectedModel;
61
+ await aiModelService.addModel(modelInfo.provider, modelInfo.model);
62
+ }
63
+ }
64
+ catch (e) {
65
+ process.exit(1);
66
+ }
67
+ }
68
+ //# sourceMappingURL=mainAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mainAction.js","sourceRoot":"","sources":["../../src/actions/mainAction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAiCommand(program: Command): void;
3
+ //# sourceMappingURL=ai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/commands/ai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,QAcjD"}
@@ -0,0 +1,20 @@
1
+ import { Command } from 'commander';
2
+ import { mainAction } from '../lib/mainAction.js';
3
+ import { AppMode } from '../types/constants.js';
4
+ import { TEXT } from '../config/text.js';
5
+ export function registerAiCommand(program) {
6
+ program.command('ai')
7
+ .argument('[input...]')
8
+ .option('-p, --preset <preset>', TEXT.commands.ai.options.preset)
9
+ .option('-i, --instruction <instruction>', TEXT.commands.ai.options.instruction)
10
+ .option('-d, --detach', TEXT.commands.ai.options.detach)
11
+ .option('-m, --model <model>', TEXT.commands.ai.options.model)
12
+ .option('-f, --file <path>', TEXT.commands.ai.options.file)
13
+ .option('--stream', TEXT.commands.ai.options.stream)
14
+ .option('--normal', TEXT.commands.ai.options.normal)
15
+ .allowUnknownOption()
16
+ .action(async (parts, opts) => {
17
+ await mainAction(parts.join(' '), opts);
18
+ });
19
+ }
20
+ //# sourceMappingURL=ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/commands/ai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAC9C,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;SAChB,QAAQ,CAAC,YAAY,CAAC;SACtB,MAAM,CAAC,uBAAuB,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;SAChE,MAAM,CAAC,iCAAiC,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;SAC/E,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;SACvD,MAAM,CAAC,qBAAqB,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;SAC7D,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;SAC1D,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;SACnD,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;SACnD,kBAAkB,EAAE;SACpB,MAAM,CAAC,KAAK,EAAE,KAAe,EAAE,IAAS,EAAE,EAAE;QACzC,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAskCommand(program: Command): void;
3
+ //# sourceMappingURL=ask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,QAWlD"}
@@ -0,0 +1,15 @@
1
+ import { Command } from 'commander';
2
+ import { mainAction } from '../lib/mainAction.js';
3
+ export function registerAskCommand(program) {
4
+ program.command('ask')
5
+ .argument('[input...]')
6
+ .option('-m, --mode <mode>', '', 'general')
7
+ .option('--model <name>', 'Specify AI model')
8
+ .option('-i, --instruction <text>')
9
+ .option('-d, --detach')
10
+ .allowUnknownOption()
11
+ .action(async (parts, opts) => {
12
+ await mainAction(parts.join(' '), opts);
13
+ });
14
+ }
15
+ //# sourceMappingURL=ask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IAC/C,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;SACjB,QAAQ,CAAC,YAAY,CAAC;SACtB,MAAM,CAAC,mBAAmB,EAAE,EAAE,EAAE,SAAS,CAAC;SAC1C,MAAM,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;SAC5C,MAAM,CAAC,0BAA0B,CAAC;SAClC,MAAM,CAAC,cAAc,CAAC;SACtB,kBAAkB,EAAE;SACpB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC1B,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * タグのリストを取得する(#を付けない)。
4
+ * Retrieves a list of tags (without the # prefix).
5
+ * @returns {string[]} タグの配列 / Array of tags.
6
+ */
7
+ export declare const getTags: () => string[];
8
+ /**
9
+ * モデルのリストを取得する。
10
+ * Retrieves a list of AI models.
11
+ * @returns {string[]} モデル名の配列 / Array of model names.
12
+ */
13
+ export declare const getModels: () => string[];
14
+ /**
15
+ * 従来の getCandidates (互換性のため)。
16
+ * Legacy getCandidates (for compatibility).
17
+ * @returns {string[]} タグとモデルの結合リスト / Combined list of tags and models.
18
+ */
19
+ export declare const getCandidates: () => string[];
20
+ /**
21
+ * 補完ロジックのセットアップ。
22
+ * 補完リクエストを処理した場合は true を返す。
23
+ * Sets up the completion logic.
24
+ * Returns true if a completion request was handled.
25
+ * @returns {boolean} 処理されたかどうか / Whether it was handled.
26
+ */
27
+ export declare const setupCompletion: () => boolean;
28
+ /**
29
+ * Commander コマンド定義。
30
+ * Commander command definition.
31
+ * @param {Command} program - Commander プログラムインスタンス / Commander program instance.
32
+ */
33
+ export declare function registerCompletionCommand(program: Command): void;
34
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC;;;;GAIG;AACH,eAAO,MAAM,OAAO,QAAO,MAAM,EAahC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,QAAO,MAAM,EAelC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,QAAO,MAAM,EAEtC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,QAAO,OAuDlC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,QASzD"}