$ stat ./projects/juliet-cli.md
Title: Juliet-CLI
Date: 1/3/2026
Description: Juliet is a modular AI framework where independent isomorphic agents develop persistent, personalized intelligence via swappable adapters that inject structured, tagged context into a standardized prompt pipeline enabling plug-and-play, divergent learning without rigid orchestration.
Juliet is a modular AI framework where independent isomorphic agents develop persistent, personalized intelligence via swappable adapters that inject structured, tagged context into a standardized prompt pipeline enabling plug-and-play, divergent learning without rigid orchestration.
Each iso maintains its own persistent memory (via vector stores), facts, and task state, while continuously ingesting unstructured data from conversations, documents (.pdf, .txt, etc.), and other sources. Over time, isos fine-tune lightweight adapters against their unique experiential history, giving rise to distinct traits, behaviors, and emergent intelligence despite originating from a shared structural blueprint.
Juliet goes beyond conventional RAG pipelines. Rather than treating retrieval as a static augmentation step, the framework models learning as a dynamic process where memory, state-space evolution, and contextual perturbations interact and produce adaptive, creative, and increasingly individualized agents.
Juliet’s core is a dynamic, adapter-driven context pipeline designed for composability and long-term evolution.
Each context source (facts, memory, knowledge, history, etc.) is implemented as an independent adapter.
Adapters output a List[dict] of standardized OpenAI-compatible messages (system, user, assistant only).
The prompt pipeline is assembled deterministically:
class ContextPipeline:
def __init__(self, chroma_store: ChromaMemoryStore, message_cache: MessageCacheAdapter, iso_name: str, user_name: str):
self.instructions = ModelInstructions(method="load", assistant_name=iso_name)
self.adapters = OrderedDict()
self.chroma_path = f"isos/{iso_name.lower().strip()}/users/{user_name.lower().strip()}/chroma_store"
self.semantic_memory_path = f"isos/{iso_name.lower().strip()}/users/{user_name.lower().strip()}/semantic_memory.json"
self.episodic_memory_path = f"isos/{iso_name.lower().strip()}/users/{user_name.lower().strip()}/episodic_memory.json"
self.facts_memory_path = f"isos/{iso_name.lower().strip()}/users/{user_name.lower().strip()}/facts_memory.json"
# === Register Context Adapters === #
self.register_adapter("timestamp", TimestampAdapter())
self.register_adapter("semantic", SemanticMemoryAdapter(chroma_store=chroma_store))
self.register_adapter("episodic", EpisodicMemoryAdapter(chroma_store=chroma_store))
# TODO: self.register_adapter("procedural", ProceduralMemoryAdapter(chroma_store=chroma_store))
# TODO: self.register_adapter("facts", FactStoreAdapter(chroma_store=chroma_store))
self.register_adapter("message_cache", message_cache)
self.register_adapter("user_request", UserRequestAdapter(tag_name="user"))
self.register_adapter("assistant_prefix", AssistantPrefixAdapter(prefix="<assistant>"))
def register_adapter(self, name: str, adapter: BaseContextAdapter):
self.adapters[name] = adapter
def build_messages(self, user_request: str) -> List[Dict[str, str]]:
"""
Build the full message list by combining fixed instructions and all adapters.
Adapters that require the current user query receive it; others do not.
"""
messages = [
{"role": "system", "content": f"<system>{self.instructions.system_message}</system>"},
{"role": "assistant", "content": f"<assistant_intro>{self.instructions.assistant_intro}</assistant_intro>"},
{"role": "system", "content": f"<focus>{self.instructions.assistant_focus}</focus>"},
]
for adapter in self.adapters.values():
if adapter.requires_user_request:
msgs = adapter.build_messages(user_request=user_request)
else:
msgs = adapter.build_messages()
if msgs:
messages.extend(msgs)
return messages
To preserve semantic boundaries and guide model reasoning, adapter content is compartmentalized using XML-like tags (e.g. <facts>, <memory>, <knowledge>). For example:
<semantic>
<The_Adventures_Of_Sherlock_Holmes>
Relevant passages from The Adventures of Sherlock Holmes...
</The_Adventures_Of_Sherlock_Holmes>
<Attention_Is_All_You_Need>
Relevant passages from the Attention is All You Need paper...
</Attention_Is_All_You_Need>
</semantic>
Summary: Highly modular, swappable context injection with a strict message format and tagged structure optimized for clarity, control, and emergent learning.
Juliet includes a terminal-based interface designed to make agent evolution observable and hands-on:

Finding related projects...
$ cd .. && ./projects.sh
← Back to all projects