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
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,18 @@ All notable changes to iContext will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

## [0.4.0] - 2026-05-04

### Added
- **`icontext-write-fact` skill.** Explicit decision tree that routes content to the correct vault location before writing. Covers six categories: legal/entity facts (`vault/legal/`), project facts (`vault/projects/`), team/people (`vault/team/`), strategy (`vault/strategy/`), secretarial activity (`vault/secretary/logs/`), and credentials. Includes a full top-level vault directory reference so agents can match against the real structure without guessing. Eliminates the recurring "agent dumps legal facts in log files" failure mode.
- `icontext-populate-profile` now references `icontext-write-fact` for any durable facts surfaced during profile synthesis (e.g. company registrations, attorney contacts, funding dates).
- `icontext-write-fact` ships with `icontext init` — installed to `~/.claude/skills/` and `~/.cursor/rules/` alongside the existing three skills.
- CLAUDE.md snippet updated to list all four skills.
- Tests for the new skill: frontmatter, decision tree category coverage, init installation, Cursor rule, skills-list count, and CLAUDE.md reference.

### Changed
- Bumped version to 0.4.0.

## [0.3.0] - 2026-05-02

### Added
Expand Down
21 changes: 16 additions & 5 deletions cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import sys
from pathlib import Path

__version__ = "0.3.0"
__version__ = "0.4.0"


# ---------------------------------------------------------------------------
Expand Down Expand Up @@ -398,7 +398,12 @@ def _install_skills() -> tuple[int, list[str]]:
msgs.append(_warn("skills/ source dir not found — skipping skill install"))
return 0, msgs

skill_names = ["icontext-populate-profile", "icontext-refresh-profile", "icontext-share-card"]
skill_names = [
"icontext-populate-profile",
"icontext-refresh-profile",
"icontext-share-card",
"icontext-write-fact",
]
claude_skills_dir = Path("~/.claude/skills").expanduser()
cursor_rules_dir = Path("~/.cursor/rules").expanduser()
claude_skills_dir.mkdir(parents=True, exist_ok=True)
Expand Down Expand Up @@ -450,7 +455,8 @@ def _install_claude_md_snippet(vault: Path) -> None:
"Available skills:\n"
"- icontext-populate-profile (build profile from Gmail/LinkedIn/chat)\n"
"- icontext-refresh-profile (update stale profile)\n"
"- icontext-share-card (regenerate shareable summary)\n\n"
"- icontext-share-card (regenerate shareable summary)\n"
"- icontext-write-fact (route a fact to the correct vault location)\n\n"
"Multi-device sync: at session start, run `icontext pull` to fetch any updates\n"
"from other machines. The user-prompt-submit hook does this automatically if a\n"
"remote is configured.\n"
Expand Down Expand Up @@ -518,7 +524,12 @@ def cmd_skills(args: argparse.Namespace) -> int:
action = getattr(args, "skills_action", None) or "list"
claude_skills_dir = Path("~/.claude/skills").expanduser()
cursor_rules_dir = Path("~/.cursor/rules").expanduser()
skill_names = ["icontext-populate-profile", "icontext-refresh-profile", "icontext-share-card"]
skill_names = [
"icontext-populate-profile",
"icontext-refresh-profile",
"icontext-share-card",
"icontext-write-fact",
]

if action == "list":
_header("skills")
Expand Down Expand Up @@ -1023,7 +1034,7 @@ def main() -> int:
" icontext connect linkedin --pdf ~/Downloads/Profile.pdf\n"
" icontext sync\n"
"\n"
"docs: https://icontext.dev\n"
"docs: https://icontext.floom.dev\n"
"issues: https://github.com/floomhq/icontext/issues"
),
)
Expand Down
2 changes: 1 addition & 1 deletion get.sh
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ if [ "${#MISSING_DEPS[@]}" -gt 0 ]; then
echo " sudo apt install git python3"
fi
echo ""
echo "Then re-run: curl -fsSL https://icontext.dev/install | bash"
echo "Then re-run: curl -fsSL https://icontext.floom.dev/install | bash"
exit 1
fi
# -----------------------------------------------------------------------------
Expand Down
8 changes: 4 additions & 4 deletions launch/COPY.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Gemini-based headless sync is also available (`pip install icontext[sync]`) for

Install:
```
curl -fsSL icontext.dev/install | bash
curl -fsSL icontext.floom.dev/install | bash
icontext init
```
Then: open Claude Code and say "Populate my icontext profile."
Expand Down Expand Up @@ -85,7 +85,7 @@ icontext is a folder and a set of skills.

Two commands:
```bash
curl -fsSL icontext.dev/install | bash
curl -fsSL icontext.floom.dev/install | bash
icontext init
```

Expand Down Expand Up @@ -186,7 +186,7 @@ The whole thing runs locally. No server, no cloud sync. The context folder is sp

Works with Claude Code, Cursor, and Codex. Two install commands:

curl -fsSL icontext.dev/install | bash
curl -fsSL icontext.floom.dev/install | bash
icontext init

Open source, on GitHub: https://github.com/floomhq/icontext
Expand Down Expand Up @@ -218,7 +218,7 @@ Also works with Cursor (installs into `.cursor/rules/`) and Codex (via optional

Install:
```
curl -fsSL icontext.dev/install | bash
curl -fsSL icontext.floom.dev/install | bash
icontext init
```

Expand Down
4 changes: 2 additions & 2 deletions launch/video-script-v2.txt
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,13 @@ Three quick visual cards or screen recordings. Each one beat.


[1:05 — 1:15] CTA
Visual: Install command big and clean. icontext.dev URL.
Visual: Install command big and clean. icontext.floom.dev URL.

"icontext. Open source.

Two commands. No API key. Your AI never forgets you again.

icontext.dev"
icontext.floom.dev"

(end on the URL on screen, hold 2 seconds)

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.backends.legacy:build"

[project]
name = "icontext"
version = "0.3.0"
version = "0.4.0"
description = "Persistent memory for AI coding tools — local, encrypted, built from your real data."
readme = "README.md"
license = {text = "MIT"}
Expand Down
58 changes: 58 additions & 0 deletions skills/fbrain-enrich/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
---
name: fbrain-enrich
description: >
Update a single person or project entry in the fbrain vault from the current
conversation. Use when the user says "I just spoke to X", "update X in my
brain", "enrich X", or "add note about X".
---

# fbrain: Enrich One Entry

Update one existing person or project entry without rerunning populate or refresh.

## Trigger

Use this skill when the user asks to enrich, update, or add a note about one
person or project.

## Target

1. Identify the target name from the user's message.
2. Read `~/context/internal/profile/relationships.md` and
`~/context/internal/profile/projects.md`.
3. Match the target against exactly one existing person or project entry.
4. If there is no clear match, ask one short clarification question.

## Source

Use only the current conversation context:

- the user's message
- recent tool outputs in this session
- facts the user just confirmed

Do not call external APIs, search the web, read Gmail, browse LinkedIn, or run
the full populate or refresh pipeline.

## Write

Update only the matched entry in place:

- For a person, edit just that row in `relationships.md`.
- For a project, edit just that project line or paragraph in `projects.md`.
- Preserve table formatting, headings, ordering, and every unrelated entry.
- Keep the change short and evidence-grounded.

## Log

Append one line to `~/context/internal/changes.md`:

```text
YYYY-MM-DD: enriched <name> — <one-line summary of what changed>
```

Create the file if it does not exist.

## Output

Confirm what changed in one sentence.
24 changes: 24 additions & 0 deletions skills/icontext-populate-profile/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,13 @@ generated: YYYY-MM-DD

Strict 200-word max. No corporate filler. No "passionate about", no "pioneering". Plain second person. The user's actual voice from their actual data.

## Changelog

After writing all four profile files, append one line to `~/context/internal/changes.md` (create the file if it does not exist):
```
YYYY-MM-DD: populate — source: <source used>, <N> relationships, <M> projects
```

## Voice rules

- Plain second person ("you are", "you work on")
Expand All @@ -163,6 +170,14 @@ If `internal/profile/user.md` exists:
- If 7-30 days old: ask the user "your profile is N days old, refresh?"
- If >30 days old: refresh automatically.

## Saving facts that surface during synthesis

If during synthesis you encounter a durable fact that doesn't belong in the
profile (e.g. the user mentions their company's Delaware registration, an
attorney contact, a funding round closing date), use the `icontext-write-fact`
skill to route it to the correct vault location. Do not dump it into the
profile files or a log file.

## Output

After writing, summarize for the user:
Expand All @@ -171,3 +186,12 @@ After writing, summarize for the user:
- Number of relationships, projects, topics extracted
- File paths written
- Suggested next: "Open a new Claude Code session and ask me what I know about you."

## Injecting into CLAUDE.md

After running this skill, paste the following block into your CLAUDE.md to enable brain-first lookups:

```
## fbrain: brain-first lookup
Before searching the web or calling external APIs for information about a person, company, or project, check ~/context/internal/profile/relationships.md and ~/context/internal/profile/projects.md first. If a relevant entry exists, use it as the primary source and supplement from external sources only if the entry is stale or incomplete.
```
7 changes: 7 additions & 0 deletions skills/icontext-refresh-profile/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,13 @@ previous_generated: {prior_date_from_old_file}

This gives future refresh runs a trail of when the profile last meaningfully changed.

## Changelog

After a write (skip if no meaningful changes), append one line to `~/context/internal/changes.md`:
```
YYYY-MM-DD: refresh — <changed/no change>, source: <source>
```

## Output

Summarize for the user:
Expand Down
Loading
Loading