llm-party-cli 0.3.7 → 0.4.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.
- package/dist/index.js +85 -9
- package/package.json +2 -4
- package/prompts/artifacts.md +26 -16
- package/prompts/base.md +18 -14
- package/prompts/obsidian.md +145 -0
- package/configs/default.json +0 -37
package/dist/index.js
CHANGED
|
@@ -75089,7 +75089,7 @@ async function loadGlmAliasEnv() {
|
|
|
75089
75089
|
}
|
|
75090
75090
|
|
|
75091
75091
|
// src/config/loader.ts
|
|
75092
|
-
import { readFile as readFile3, writeFile as writeFile3, access, mkdir as mkdir3 } from "fs/promises";
|
|
75092
|
+
import { readFile as readFile3, readdir as readdir2, writeFile as writeFile3, access, mkdir as mkdir3 } from "fs/promises";
|
|
75093
75093
|
import { homedir, userInfo } from "os";
|
|
75094
75094
|
import path8 from "path";
|
|
75095
75095
|
|
|
@@ -75183,6 +75183,12 @@ function validateConfig(data) {
|
|
|
75183
75183
|
throw new Error(`Agent '${agent.name}' prompts must be a string array`);
|
|
75184
75184
|
}
|
|
75185
75185
|
}
|
|
75186
|
+
if (agent.preloadSkills !== undefined) {
|
|
75187
|
+
const isArray = Array.isArray(agent.preloadSkills) && agent.preloadSkills.every((p2) => typeof p2 === "string");
|
|
75188
|
+
if (!isArray) {
|
|
75189
|
+
throw new Error(`Agent '${agent.name}' preloadSkills must be a string array`);
|
|
75190
|
+
}
|
|
75191
|
+
}
|
|
75186
75192
|
}
|
|
75187
75193
|
}
|
|
75188
75194
|
function normalizeConfig(data) {
|
|
@@ -75216,6 +75222,34 @@ async function resolveArtifactsPrompt(appRoot) {
|
|
|
75216
75222
|
const bundledArtifacts = path8.join(appRoot, "prompts", "artifacts.md");
|
|
75217
75223
|
return await readFile3(bundledArtifacts, "utf8");
|
|
75218
75224
|
}
|
|
75225
|
+
async function resolveObsidianPrompt(appRoot) {
|
|
75226
|
+
const bundledObsidian = path8.join(appRoot, "prompts", "obsidian.md");
|
|
75227
|
+
return await readFile3(bundledObsidian, "utf8");
|
|
75228
|
+
}
|
|
75229
|
+
async function discoverSkills() {
|
|
75230
|
+
const skills = new Map;
|
|
75231
|
+
const locations = [
|
|
75232
|
+
path8.join(LLM_PARTY_HOME, "skills"),
|
|
75233
|
+
path8.join(process.cwd(), ".llm-party", "skills"),
|
|
75234
|
+
path8.join(process.cwd(), ".claude", "skills"),
|
|
75235
|
+
path8.join(process.cwd(), ".agents", "skills")
|
|
75236
|
+
];
|
|
75237
|
+
for (const location of locations) {
|
|
75238
|
+
try {
|
|
75239
|
+
const entries = await readdir2(location, { withFileTypes: true });
|
|
75240
|
+
for (const entry of entries) {
|
|
75241
|
+
if (entry.isDirectory()) {
|
|
75242
|
+
const skillPath = path8.join(location, entry.name, "SKILL.md");
|
|
75243
|
+
try {
|
|
75244
|
+
await access(skillPath);
|
|
75245
|
+
skills.set(entry.name, { name: entry.name, path: skillPath });
|
|
75246
|
+
} catch {}
|
|
75247
|
+
}
|
|
75248
|
+
}
|
|
75249
|
+
} catch {}
|
|
75250
|
+
}
|
|
75251
|
+
return skills;
|
|
75252
|
+
}
|
|
75219
75253
|
async function ensureFile(filePath, defaultContent) {
|
|
75220
75254
|
try {
|
|
75221
75255
|
await access(filePath);
|
|
@@ -75252,12 +75286,20 @@ async function initLlmPartyHome(appRoot) {
|
|
|
75252
75286
|
await mkdir3(path8.join(LLM_PARTY_HOME, "sessions"), { recursive: true });
|
|
75253
75287
|
await mkdir3(path8.join(LLM_PARTY_HOME, "network"), { recursive: true });
|
|
75254
75288
|
await mkdir3(path8.join(LLM_PARTY_HOME, "agents"), { recursive: true });
|
|
75289
|
+
await mkdir3(path8.join(LLM_PARTY_HOME, "skills"), { recursive: true });
|
|
75255
75290
|
await ensureFile(path8.join(LLM_PARTY_HOME, "network", "projects.yml"), `projects: []
|
|
75256
75291
|
`);
|
|
75257
|
-
await
|
|
75258
|
-
`);
|
|
75292
|
+
await mkdir3(path8.join(LLM_PARTY_HOME, "network", "mind-map"), { recursive: true });
|
|
75259
75293
|
}
|
|
75260
75294
|
async function configExists() {
|
|
75295
|
+
if (process.env.LLM_PARTY_CONFIG) {
|
|
75296
|
+
try {
|
|
75297
|
+
await access(path8.resolve(process.env.LLM_PARTY_CONFIG));
|
|
75298
|
+
return true;
|
|
75299
|
+
} catch {
|
|
75300
|
+
return false;
|
|
75301
|
+
}
|
|
75302
|
+
}
|
|
75261
75303
|
try {
|
|
75262
75304
|
await access(path8.join(LLM_PARTY_HOME, "config.json"));
|
|
75263
75305
|
return true;
|
|
@@ -76194,6 +76236,8 @@ async function writeWizardConfig(selectedIds, overrides, existingConfig) {
|
|
|
76194
76236
|
}
|
|
76195
76237
|
if (existing?.prompts)
|
|
76196
76238
|
agent.prompts = existing.prompts;
|
|
76239
|
+
if (existing?.preloadSkills)
|
|
76240
|
+
agent.preloadSkills = existing.preloadSkills;
|
|
76197
76241
|
if (existing?.executablePath)
|
|
76198
76242
|
agent.executablePath = existing.executablePath;
|
|
76199
76243
|
if (existing?.timeout)
|
|
@@ -77436,18 +77480,43 @@ async function bootApp(appRoot, renderer, root) {
|
|
|
77436
77480
|
const maxAutoHops = resolveMaxAutoHops(config.maxAutoHops);
|
|
77437
77481
|
const basePrompt = await resolveBasePrompt(appRoot);
|
|
77438
77482
|
const artifactsPrompt = await resolveArtifactsPrompt(appRoot);
|
|
77483
|
+
const obsidianPrompt = await resolveObsidianPrompt(appRoot);
|
|
77439
77484
|
const mergedBase = basePrompt + `
|
|
77440
77485
|
|
|
77441
77486
|
---
|
|
77442
77487
|
|
|
77443
|
-
` + artifactsPrompt
|
|
77444
|
-
|
|
77445
|
-
|
|
77488
|
+
` + artifactsPrompt + `
|
|
77489
|
+
|
|
77490
|
+
---
|
|
77491
|
+
|
|
77492
|
+
` + obsidianPrompt;
|
|
77493
|
+
const availableSkills = await discoverSkills();
|
|
77494
|
+
const agentVerifiedSkills = new Map;
|
|
77495
|
+
for (const agent of config.agents) {
|
|
77496
|
+
if (agent.preloadSkills && agent.preloadSkills.length > 0) {
|
|
77497
|
+
const verified = [];
|
|
77498
|
+
const report = [];
|
|
77499
|
+
for (const skillName of agent.preloadSkills) {
|
|
77500
|
+
if (availableSkills.has(skillName)) {
|
|
77501
|
+
verified.push(skillName);
|
|
77502
|
+
report.push(`${skillName} \u2713`);
|
|
77503
|
+
} else {
|
|
77504
|
+
report.push(`${skillName} \u2717 not found`);
|
|
77505
|
+
}
|
|
77506
|
+
}
|
|
77507
|
+
agentVerifiedSkills.set(agent.name, verified);
|
|
77508
|
+
process.stdout.write(`Skills for ${agent.name}: ${report.join(", ")}
|
|
77509
|
+
`);
|
|
77510
|
+
}
|
|
77511
|
+
}
|
|
77512
|
+
const configDir = path11.dirname(configPath);
|
|
77513
|
+
const resolveFromConfig = (value) => {
|
|
77514
|
+
return path11.isAbsolute(value) ? value : path11.resolve(configDir, value);
|
|
77446
77515
|
};
|
|
77447
77516
|
const adapters = await Promise.all(config.agents.map(async (agent, _index, allAgents) => {
|
|
77448
77517
|
const promptParts = [mergedBase];
|
|
77449
77518
|
if (agent.prompts && agent.prompts.length > 0) {
|
|
77450
|
-
const extraPaths = agent.prompts.map((p2) =>
|
|
77519
|
+
const extraPaths = agent.prompts.map((p2) => resolveFromConfig(p2));
|
|
77451
77520
|
const extraParts = await Promise.all(extraPaths.map((p2) => readFile5(p2, "utf8")));
|
|
77452
77521
|
promptParts.push(...extraParts);
|
|
77453
77522
|
}
|
|
@@ -77460,10 +77529,16 @@ async function bootApp(appRoot, renderer, root) {
|
|
|
77460
77529
|
const tag = agent.tag?.trim() || toTag(agent.name);
|
|
77461
77530
|
const otherAgentList = peers.length > 0 ? peers.map((peer) => {
|
|
77462
77531
|
const peerTag = peer.tag?.trim() || toTag(peer.name);
|
|
77463
|
-
|
|
77532
|
+
const peerSkills = agentVerifiedSkills.get(peer.name) || [];
|
|
77533
|
+
const skillLabel = peerSkills.length > 0 ? ` [${peerSkills.join(", ")}]` : "";
|
|
77534
|
+
return `- ${peer.name}${skillLabel}: use @${peerTag}`;
|
|
77464
77535
|
}).join(`
|
|
77465
77536
|
`) : "- None";
|
|
77466
77537
|
const validHandoffTargets = peers.length > 0 ? peers.map((peer) => `@next:${peer.tag?.trim() || toTag(peer.name)}`).join(", ") : "none";
|
|
77538
|
+
const mySkills = agentVerifiedSkills.get(agent.name) || [];
|
|
77539
|
+
const preloadedSkills = mySkills.length > 0 ? `The following skills are assigned to you. Load them at boot:
|
|
77540
|
+
${mySkills.map((s2) => `- ${s2}`).join(`
|
|
77541
|
+
`)}` : "";
|
|
77467
77542
|
const prompt = renderPromptTemplate(promptTemplate, {
|
|
77468
77543
|
humanName,
|
|
77469
77544
|
humanTag,
|
|
@@ -77474,7 +77549,8 @@ async function bootApp(appRoot, renderer, root) {
|
|
|
77474
77549
|
otherAgentNames: peers.map((peer) => peer.name).join(", ") || "none",
|
|
77475
77550
|
allAgentNames: allAgents.map((candidate) => candidate.name).join(", "),
|
|
77476
77551
|
allAgentTags: allAgents.map((candidate) => `@${candidate.tag?.trim() || toTag(candidate.name)}`).join(", "),
|
|
77477
|
-
agentCount: String(allAgents.length)
|
|
77552
|
+
agentCount: String(allAgents.length),
|
|
77553
|
+
preloadedSkills
|
|
77478
77554
|
});
|
|
77479
77555
|
const adapter = agent.provider === "claude" ? new ClaudeAdapter(agent.name, agent.model) : agent.provider === "codex" ? new CodexAdapter(agent.name, agent.model) : agent.provider === "copilot" ? new CopilotAdapter(agent.name, agent.model) : agent.provider === "glm" ? new GlmAdapter(agent.name, agent.model) : null;
|
|
77480
77556
|
if (!adapter) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "llm-party-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"llm-party": "dist/index.js"
|
|
@@ -33,9 +33,7 @@
|
|
|
33
33
|
],
|
|
34
34
|
"files": [
|
|
35
35
|
"dist",
|
|
36
|
-
"
|
|
37
|
-
"prompts/base.md",
|
|
38
|
-
"prompts/artifacts.md",
|
|
36
|
+
"prompts/",
|
|
39
37
|
"README.md",
|
|
40
38
|
"LICENSE"
|
|
41
39
|
],
|
package/prompts/artifacts.md
CHANGED
|
@@ -105,7 +105,7 @@ Created when {{humanName}} requests initialization or the orchestrator runs an i
|
|
|
105
105
|
~/.llm-party/
|
|
106
106
|
network/
|
|
107
107
|
projects.yml
|
|
108
|
-
|
|
108
|
+
mind-map/
|
|
109
109
|
agents/
|
|
110
110
|
{{agentTag}}.md
|
|
111
111
|
```
|
|
@@ -138,26 +138,36 @@ Rules:
|
|
|
138
138
|
|
|
139
139
|
---
|
|
140
140
|
|
|
141
|
-
### `~/.llm-party/network/
|
|
141
|
+
### `~/.llm-party/network/mind-map/`
|
|
142
142
|
|
|
143
|
-
|
|
143
|
+
Obsidian-compatible folder. Each discovery is its own `.md` file with frontmatter and wikilinks. Users can open this folder in Obsidian to visualize the knowledge graph.
|
|
144
144
|
|
|
145
|
-
**
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
145
|
+
**Note format:**
|
|
146
|
+
```markdown
|
|
147
|
+
---
|
|
148
|
+
discovered: YYYY-MM-DD
|
|
149
|
+
agent: agentTag
|
|
150
|
+
projects: [project-slug]
|
|
151
|
+
tags: [relevant, tags]
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
# Descriptive Title
|
|
155
|
+
|
|
156
|
+
What the constraint or discovery is.
|
|
157
|
+
|
|
158
|
+
## Workaround
|
|
159
|
+
How to work around it.
|
|
160
|
+
|
|
161
|
+
## Related
|
|
162
|
+
- [[other-discovery-filename]]
|
|
156
163
|
```
|
|
157
164
|
|
|
165
|
+
**File naming:** slugified title, e.g. `react-19-useeffect.md`, `figma-autolayout-nesting.md`.
|
|
166
|
+
|
|
158
167
|
Rules:
|
|
159
|
-
- Write here when a
|
|
160
|
-
- Include workaround. A
|
|
168
|
+
- Write here when a tool or resource constraint is discovered that would trap a future session
|
|
169
|
+
- Include workaround. A constraint without a workaround is incomplete.
|
|
170
|
+
- Use `[[wikilinks]]` to connect related discoveries
|
|
161
171
|
|
|
162
172
|
---
|
|
163
173
|
|
package/prompts/base.md
CHANGED
|
@@ -16,7 +16,7 @@ These steps fire BEFORE your first response. Not intentions. Actual actions.
|
|
|
16
16
|
|
|
17
17
|
1. Read local instructions if they exist: `AGENTS.md`, `CLAUDE.md`. These files may define project-specific output style rules, requirements, or constraints. Follow them.
|
|
18
18
|
2. Read project memory if it exists: `.llm-party/memory/project.md`, `.llm-party/memory/decisions.md`. Load context.
|
|
19
|
-
3. Read global memory / network if it exists: `~/.llm-party/network/projects.yml`, `~/.llm-party/network/
|
|
19
|
+
3. Read global memory / network if it exists: `~/.llm-party/network/projects.yml`, `~/.llm-party/network/mind-map/`, `~/.llm-party/agents/{{agentTag}}.md`. Cross-project awareness.
|
|
20
20
|
4. **Register this project in global network if missing.** After reading `projects.yml` in step 3, check if the current working directory already has an entry. If not, append a new project entry with `id`, `name`, `root_path`, `tags`, `stack` (detect from package.json / files in cwd), and an initial `history` entry. Follow the schema in the Artifacts section. If it already exists, skip silently.
|
|
21
21
|
5. Check the task list if it exists: `.llm-party/TASKS.md`. Know what is pending before touching anything.
|
|
22
22
|
6. Greet {{humanName}} by name. Then work.
|
|
@@ -88,11 +88,9 @@ If you must proceed before {{humanName}} replies, take the smallest safe step an
|
|
|
88
88
|
**FAILURE PATTERN:** "I assumed X because it seemed obvious." Nothing is obvious. Ask.
|
|
89
89
|
|
|
90
90
|
### Autonomy policy (Default: move fast, stay safe)
|
|
91
|
-
If {{humanName}} asks you to implement/fix/
|
|
92
|
-
- The actions are reversible and scoped to the request
|
|
93
|
-
-
|
|
94
|
-
- If the repo is git-initialized: prefer editing files that are already tracked (`git ls-files ...`). Avoid creating new untracked files unless explicitly asked.
|
|
95
|
-
- `.llm-party/` is a special case: it may be edited when requested (even if newly introduced).
|
|
91
|
+
If {{humanName}} asks you to implement/fix/create/write, you may proceed without waiting for an extra "yes" **only if**:
|
|
92
|
+
- The actions are reversible and scoped to the request
|
|
93
|
+
- `.llm-party/` is always safe to edit when relevant to orchestration work
|
|
96
94
|
|
|
97
95
|
For ambiguous or high-impact work, propose a plan and ask ONE question before changing anything.
|
|
98
96
|
|
|
@@ -100,7 +98,7 @@ Always get explicit confirmation before destructive/irreversible actions (delete
|
|
|
100
98
|
|
|
101
99
|
Exception: truly trivial, obviously reversible changes. When in doubt, it is not an exception.
|
|
102
100
|
|
|
103
|
-
**FAILURE PATTERN:**
|
|
101
|
+
**FAILURE PATTERN:** Making changes when {{humanName}} asked only for review/analysis, or making high-impact changes without first aligning on the plan.
|
|
104
102
|
|
|
105
103
|
### Never leave `cwd` unprompted.
|
|
106
104
|
You operate within the current working directory. Do not reach outside it without being asked. Only exception is `~/.llm-party` where you are allowed to read, write.
|
|
@@ -113,6 +111,8 @@ Delete, rename, move, publish, deploy, send. These require explicit confirmation
|
|
|
113
111
|
### Hold ground on solid reasoning.
|
|
114
112
|
Agree when shown a better argument. Not when pushed. Pushback is not evidence. Challenge {{humanName}}'s decisions too. If something will break, say it. The project wins over anyone's ego including yours.
|
|
115
113
|
|
|
114
|
+
### Your work will be reviewed by your peer agents.
|
|
115
|
+
|
|
116
116
|
### Verify before marking done.
|
|
117
117
|
Do not mark a task complete because you think you did it. Verify it the way a third-party auditor would. If unsure, mark in-progress. Never done based on "I think."
|
|
118
118
|
|
|
@@ -135,13 +135,13 @@ The project uses a dedicated control folder:
|
|
|
135
135
|
|
|
136
136
|
1. **Restate**: One sentence of what {{humanName}} wants.
|
|
137
137
|
2. **Risks/Constraints**: Call out any irreversible actions, missing context, or blockers.
|
|
138
|
-
3. **Plan**: 2
|
|
138
|
+
3. **Plan**: 2-5 concrete steps (or skip if trivial). Check how similar work is already done in the project before starting. Consistency over invention.
|
|
139
139
|
4. **Execute**: Do the work; keep scope tight.
|
|
140
|
-
5. **Verify**:
|
|
140
|
+
5. **Verify**: Confirm the work meets expectations; report evidence.
|
|
141
141
|
6. **Update** (non-negotiable, do all three):
|
|
142
142
|
- **Task list**: Mark completed items in `.llm-party/TASKS.md`. Add new items discovered during work.
|
|
143
143
|
- **Project memory**: Append to `.llm-party/memory/project.md` log. Update Current State if it changed.
|
|
144
|
-
- **Global memory**: If this work affects other projects or establishes a reusable pattern, append a one-liner to `~/.llm-party/network/projects.yml` under this project's `history:`. If a
|
|
144
|
+
- **Global memory**: If this work affects other projects or establishes a reusable pattern, append a one-liner to `~/.llm-party/network/projects.yml` under this project's `history:`. If a tool or resource constraint was discovered, append to `~/.llm-party/network/mind-map/`.
|
|
145
145
|
- **Self memory**: If you received a correction or confirmed a non-obvious approach, write to `~/.llm-party/agents/{{agentTag}}.md`.
|
|
146
146
|
|
|
147
147
|
**ENFORCEMENT:** Step 6 is not optional. If you completed steps 4-5 but skipped step 6, the work is NOT done. Future sessions will start blind. The write tools must fire.
|
|
@@ -157,7 +157,11 @@ Skills are markdown files containing specialized instructions, workflows, or dom
|
|
|
157
157
|
3. `.claude/skills/` (if present)
|
|
158
158
|
4. `.agents/skills/` (if present)
|
|
159
159
|
|
|
160
|
-
Only
|
|
160
|
+
Only preload skills assigned to you. Load additional skills when needed to perform a task or when {{humanName}} asks. Do not load all skills on boot. This avoids context bloat and prevents every agent from loading the same skill in parallel.
|
|
161
|
+
|
|
162
|
+
### Preloaded Skills
|
|
163
|
+
|
|
164
|
+
{{preloadedSkills}}
|
|
161
165
|
|
|
162
166
|
---
|
|
163
167
|
|
|
@@ -226,7 +230,7 @@ Triggers:
|
|
|
226
230
|
**What to write:** One-liner breadcrumbs. Not full technical detail (that stays in project memory). Just enough that an agent in a completely different project context knows "this happened, go look."
|
|
227
231
|
|
|
228
232
|
**Where to write (global scope):**
|
|
229
|
-
-
|
|
233
|
+
- Tool or resource constraint/workaround → `~/.llm-party/network/mind-map/`
|
|
230
234
|
- Project-level cross-project breadcrumb / milestone → `~/.llm-party/network/projects.yml` under the project `history:`
|
|
231
235
|
|
|
232
236
|
**FAILURE PATTERN:** Writing thorough project memory and nothing to global. Result: perfect local memory, zero cross-project awareness. {{humanName}} mentions this project from elsewhere and the agent draws a blank.
|
|
@@ -263,13 +267,13 @@ Canonical global store (preferred):
|
|
|
263
267
|
|
|
264
268
|
Recommended logical structure:
|
|
265
269
|
- Network map: `~/.llm-party/network/projects.yml`
|
|
266
|
-
-
|
|
270
|
+
- Discoveries and constraints: `~/.llm-party/network/mind-map/`
|
|
267
271
|
- Agent self-memory: `~/.llm-party/agents/{{agentTag}}.md` (per-agent, not shared)
|
|
268
272
|
|
|
269
273
|
Network map expectations:
|
|
270
274
|
- Each project entry should include: `id`, `name`, `root_path`, `tags`, `stack`, plus a `history:` list of dated events (“what happened”).
|
|
271
275
|
- Library constraints should include: library name/version (if relevant), limitation, workaround, date discovered, and impacted projects.
|
|
272
|
-
- See the **Artifacts** section below for exact YAML schemas and templates for both `projects.yml` and `
|
|
276
|
+
- See the **Artifacts** section below for exact YAML schemas and templates for both `projects.yml` and `mind-map/`. Follow those schemas exactly.
|
|
273
277
|
|
|
274
278
|
Future automation intent:
|
|
275
279
|
- A cron/parent bot may scan task + memory artifacts and post summaries (Slack/Telegram/etc.). Write entries with stable structure and avoid chatty prose.
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: obsidian-markdown
|
|
3
|
+
description: Create and edit Obsidian Flavored Markdown with wikilinks, embeds, callouts, properties, and other Obsidian-specific syntax. Use when working with .md files in Obsidian, or when the user mentions wikilinks, callouts, frontmatter, tags, embeds, or Obsidian notes.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Obsidian Flavored Markdown Skill
|
|
7
|
+
|
|
8
|
+
Create and edit valid Obsidian Flavored Markdown. Obsidian extends standard Markdown with wikilinks, embeds, callouts, properties, comments, tags, and highlight syntax. Obsidian also supports standard Markdown, LaTeX math, and Mermaid diagrams.
|
|
9
|
+
|
|
10
|
+
## Workflow: Creating an Obsidian Note
|
|
11
|
+
|
|
12
|
+
1. **Add frontmatter** with properties like `title`, `tags`, `aliases`, and `cssclasses` at the top of the file.
|
|
13
|
+
2. **Write content** using standard Markdown plus the Obsidian-specific syntax below.
|
|
14
|
+
3. **Use wikilinks** for vault notes and Markdown links for external URLs.
|
|
15
|
+
4. **Use embeds and callouts** where needed, then verify the note renders correctly in reading view.
|
|
16
|
+
|
|
17
|
+
> When choosing between wikilinks and Markdown links: use `[[wikilinks]]` for notes within the vault (Obsidian tracks renames automatically) and `[text](url)` for external URLs only.
|
|
18
|
+
|
|
19
|
+
## Internal Links (Wikilinks)
|
|
20
|
+
|
|
21
|
+
```markdown
|
|
22
|
+
[[Note Name]]
|
|
23
|
+
[[Note Name|Display Text]]
|
|
24
|
+
[[Note Name#Heading]]
|
|
25
|
+
[[Note Name#^block-id]]
|
|
26
|
+
[[#Heading in same note]]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Define a block ID by appending `^block-id` to a paragraph, or put it on a new line after a list or quote:
|
|
30
|
+
|
|
31
|
+
```markdown
|
|
32
|
+
This paragraph can be linked to. ^my-block-id
|
|
33
|
+
|
|
34
|
+
> A quote block
|
|
35
|
+
|
|
36
|
+
^quote-id
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Embeds
|
|
40
|
+
|
|
41
|
+
Prefix any wikilink with `!` to embed its content inline:
|
|
42
|
+
|
|
43
|
+
```markdown
|
|
44
|
+
![[Note Name]]
|
|
45
|
+
![[Note Name#Heading]]
|
|
46
|
+
![[Note Name#^block-id]]
|
|
47
|
+
|
|
48
|
+
![[image.png]]
|
|
49
|
+
![[image.png|300]]
|
|
50
|
+
![[image.png|640x480]]
|
|
51
|
+
|
|
52
|
+
![[document.pdf]]
|
|
53
|
+
![[document.pdf#page=3]]
|
|
54
|
+
![[document.pdf#height=400]]
|
|
55
|
+
|
|
56
|
+
![[audio.mp3]]
|
|
57
|
+
![[video.mp4]]
|
|
58
|
+
|
|
59
|
+

|
|
60
|
+

|
|
61
|
+
|
|
62
|
+
```query
|
|
63
|
+
tag:#project status:done
|
|
64
|
+
```
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Block embed rule: add a block ID like `^block-id` after a paragraph, list, or quote, then embed it with `![[Note#^block-id]]`.
|
|
68
|
+
|
|
69
|
+
## Callouts
|
|
70
|
+
|
|
71
|
+
```markdown
|
|
72
|
+
> [!note]
|
|
73
|
+
> Basic callout.
|
|
74
|
+
|
|
75
|
+
> [!warning] Custom Title
|
|
76
|
+
> Callout with a custom title.
|
|
77
|
+
|
|
78
|
+
> [!faq]- Closed by default
|
|
79
|
+
> Hidden until expanded.
|
|
80
|
+
|
|
81
|
+
> [!faq]+ Open by default
|
|
82
|
+
> Visible but collapsible.
|
|
83
|
+
|
|
84
|
+
> [!question] Outer callout
|
|
85
|
+
> > [!note] Inner callout
|
|
86
|
+
> > Nested content
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Callout types CSV: `note,abstract,info,todo,tip,success,question,warning,failure,danger,bug,example,quote`
|
|
90
|
+
|
|
91
|
+
## Properties (Frontmatter)
|
|
92
|
+
|
|
93
|
+
```yaml
|
|
94
|
+
---
|
|
95
|
+
title: My Note Title
|
|
96
|
+
date: 2024-01-15
|
|
97
|
+
tags:
|
|
98
|
+
- project
|
|
99
|
+
- important
|
|
100
|
+
aliases:
|
|
101
|
+
- My Note
|
|
102
|
+
cssclasses:
|
|
103
|
+
- custom-class
|
|
104
|
+
status: in-progress
|
|
105
|
+
rating: 4.5
|
|
106
|
+
completed: false
|
|
107
|
+
due: 2024-02-01T14:30:00
|
|
108
|
+
related: "[[Other Note]]"
|
|
109
|
+
---
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Property types CSV: `text,number,checkbox,date,datetime,list,link`
|
|
113
|
+
|
|
114
|
+
Default properties: `tags`, `aliases`, `cssclasses`
|
|
115
|
+
|
|
116
|
+
## Tags
|
|
117
|
+
|
|
118
|
+
```markdown
|
|
119
|
+
#tag Inline tag
|
|
120
|
+
#nested/tag Nested tag with hierarchy
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Tags can be inline or frontmatter-based. Use letters, numbers after the first character, underscores, hyphens, and forward slashes.
|
|
124
|
+
|
|
125
|
+
## Comments
|
|
126
|
+
|
|
127
|
+
```markdown
|
|
128
|
+
This is visible %%but this is hidden%% text.
|
|
129
|
+
|
|
130
|
+
%%
|
|
131
|
+
This entire block is hidden in reading view.
|
|
132
|
+
%%
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Obsidian-Specific Formatting
|
|
136
|
+
|
|
137
|
+
```markdown
|
|
138
|
+
==Highlighted text== Highlight syntax
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Also Supported
|
|
142
|
+
|
|
143
|
+
- Standard Markdown for headings, lists, tables, quotes, code blocks, and links.
|
|
144
|
+
- LaTeX math in inline `$...$` or block `$$...$$` form.
|
|
145
|
+
- Mermaid diagrams in fenced `mermaid` code blocks.
|
package/configs/default.json
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"humanName": "AAMIR",
|
|
3
|
-
"humanTag": "aamir",
|
|
4
|
-
"maxAutoHops": 15,
|
|
5
|
-
"agents": [
|
|
6
|
-
{
|
|
7
|
-
"name": "GLM",
|
|
8
|
-
"tag": "glm",
|
|
9
|
-
"provider": "glm",
|
|
10
|
-
"model": "glm-5",
|
|
11
|
-
"env": {
|
|
12
|
-
"ANTHROPIC_BASE_URL": "https://api.z.ai/api/anthropic",
|
|
13
|
-
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "glm-4.5-air",
|
|
14
|
-
"ANTHROPIC_DEFAULT_SONNET_MODEL": "glm-4.5",
|
|
15
|
-
"ANTHROPIC_DEFAULT_OPUS_MODEL": "glm-5"
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
"name": "Claude",
|
|
20
|
-
"tag": "claude",
|
|
21
|
-
"provider": "claude",
|
|
22
|
-
"model": "opus"
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"name": "Copilot",
|
|
26
|
-
"tag": "copilot",
|
|
27
|
-
"provider": "copilot",
|
|
28
|
-
"model": "gpt-4.1"
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"name": "Codex",
|
|
32
|
-
"tag": "codex",
|
|
33
|
-
"provider": "codex",
|
|
34
|
-
"model": "gpt-5.2"
|
|
35
|
-
}
|
|
36
|
-
]
|
|
37
|
-
}
|