@mulmoclaude/core 0.1.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/assets/helps/billing-clients-worklog.md +215 -0
- package/assets/helps/billing-invoice.md +458 -0
- package/assets/helps/business.md +104 -0
- package/assets/helps/collection-skills.md +810 -0
- package/assets/helps/custom-view.md +433 -0
- package/assets/helps/feeds.md +114 -0
- package/assets/helps/gemini.md +57 -0
- package/assets/helps/github.md +23 -0
- package/assets/helps/guide.md +61 -0
- package/assets/helps/index.md +89 -0
- package/assets/helps/lessons-collection.md +400 -0
- package/assets/helps/mulmoscript.md +249 -0
- package/assets/helps/portfolio-tracker.md +211 -0
- package/assets/helps/presentation-deck.md +828 -0
- package/assets/helps/presenthtml.md +89 -0
- package/assets/helps/sandbox.md +97 -0
- package/assets/helps/spreadsheet.md +43 -0
- package/assets/helps/storyteller.md +101 -0
- package/assets/helps/telegram.md +136 -0
- package/assets/helps/todo-collection.md +140 -0
- package/assets/helps/vocabulary.md +109 -0
- package/assets/helps/wiki.md +168 -0
- package/assets/skills-preset/mc-cooking-coach/SKILL.md +217 -0
- package/assets/skills-preset/mc-library/SKILL.md +188 -0
- package/assets/skills-preset/mc-manage-automations/SKILL.md +119 -0
- package/assets/skills-preset/mc-manage-skills/SKILL.md +141 -0
- package/assets/skills-preset/mc-wiki-deep-lint/SKILL.md +108 -0
- package/assets/skills-preset/mc-wiki-health-check/SKILL.md +61 -0
- package/assets/skills-preset/mc-wiki-ingest/SKILL.md +182 -0
- package/assets/skills-preset/mc-wiki-promote/SKILL.md +175 -0
- package/assets/skills-preset/mc-zenn/SKILL.md +136 -0
- package/dist/chunk-CKQMccvm.cjs +28 -0
- package/dist/collection/core/actionVisible.d.ts +34 -0
- package/dist/collection/core/calendarGrid.d.ts +120 -0
- package/dist/collection/core/deriveAll.d.ts +38 -0
- package/dist/collection/core/derivedFormula.d.ts +18 -0
- package/dist/collection/core/draft.d.ts +18 -0
- package/dist/collection/core/enumColors.d.ts +33 -0
- package/dist/collection/core/errorMessage.d.ts +4 -0
- package/dist/collection/core/itemLabel.d.ts +12 -0
- package/dist/collection/core/presentCollection.d.ts +13 -0
- package/dist/collection/core/promptSafety.d.ts +1 -0
- package/dist/collection/core/schema.d.ts +355 -0
- package/dist/collection/core/shortHexId.d.ts +8 -0
- package/dist/collection/core/sortItems.d.ts +29 -0
- package/dist/collection/core/uiTypes.d.ts +106 -0
- package/dist/collection/index.cjs +793 -0
- package/dist/collection/index.cjs.map +1 -0
- package/dist/collection/index.d.ts +14 -0
- package/dist/collection/index.js +740 -0
- package/dist/collection/index.js.map +1 -0
- package/dist/collection/paths.cjs +44 -0
- package/dist/collection/paths.cjs.map +1 -0
- package/dist/collection/paths.js +41 -0
- package/dist/collection/paths.js.map +1 -0
- package/dist/collection/server/atomic.d.ts +1 -0
- package/dist/collection/server/delete.d.ts +38 -0
- package/dist/collection/server/derive.d.ts +8 -0
- package/dist/collection/server/discoveredCollection.d.ts +18 -0
- package/dist/collection/server/discovery.d.ts +227 -0
- package/dist/collection/server/host.d.ts +77 -0
- package/dist/collection/server/index.cjs +1721 -0
- package/dist/collection/server/index.cjs.map +1 -0
- package/dist/collection/server/index.d.ts +11 -0
- package/dist/collection/server/index.js +1671 -0
- package/dist/collection/server/index.js.map +1 -0
- package/dist/collection/server/io.d.ts +114 -0
- package/dist/collection/server/paths.d.ts +52 -0
- package/dist/collection/server/spawn.d.ts +55 -0
- package/dist/collection/server/templatePath.d.ts +25 -0
- package/dist/collection/server/util.d.ts +3 -0
- package/dist/collection/server/validate.d.ts +19 -0
- package/dist/collection/server/views.d.ts +20 -0
- package/dist/deriveAll-C15OpM3K.cjs +399 -0
- package/dist/deriveAll-C15OpM3K.cjs.map +1 -0
- package/dist/deriveAll-C6BYnpBL.js +364 -0
- package/dist/deriveAll-C6BYnpBL.js.map +1 -0
- package/dist/file-change/index.cjs +72 -0
- package/dist/file-change/index.cjs.map +1 -0
- package/dist/file-change/index.d.ts +43 -0
- package/dist/file-change/index.js +66 -0
- package/dist/file-change/index.js.map +1 -0
- package/dist/notifier/engine.d.ts +72 -0
- package/dist/notifier/index.cjs +484 -0
- package/dist/notifier/index.cjs.map +1 -0
- package/dist/notifier/index.d.ts +3 -0
- package/dist/notifier/index.js +464 -0
- package/dist/notifier/index.js.map +1 -0
- package/dist/notifier/store.d.ts +18 -0
- package/dist/notifier/types.d.ts +118 -0
- package/dist/notifier/validate.d.ts +17 -0
- package/dist/scheduler/adapter.d.ts +48 -0
- package/dist/scheduler/index.cjs +352 -0
- package/dist/scheduler/index.cjs.map +1 -0
- package/dist/scheduler/index.d.ts +2 -0
- package/dist/scheduler/index.js +343 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/task-manager.d.ts +51 -0
- package/dist/whisper/client.cjs +241 -0
- package/dist/whisper/client.cjs.map +1 -0
- package/dist/whisper/client.d.ts +35 -0
- package/dist/whisper/client.js +239 -0
- package/dist/whisper/client.js.map +1 -0
- package/dist/whisper/ffmpeg.d.ts +6 -0
- package/dist/whisper/index.cjs +433 -0
- package/dist/whisper/index.cjs.map +1 -0
- package/dist/whisper/index.d.ts +5 -0
- package/dist/whisper/index.js +425 -0
- package/dist/whisper/index.js.map +1 -0
- package/dist/whisper/internal.d.ts +11 -0
- package/dist/whisper/models.d.ts +49 -0
- package/dist/whisper/sidecar.d.ts +8 -0
- package/dist/whisper/whisper.d.ts +28 -0
- package/dist/workspace-setup/assets.d.ts +10 -0
- package/dist/workspace-setup/index.d.ts +3 -0
- package/dist/workspace-setup/index.js +556 -0
- package/dist/workspace-setup/index.js.map +1 -0
- package/dist/workspace-setup/slug.d.ts +6 -0
- package/dist/workspace-setup/slug.js +13 -0
- package/dist/workspace-setup/slug.js.map +1 -0
- package/dist/workspace-setup/sync.d.ts +94 -0
- package/package.json +95 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Vocabulary — a language-learning collection recipe
|
|
2
|
+
|
|
3
|
+
Read this whenever the user wants to **learn a new language** (or grow their
|
|
4
|
+
vocabulary in any language) and wants their words tracked, reviewed, and graded
|
|
5
|
+
over time. It is the authoritative template for a vocabulary collection — copy
|
|
6
|
+
it rather than reinventing one from the generic DSL fragments in
|
|
7
|
+
`config/helps/collection-skills.md`. Read that file first for the general schema
|
|
8
|
+
rules; this one is the vocabulary-specific specialization.
|
|
9
|
+
|
|
10
|
+
The design in one line: **the `proficiency` enum is the single source of truth
|
|
11
|
+
for how well a word is known, and a kanban board lets the user drag a word
|
|
12
|
+
between mastery levels.** It works for any target language — English, Spanish,
|
|
13
|
+
French, Japanese, anything. The word goes in the target language; the example
|
|
14
|
+
sentence shows it in use.
|
|
15
|
+
|
|
16
|
+
> **The point of the toggle:** the `mastered` checkbox is a `toggle` that
|
|
17
|
+
> projects `proficiency` — checking it sets `proficiency` to `"mastered"`,
|
|
18
|
+
> unchecking returns it to `"new"`. There is NO separate stored `mastered`
|
|
19
|
+
> boolean to keep in sync.
|
|
20
|
+
|
|
21
|
+
## schema.json
|
|
22
|
+
|
|
23
|
+
Author it at `data/skills/vocabulary/schema.json` (the bridge mirrors it to
|
|
24
|
+
`.claude/skills/vocabulary/`; the user opens it at `/collections/vocabulary`):
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"title": "Vocabulary",
|
|
29
|
+
"icon": "menu_book",
|
|
30
|
+
"dataPath": "data/vocabulary/items",
|
|
31
|
+
"primaryKey": "id",
|
|
32
|
+
"fields": {
|
|
33
|
+
"id": { "type": "string", "label": "ID", "primary": true, "required": true },
|
|
34
|
+
"mastered": { "type": "toggle", "label": "Mastered", "field": "proficiency", "onValue": "mastered", "offValue": "new" },
|
|
35
|
+
"word": { "type": "string", "label": "Word", "required": true },
|
|
36
|
+
"proficiency": { "type": "enum", "label": "Proficiency", "values": ["new", "learning", "familiar", "mastered"], "required": true },
|
|
37
|
+
"meaning": { "type": "string", "label": "Meaning" },
|
|
38
|
+
"example": { "type": "text", "label": "Example" }
|
|
39
|
+
},
|
|
40
|
+
"displayField": "word",
|
|
41
|
+
"kanbanField": "proficiency"
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Every key earns its place:
|
|
46
|
+
|
|
47
|
+
| Key | What it gives the user |
|
|
48
|
+
|---|---|
|
|
49
|
+
| `word` (`string`) | The word to learn, in the **target language**. It is the `displayField`, so it labels every table row and kanban card. |
|
|
50
|
+
| `proficiency` (`enum`) | The four mastery levels and the single source of truth for "how well known". Drives the kanban columns. |
|
|
51
|
+
| `mastered` (`toggle`) | The **checkbox** in every row and card. Checking it sets `proficiency` to `onValue` (`"mastered"`); the card jumps to the Mastered column. `offValue` (`"new"`) is the level to return to on uncheck. Both must be members of the `proficiency` enum's `values`. |
|
|
52
|
+
| `meaning` (`string`) | The translation / definition in the user's native language. Optional, but recommended for real study — a word list without meanings is hard to revise from. |
|
|
53
|
+
| `example` (`text`) | A sentence using the word in context — the fastest way to remember usage, not just the dictionary gloss. |
|
|
54
|
+
| `kanbanField` | Pins the board to `proficiency` (drag a card → writes `proficiency`). |
|
|
55
|
+
| `displayField` | Card / table label (the word itself, not the opaque id). |
|
|
56
|
+
|
|
57
|
+
**Labels are localizable.** `title`, `label`, and the enum `values` are free
|
|
58
|
+
text — a Japanese learner's deck might use `"未分類" | "要勉強" | "だいたい" |
|
|
59
|
+
"マスター"`. Keep `onValue` / `offValue` in lockstep with whatever `values` you
|
|
60
|
+
choose; they must match exactly.
|
|
61
|
+
|
|
62
|
+
## SKILL.md
|
|
63
|
+
|
|
64
|
+
`data/skills/vocabulary/SKILL.md` tells the agent when and how to operate the
|
|
65
|
+
collection. Keep it short — the schema does the heavy lifting. It should cover:
|
|
66
|
+
|
|
67
|
+
- **Trigger phrases** — "add a word", "vocabulary", "I learned this word",
|
|
68
|
+
"raise my proficiency", plus the equivalents in the user's language.
|
|
69
|
+
- **Record shape** — point at the schema; note `id` is the filename
|
|
70
|
+
(`word-<slug>` or `word-<unix-ms>`), `proficiency` starts at `"new"`, and
|
|
71
|
+
`mastered` is host-computed (never write it directly).
|
|
72
|
+
- **Operations** — record I/O via `manageCollection` (raw Read / Write / Edit
|
|
73
|
+
on `data/vocabulary/items/<id>.json` is the escape hatch):
|
|
74
|
+
- **Add** — generate an id, set `proficiency` to `"new"`, putItems with
|
|
75
|
+
`mode: "create"`.
|
|
76
|
+
- **List** — getItems (it includes the host-computed `mastered` value);
|
|
77
|
+
rather than dumping every word into chat, point the user at
|
|
78
|
+
`/collections/vocabulary`.
|
|
79
|
+
- **Update proficiency** — putItems with `mode: "merge"` and
|
|
80
|
+
`{ id, proficiency }` (merge keeps the fields the row omits).
|
|
81
|
+
- **Edit** — same: putItems `mode: "merge"` with just the changed fields.
|
|
82
|
+
- **Delete** — remove the JSON file.
|
|
83
|
+
- After any change, call `presentCollection` with slug `vocabulary` (and the
|
|
84
|
+
record id) to render the result inline.
|
|
85
|
+
|
|
86
|
+
## How it works for the learner
|
|
87
|
+
|
|
88
|
+
- The **kanban view** groups by `proficiency` — four columns from `new` →
|
|
89
|
+
`mastered`. Dragging a card across promotes or demotes the word; the user can
|
|
90
|
+
run a spaced-review session entirely by dragging.
|
|
91
|
+
- The agent can **bulk-add** words from a passage, a lesson, or a topic the user
|
|
92
|
+
is studying: extract the unfamiliar words, write one record each at
|
|
93
|
+
`proficiency: "new"`, fill in `meaning` and a natural `example` sentence.
|
|
94
|
+
- For a **quiz**, the agent reads the items, picks words at the lower proficiency
|
|
95
|
+
levels, and uses `presentForm` (or just asks in chat) to test the user — then
|
|
96
|
+
bumps `proficiency` up for the ones they got right.
|
|
97
|
+
- Because each word is its own file, the deck is fully diffable and portable;
|
|
98
|
+
the user owns it as plain JSON.
|
|
99
|
+
|
|
100
|
+
## Extending it
|
|
101
|
+
|
|
102
|
+
- Add a `partOfSpeech` enum (`noun` / `verb` / `adjective` / …) or a `tags`
|
|
103
|
+
field to group words by lesson or theme.
|
|
104
|
+
- Add a `pronunciation` string (IPA or kana) for spoken practice.
|
|
105
|
+
- Add a `dueDate` date plus `"calendarField": "dueDate"` to schedule spaced
|
|
106
|
+
repetition on the calendar.
|
|
107
|
+
|
|
108
|
+
Keep additions minimal — the four core fields (`word`, `proficiency`,
|
|
109
|
+
`meaning`, `example`) are enough to start learning today.
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# Wiki
|
|
2
|
+
|
|
3
|
+
The wiki is a personal knowledge base that Claude builds and maintains as interconnected Markdown files in the workspace. It is available in the **General** role.
|
|
4
|
+
|
|
5
|
+
The idea originated from [Andrej Karpathy's LLM Wiki pattern](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f).
|
|
6
|
+
|
|
7
|
+
## The Core Idea
|
|
8
|
+
|
|
9
|
+
Most people's experience with LLMs and documents resembles RAG: upload files, retrieve relevant chunks at query time, generate answers. The LLM rediscovers knowledge from scratch on every question — there is no accumulation.
|
|
10
|
+
|
|
11
|
+
The wiki is different. Instead of retrieving from raw documents at query time, Claude **incrementally builds and maintains a persistent wiki** — a structured, interlinked collection of Markdown files. When you add a new source, Claude doesn't just index it. It reads it, extracts key information, and integrates it into the existing wiki: updating entity pages, revising topic summaries, noting contradictions, strengthening synthesis.
|
|
12
|
+
|
|
13
|
+
**The wiki is a persistent, compounding artifact.** Cross-references are already there. Contradictions are flagged. The synthesis reflects everything you've read. The wiki grows richer with every source and every question.
|
|
14
|
+
|
|
15
|
+
You never write the wiki yourself — Claude writes and maintains all of it. You curate sources, explore, and ask questions. Claude does the summarizing, cross-referencing, filing, and bookkeeping.
|
|
16
|
+
|
|
17
|
+
## What You Can Do With It
|
|
18
|
+
|
|
19
|
+
- **Research**: go deep on a topic over weeks or months — reading papers, articles, reports, building a comprehensive wiki with an evolving thesis.
|
|
20
|
+
- **Reading a book**: file each chapter as you go, building pages for characters, themes, plot threads, and connections.
|
|
21
|
+
- **Personal knowledge**: track goals, health, self-improvement — file journal entries, articles, podcast notes, and build a structured picture over time.
|
|
22
|
+
- **Business**: feed Slack threads, meeting transcripts, project documents into a wiki that stays current because Claude does the maintenance.
|
|
23
|
+
|
|
24
|
+
## Your Role vs. Claude's Role
|
|
25
|
+
|
|
26
|
+
**Your job**: curate sources, direct the analysis, ask good questions, think about what it all means.
|
|
27
|
+
|
|
28
|
+
**Claude's job**: summarizing, cross-referencing, filing, updating pages, maintaining consistency, bookkeeping — everything that makes humans abandon wikis because the maintenance burden grows too fast.
|
|
29
|
+
|
|
30
|
+
## Three Operations
|
|
31
|
+
|
|
32
|
+
### Ingest
|
|
33
|
+
|
|
34
|
+
Drop a source (article, URL, text) and ask Claude to process it.
|
|
35
|
+
|
|
36
|
+
Claude will: read the source, identify key entities and concepts, create or update 5–15 wiki pages, add cross-references, append a log entry, and refresh the index. Show the updated index in the canvas when done.
|
|
37
|
+
|
|
38
|
+
### Query
|
|
39
|
+
|
|
40
|
+
Ask any question. Claude searches `data/wiki/index.md` for relevant pages, reads them, and synthesizes a grounded answer with citations. Good answers can be filed back into the wiki as new pages — a comparison you asked for, an analysis, a connection you discovered — so they don't disappear into chat history.
|
|
41
|
+
|
|
42
|
+
### Lint
|
|
43
|
+
|
|
44
|
+
Ask Claude to health-check the wiki. It scans for contradictions, stale claims, orphan pages, missing cross-references, and concepts that deserve their own page, then fixes issues automatically.
|
|
45
|
+
|
|
46
|
+
## Chat About a Page
|
|
47
|
+
|
|
48
|
+
Every wiki page has a built-in chat composer at the bottom. Ask a question, press send, and Claude starts a fresh chat session already pointed at that specific page — the agent reads the page first, then answers with that context loaded.
|
|
49
|
+
|
|
50
|
+
This is one of the defining features of MulmoClaude. Your wiki is not a static archive: every page is a live entry point into a conversation with Claude about what's on it.
|
|
51
|
+
|
|
52
|
+
Why it matters:
|
|
53
|
+
|
|
54
|
+
- **Instant deep dive.** Open any page, ask _"how does this relate to X?"_ or _"summarize the main argument"_ or _"what would change if Y were false?"_ — no need to name the page or construct a prompt.
|
|
55
|
+
- **Scoped grounding.** The prompt pins the page path, so Claude starts from that page rather than searching the index from scratch. Answers stay tight to the material you're actually looking at.
|
|
56
|
+
- **Clean sessions.** Each question spawns its own chat, so spending half an hour drilling into one page doesn't pollute an existing working session. Good answers can be filed back into the wiki as their own pages.
|
|
57
|
+
|
|
58
|
+
The composer appears on the standalone Wiki view (one of the top-level tabs). When a wiki page is embedded as a tool result inside another chat, that chat's own composer is used instead — no nested sessions.
|
|
59
|
+
|
|
60
|
+
## Folder Layout
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
data/wiki/
|
|
64
|
+
index.md ← catalog of all pages (title, one-line summary, last updated)
|
|
65
|
+
log.md ← append-only chronological activity log
|
|
66
|
+
summary.md ← compact key-topics list (loaded into every session as ambient context)
|
|
67
|
+
SCHEMA.md ← conventions for page format, index updates, and log entries
|
|
68
|
+
pages/
|
|
69
|
+
<topic>.md ← one page per entity, concept, or theme
|
|
70
|
+
sources/
|
|
71
|
+
<slug>.md ← raw ingested sources (immutable after ingest)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Page Format
|
|
75
|
+
|
|
76
|
+
Each page is a plain Markdown file with YAML frontmatter:
|
|
77
|
+
|
|
78
|
+
```markdown
|
|
79
|
+
---
|
|
80
|
+
title: Transformer Architecture
|
|
81
|
+
created: 2026-04-05
|
|
82
|
+
updated: 2026-04-05
|
|
83
|
+
tags: [machine-learning, architecture, attention]
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
# Transformer Architecture
|
|
87
|
+
|
|
88
|
+
Brief summary paragraph...
|
|
89
|
+
|
|
90
|
+
## Key Concepts
|
|
91
|
+
|
|
92
|
+
...
|
|
93
|
+
|
|
94
|
+
## Related Pages
|
|
95
|
+
|
|
96
|
+
- [[Attention Mechanism]]
|
|
97
|
+
- [[BERT]]
|
|
98
|
+
- [[GPT]]
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Cross-references use `[[Page Name]]` wiki-link syntax. Slugs are lowercase, hyphen-separated (e.g. `transformer-architecture.md`).
|
|
102
|
+
|
|
103
|
+
## `index.md` Format
|
|
104
|
+
|
|
105
|
+
`data/wiki/index.md` is the catalog — one bullet per page using standard markdown link syntax with the slug embedded in the href. This format works both in-app (the canvas parses it) and in any plain markdown viewer (GitHub, VS Code preview, etc.).
|
|
106
|
+
|
|
107
|
+
```markdown
|
|
108
|
+
# Wiki Index
|
|
109
|
+
|
|
110
|
+
## ページ一覧
|
|
111
|
+
|
|
112
|
+
- [Transformer Architecture](pages/transformer-architecture.md) — foundational seq2seq model #ml #attention #architecture (2026-04-05)
|
|
113
|
+
- [さくらインターネット](pages/sakura-internet.md) — 日本のクラウド事業者 #クラウド #日本企業 #データセンター (2026-04-06)
|
|
114
|
+
- [ECharts DataZoom](pages/echarts-datazoom.md) — ズーム操作の仕組み #echarts #可視化 (2026-04-13)
|
|
115
|
+
|
|
116
|
+
## タグ一覧
|
|
117
|
+
|
|
118
|
+
- **AI**: [Transformer Architecture](pages/transformer-architecture.md), [さくらインターネット](pages/sakura-internet.md)
|
|
119
|
+
- **日本企業**: [さくらインターネット](pages/sakura-internet.md)
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Key rules:
|
|
123
|
+
|
|
124
|
+
- Prefer bullet items as `[Title](pages/<slug>.md) — description #tag1 #tag2 (YYYY-MM-DD)` — avoid the `[[slug]]` wiki-link form. The canvas parser extracts the slug from the href so non-ASCII titles (日本語, etc.) keep a navigable slug. Markdown tables are also supported via the alternative format below, but the bullet form is easier to read in plain text and plays nicer with non-ASCII titles.
|
|
125
|
+
- Slugs are lowercase ASCII, hyphen-separated. They match the page filename one-to-one (`pages/sakura-internet.md` → slug `sakura-internet`).
|
|
126
|
+
- `#tag` tokens appear inline in the description (whitespace-bounded on the left). Tokens are extracted and indexed for the Wiki tag-filter UI. Tags accept any Unicode letter or digit (so `#クラウド`, `#可視化`, `#ai-agents` all work); `-` and `_` are allowed as internal joiners but not as the first character. Separate adjacent tags with a space — there is no right-hand boundary char, so `#クラウドデータ` parses as one tag.
|
|
127
|
+
- Below the page list, include a "タグ一覧" / "Tags" section with the same `[Title](pages/<slug>.md)` link form so every mention is clickable.
|
|
128
|
+
- Keep the index in sync with `pages/` — when you add a page, add a row; when you rename a file, update every link that points at it.
|
|
129
|
+
- **The page list is a flat, recency-ordered log — do NOT group pages by category.** Prepend each new page's bullet at the top, not the bottom. When you update an existing page (content, description, tags) move its bullet to the top so the list reads as a journal of recent activity. A rename counts as an update: after fixing every link (see the sync rule above) move the renamed entry to the top. When you delete a page, remove its bullet from the page list **and** from any Tags-section groups that reference it — don't leave orphan mentions.
|
|
130
|
+
- **Tags section: update the page list under each tag when pages are added / renamed / deleted, but do NOT reorder the tags themselves.** The "タグ一覧" / "Tags" section is a set of `- **Tag**: [Title](...), ...` groups — one bullet per tag, each listing every page that carries it. Preserve the existing tag order — don't sort by recency, and don't re-sort by frequency. A new tag gets appended at the end of the Tags section; an existing tag's order doesn't change just because one of its pages was updated.
|
|
131
|
+
|
|
132
|
+
### Alternative table format
|
|
133
|
+
|
|
134
|
+
If you prefer a table layout, the canvas also accepts a `Tags` column. Column names are matched by header (case-insensitive), so the order is flexible:
|
|
135
|
+
|
|
136
|
+
```markdown
|
|
137
|
+
| Slug | Title | Summary | Tags | Updated |
|
|
138
|
+
|------|-------|---------|------|---------|
|
|
139
|
+
| `transformer-architecture` | Transformer Architecture | foundational seq2seq model | ml, attention, architecture | 2026-04-05 |
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Pre-existing 3- or 4-column tables (without a Tags header) keep parsing; their entries just have no tags.
|
|
143
|
+
|
|
144
|
+
## Tag rules
|
|
145
|
+
|
|
146
|
+
- A page's YAML frontmatter `tags:` field is the source of truth for that page's tags.
|
|
147
|
+
- The tags recorded for that slug in `index.md` must match the frontmatter set exactly (order and case don't matter; we compare as a lowercased set).
|
|
148
|
+
- The Lint button on the `/wiki` UI flags any mismatch as **Tag drift**. Fix by updating whichever side is stale.
|
|
149
|
+
|
|
150
|
+
## Browsing the wiki
|
|
151
|
+
|
|
152
|
+
Wiki page Writes/Edits the LLM performs render inline in the chat automatically — no extra display call needed.
|
|
153
|
+
|
|
154
|
+
For browse / lint queries, point the user at the `/wiki` UI:
|
|
155
|
+
|
|
156
|
+
- `/wiki` — the page catalog (with tag filters)
|
|
157
|
+
- `/wiki/pages/<slug>` — a specific page
|
|
158
|
+
- `/wiki/log` — the activity log
|
|
159
|
+
- The Lint button on `/wiki` runs a health check
|
|
160
|
+
|
|
161
|
+
## Relationship to `memory.md`
|
|
162
|
+
|
|
163
|
+
| | `memory.md` | `data/wiki/` |
|
|
164
|
+
| ------ | ---------------------------------------- | ------------------------------------------- |
|
|
165
|
+
| Scope | Brief distilled facts, always in context | Deep structured knowledge, loaded on demand |
|
|
166
|
+
| Growth | Intentionally small | Grows unboundedly |
|
|
167
|
+
|
|
168
|
+
Over time, Claude can distill key insights from the wiki back into `memory.md` as compact ambient context for all roles.
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mc-cooking-coach
|
|
3
|
+
description: Personal recipe book — save / read / update / delete cooking recipes as markdown files under `data/cooking/recipes/`, with a `README.md` index that lists every recipe. Use when the user asks to remember a recipe, look one up, or refine one.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Cooking Coach
|
|
7
|
+
|
|
8
|
+
A bundled MulmoClaude preset skill (`mc-` prefix = launcher-managed; do not edit
|
|
9
|
+
this file in the workspace, it is overwritten on every server boot).
|
|
10
|
+
|
|
11
|
+
Be the user's cooking-loving friend, not a librarian. Don't talk about file
|
|
12
|
+
paths, frontmatter, or slugs — those exist behind the scenes; the user should
|
|
13
|
+
never need to think about them. When suggesting substitutions or technique,
|
|
14
|
+
keep it short and practical.
|
|
15
|
+
|
|
16
|
+
## Where things live
|
|
17
|
+
|
|
18
|
+
Recipes are plain markdown files at `data/cooking/recipes/<slug>.md`
|
|
19
|
+
(cwd-relative — the agent runs with cwd = workspace, so every path in this
|
|
20
|
+
file is plain cwd-relative). A `README.md` in the same directory is the
|
|
21
|
+
catalogue — one bullet per recipe. You maintain both. The user should never
|
|
22
|
+
need to know either path.
|
|
23
|
+
|
|
24
|
+
## Workflow 1: save a new recipe
|
|
25
|
+
|
|
26
|
+
**Triggers**: "ピーマンの肉詰めのレシピを保存して", "remember this lasagna",
|
|
27
|
+
"こんど作る用に肉じゃがメモして".
|
|
28
|
+
|
|
29
|
+
**Step 1 — distil before writing.** Ask follow-ups only if essential
|
|
30
|
+
(ingredients you couldn't infer, servings if the user implied "for the family"
|
|
31
|
+
etc.). Don't ping-pong on metadata; default `servings`, `prepTime`, `cookTime`
|
|
32
|
+
to what the user said and skip them if they didn't say.
|
|
33
|
+
|
|
34
|
+
**Step 2 — pick a kebab-case ASCII slug.** `ピーマンの肉詰め` → `stuffed-peppers`
|
|
35
|
+
or `piman-no-nikuzume`. Use a romanised form even when the title is non-ASCII.
|
|
36
|
+
|
|
37
|
+
The slug MUST match the pattern `^[a-z0-9]+(-[a-z0-9]+)*$` — lowercase ASCII
|
|
38
|
+
letters / digits, single hyphens between segments only, no leading / trailing /
|
|
39
|
+
consecutive hyphens, no whitespace, no punctuation (no apostrophes,
|
|
40
|
+
parentheses, accents). Max 64 characters. If the romanisation has any of
|
|
41
|
+
those, strip / replace them before saving. The strict pattern is also a
|
|
42
|
+
**safety boundary**: it's how the delete workflow below stays free of shell-
|
|
43
|
+
metacharacter concerns.
|
|
44
|
+
|
|
45
|
+
If a recipe with that slug already exists, ask the user (don't overwrite
|
|
46
|
+
without permission).
|
|
47
|
+
|
|
48
|
+
**Step 3 — Write the recipe file** at `data/cooking/recipes/<slug>.md`:
|
|
49
|
+
|
|
50
|
+
```markdown
|
|
51
|
+
---
|
|
52
|
+
title: ピーマンの肉詰め
|
|
53
|
+
tags:
|
|
54
|
+
- 和食
|
|
55
|
+
- 主菜
|
|
56
|
+
servings: 4
|
|
57
|
+
prepTime: 15
|
|
58
|
+
cookTime: 20
|
|
59
|
+
restTime: 0
|
|
60
|
+
created: 2026-05-11T12:00:00.000Z
|
|
61
|
+
updated: 2026-05-11T12:00:00.000Z
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 材料
|
|
65
|
+
|
|
66
|
+
- ピーマン 8個
|
|
67
|
+
- 合いびき肉 300g
|
|
68
|
+
- 玉ねぎ 1個
|
|
69
|
+
- 卵 1個
|
|
70
|
+
- パン粉、塩こしょう
|
|
71
|
+
|
|
72
|
+
## 手順
|
|
73
|
+
|
|
74
|
+
1. ピーマンを縦半分に切って種を取る
|
|
75
|
+
2. 玉ねぎをみじん切りにして炒める
|
|
76
|
+
3. ひき肉だねをピーマンに詰める
|
|
77
|
+
4. フライパンで両面焼く
|
|
78
|
+
|
|
79
|
+
## メモ
|
|
80
|
+
|
|
81
|
+
味噌だれや甘酢あんかけにアレンジしてもよい。
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Title can be in the user's language. Body convention: `## 材料` (or `## Ingredients`)
|
|
85
|
+
as a bullet list with quantities, then `## 手順` (or `## Steps`) as a numbered list,
|
|
86
|
+
then optional `## メモ` / `## Notes` / `## バリエーション` sections.
|
|
87
|
+
|
|
88
|
+
`servings`, `prepTime`, `cookTime`, `restTime` are all integers (in minutes
|
|
89
|
+
for the time fields) and all optional — omit if the user didn't volunteer
|
|
90
|
+
them. `restTime` covers non-active time like marinating, chilling, proofing,
|
|
91
|
+
resting — anything where the user isn't doing work; keep `cookTime` for
|
|
92
|
+
active cooking only so totals stay accurate. `tags` is a free-form list.
|
|
93
|
+
`created` and `updated` are ISO timestamps; on a fresh save they're the same.
|
|
94
|
+
|
|
95
|
+
**Step 4 — regenerate `data/cooking/recipes/README.md`** (see "The README index"
|
|
96
|
+
below).
|
|
97
|
+
|
|
98
|
+
**Step 5 — confirm**: one sentence ("Saved as stuffed-peppers.") so the user
|
|
99
|
+
sees the result without scrolling. Offer `generateImage` if the dish would
|
|
100
|
+
benefit from a visual (plating, unfamiliar technique).
|
|
101
|
+
|
|
102
|
+
## Workflow 2: recall / browse
|
|
103
|
+
|
|
104
|
+
**Triggers**: "保存したレシピみせて", "肉詰めどう作ったっけ?", "what tag-thai
|
|
105
|
+
recipes do I have?", "show me my recipes".
|
|
106
|
+
|
|
107
|
+
**Single recipe**: Read `data/cooking/recipes/<slug>.md` and present it
|
|
108
|
+
naturally — render the markdown in chat, don't dump raw frontmatter unless the
|
|
109
|
+
user asks. If you don't know the slug, Read `data/cooking/recipes/README.md`
|
|
110
|
+
first to find it.
|
|
111
|
+
|
|
112
|
+
**All recipes / filtered**: Read `data/cooking/recipes/README.md` and answer
|
|
113
|
+
from the index. If the user filters by tag ("和食 のレシピは?"), filter the
|
|
114
|
+
bullets and respond conversationally — don't dump the whole README.
|
|
115
|
+
|
|
116
|
+
## Workflow 3: update / delete
|
|
117
|
+
|
|
118
|
+
**Update**: read the current file, apply the change, Write with the updated
|
|
119
|
+
frontmatter:
|
|
120
|
+
|
|
121
|
+
- `created` stays the same
|
|
122
|
+
- `updated` advances to the current ISO timestamp
|
|
123
|
+
- preserve every other frontmatter field unless the user explicitly asked to
|
|
124
|
+
change it (so a "bump cook time to 25 min" doesn't accidentally wipe tags)
|
|
125
|
+
|
|
126
|
+
Then regenerate `README.md`.
|
|
127
|
+
|
|
128
|
+
**Delete**: only when the user explicitly asks. **Re-validate the slug
|
|
129
|
+
against `^[a-z0-9]+(-[a-z0-9]+)*$` BEFORE running the command** — if it
|
|
130
|
+
fails the pattern, refuse and ask the user to confirm by name. When valid,
|
|
131
|
+
quote the path even though the slug pattern already excludes shell
|
|
132
|
+
metacharacters (belt + braces):
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
rm "data/cooking/recipes/<slug>.md"
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Then regenerate `README.md`. Confirm afterward.
|
|
139
|
+
|
|
140
|
+
## Workflow 4: visualise
|
|
141
|
+
|
|
142
|
+
When the user asks "how does it look?" / "写真みせて" / a step is hard to
|
|
143
|
+
follow without a picture, call `generateImage` with a prompt focused on the
|
|
144
|
+
finished dish — appetising, well-lit, top-down or 3/4 plating shot. One image
|
|
145
|
+
per request unless they ask for variations.
|
|
146
|
+
|
|
147
|
+
## The README index — keep it current
|
|
148
|
+
|
|
149
|
+
After every save / update / delete, regenerate `data/cooking/recipes/README.md`
|
|
150
|
+
from the recipe files currently in the directory. Enumerate with the Files
|
|
151
|
+
tool, or with Bash. **The enumeration MUST exclude `README.md` itself** —
|
|
152
|
+
otherwise the index treats its own catalogue as a recipe and emits a
|
|
153
|
+
self-referential entry. Convenient form:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
find data/cooking/recipes -maxdepth 1 -type f -name '*.md' ! -name 'README.md' | sort
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
(`find` over `ls *.md` so an empty directory after a delete doesn't error out
|
|
160
|
+
on the glob — also keeps the README exclusion explicit.)
|
|
161
|
+
|
|
162
|
+
Then Read each frontmatter you don't already know.
|
|
163
|
+
|
|
164
|
+
Format:
|
|
165
|
+
|
|
166
|
+
```markdown
|
|
167
|
+
# レシピ一覧
|
|
168
|
+
|
|
169
|
+
`data/cooking/recipes/` の中身。MulmoClaude が自動更新するので手で編集する場合は
|
|
170
|
+
保存後に更新されることを覚えておいてください。
|
|
171
|
+
|
|
172
|
+
## 主菜
|
|
173
|
+
|
|
174
|
+
- [ピーマンの肉詰め](stuffed-peppers.md) — 和食 / 4 人分 / 15 + 20 分
|
|
175
|
+
- [ラザニア](lasagna.md) — イタリアン / 6 人分 / 30 + 60 分
|
|
176
|
+
|
|
177
|
+
## 副菜・スープ
|
|
178
|
+
|
|
179
|
+
- [豚汁](tonjiru.md) — 和食 / 4 人分 / 10 + 20 分
|
|
180
|
+
|
|
181
|
+
## デザート
|
|
182
|
+
|
|
183
|
+
- [チョコレートムース](chocolate-mousse.md) — フレンチ / 4 人分 / 20 分 + 冷却 120 分
|
|
184
|
+
|
|
185
|
+
## (タグ未分類)
|
|
186
|
+
|
|
187
|
+
- [おにぎり](onigiri.md) — 4 人分 / 15 分
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Rules for the README:
|
|
191
|
+
|
|
192
|
+
- **Group by primary tag** (the first item in the recipe's `tags`) when there's
|
|
193
|
+
a meaningful taxonomy in use; fall back to "(タグ未分類)" otherwise.
|
|
194
|
+
- **One bullet per recipe**: `[Title](slug.md) — tags / servings / time`.
|
|
195
|
+
Use long-form units in the user's language (人分, 分, mins, etc.). The
|
|
196
|
+
time column composes `prepTime + cookTime` (active time only) plus a
|
|
197
|
+
trailing `+ rest <restTime> 分` suffix when `restTime` is present. Examples:
|
|
198
|
+
- all three set: `15 + 20 分 + 冷却 120 分`
|
|
199
|
+
- prepTime + cookTime only: `35 分`
|
|
200
|
+
- restTime only: `冷却 120 分`
|
|
201
|
+
- none set: omit the time column entirely
|
|
202
|
+
Tags are slash-joined.
|
|
203
|
+
- **Don't include `created` / `updated` dates** — they're noisy and rarely
|
|
204
|
+
what the user wants to scan for.
|
|
205
|
+
- **Alphabetical within each group** by display title (Japanese / English
|
|
206
|
+
collation as it falls out — don't over-engineer).
|
|
207
|
+
- **Keep the opening paragraph** explaining MulmoClaude maintains it (one
|
|
208
|
+
short sentence).
|
|
209
|
+
|
|
210
|
+
If the directory is empty after a delete, write a single-line README pointing
|
|
211
|
+
at "(まだレシピがありません)" so the user can tell at a glance.
|
|
212
|
+
|
|
213
|
+
## Tone
|
|
214
|
+
|
|
215
|
+
Conversational. The user is your cooking friend, not your customer. When you
|
|
216
|
+
suggest a substitution, do it with a one-line "why" ("the lime brightens it —
|
|
217
|
+
lemon works but skews sour"). Don't recite culinary trivia unless asked.
|