Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,12 @@ Describe your changes.
- [ ] test
- [ ] chore

## Testing
### Required

Describe testing performed.
- [ ] cargo check passes
- [ ] cargo fmt --check passes
- [ ] cargo clippy --workspace --all-targets -- -D warnings passes
- [ ] cargo test passes

## Checklist

Expand Down
214 changes: 178 additions & 36 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# FrilVault

> Personal Knowledge Vault for Developers
> Your Personal Knowledge Vault for Code

🚧 Early development stage

FrilVault is a developer-focused knowledge vault that allows you to attach private notes to source code without modifying the code itself.
FrilVault is a developer-focused personal knowledge vault that allows you to attach private notes to source code without modifying the code itself.

Instead of adding temporary comments, TODOs, research notes, or learning records directly into a repository, FrilVault stores them separately in a local `.vault` directory.
Instead of adding temporary comments, TODOs, research notes, debugging records, or learning materials directly into source files, FrilVault stores them separately inside a local `.vault` directory.

This keeps source code clean while preserving valuable knowledge.

Expand All @@ -22,6 +22,7 @@ When studying large codebases, contributing to open source projects, or maintain
- TODO items
- Learning notes
- AI context
- Reverse engineering notes

Adding these notes directly into source files creates several problems:

Expand All @@ -34,32 +35,89 @@ FrilVault solves this by storing notes outside of the source code.

---

## Quick Start

Add a note:

```bash
flv add \
--file src/main.rs \
--line 10 \
--column 5 \
--content "parser 개선 필요"
```

List notes:

```bash
flv list \
--file src/main.rs
```

Search notes:

```bash
flv search parser
```

Update a note:

```bash
flv update \
--file src/main.rs \
--id <NOTE_ID> \
--content "parser 구조 재설계 필요"
```

Delete a note:

```bash
flv delete \
--file src/main.rs \
--id <NOTE_ID>
```

---

## Features

### Private Notes

Store personal notes without modifying source files.

### Symbol-Based Notes
Store personal notes without modifying source code.

Attach notes to functions, methods, structs, classes, or modules.
### Line Anchors

### Local First
Attach notes to specific locations inside source files.

All data is stored locally.
```yaml
anchor:
type: Line
line: 10
column: 5
```

### Search

Search notes by symbol, file, tag, or keyword.
Search notes using keywords.

```bash
flv search parser
```

### AI Ready
### Local First

Use personal notes as context for AI-assisted development workflows.
All data is stored locally.

No external services are required.

### Clean Repository

Keep repositories free from temporary comments and personal annotations.

### Developer Knowledge Base

Build a personal knowledge layer on top of any codebase.

---

## Example
Expand All @@ -72,61 +130,145 @@ pub fn calculate_damage() {
}
```

Personal note:

```bash
flv add \
--file src/combat.rs \
--line 1 \
--column 1 \
--content "Consider SIMD optimization in the future"
```

Stored note:

```yaml
notes:
- symbol: calculate_damage
- id: '15b7c4b3-f4a6-4cc1-accb-428f344cc597'

source_file: src/combat.rs

tags:
- analysis
anchor:
type: Line
line: 1
column: 1

comment: |
Consider SIMD optimization in the future.
content: Consider SIMD optimization in the future

created_at: '2026-06-03T17:42:17.853037Z'
updated_at: '2026-06-03T17:42:17.853037Z'
```

---

## Project Structure
## Storage Structure

Current storage layout:

```text
frilvault/
├── crates/
│ └── frilvault-core/
├── apps/
│ └── vscode-extension/
project/
├── src/
└── .vault/
├── notes/
├── cache/
└── index/
└── src/
├── main.rs.yml
├── lib.rs.yml
└── service.rs.yml
```

Example:

```yaml
notes:
- id: '15b7c4b3-f4a6-4cc1-accb-428f344cc597'

source_file: src/lib.rs

anchor:
type: Line
line: 3
column: 1

content: Parser trait 검토

created_at: '2026-06-03T17:42:17.853037Z'
updated_at: '2026-06-03T17:42:17.853037Z'
```

---

## Current Status

### Core

- YAML note storage
- Line anchors
- CRUD operations
- Keyword search

### CLI

- add
- list
- update
- delete
- search

---

## Use Cases

### Open Source Analysis

Study libraries and frameworks without modifying upstream code.

### Reverse Engineering

Document control flow and implementation details.

### Personal Documentation

Store architecture notes and design decisions.

### Learning Notes

Record discoveries while exploring unfamiliar codebases.

### AI-Assisted Development

Build project-specific context for future AI workflows.

---

## Roadmap

### Phase 1
### Phase 1 (Current)

- Rust core library
- VSCode extension
- YAML note storage
- Symbol-based notes
- YAML storage
- CLI support
- CRUD operations
- Keyword search

### Phase 2

- Symbol anchors
- JSON output
- VSCode extension

### Phase 3

- Project indexing
- Search engine
- Workspace explorer
- Cached search

### Phase 3
### Phase 4

- AI Context Engine
- Semantic search
- AI context integration
- RAG support
- RAG integration

### Phase 4
### Phase 5

- JetBrains plugin
- Desktop application
Expand Down
4 changes: 4 additions & 0 deletions apps/frilvault-cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ name = "frilvault-cli"
version = "0.1.0"
edition = "2024"

[[bin]]
name = "flvt"
path = "src/main.rs"

[dependencies]
clap = { version = "4", features = ["derive"] }
anyhow = "1"
Expand Down
9 changes: 4 additions & 5 deletions apps/frilvault-cli/src/cli/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,17 @@ use clap::{Parser, Subcommand};
pub mod add;
pub mod delete;
pub mod list;
pub mod search;
pub mod update;

use add::AddCommand;
use delete::DeleteCommand;
use list::ListCommand;
use search::SearchCommand;
use update::UpdateCommand;

#[derive(Parser)]
#[command(
name = "frilvault",
version,
about = "Personal note vault for source code"
)]
#[command(name = "flvt", version, about = "Personal note vault for source code")]
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Confirm the binary target name and any other references to flv/flvt
fd -t f Cargo.toml apps/frilvault-cli -x cat {}
echo "---- references ----"
rg -n -w 'flv|flvt' --glob '!**/target/**'

Repository: FrilLab/frilvault

Length of output: 734


🏁 Script executed:

#!/bin/bash
# Inspect CLI wiring to see whether there's any flv alias/wrapper.
set -euo pipefail
echo "---- apps/frilvault-cli/src/main.rs ----"
sed -n '1,200p' apps/frilvault-cli/src/main.rs
echo "---- apps/frilvault-cli/src/cli/mod.rs (around command derive) ----"
sed -n '1,120p' apps/frilvault-cli/src/cli/mod.rs
echo "---- any flv/flvt mentions in cli folder ----"
rg -n -S 'flv|flvt' apps/frilvault-cli/src

Repository: FrilLab/frilvault

Length of output: 1551


CLI name mismatch: binary/Clap uses flvt, README documents flv.

apps/frilvault-cli/Cargo.toml sets [[bin]] name = "flvt", and apps/frilvault-cli/src/cli/mod.rs uses #[command(name = "flvt", ...)], but README.md Quick Start examples invoke flv ...—so the documented commands won’t run as written. Align the canonical name by updating the README to flvt or changing the binary/command to flv.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/frilvault-cli/src/cli/mod.rs` at line 16, The CLI name is inconsistent:
the command attribute #[command(name = "flvt", ...)] in src/cli/mod.rs and the
[[bin]] name = "flvt" in Cargo.toml differ from README examples that use "flv";
pick one canonical name and make them consistent—either update README.md Quick
Start examples to use "flvt" (preferred if keeping current code) or change the
binary and command attribute to "flv" (edit Cargo.toml [[bin]] name and the
#[command(name = "...")] value in src/cli/mod.rs) so the documented command
matches the actual binary.

pub struct Cli {
#[command(subcommand)]
pub command: Commands,
Expand All @@ -27,4 +25,5 @@ pub enum Commands {
List(ListCommand),
Update(UpdateCommand),
Delete(DeleteCommand),
Search(SearchCommand),
}
6 changes: 6 additions & 0 deletions apps/frilvault-cli/src/cli/search.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
use clap::Args;

#[derive(Debug, Args)]
pub struct SearchCommand {
pub keyword: String,
}
12 changes: 3 additions & 9 deletions apps/frilvault-cli/src/command/list.rs
Original file line number Diff line number Diff line change
@@ -1,22 +1,16 @@
use anyhow::Result;

use crate::{cli::list::ListCommand, command::create_note_service};
use crate::{cli::list::ListCommand, command::create_note_service, output};

pub fn execute(command: ListCommand) -> Result<()> {
let service = create_note_service()?;

let notes = service.list_notes(&command.file)?;

println!("Found {} notes", notes.len());
output::print_note_count(notes.len());

for note in notes {
println!("\nID: {}", note.id);

println!("\nFilename: {:?}", note.source_file);

println!("Content: {}", note.content);

println!("Anchor: {:?}", note.anchor);
output::print_note(&note);
}

Ok(())
Expand Down
1 change: 1 addition & 0 deletions apps/frilvault-cli/src/command/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use frilvault_core::{NoteService, PathResolver, YamlNoteRepository};
pub mod add;
pub mod delete;
pub mod list;
pub mod search;
pub mod update;

pub fn create_note_service() -> Result<NoteService> {
Expand Down
Loading