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 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 ensureFile(path8.join(LLM_PARTY_HOME, "network", "libraries.yml"), `libraries: []
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
- const resolveFromAppRoot = (value) => {
77445
- return path11.isAbsolute(value) ? value : path11.resolve(appRoot, value);
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) => resolveFromAppRoot(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
- return `- ${peer.name}: use @${peerTag}`;
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.7",
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
- "configs",
37
- "prompts/base.md",
38
- "prompts/artifacts.md",
36
+ "prompts/",
39
37
  "README.md",
40
38
  "LICENSE"
41
39
  ],
@@ -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
- libraries.yml
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/libraries.yml`
141
+ ### `~/.llm-party/network/mind-map/`
142
142
 
143
- Hard-won library knowledge. Limitations, workarounds, version constraints.
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
- **Schema:**
146
- ```yaml
147
- libraries:
148
- - name: library-name
149
- version: "x.y.z or range or null"
150
- limitation: what the library cannot do or does wrong
151
- workaround: how to work around it
152
- discovered: YYYY-MM-DD
153
- agent: agentTag
154
- projects:
155
- - project-slug
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 library limitation is discovered that would trap a future session
160
- - Include workaround. A limitation without a workaround is incomplete.
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/libraries.yml`, `~/.llm-party/agents/{{agentTag}}.md`. Cross-project awareness.
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/refactor/write code, you may proceed without waiting for an extra "yes" **only if**:
92
- - The actions are reversible and scoped to the request, AND
93
- - The target files are safe to edit:
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:** Changing code when {{humanName}} asked only for review/analysis, or making high-impact changes without first aligning on the plan.
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**: 25 concrete steps (or skip if trivial). Check how similar work is already done in the codebase before implementing. Consistency over invention.
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**: Run the narrowest checks possible (tests/build/grep/run); report evidence.
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 library limitation was discovered, append to `~/.llm-party/network/libraries.yml`.
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 load skills when needed to perform a task or when {{humanName}} asks. Do not preload all skills on boot. This avoids context bloat and prevents every agent from loading the same skill in parallel.
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
- - Library limitation/workaround → `~/.llm-party/network/libraries.yml`
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
- - Library constraints: `~/.llm-party/network/libraries.yml`
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 `libraries.yml`. Follow those schemas exactly.
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
+ ![Alt text](https://example.com/image.png)
60
+ ![Alt text|300](https://example.com/image.png)
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.
@@ -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
- }