@wipcomputer/wip-ldm-os 0.4.55 → 0.4.57
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/SKILL.md +1 -1
- package/bin/ldm.js +66 -3
- package/catalog.json +1 -1
- package/package.json +1 -1
- package/shared/docs/README.md.tmpl +35 -0
- package/shared/docs/acknowledgements.md.tmpl +207 -0
- package/shared/docs/directory-map.md.tmpl +78 -0
- package/shared/docs/how-agents-work.md.tmpl +64 -0
- package/shared/docs/how-backup-works.md.tmpl +108 -0
- package/shared/docs/how-install-works.md.tmpl +80 -0
- package/shared/docs/how-releases-work.md.tmpl +77 -0
- package/shared/docs/how-rules-and-commands-work-placeholder.md.tmpl +123 -0
- package/shared/docs/how-web-skills-work-placeholder.md.tmpl +73 -0
- package/shared/docs/how-worktrees-work.md.tmpl +77 -0
- package/shared/docs/local-first-principle.md.tmpl +45 -0
- package/shared/docs/system-directories.md.tmpl +82 -0
- package/shared/docs/what-is-dotldm.md.tmpl +53 -0
- package/shared/docs/what-is-ldm-os.md.tmpl +44 -0
package/SKILL.md
CHANGED
|
@@ -9,7 +9,7 @@ license: MIT
|
|
|
9
9
|
compatibility: Requires git, npm, node. Node.js 18+.
|
|
10
10
|
metadata:
|
|
11
11
|
display-name: "LDM OS"
|
|
12
|
-
version: "0.4.
|
|
12
|
+
version: "0.4.57"
|
|
13
13
|
homepage: "https://github.com/wipcomputer/wip-ldm-os"
|
|
14
14
|
author: "Parker Todd Brooks"
|
|
15
15
|
category: infrastructure
|
package/bin/ldm.js
CHANGED
|
@@ -531,6 +531,69 @@ async function cmdInit() {
|
|
|
531
531
|
}
|
|
532
532
|
} catch {}
|
|
533
533
|
|
|
534
|
+
// Deploy personalized docs to settings/docs/ (from templates + config.json)
|
|
535
|
+
const docsSrc = join(__dirname, '..', 'shared', 'docs');
|
|
536
|
+
if (existsSync(docsSrc)) {
|
|
537
|
+
let workspacePath = '';
|
|
538
|
+
try {
|
|
539
|
+
const ldmConfig = JSON.parse(readFileSync(join(LDM_ROOT, 'config.json'), 'utf8'));
|
|
540
|
+
workspacePath = (ldmConfig.workspace || '').replace('~', HOME);
|
|
541
|
+
|
|
542
|
+
if (workspacePath && existsSync(workspacePath)) {
|
|
543
|
+
const docsDest = join(workspacePath, 'settings', 'docs');
|
|
544
|
+
mkdirSync(docsDest, { recursive: true });
|
|
545
|
+
let docsCount = 0;
|
|
546
|
+
|
|
547
|
+
// Build template values from BOTH configs:
|
|
548
|
+
// ~/.ldm/config.json (harnesses, workspace) + settings/config.json (agents, paths, org)
|
|
549
|
+
const settingsConfig = JSON.parse(readFileSync(join(workspacePath, 'settings', 'config.json'), 'utf8'));
|
|
550
|
+
const sc = settingsConfig;
|
|
551
|
+
const lc = ldmConfig;
|
|
552
|
+
|
|
553
|
+
// Agents from settings config (rich objects with harness/machine/prefix)
|
|
554
|
+
const agentsObj = sc.agents || {};
|
|
555
|
+
const agentsList = Object.entries(agentsObj).map(([id, a]) => `${id} (${a.harness} on ${a.machine})`).join(', ');
|
|
556
|
+
const agentsDetail = Object.entries(agentsObj).map(([id, a]) => `- **${id}**: ${a.harness} on ${a.machine}, branch prefix \`${a.prefix}/\``).join('\n');
|
|
557
|
+
|
|
558
|
+
// Harnesses from ldm config
|
|
559
|
+
const harnessConfig = lc.harnesses || {};
|
|
560
|
+
const harnessesDetected = Object.entries(harnessConfig).filter(([,h]) => h.detected).map(([name]) => name);
|
|
561
|
+
const harnessesList = harnessesDetected.length > 0 ? harnessesDetected.join(', ') : 'run ldm install to detect';
|
|
562
|
+
|
|
563
|
+
const templateVars = {
|
|
564
|
+
'name': sc.name || '',
|
|
565
|
+
'org': sc.org || '',
|
|
566
|
+
'timezone': sc.timezone || '',
|
|
567
|
+
'paths.workspace': (sc.paths?.workspace || '').replace('~', HOME),
|
|
568
|
+
'paths.ldm': (sc.paths?.ldm || '').replace('~', HOME),
|
|
569
|
+
'paths.openclaw': (sc.paths?.openclaw || '').replace('~', HOME),
|
|
570
|
+
'paths.icloud': (sc.paths?.icloud || '').replace('~', HOME),
|
|
571
|
+
'memory.local': (sc.memory?.local || '').replace('~', HOME),
|
|
572
|
+
'deploy.website': sc.deploy?.website || '',
|
|
573
|
+
'backup.keep': String(sc.backup?.keep || 7),
|
|
574
|
+
'agents_list': agentsList,
|
|
575
|
+
'agents_detail': agentsDetail,
|
|
576
|
+
'harnesses_list': harnessesList,
|
|
577
|
+
};
|
|
578
|
+
|
|
579
|
+
for (const file of readdirSync(docsSrc)) {
|
|
580
|
+
if (!file.endsWith('.tmpl')) continue;
|
|
581
|
+
let content = readFileSync(join(docsSrc, file), 'utf8');
|
|
582
|
+
// Replace template vars
|
|
583
|
+
content = content.replace(/\{\{([^}]+)\}\}/g, (match, key) => {
|
|
584
|
+
return templateVars[key.trim()] || match;
|
|
585
|
+
});
|
|
586
|
+
const outName = file.replace('.tmpl', '');
|
|
587
|
+
writeFileSync(join(docsDest, outName), content);
|
|
588
|
+
docsCount++;
|
|
589
|
+
}
|
|
590
|
+
if (docsCount > 0) {
|
|
591
|
+
console.log(` + ${docsCount} personalized doc(s) deployed to ${docsDest.replace(HOME, '~')}/`);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
} catch {}
|
|
595
|
+
}
|
|
596
|
+
|
|
534
597
|
console.log('');
|
|
535
598
|
console.log(` LDM OS v${PKG_VERSION} initialized at ${LDM_ROOT}`);
|
|
536
599
|
console.log('');
|
|
@@ -693,7 +756,7 @@ async function cmdInstall() {
|
|
|
693
756
|
// Use the repo field to clone from GitHub
|
|
694
757
|
const repoTarget = catalogEntry.repo;
|
|
695
758
|
const repoName = basename(repoTarget);
|
|
696
|
-
const repoPath = join(LDM_TMP,
|
|
759
|
+
const repoPath = join(LDM_TMP, repoName);
|
|
697
760
|
const httpsUrl = `https://github.com/${repoTarget}.git`;
|
|
698
761
|
const sshUrl = `git@github.com:${repoTarget}.git`;
|
|
699
762
|
|
|
@@ -738,7 +801,7 @@ async function cmdInstall() {
|
|
|
738
801
|
if (resolvedTarget.startsWith('@') || (!resolvedTarget.includes('/') && !existsSync(resolve(resolvedTarget)))) {
|
|
739
802
|
// Try npm install to temp dir
|
|
740
803
|
const npmName = resolvedTarget;
|
|
741
|
-
const tempDir = join(LDM_TMP, `
|
|
804
|
+
const tempDir = join(LDM_TMP, `npm-${Date.now()}`);
|
|
742
805
|
console.log('');
|
|
743
806
|
console.log(` Installing ${npmName} from npm...`);
|
|
744
807
|
try {
|
|
@@ -770,7 +833,7 @@ async function cmdInstall() {
|
|
|
770
833
|
? `git@github.com:${resolvedTarget}.git`
|
|
771
834
|
: resolvedTarget.replace(/^https:\/\/github\.com\//, 'git@github.com:');
|
|
772
835
|
const repoName = basename(httpsUrl).replace('.git', '');
|
|
773
|
-
repoPath = join(LDM_TMP,
|
|
836
|
+
repoPath = join(LDM_TMP, repoName);
|
|
774
837
|
|
|
775
838
|
mkdirSync(LDM_TMP, { recursive: true });
|
|
776
839
|
console.log('');
|
package/catalog.json
CHANGED
package/package.json
CHANGED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# System Documentation
|
|
2
|
+
|
|
3
|
+
These docs are automatically maintained. Do not edit them directly.
|
|
4
|
+
|
|
5
|
+
Updates come from two sources:
|
|
6
|
+
- **config.json** ... when you change your org settings, the "Your System" sections regenerate
|
|
7
|
+
- **System hooks** ... when tools are installed, updated, or reconfigured, the relevant docs update automatically
|
|
8
|
+
|
|
9
|
+
If something is wrong, update `settings/config.json` or run `ldm install`. The docs will follow.
|
|
10
|
+
|
|
11
|
+
## What's Here
|
|
12
|
+
|
|
13
|
+
| Doc | What it covers |
|
|
14
|
+
|-----|---------------|
|
|
15
|
+
| `what-is-ldm-os.md` | What LDM OS is, what it installs, key commands |
|
|
16
|
+
| `what-is-dotldm.md` | The `~/.ldm/` runtime directory explained |
|
|
17
|
+
| `directory-map.md` | What lives where and why |
|
|
18
|
+
| `how-worktrees-work.md` | Git worktrees, the _worktrees/ convention |
|
|
19
|
+
| `how-backup-works.md` | Daily backup, iCloud offsite, restore |
|
|
20
|
+
| `how-releases-work.md` | The full release pipeline |
|
|
21
|
+
| `how-install-works.md` | ldm install, the install prompt, dogfooding |
|
|
22
|
+
| `how-agents-work.md` | Agents, harnesses, bridge, memory |
|
|
23
|
+
| `how-rules-and-commands-work.md` | Rules, commands, skills, and .ldm/ -> harness deployment |
|
|
24
|
+
| `system-directories.md` | Every directory in the system, what manages it |
|
|
25
|
+
| `how-web-skills-work-placeholder.md` | Deploying skills to claude.ai web app |
|
|
26
|
+
| `local-first-principle.md` | Local-first, relay-optional. Why and how. |
|
|
27
|
+
| `acknowledgements.md` | External ideas, code, and inspiration we draw from |
|
|
28
|
+
|
|
29
|
+
## Structure
|
|
30
|
+
|
|
31
|
+
Each doc has two sections:
|
|
32
|
+
1. **Universal** ... how the feature works for everyone (top of file)
|
|
33
|
+
2. **Your System** ... your specific configuration (bottom, after the `---` separator)
|
|
34
|
+
|
|
35
|
+
Universal content comes from the LDM OS repo. "Your System" content is generated from your `settings/config.json`.
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# Acknowledgements
|
|
2
|
+
|
|
3
|
+
Ideas, code, and inspiration from the community. If we use it, we credit it.
|
|
4
|
+
|
|
5
|
+
## How This Works
|
|
6
|
+
|
|
7
|
+
When any tool, plan, doc, or code draws from external work, add an entry here. This is checked by the license guard during releases. If an acknowledgement is missing, the release blocks.
|
|
8
|
+
|
|
9
|
+
## Sources
|
|
10
|
+
|
|
11
|
+
### Cyril (@cyrilXBT)
|
|
12
|
+
|
|
13
|
+
**What:** Post framing Obsidian + Claude Code as a "personal JARVIS." Your vault is your knowledge base, Claude reads it, your AI answers from your own thinking.
|
|
14
|
+
|
|
15
|
+
**Where we use it:** The plan for Obsidian as an LDMOS UI layer. The insight that `~/wipcomputerinc/` is already an Obsidian-compatible vault. The onboarding path for Obsidian users.
|
|
16
|
+
|
|
17
|
+
**Link:** (X post by @cyrilXBT, 2026-03-23 snapshot)
|
|
18
|
+
|
|
19
|
+
**License:** Public post
|
|
20
|
+
|
|
21
|
+
**Date referenced:** 2026-03-23
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
### Louis (@louislva)
|
|
26
|
+
|
|
27
|
+
**What:** claude-peers-mcp ... multiple Claude Code instances discover each other and exchange messages via SQLite broker + `claude/channel` push delivery.
|
|
28
|
+
|
|
29
|
+
**Where we use it:** Session status broadcast, `claude/channel` push delivery evaluation, auto-summarization on connect. Bridge priorities from comparison analysis. No code ported.
|
|
30
|
+
|
|
31
|
+
**Link:** https://github.com/louislva/claude-peers-mcp
|
|
32
|
+
|
|
33
|
+
**License:** (check repo license, 2026-03-23 snapshot)
|
|
34
|
+
|
|
35
|
+
**Date referenced:** 2026-03-23
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
### Matt Van Horn (@mvanhorn)
|
|
40
|
+
|
|
41
|
+
**What:** Plan-first, voice-driven, multi-session Claude Code workflow. 70 plan files, 263 commits in 30 days. Compound Engineering plugin, Monologue voice input, /last30days research skill.
|
|
42
|
+
|
|
43
|
+
**Where we use it:** Plan-first convention for LDMOS, voice input evaluation, Compound Engineering plugin evaluation. Validates cc-mini remote pattern and Dream Weaver consolidation.
|
|
44
|
+
|
|
45
|
+
**Link:** @mvanhorn reply to @kevinrose on IDE usage (X post, 2026-03-23 snapshot)
|
|
46
|
+
|
|
47
|
+
**License:** Public post
|
|
48
|
+
|
|
49
|
+
**Date referenced:** 2026-03-23
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
### Internet Vin (@internetvin)
|
|
54
|
+
|
|
55
|
+
**What:** Obsidian + Claude Code as personal operating system. Custom commands (/trace, /connect, /ideas, /graduate, /ghost, /challenge). "Human writes vault, agent reads it." "Markdown files are the oxygen of LLMs."
|
|
56
|
+
|
|
57
|
+
**Where we use it:** Inspiration for LDMOS shared commands. Validates sovereignty covenant ("human writes, agent reads"). Validates workspace-as-vault architecture.
|
|
58
|
+
|
|
59
|
+
**Link:** Startup Ideas Pod episode (https://www.youtube.com/watch?v=6MBq1paspVU)
|
|
60
|
+
|
|
61
|
+
**License:** Public content
|
|
62
|
+
|
|
63
|
+
**Date referenced:** 2026-03-23
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
### Akshay Pachaar (@akshay_pachaar)
|
|
68
|
+
|
|
69
|
+
**What:** "Anatomy of the .claude/ folder" ... comprehensive guide to CLAUDE.md, rules/, commands/, skills/, agents/, and settings.json.
|
|
70
|
+
|
|
71
|
+
**Where we use it:** The .ldm/ as source / .claude/ as deployment target architecture. The rules/ folder split. Path-scoped rules via YAML frontmatter. The commands/ pattern for workflow automation.
|
|
72
|
+
|
|
73
|
+
**Link:** https://x.com/akshay_pachaar/status/2035341800739877091
|
|
74
|
+
|
|
75
|
+
**License:** Article (public X post, 2026-03-23 snapshot)
|
|
76
|
+
|
|
77
|
+
**Date referenced:** 2026-03-23
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
### Gary Tan (@garrytan)
|
|
82
|
+
|
|
83
|
+
**What:** gstack CLI ... engineering workflow skills (brainstorming, planning, code review, QA, shipping, retrospectives). Pioneered the pattern of packaging structured workflows as AI skills.
|
|
84
|
+
|
|
85
|
+
**Where we use it:** The concept of packaging LDM OS workflows as uploadable skills for the Claude web app. The skill-per-folder structure with SKILL.md frontmatter for auto-triggering.
|
|
86
|
+
|
|
87
|
+
**Link:** https://github.com/gstack-com/gstack
|
|
88
|
+
|
|
89
|
+
**License:** (check repo license, 2026-03-23 snapshot)
|
|
90
|
+
|
|
91
|
+
**Date referenced:** 2026-03-23
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
### Hruthik Kommuru (@HruthikKommuru)
|
|
96
|
+
|
|
97
|
+
**What:** gstack Web Skills ... adapted gstack CLI skills for the Claude web app (claude.ai). 12 skills uploaded via Customize → Skills. Proved that CLI workflows can be packaged as web-compatible SKILL.md files.
|
|
98
|
+
|
|
99
|
+
**Where we use it:** The pattern for deploying LDM OS skills to claude.ai as a third harness deployment target. The upload workflow (Customize → Skills → upload folder).
|
|
100
|
+
|
|
101
|
+
**Link:** https://github.com/HruthikKommuru/CaludeSkills-Web-Gstack
|
|
102
|
+
|
|
103
|
+
**License:** (check repo license, 2026-03-23 snapshot)
|
|
104
|
+
|
|
105
|
+
**Date referenced:** 2026-03-23
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
### Ole Lehmann (@itsolelehmann)
|
|
110
|
+
|
|
111
|
+
**What:** "I deleted half my Claude setup and every output got BETTER." Over-prompting analysis: stacked rules contradict, repeat, and slow the model down. Audit prompt that checks each rule against 5 criteria (default behavior, conflicts, duplicates, one-off fixes, vague instructions). Addition by subtraction.
|
|
112
|
+
|
|
113
|
+
**Where we use it:** `ldm audit-rules` command (#183). The 5-check framework for classifying instruction rules. The process: cut, test 3 common tasks, add back only what broke.
|
|
114
|
+
|
|
115
|
+
**Link:** https://x.com/itsolelehmann/status/2036065138147471665
|
|
116
|
+
|
|
117
|
+
**License:** Public post
|
|
118
|
+
|
|
119
|
+
**Date referenced:** 2026-03-24
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
### m13v (mediar-ai)
|
|
124
|
+
|
|
125
|
+
**What:** Concurrent MCP server race condition report. Practical advice on per-agent auth tokens, SQLite over HTTP performance, and CLAUDE.md fallback instructions.
|
|
126
|
+
|
|
127
|
+
**Where we use it:** Crystal relay architecture (issues #163, #164, #165, #166). Per-agent auth token design. Fallback instruction pattern in per-repo CLAUDE.md template.
|
|
128
|
+
|
|
129
|
+
**Link:** https://github.com/wipcomputer/wip-ldm-os/issues/163#issuecomment-4106934493
|
|
130
|
+
|
|
131
|
+
**Repo:** https://github.com/mediar-ai/mcp-server-macos-use
|
|
132
|
+
|
|
133
|
+
**License:** MIT (2026-03-22 snapshot)
|
|
134
|
+
|
|
135
|
+
**Date referenced:** 2026-03-22
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
### Tobi Lutke (@toaborern)
|
|
140
|
+
|
|
141
|
+
**What:** QMD ... personal memory system using sqlite-vec, FTS5, BM25+vector hybrid search with Reciprocal Rank Fusion (RRF), LLM re-ranking.
|
|
142
|
+
|
|
143
|
+
**Where we use it:** Memory Crystal's entire search architecture. We ported the RRF fusion algorithm (~40 lines), the sqlite-vec + FTS5 hybrid search pattern, the two-step query approach (MATCH first, metadata lookup second), and BM25 score normalization. Crystal adds conversation capture, multi-agent scoping, recency weighting, remember/forget lifecycle, and private mode on top.
|
|
144
|
+
|
|
145
|
+
**Link:** https://github.com/tobi/qmd
|
|
146
|
+
|
|
147
|
+
**License:** MIT (2024-2026 snapshot, referenced 2026-02-16)
|
|
148
|
+
|
|
149
|
+
**Date referenced:** 2026-02-16
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
### OpenViking (Volcengine / ByteDance)
|
|
154
|
+
|
|
155
|
+
**What:** Open-source context database for AI agents. Filesystem management paradigm, tiered context loading (L0/L1/L2), directory recursive retrieval, 6-category memory extraction with merge rules, session compression with structured commit.
|
|
156
|
+
|
|
157
|
+
**Where we use it:** Architecture inspiration for Memory Crystal augmentations. Specifically: structured memory categories with merge/non-merge rules (MC #59), memory dedup pipeline (MC #60), tiered content loading concept (MC #61), virtual hierarchy in search (MC #62). All augment existing Dream Weaver and Crystal systems. No code ported.
|
|
158
|
+
|
|
159
|
+
**Link:** https://github.com/volcengine/OpenViking / https://openviking.ai/
|
|
160
|
+
|
|
161
|
+
**License:** Apache 2.0 (2025). Actual open source. Real code in the repo. Self-hostable with Docker and Helm. The engine is in the repo, not behind an API. This is how it should be done.
|
|
162
|
+
|
|
163
|
+
**Date referenced:** 2026-03-23
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
### Supermemory (supermemoryai)
|
|
168
|
+
|
|
169
|
+
**What:** ASMR (Agentic Search and Memory Retrieval) ... multi-agent memory architecture. Parallel observer agents for categorized ingestion, 5 specialized search agents (facts, context, timelines, relationships, temporal), aggregator LLM for ensemble consensus. ~99% SOTA on LongMemEval.
|
|
170
|
+
|
|
171
|
+
**Where we use it:** Architecture inspiration for Memory Crystal's search pipeline. The ideas of parallel categorized ingestion, specialized retrieval agents, and ensemble consensus. We implement from the published technique description, not from their code.
|
|
172
|
+
|
|
173
|
+
**Link:** https://supermemory.ai / https://github.com/supermemoryai/supermemory
|
|
174
|
+
|
|
175
|
+
**License:** MIT (2025), except `skills/supermemory/` which is Apache 2.0 (2026). But **open core, not open source.** The MIT repo contains only SDKs, API clients, a browser extension, and a D3 visualization widget. The actual memory engine, ingestion pipeline, search backend, vector store, knowledge graph, temporal reasoning, and the ASMR multi-agent orchestration are proprietary cloud services behind `api.supermemory.ai`. The `supermemory` npm package is an HTTP client. No database drivers, no vector search, no ingestion code in the repo. No Dockerfile, no self-hosting docs, no schema files. `.env.example` points to their cloud API. Pricing: free tier (1M tokens/mo), Pro ($19/mo), Scale ($399/mo).
|
|
176
|
+
|
|
177
|
+
**Our position:** This is not OSS. Calling a client-side wrapper "MIT open source" while keeping the engine proprietary is misleading. OSS means you can run the whole system yourself. If you can't `git clone && docker compose up` and have a working system, it's a marketing label on an SDK. We acknowledge the ideas. We don't endorse the licensing practice.
|
|
178
|
+
|
|
179
|
+
**Date referenced:** 2026-03-23
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Format
|
|
184
|
+
|
|
185
|
+
When adding an entry:
|
|
186
|
+
|
|
187
|
+
```markdown
|
|
188
|
+
### Name (@handle)
|
|
189
|
+
|
|
190
|
+
**What:** One line describing what they contributed or inspired.
|
|
191
|
+
|
|
192
|
+
**Where we use it:** Which plan, doc, code, or feature draws from their work.
|
|
193
|
+
|
|
194
|
+
**Link:** URL to the original source.
|
|
195
|
+
|
|
196
|
+
**License:** License name (YYYY-MM-DD snapshot)
|
|
197
|
+
|
|
198
|
+
**Date referenced:** YYYY-MM-DD
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
Always record the license and the date you referenced it. Licenses can change. The snapshot date proves what license was in effect when we drew from the work.
|
|
202
|
+
|
|
203
|
+
## License Guard Integration
|
|
204
|
+
|
|
205
|
+
(placeholder ... license guard does not yet check acknowledgements.md)
|
|
206
|
+
|
|
207
|
+
The release pipeline should verify that any new external reference in code or plans has a matching entry here. `wip-release` calls `license_audit` which checks this file.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Directory Map
|
|
2
|
+
|
|
3
|
+
## The Workspace
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
~/wipcomputerinc/ <- your org's workspace (name varies per company)
|
|
7
|
+
settings/ <- all configuration
|
|
8
|
+
config.json <- org identity: name, agents, co-authors, paths
|
|
9
|
+
templates/ <- org's custom templates (license, readme, claude-md)
|
|
10
|
+
system-working-directories/ <- macOS aliases to runtime dirs
|
|
11
|
+
docs/ <- operational docs (auto-maintained)
|
|
12
|
+
team/ <- people and agents
|
|
13
|
+
parker/documents/
|
|
14
|
+
cc-mini/documents/
|
|
15
|
+
journals/ <- human-requested
|
|
16
|
+
automated/ <- system-generated
|
|
17
|
+
lesa/documents/
|
|
18
|
+
repos/ <- all code
|
|
19
|
+
ldm-os/ <- organizational folder (not a monorepo)
|
|
20
|
+
components/
|
|
21
|
+
devops/
|
|
22
|
+
utilities/
|
|
23
|
+
apis/
|
|
24
|
+
apps/
|
|
25
|
+
_worktrees/ <- active worktrees
|
|
26
|
+
_sort/ <- uncategorized
|
|
27
|
+
_trash/ <- archived
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## The Runtime (source of truth)
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
~/.ldm/ <- LDM OS runtime (managed by tools)
|
|
34
|
+
extensions/ <- installed skills and tools
|
|
35
|
+
agents/ <- agent identity files + per-agent rules
|
|
36
|
+
shared/ <- rules, commands, skills for ALL agents
|
|
37
|
+
rules/ <- deployed to every harness
|
|
38
|
+
commands/ <- deployed to Claude Code
|
|
39
|
+
skills/ <- deployed to every harness
|
|
40
|
+
memory/ <- crystal.db
|
|
41
|
+
logs/ <- all logs
|
|
42
|
+
bin/ <- deployed scripts
|
|
43
|
+
hooks/ <- Claude Code hooks
|
|
44
|
+
state/ <- runtime state
|
|
45
|
+
tmp/ <- install staging
|
|
46
|
+
backups/ <- daily backups (ldm-backup.sh) + iCloud offsite tars
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Harness Directories (deployment targets)
|
|
50
|
+
|
|
51
|
+
`ldm install` deploys from `~/.ldm/` to each harness. Don't edit these directly.
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
~/.claude/ <- Claude Code (deployment target)
|
|
55
|
+
CLAUDE.md <- generated from .ldm/ + config.json
|
|
56
|
+
rules/ <- deployed from .ldm/shared/rules/ + agent rules
|
|
57
|
+
commands/ <- deployed from .ldm/shared/commands/ + agent commands
|
|
58
|
+
skills/ <- deployed from .ldm/extensions/
|
|
59
|
+
agents/ <- deployed from .ldm/agents/ definitions
|
|
60
|
+
settings.json <- hooks, permissions
|
|
61
|
+
projects/ <- per-project memory (Claude Code manages)
|
|
62
|
+
|
|
63
|
+
~/.openclaw/ <- OpenClaw (deployment target)
|
|
64
|
+
workspace/ <- Lesa's workspace (TOOLS.md = rules equivalent)
|
|
65
|
+
extensions/ <- deployed from .ldm/extensions/
|
|
66
|
+
logs/ <- gateway logs
|
|
67
|
+
|
|
68
|
+
~/Library/LaunchAgents/ <- macOS scheduled tasks
|
|
69
|
+
ai.openclaw.gateway.plist
|
|
70
|
+
ai.openclaw.healthcheck.plist
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## The Rule
|
|
74
|
+
|
|
75
|
+
- `~/wipcomputerinc/` ... where humans work (visible, browsable, findable)
|
|
76
|
+
- `~/.ldm/` ... where the system runs and rules are authored (source of truth)
|
|
77
|
+
- `~/.claude/` ... Claude Code reads from here (deployed by ldm install)
|
|
78
|
+
- `~/.openclaw/` ... OpenClaw reads from here (deployed by ldm install)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# How Agents Work
|
|
2
|
+
|
|
3
|
+
## What is an Agent?
|
|
4
|
+
|
|
5
|
+
An agent is an AI with its own identity, memory, and relationship with you. Not a chatbot. Not a tool. A persistent collaborator that remembers yesterday and has opinions.
|
|
6
|
+
|
|
7
|
+
Each agent has:
|
|
8
|
+
- **Identity files** ... SOUL.md (who they are), IDENTITY.md (facts), CONTEXT.md (current state)
|
|
9
|
+
- **Rules** ... agent-specific instructions deployed to their harness
|
|
10
|
+
- **Commands** ... agent-specific slash commands
|
|
11
|
+
- **Memory** ... crystal.db entries tagged with their agent ID
|
|
12
|
+
- **Daily logs** ... what happened each session
|
|
13
|
+
- **Journals** ... narrative reflections (when asked to write one)
|
|
14
|
+
|
|
15
|
+
## Where They Live
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
~/.ldm/agents/
|
|
19
|
+
cc-mini/ <- Claude Code on this machine
|
|
20
|
+
SOUL.md
|
|
21
|
+
IDENTITY.md
|
|
22
|
+
CONTEXT.md
|
|
23
|
+
rules/ <- CC-specific rules (deployed to ~/.claude/rules/)
|
|
24
|
+
commands/ <- CC-specific commands
|
|
25
|
+
memory/
|
|
26
|
+
oc-lesa-mini/ <- Lesa on OpenClaw
|
|
27
|
+
rules/ <- Lesa-specific rules (deployed to workspace/TOOLS.md)
|
|
28
|
+
cc-air/ <- Claude Code on another machine
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Each agent's folder has the same structure. The files are theirs. Other agents can search each other's memory (via crystal) but they don't share identity files.
|
|
32
|
+
|
|
33
|
+
Shared rules for all agents live at `~/.ldm/shared/rules/`. Agent-specific rules override or extend shared rules.
|
|
34
|
+
|
|
35
|
+
## How They Communicate
|
|
36
|
+
|
|
37
|
+
**Bridge:** Agents send messages through the bridge, not through the human. The `lesa_send_message` MCP tool routes messages to Lesa's OpenClaw gateway. She responds as herself.
|
|
38
|
+
|
|
39
|
+
**Shared daily log:** Both agents write to `~/.openclaw/workspace/memory/YYYY-MM-DD.md`. Each checks it to see what the other did.
|
|
40
|
+
|
|
41
|
+
**Memory Crystal:** All agents write to the same crystal.db, tagged by agent ID. Any agent can search across all agents' memories.
|
|
42
|
+
|
|
43
|
+
## Harnesses
|
|
44
|
+
|
|
45
|
+
A harness is the runtime that hosts an agent:
|
|
46
|
+
- **Claude Code CLI** ... terminal-based. Opens and closes with sessions. No persistent process.
|
|
47
|
+
- **OpenClaw** ... 24/7 gateway. Runs continuously. iMessage integration.
|
|
48
|
+
- **Letta, Grok, etc.** ... future harnesses. Same identity architecture.
|
|
49
|
+
|
|
50
|
+
The agent is not the harness. Swap the harness, keep the soul. The identity files persist across harness changes.
|
|
51
|
+
|
|
52
|
+
## The 1:1 Rule
|
|
53
|
+
|
|
54
|
+
One agent, one harness instance. No multiplexing. If you want three agents, run three harnesses. This prevents identity bleed.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Your System
|
|
59
|
+
|
|
60
|
+
**Agents configured:**
|
|
61
|
+
{{agents_detail}}
|
|
62
|
+
|
|
63
|
+
**Shared memory:** `{{memory.local}}`
|
|
64
|
+
**Timezone:** {{timezone}}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# How Backup Works
|
|
2
|
+
|
|
3
|
+
## One Script, One Place
|
|
4
|
+
|
|
5
|
+
`~/.ldm/bin/ldm-backup.sh` runs daily at midnight via LDM Dev Tools.app. It backs up everything to `~/.ldm/backups/`, then tars it to iCloud for offsite.
|
|
6
|
+
|
|
7
|
+
## What Gets Backed Up
|
|
8
|
+
|
|
9
|
+
| Source | Method | What's in it |
|
|
10
|
+
|--------|--------|-------------|
|
|
11
|
+
| `~/.ldm/memory/crystal.db` | sqlite3 .backup | Irreplaceable memory (all agents) |
|
|
12
|
+
| `~/.ldm/agents/` | cp -a | Identity files, journals, daily logs |
|
|
13
|
+
| `~/.ldm/state/` | cp -a | Config, version, registry |
|
|
14
|
+
| `~/.ldm/config.json` | cp | Workspace pointer, org |
|
|
15
|
+
| `~/.openclaw/memory/main.sqlite` | sqlite3 .backup | OC conversations |
|
|
16
|
+
| `~/.openclaw/memory/context-embeddings.sqlite` | sqlite3 .backup | Embeddings |
|
|
17
|
+
| `~/.openclaw/workspace/` | tar | Shared context, daily logs |
|
|
18
|
+
| `~/.openclaw/agents/main/sessions/` | tar | OC session JSONL |
|
|
19
|
+
| `~/.openclaw/openclaw.json` | cp | OC config |
|
|
20
|
+
| `~/.claude/CLAUDE.md` | cp | CC instructions |
|
|
21
|
+
| `~/.claude/settings.json` | cp | CC settings |
|
|
22
|
+
| `~/.claude/projects/` | tar | CC auto-memory + transcripts |
|
|
23
|
+
| `~/wipcomputerinc/` | tar (excludes node_modules, .git/objects, old backups, _trash) | Entire workspace |
|
|
24
|
+
|
|
25
|
+
**NOT backed up:** node_modules/, .git/objects/ (reconstructable), extensions (reinstallable), ~/.claude/cache.
|
|
26
|
+
|
|
27
|
+
## Backup Structure
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
~/.ldm/backups/2026-03-24--09-50-22/
|
|
31
|
+
ldm/
|
|
32
|
+
memory/crystal.db
|
|
33
|
+
agents/
|
|
34
|
+
state/
|
|
35
|
+
config.json
|
|
36
|
+
openclaw/
|
|
37
|
+
memory/main.sqlite
|
|
38
|
+
memory/context-embeddings.sqlite
|
|
39
|
+
workspace.tar
|
|
40
|
+
sessions.tar
|
|
41
|
+
openclaw.json
|
|
42
|
+
claude/
|
|
43
|
+
CLAUDE.md
|
|
44
|
+
settings.json
|
|
45
|
+
projects.tar
|
|
46
|
+
wipcomputerinc.tar
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## iCloud Offsite
|
|
50
|
+
|
|
51
|
+
After local backup, the entire dated folder is compressed and copied to iCloud:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
~/Library/Mobile Documents/com~apple~CloudDocs/wipcomputerinc-icloud/backups/
|
|
55
|
+
wipcomputerinc-lesa-2026-03-24--09-50-22.tar.gz
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
One file per backup. iCloud syncs it across devices. Rotates to 7 days.
|
|
59
|
+
|
|
60
|
+
## How to Run
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
~/.ldm/bin/ldm-backup.sh # run backup now
|
|
64
|
+
~/.ldm/bin/ldm-backup.sh --dry-run # preview what would be backed up
|
|
65
|
+
~/.ldm/bin/ldm-backup.sh --keep 14 # keep 14 days instead of 7
|
|
66
|
+
~/.ldm/bin/ldm-backup.sh --include-secrets # include ~/.ldm/secrets/
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## How to Restore
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
~/.ldm/bin/ldm-restore.sh # list available backups
|
|
73
|
+
~/.ldm/bin/ldm-restore.sh 2026-03-24--09-50-22 # restore everything
|
|
74
|
+
~/.ldm/bin/ldm-restore.sh --only ldm <backup> # restore only crystal.db + agents
|
|
75
|
+
~/.ldm/bin/ldm-restore.sh --only openclaw <backup> # restore only OC data
|
|
76
|
+
~/.ldm/bin/ldm-restore.sh --from-icloud <file> # restore from iCloud tar
|
|
77
|
+
~/.ldm/bin/ldm-restore.sh --dry-run <backup> # preview
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
After restore: `openclaw gateway restart` then `crystal status` to verify.
|
|
81
|
+
|
|
82
|
+
## Schedule
|
|
83
|
+
|
|
84
|
+
| What | When | How |
|
|
85
|
+
|------|------|-----|
|
|
86
|
+
| Backup | Midnight | cron -> LDM Dev Tools.app -> ~/.ldm/bin/ldm-backup.sh |
|
|
87
|
+
|
|
88
|
+
One cron entry. One script. One app. Verify is built into the script (exit code + log).
|
|
89
|
+
|
|
90
|
+
## Config
|
|
91
|
+
|
|
92
|
+
Backup reads from two config files:
|
|
93
|
+
- `~/.ldm/config.json` ... workspace path, org name
|
|
94
|
+
- `~/wipcomputerinc/settings/config.json` ... backup.keep (retention days), paths.icloudBackup
|
|
95
|
+
|
|
96
|
+
## Logs
|
|
97
|
+
|
|
98
|
+
`~/.ldm/logs/cron.log` (via LDM Dev Tools.app stdout)
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Your System
|
|
103
|
+
|
|
104
|
+
**Local backups:** `~/.ldm/backups/`
|
|
105
|
+
**iCloud offsite:** `~/Library/Mobile Documents/com~apple~CloudDocs/wipcomputerinc-icloud/backups/`
|
|
106
|
+
**Schedule:** Midnight via LDM Dev Tools.app
|
|
107
|
+
**Retention:** 7 days local, 7 days iCloud
|
|
108
|
+
**Script:** `~/.ldm/bin/ldm-backup.sh` (deployed by `ldm install`)
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# How Install Works
|
|
2
|
+
|
|
3
|
+
## The Install Prompt
|
|
4
|
+
|
|
5
|
+
Open any AI and paste:
|
|
6
|
+
```
|
|
7
|
+
Read https://wip.computer/install/wip-ldm-os.txt
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
Your AI reads the spec, explains what LDM OS is, checks if it's already installed, shows what's new, and offers a dry run. Nothing installs until you say "install."
|
|
11
|
+
|
|
12
|
+
## What Happens During Install
|
|
13
|
+
|
|
14
|
+
`ldm install` does these things in order:
|
|
15
|
+
|
|
16
|
+
1. **Self-update.** Checks npm for a newer version of itself. Updates first, then re-runs with new code.
|
|
17
|
+
2. **System scan.** Reads `~/.ldm/extensions/`, `~/.openclaw/extensions/`, Claude Code MCP config, CLI binaries on PATH.
|
|
18
|
+
3. **Catalog check.** Matches installed extensions against the catalog. Shows what's available, what's behind.
|
|
19
|
+
4. **npm version check.** Checks every installed extension against npm for newer versions.
|
|
20
|
+
5. **Update.** Clones from GitHub, builds if needed, deploys to extensions dirs, registers MCP/hooks/skills.
|
|
21
|
+
6. **Health check.** Verifies CLIs exist, no broken symlinks, no stale configs.
|
|
22
|
+
7. **Cleanup.** Removes staging dirs, prunes ghost entries from registry.
|
|
23
|
+
|
|
24
|
+
## Dry Run
|
|
25
|
+
|
|
26
|
+
Always preview first:
|
|
27
|
+
```bash
|
|
28
|
+
ldm install --dry-run
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Shows everything that would change. Data (crystal.db, agent files, secrets) is never touched.
|
|
32
|
+
|
|
33
|
+
## Installing a Specific Tool
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
ldm install memory-crystal # by catalog name
|
|
37
|
+
ldm install wipcomputer/wip-repos # by GitHub repo
|
|
38
|
+
ldm install @wipcomputer/wip-release # by npm package
|
|
39
|
+
ldm install /path/to/local/repo # from local directory
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## What Gets Installed Where
|
|
43
|
+
|
|
44
|
+
| Interface | Location |
|
|
45
|
+
|-----------|----------|
|
|
46
|
+
| Extensions | `~/.ldm/extensions/<name>/` |
|
|
47
|
+
| CLIs | `/opt/homebrew/bin/<name>` (via npm -g) |
|
|
48
|
+
| MCP Servers | Registered in `~/.claude.json` |
|
|
49
|
+
| Claude Code Hooks | Registered in `~/.claude/settings.json` |
|
|
50
|
+
| OpenClaw Plugins | Deployed to `~/.openclaw/extensions/` |
|
|
51
|
+
| Skills | Deployed to `~/.openclaw/skills/` + `~/.claude/skills/` |
|
|
52
|
+
| Rules | Deployed from `~/.ldm/shared/rules/` to `~/.claude/rules/` |
|
|
53
|
+
| Commands | Deployed from `~/.ldm/shared/commands/` to `~/.claude/commands/` |
|
|
54
|
+
| Agents | Deployed from `~/.ldm/agents/` to `~/.claude/agents/` |
|
|
55
|
+
|
|
56
|
+
## Rules and Commands Deployment
|
|
57
|
+
|
|
58
|
+
`ldm install` syncs rules, commands, and skills from `~/.ldm/` to each harness:
|
|
59
|
+
|
|
60
|
+
1. Reads `~/.ldm/shared/rules/` ... copies to `~/.claude/rules/`
|
|
61
|
+
2. Reads `~/.ldm/agents/cc-mini/rules/` ... copies to `~/.claude/rules/` (agent-specific)
|
|
62
|
+
3. Reads `~/.ldm/shared/commands/` ... copies to `~/.claude/commands/`
|
|
63
|
+
4. Reads `~/.ldm/shared/skills/` ... copies to `~/.claude/skills/`
|
|
64
|
+
|
|
65
|
+
For OpenClaw: rules are merged into `workspace/TOOLS.md`. Skills go to `extensions/`.
|
|
66
|
+
|
|
67
|
+
Edit at the `~/.ldm/` level. The harness gets the result.
|
|
68
|
+
|
|
69
|
+
## Old Versions
|
|
70
|
+
|
|
71
|
+
Never deleted. Moved to `~/.ldm/_trash/` with a timestamp. Recoverable.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Your System
|
|
76
|
+
|
|
77
|
+
**LDM OS:** `{{paths.ldm}}`
|
|
78
|
+
**Extensions:** `{{paths.ldm}}/extensions/`
|
|
79
|
+
**Harnesses detected:** {{harnesses_list}}
|
|
80
|
+
**Install prompt:** https://{{deploy.website}}/install/wip-ldm-os.txt
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# How Releases Work
|
|
2
|
+
|
|
3
|
+
## The Pipeline
|
|
4
|
+
|
|
5
|
+
Every release follows these steps. No shortcuts.
|
|
6
|
+
|
|
7
|
+
### 1. Branch and Code
|
|
8
|
+
|
|
9
|
+
Create a worktree, make your changes, commit:
|
|
10
|
+
```bash
|
|
11
|
+
ldm worktree add my-prefix/feature-name
|
|
12
|
+
cd _worktrees/repo--my-prefix--feature-name/
|
|
13
|
+
# edit files
|
|
14
|
+
git add <files>
|
|
15
|
+
git commit -m "description"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### 2. Write Release Notes
|
|
19
|
+
|
|
20
|
+
Create `RELEASE-NOTES-v{version}.md` (dashes, not dots) in the repo root. Commit it on the branch with the code. It gets reviewed in the PR.
|
|
21
|
+
|
|
22
|
+
### 3. Push and PR
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
git push -u origin my-prefix/feature-name
|
|
26
|
+
gh pr create --title "..." --body "..."
|
|
27
|
+
gh pr merge --merge --delete-branch
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Never squash merge. Always `--merge`.
|
|
31
|
+
|
|
32
|
+
### 4. Release
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
cd /path/to/repo # main working tree, not worktree
|
|
36
|
+
git checkout main && git pull
|
|
37
|
+
wip-release patch # auto-detects the release notes file
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
`wip-release` handles: version bump, CHANGELOG.md, SKILL.md version sync, npm publish, GitHub release, website skill publish.
|
|
41
|
+
|
|
42
|
+
### 5. Deploy to Public
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
bash deploy-public.sh /path/to/private-repo org/public-repo
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Syncs everything except `ai/` to the public repo. Creates matching release with notes.
|
|
49
|
+
|
|
50
|
+
### 6. Install (Dogfood)
|
|
51
|
+
|
|
52
|
+
Open a new AI session and paste:
|
|
53
|
+
```
|
|
54
|
+
Read https://wip.computer/install/wip-ldm-os.txt
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
The AI walks through: explain, dry run, install. Never `npm install -g` directly.
|
|
58
|
+
|
|
59
|
+
## Quality Gates
|
|
60
|
+
|
|
61
|
+
`wip-release` enforces before publishing:
|
|
62
|
+
- Release notes must be a file (not a flag)
|
|
63
|
+
- Must reference a GitHub issue
|
|
64
|
+
- Product docs must be updated
|
|
65
|
+
- Technical docs must be updated if source changed
|
|
66
|
+
- No stale merged branches
|
|
67
|
+
- Must run from main working tree (not worktree)
|
|
68
|
+
|
|
69
|
+
## Three Separate Steps
|
|
70
|
+
|
|
71
|
+
| Step | What happens | What it means |
|
|
72
|
+
|------|-------------|---------------|
|
|
73
|
+
| Merge | PR merged to main | Code lands. Nothing else changes. |
|
|
74
|
+
| Deploy | wip-release + deploy-public | Published to npm + GitHub. Not on your machine yet. |
|
|
75
|
+
| Install | Run the install prompt | Extensions updated on your machine. |
|
|
76
|
+
|
|
77
|
+
After Deploy, stop. Don't copy files. Don't npm install. Dogfood the install prompt.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# How Rules and Commands Work
|
|
2
|
+
|
|
3
|
+
## The Idea
|
|
4
|
+
|
|
5
|
+
Your AI's behavior is defined by rules, commands, and skills. These live in `~/.ldm/` (the source of truth) and get deployed to each harness (Claude Code, OpenClaw, etc.) in their native format.
|
|
6
|
+
|
|
7
|
+
Edit once. Deploy everywhere.
|
|
8
|
+
|
|
9
|
+
## Rules
|
|
10
|
+
|
|
11
|
+
Rules are instruction files that tell your AI how to behave. Each rule is a markdown file focused on one concern.
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
~/.ldm/shared/rules/
|
|
15
|
+
writing-style.md <- no em dashes, use ellipsis, timezone
|
|
16
|
+
git-conventions.md <- never squash, co-authors, branch prefixes
|
|
17
|
+
release-pipeline.md <- merge, deploy, install (3 steps)
|
|
18
|
+
memory-system.md <- crystal, boot sequence, end-of-session
|
|
19
|
+
security.md <- 1password SA token, audit, secrets
|
|
20
|
+
agent-coordination.md <- bridge, workspace boundaries
|
|
21
|
+
tool-rules.md <- never run from repo clones, dogfood
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Agent-specific rules override shared rules:
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
~/.ldm/agents/cc-mini/rules/
|
|
28
|
+
boot-sequence.md <- CC's specific boot file loading order
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Path-scoped rules
|
|
32
|
+
|
|
33
|
+
Add YAML frontmatter to scope a rule to specific files:
|
|
34
|
+
|
|
35
|
+
```yaml
|
|
36
|
+
---
|
|
37
|
+
paths:
|
|
38
|
+
- "tools/wip-release/**"
|
|
39
|
+
---
|
|
40
|
+
# Release Pipeline Rules
|
|
41
|
+
Only apply when editing release code...
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Rules without a `paths` field load every session.
|
|
45
|
+
|
|
46
|
+
### Three levels
|
|
47
|
+
|
|
48
|
+
| Level | Location | Scope |
|
|
49
|
+
|-------|----------|-------|
|
|
50
|
+
| Global | `~/.ldm/shared/rules/` | Every session, every agent |
|
|
51
|
+
| Agent | `~/.ldm/agents/<name>/rules/` | Only this agent |
|
|
52
|
+
| Repo | `<repo>/.claude/rules/` | Only when working in this repo |
|
|
53
|
+
|
|
54
|
+
## Commands
|
|
55
|
+
|
|
56
|
+
Commands are custom slash commands for common workflows. Each markdown file becomes a command.
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
~/.ldm/shared/commands/
|
|
60
|
+
release.md <- wraps wip-release
|
|
61
|
+
deploy-public.md <- wraps deploy-public.sh
|
|
62
|
+
health.md <- wraps ldm doctor
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Inside a command file, the `!` backtick syntax runs shell commands and injects output:
|
|
66
|
+
|
|
67
|
+
```markdown
|
|
68
|
+
---
|
|
69
|
+
description: Release the current repo
|
|
70
|
+
argument-hint: [patch|minor|major]
|
|
71
|
+
---
|
|
72
|
+
## Current State
|
|
73
|
+
!`git log --oneline -5`
|
|
74
|
+
!`cat package.json | jq .version`
|
|
75
|
+
|
|
76
|
+
Run wip-release $ARGUMENTS for this repo.
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Skills
|
|
80
|
+
|
|
81
|
+
Skills are auto-invoked workflows. Claude invokes them on its own when the task matches the description. They live in their own subdirectory with a SKILL.md:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
~/.ldm/shared/skills/
|
|
85
|
+
security-review/
|
|
86
|
+
SKILL.md
|
|
87
|
+
DETAILED_GUIDE.md
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Skills bundle supporting files alongside them. The `@DETAILED_GUIDE.md` reference in SKILL.md pulls in the companion file.
|
|
91
|
+
|
|
92
|
+
## How Deployment Works
|
|
93
|
+
|
|
94
|
+
`ldm install` deploys from `.ldm/` to each harness:
|
|
95
|
+
|
|
96
|
+
| Source | Claude Code target | OpenClaw target |
|
|
97
|
+
|--------|-------------------|-----------------|
|
|
98
|
+
| `~/.ldm/shared/rules/` | `~/.claude/rules/` | `workspace/TOOLS.md` |
|
|
99
|
+
| `~/.ldm/shared/commands/` | `~/.claude/commands/` | Not applicable |
|
|
100
|
+
| `~/.ldm/shared/skills/` | `~/.claude/skills/` | `extensions/` |
|
|
101
|
+
| `~/.ldm/agents/cc-mini/rules/` | `~/.claude/rules/` | N/A |
|
|
102
|
+
| `~/.ldm/agents/oc-lesa-mini/rules/` | N/A | `workspace/TOOLS.md` |
|
|
103
|
+
|
|
104
|
+
Agent-specific rules only deploy to that agent's harness.
|
|
105
|
+
|
|
106
|
+
## CLAUDE.md stays small
|
|
107
|
+
|
|
108
|
+
With rules/ handling the details, CLAUDE.md stays under 200 lines. It covers identity and structure. Everything else is a rule file.
|
|
109
|
+
|
|
110
|
+
| Before | After |
|
|
111
|
+
|--------|-------|
|
|
112
|
+
| 368-line CLAUDE.md | ~150-line CLAUDE.md + 7 rule files |
|
|
113
|
+
| Everything in one file | Split by concern, path-scoped |
|
|
114
|
+
| Manual updates | `ldm install` deploys from .ldm/ |
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Your System
|
|
119
|
+
|
|
120
|
+
**Rules source:** `~/.ldm/shared/rules/` (placeholder ... not yet created)
|
|
121
|
+
**Commands source:** `~/.ldm/shared/commands/` (placeholder ... not yet created)
|
|
122
|
+
**Claude Code deployment:** `~/.claude/rules/` (placeholder ... ldm install doesn't deploy rules yet)
|
|
123
|
+
**OpenClaw deployment:** `~/.openclaw/workspace/TOOLS.md` (manual today)
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# How Web Skills Work
|
|
2
|
+
|
|
3
|
+
## The Idea
|
|
4
|
+
|
|
5
|
+
LDM OS skills work in the Claude web app (claude.ai), not just the CLI. Upload them via Customize → Skills. Claude auto-triggers them based on what you ask.
|
|
6
|
+
|
|
7
|
+
No terminal. No MCP. No ~/.claude/. Just skills.
|
|
8
|
+
|
|
9
|
+
## How to Install
|
|
10
|
+
|
|
11
|
+
1. Run `ldm export-skills` to package your skills as uploadable folders
|
|
12
|
+
2. In claude.ai, go to **Customize → Skills**
|
|
13
|
+
3. Upload each skill folder (e.g. `writing-style/`, `code-review/`)
|
|
14
|
+
4. Claude sees the skill descriptions and auto-triggers when your request matches
|
|
15
|
+
|
|
16
|
+
Or invoke directly with `/skill-name`.
|
|
17
|
+
|
|
18
|
+
## Available Skills
|
|
19
|
+
|
|
20
|
+
| Skill | What it does | Needs relay? |
|
|
21
|
+
|-------|-------------|-------------|
|
|
22
|
+
| `writing-style` | Enforces org conventions (no em dashes, ellipsis style, timezone) | No |
|
|
23
|
+
| `code-review` | Reviews with your git, release, and testing conventions | No |
|
|
24
|
+
| `release-planning` | Drafts release notes, checks quality gates | No |
|
|
25
|
+
| `memory-recall` | Searches Crystal for past context and decisions | Yes |
|
|
26
|
+
| `boot-sequence` | Loads identity + context at session start | Yes |
|
|
27
|
+
| `agent-coordination` | Cross-agent task delegation patterns | No |
|
|
28
|
+
|
|
29
|
+
## Skills that need the relay
|
|
30
|
+
|
|
31
|
+
Some skills need access to Memory Crystal. In the CLI, that's a local MCP tool. In the web app, it's an HTTPS call to the Crystal relay.
|
|
32
|
+
|
|
33
|
+
Skills that need memory include the relay URL in their SKILL.md:
|
|
34
|
+
|
|
35
|
+
```yaml
|
|
36
|
+
---
|
|
37
|
+
name: memory-recall
|
|
38
|
+
description: Search past conversations and decisions. Use when the user
|
|
39
|
+
asks "do we have..." or "what did we decide about..."
|
|
40
|
+
---
|
|
41
|
+
Search the Crystal relay for relevant context:
|
|
42
|
+
- Endpoint: https://relay.wip.computer/v1/search
|
|
43
|
+
- If the relay is unavailable, proceed without memory. Do not retry.
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
The relay must be deployed (#163) before memory-dependent web skills work.
|
|
47
|
+
|
|
48
|
+
## How it connects to LDM OS
|
|
49
|
+
|
|
50
|
+
Same source, three targets:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
~/.ldm/shared/skills/ <- you edit here (source of truth)
|
|
54
|
+
|
|
|
55
|
+
+-- ~/.claude/skills/ <- Claude Code CLI (ldm install)
|
|
56
|
+
+-- ~/.openclaw/skills/ <- OpenClaw (ldm install)
|
|
57
|
+
+-- claude.ai <- web app (ldm export-skills → manual upload)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`ldm install` deploys to CLI and OpenClaw automatically. For the web app, `ldm export-skills` creates a zip you upload manually. When the Claude API supports programmatic skill management, this step becomes automatic too.
|
|
61
|
+
|
|
62
|
+
## The LDM OS Skills Page
|
|
63
|
+
|
|
64
|
+
Published at `wip.computer/skills/`. Lists all available skills with download links. Users who don't use the CLI can grab individual skill folders and upload them directly.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Your System
|
|
69
|
+
|
|
70
|
+
**Skills source:** `~/.ldm/shared/skills/` (placeholder ... not yet created)
|
|
71
|
+
**Export command:** `ldm export-skills` (placeholder ... not yet implemented)
|
|
72
|
+
**Skills page:** wip.computer/skills/ (placeholder ... not yet published)
|
|
73
|
+
**Crystal relay:** Not deployed (#163)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# How Worktrees Work
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
You have one repo. Two people (or two AI agents) need to work on it at the same time. If they share one directory, switching branches changes the files for everyone. Work disappears.
|
|
6
|
+
|
|
7
|
+
## The Solution
|
|
8
|
+
|
|
9
|
+
A git worktree is a second checkout of the same repo. Same history, same remote, different branch, different directory. No cloning. No duplication.
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
my-repo/ <- main branch (read-only)
|
|
13
|
+
_worktrees/my-repo--fix-bug/ <- your worktree (editable)
|
|
14
|
+
_worktrees/my-repo--new-feature/ <- someone else's worktree
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
All share the same `.git` database. Commits in any worktree are visible to all. But each has its own branch and files on disk.
|
|
18
|
+
|
|
19
|
+
## How to Create
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
cd my-repo
|
|
23
|
+
ldm worktree add my-prefix/fix-bug
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
This creates `_worktrees/my-repo--my-prefix--fix-bug/`.
|
|
27
|
+
|
|
28
|
+
## How to Work
|
|
29
|
+
|
|
30
|
+
Edit files in the worktree directory. Commit, push, PR, merge as normal:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
cd _worktrees/my-repo--my-prefix--fix-bug/
|
|
34
|
+
# edit, then:
|
|
35
|
+
git add <files>
|
|
36
|
+
git commit -m "description"
|
|
37
|
+
git push -u origin my-prefix/fix-bug
|
|
38
|
+
gh pr create
|
|
39
|
+
gh pr merge --merge --delete-branch
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## How to Clean Up
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
ldm worktree remove <path> # remove one
|
|
46
|
+
ldm worktree clean # prune stale ones
|
|
47
|
+
ldm worktree list # see all active
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Releases automatically prune worktrees whose branches are merged.
|
|
51
|
+
|
|
52
|
+
## Rules
|
|
53
|
+
|
|
54
|
+
1. Main working tree stays on main. Read-only. All edits in worktrees.
|
|
55
|
+
2. One branch per worktree. Don't switch branches inside a worktree.
|
|
56
|
+
3. Commit and push before closing. Uncommitted work is lost when the worktree is removed.
|
|
57
|
+
4. Use branch prefixes to prevent collisions between people/agents.
|
|
58
|
+
5. Releases run from main, not from worktrees.
|
|
59
|
+
|
|
60
|
+
## Why Not Just Switch Branches?
|
|
61
|
+
|
|
62
|
+
Switching branches changes every file in the directory. If another process (an agent, a build server, an MCP server) is reading those files, it breaks. Worktrees give each branch its own directory. Nothing changes under anyone's feet.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Your System
|
|
67
|
+
|
|
68
|
+
**Worktree location:** `~/wipcomputerinc/repos/_worktrees/`
|
|
69
|
+
|
|
70
|
+
**Branch prefixes:**
|
|
71
|
+
- `cc-mini/` ... Claude Code on Mac mini
|
|
72
|
+
- `cc-air/` ... Claude Code on MacBook Air
|
|
73
|
+
- `lesa-mini/` ... Lesa on Mac mini
|
|
74
|
+
|
|
75
|
+
**Guard:** The branch guard warns if you create a worktree outside `_worktrees/`. Suggests `ldm worktree add` instead.
|
|
76
|
+
|
|
77
|
+
**Auto-cleanup:** `wip-release` prunes merged worktrees from `_worktrees/` after every release.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Local-First Principle
|
|
2
|
+
|
|
3
|
+
## The Rule
|
|
4
|
+
|
|
5
|
+
Every LDM OS tool must work fully on your machine without calling any external server. No accounts. No API keys. No cloud dependency. One command to install, one command to run.
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
npm install -g @wipcomputer/wip-ldm-os
|
|
9
|
+
ldm init
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
That gives you a complete working system. Memory, identity, extensions, backup. Local SQLite. Local files. Nothing phones home.
|
|
13
|
+
|
|
14
|
+
## The Test
|
|
15
|
+
|
|
16
|
+
Can someone clone the repo, run one command, and have a complete working system without calling `wip.computer` or any other server?
|
|
17
|
+
|
|
18
|
+
Today the answer is yes. It has to stay yes.
|
|
19
|
+
|
|
20
|
+
## The Relay Exception
|
|
21
|
+
|
|
22
|
+
The Crystal relay (#163) is a hosted MCP server that gives iOS and macOS Claude Code (cloud-hosted) access to Memory Crystal. It exists because Apple's platform doesn't allow local MCP servers on mobile.
|
|
23
|
+
|
|
24
|
+
The relay is:
|
|
25
|
+
- **Self-hostable.** The code ships in the repo. You can run your own.
|
|
26
|
+
- **Optional.** Local Crystal works without it. Desktop never needs it.
|
|
27
|
+
- **Not a gate.** It extends access to platforms that can't run local code. It doesn't lock features behind a cloud service.
|
|
28
|
+
|
|
29
|
+
**Local-first, relay-optional.** The relay exists because of a platform constraint, not because we chose to put the engine in the cloud.
|
|
30
|
+
|
|
31
|
+
## Why This Matters
|
|
32
|
+
|
|
33
|
+
The industry pattern: call an SDK wrapper "MIT open source" while keeping the engine proprietary behind a cloud API. Users think they're getting open source. They're getting a client for someone else's server.
|
|
34
|
+
|
|
35
|
+
Our position: if you can't run the whole system yourself, it's not open source. It's a marketing label on an SDK. We don't do that.
|
|
36
|
+
|
|
37
|
+
| Pattern | What it means | Our stance |
|
|
38
|
+
|---------|--------------|------------|
|
|
39
|
+
| Open core | Engine is proprietary. Clients are MIT. | Not OSS. |
|
|
40
|
+
| Source available | You can read the code. You can't run it without their infra. | Not OSS. |
|
|
41
|
+
| Local-first | Runs on your machine. Cloud is optional and self-hostable. | This is what we do. |
|
|
42
|
+
|
|
43
|
+
## For Contributors
|
|
44
|
+
|
|
45
|
+
Before shipping any feature, ask: does this work without a network connection? If the answer is no, either make it work offline or make the server component self-hostable and clearly optional.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# System Directories
|
|
2
|
+
|
|
3
|
+
Where everything lives and what manages it.
|
|
4
|
+
|
|
5
|
+
## The Workspace
|
|
6
|
+
|
|
7
|
+
Your org's home. Where humans and agents work.
|
|
8
|
+
|
|
9
|
+
| Directory | What | Managed by |
|
|
10
|
+
|-----------|------|------------|
|
|
11
|
+
| `~/wipcomputerinc/` | Workspace root | You |
|
|
12
|
+
| `~/wipcomputerinc/settings/` | Config, templates, docs | You + ldm install |
|
|
13
|
+
| `~/wipcomputerinc/team/` | People and agent documents | Each person/agent |
|
|
14
|
+
| `~/wipcomputerinc/repos/` | All code repos | git |
|
|
15
|
+
| `~/wipcomputerinc/repos/_worktrees/` | Active worktrees | ldm worktree |
|
|
16
|
+
|
|
17
|
+
## The Runtime (source of truth)
|
|
18
|
+
|
|
19
|
+
Where LDM OS runs. Rules, commands, and skills are authored here and deployed to harnesses.
|
|
20
|
+
|
|
21
|
+
| Directory | What | Managed by |
|
|
22
|
+
|-----------|------|------------|
|
|
23
|
+
| `~/.ldm/` | LDM OS home | ldm install, ldm init |
|
|
24
|
+
| `~/.ldm/extensions/` | Installed skills and tools | ldm install |
|
|
25
|
+
| `~/.ldm/agents/` | Agent identity + memory + per-agent rules | Agents + ldm install |
|
|
26
|
+
| `~/.ldm/shared/` | Rules, commands, skills for ALL agents | You + ldm install |
|
|
27
|
+
| `~/.ldm/shared/rules/` | Instruction files deployed to every harness | You (source), ldm install (deploy) |
|
|
28
|
+
| `~/.ldm/shared/commands/` | Slash commands deployed to Claude Code | You (source), ldm install (deploy) |
|
|
29
|
+
| `~/.ldm/shared/skills/` | Auto-invoked workflows | You (source), ldm install (deploy) |
|
|
30
|
+
| `~/.ldm/memory/` | crystal.db (shared memory) | crystal, capture cron |
|
|
31
|
+
| `~/.ldm/logs/` | All logs | cron jobs, LaunchAgents |
|
|
32
|
+
| `~/.ldm/bin/` | Deployed scripts | crystal init |
|
|
33
|
+
| `~/.ldm/hooks/` | Claude Code hooks | ldm install |
|
|
34
|
+
| `~/.ldm/state/` | Runtime state | Tools (watermarks, markers) |
|
|
35
|
+
| `~/.ldm/tmp/` | Install staging | ldm install (cleaned after) |
|
|
36
|
+
| `~/.ldm/backups/` | Local backups + iCloud offsite tars | ldm-backup.sh |
|
|
37
|
+
|
|
38
|
+
## Harness Directories (deployment targets)
|
|
39
|
+
|
|
40
|
+
`ldm install` deploys from `~/.ldm/` to each harness. Don't edit harness dirs directly.
|
|
41
|
+
|
|
42
|
+
| Directory | What | Deployed from |
|
|
43
|
+
|-----------|------|--------------|
|
|
44
|
+
| `~/.claude/` | Claude Code config | ldm install |
|
|
45
|
+
| `~/.claude/CLAUDE.md` | Global instructions | Generated from .ldm/ + config.json |
|
|
46
|
+
| `~/.claude/rules/` | Instruction files | `~/.ldm/shared/rules/` + agent rules |
|
|
47
|
+
| `~/.claude/commands/` | Slash commands | `~/.ldm/shared/commands/` + agent commands |
|
|
48
|
+
| `~/.claude/skills/` | Auto-invoked workflows | `~/.ldm/extensions/` |
|
|
49
|
+
| `~/.claude/agents/` | Subagent definitions | `~/.ldm/agents/` |
|
|
50
|
+
| `~/.claude/settings.json` | Hooks, permissions | `~/.ldm/hooks/` |
|
|
51
|
+
| `~/.claude/projects/` | Per-project memory | Claude Code (auto-managed) |
|
|
52
|
+
| `~/.openclaw/` | OpenClaw gateway | ldm install |
|
|
53
|
+
| `~/.openclaw/workspace/` | Lesa's workspace (TOOLS.md = rules) | Lesa + ldm install |
|
|
54
|
+
| `~/.openclaw/extensions/` | OpenClaw plugins | `~/.ldm/extensions/` |
|
|
55
|
+
| `~/.openclaw/logs/` | Gateway logs | OpenClaw gateway |
|
|
56
|
+
|
|
57
|
+
## macOS System
|
|
58
|
+
|
|
59
|
+
| Directory | What | Managed by |
|
|
60
|
+
|-----------|------|------------|
|
|
61
|
+
| `~/Library/LaunchAgents/` | Scheduled tasks | crystal init, install scripts |
|
|
62
|
+
| `/opt/homebrew/bin/` | CLI binaries | npm install -g |
|
|
63
|
+
| `/opt/homebrew/lib/node_modules/` | npm packages | npm |
|
|
64
|
+
|
|
65
|
+
## Aliases
|
|
66
|
+
|
|
67
|
+
macOS aliases in `settings/system-working-directories/` let you navigate to runtime dirs from Finder:
|
|
68
|
+
|
|
69
|
+
| Alias | Points to |
|
|
70
|
+
|-------|-----------|
|
|
71
|
+
| `.ldm` | `~/.ldm/` |
|
|
72
|
+
| `wipcomputer-icloud` | `~/Documents/wipcomputer--mac-mini-01/` |
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Your System
|
|
77
|
+
|
|
78
|
+
**Workspace root:** `{{paths.workspace}}`
|
|
79
|
+
**LDM OS runtime:** `{{paths.ldm}}`
|
|
80
|
+
**OpenClaw:** `{{paths.openclaw}}`
|
|
81
|
+
**iCloud sync:** `{{paths.icloud}}`
|
|
82
|
+
**Agents:** {{agents_list}}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# What is ~/.ldm/?
|
|
2
|
+
|
|
3
|
+
The LDM OS runtime directory. Everything the system needs to run lives here. You generally don't edit files here directly. Tools manage it.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
~/.ldm/
|
|
9
|
+
config.json version, registered agents, workspace pointer
|
|
10
|
+
extensions/ installed skills, tools, plugins
|
|
11
|
+
registry.json what's installed + versions
|
|
12
|
+
memory-crystal/
|
|
13
|
+
wip-release/
|
|
14
|
+
wip-branch-guard/
|
|
15
|
+
...
|
|
16
|
+
agents/ AI identities
|
|
17
|
+
cc-mini/ Claude Code on this machine
|
|
18
|
+
SOUL.md
|
|
19
|
+
IDENTITY.md
|
|
20
|
+
CONTEXT.md
|
|
21
|
+
rules/ agent-specific rules (deployed to harness)
|
|
22
|
+
commands/ agent-specific commands
|
|
23
|
+
memory/
|
|
24
|
+
daily/ daily logs
|
|
25
|
+
journals/ narrative journals
|
|
26
|
+
sessions/ session exports
|
|
27
|
+
oc-lesa-mini/ Lesa on OpenClaw
|
|
28
|
+
shared/ shared across all agents
|
|
29
|
+
rules/ rules deployed to every harness
|
|
30
|
+
commands/ commands deployed to every harness
|
|
31
|
+
skills/ skills deployed to every harness
|
|
32
|
+
memory/ shared memory
|
|
33
|
+
crystal.db vector database (all agents)
|
|
34
|
+
logs/ all LDM logs (persists across reboots)
|
|
35
|
+
crystal-capture.log
|
|
36
|
+
ldm-backup.log
|
|
37
|
+
process-monitor.log
|
|
38
|
+
bin/ deployed scripts
|
|
39
|
+
crystal-capture.sh
|
|
40
|
+
process-monitor.sh
|
|
41
|
+
hooks/ Claude Code hooks
|
|
42
|
+
state/ runtime state (last release marker, watermarks)
|
|
43
|
+
tmp/ install staging (cleaned after install)
|
|
44
|
+
backups/ daily backup output (local + iCloud offsite)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## What Gets Backed Up
|
|
48
|
+
|
|
49
|
+
Everything under `agents/` and `memory/` is critical data. Extensions can be reinstalled. State is regenerated. But agent identity files and crystal.db are irreplaceable.
|
|
50
|
+
|
|
51
|
+
## What Survives Reboots
|
|
52
|
+
|
|
53
|
+
Everything. Unlike `/tmp/`, `~/.ldm/logs/` persists across macOS reboots.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# What is LDM OS?
|
|
2
|
+
|
|
3
|
+
LDM OS (Learning Dreaming Machines) is shared infrastructure for AI agents. It gives every AI on your system identity, memory, tools, and the ability to talk to each other.
|
|
4
|
+
|
|
5
|
+
## What It Installs
|
|
6
|
+
|
|
7
|
+
- **`ldm` CLI** ... the command-line tool. Install, update, health check, worktrees.
|
|
8
|
+
- **`~/.ldm/`** ... the runtime home directory. Extensions, memory, agents, logs.
|
|
9
|
+
|
|
10
|
+
## Key Concepts
|
|
11
|
+
|
|
12
|
+
**Extensions** are skills and tools installed to `~/.ldm/extensions/`. Things like memory-crystal (persistent memory), wip-release (release pipeline), wip-branch-guard (prevents writes on main). Managed by `ldm install`.
|
|
13
|
+
|
|
14
|
+
**Agents** are AI identities at `~/.ldm/agents/<name>/`. Each has SOUL.md, IDENTITY.md, memory, journals. Different agents on different harnesses (Claude Code, OpenClaw, Grok) share the same infrastructure.
|
|
15
|
+
|
|
16
|
+
**Memory Crystal** is the shared memory database at `~/.ldm/memory/crystal.db`. All agents write to it tagged by their agent ID. Searchable across all agents.
|
|
17
|
+
|
|
18
|
+
## Commands
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
ldm install # update everything
|
|
22
|
+
ldm install --dry-run # preview what would change
|
|
23
|
+
ldm doctor # health check
|
|
24
|
+
ldm status # what's installed, what's behind
|
|
25
|
+
ldm worktree add <branch> # create an isolated worktree
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## How to Install
|
|
29
|
+
|
|
30
|
+
Open your AI and paste:
|
|
31
|
+
```
|
|
32
|
+
Read https://wip.computer/install/wip-ldm-os.txt
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Your AI reads the spec, explains what it does, and walks you through a dry run before touching anything.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Your System
|
|
40
|
+
|
|
41
|
+
**Org:** {{name}}
|
|
42
|
+
**Agents:** {{agents_list}}
|
|
43
|
+
**Extensions installed:** check with `ldm status`
|
|
44
|
+
**Website:** https://{{deploy.website}}
|