@younndai/lyt-skills 0.9.8 → 0.10.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/README.md +2 -0
- package/package.json +2 -2
- package/skills/lyt-capture/SKILL.md +3 -3
- package/skills/lyt-search/SKILL.md +43 -0
package/README.md
CHANGED
|
@@ -74,6 +74,8 @@ Each skill autodetects the active vault + project via `lyt vault info --by-path`
|
|
|
74
74
|
|
|
75
75
|
A `meta:` escape-hatch blob accepts free-form fields without schema churn. The result: every note an agent saves is structured, searchable, and legible to the next agent that reads it.
|
|
76
76
|
|
|
77
|
+
On an interactive terminal, `/lyt-capture` also resolves **where** the note lands — `--dir <vault-subdir>`, an opt-in `topics/<slug>/` folder, or the default `notes/` (fail-closed against escapes) — and offers your vault's existing topics (recommended first) so `topic:` stays consistent. `tags` fill with no model required; with a local embedding model present, a `topic:` is additionally suggested (recommended, never auto-selected) — computed on-device, never sent anywhere.
|
|
78
|
+
|
|
77
79
|
## Patterns vs skills
|
|
78
80
|
|
|
79
81
|
- A **pattern** is data: a `pattern.yon` descriptor + a `templates/` folder of markdown templates with frontmatter. Patterns live at `~/lyt/patterns/`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@younndai/lyt-skills",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Lyt harness skills — 16 skills (/lyt-plan, /lyt-progress, /lyt-result, /lyt-retro, /lyt-insight, /lyt-handoff, /lyt-decision, /lyt-pattern, /lyt-capture, /lyt-recall, /lyt-pod, /lyt-mesh-explore, /lyt-primer-context, /lyt-search, /lyt-sync, /lyt-alias) symlinked tri-runtime into ~/.claude/skills/, ~/.codex/skills/, ~/.agents/skills/. Composed into the `lyt skills install` and `lyt skills list` meta-CLI verbs.",
|
|
5
5
|
"homepage": "https://linkyourthink.com",
|
|
6
6
|
"repository": {
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"prepublishOnly": "node ../../scripts/check-no-vendored-deps.mjs --root ../.. && node ../../scripts/public-release/scan-tarball.mjs lyt-skills"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@younndai/lyt-vault": "^0.
|
|
52
|
+
"@younndai/lyt-vault": "^0.10.0",
|
|
53
53
|
"commander": "^12.1.0"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
@@ -59,9 +59,9 @@ Per yai.lyt v1 frontmatter contract, every captured Figment carries 8 mandatory
|
|
|
59
59
|
|
|
60
60
|
1. **Determine a title.** Use the user's explicit title if given. Otherwise infer a short noun-phrase (5–8 words) from the content. If unsure, ask.
|
|
61
61
|
2. **Compute the slug** — lowercase, kebab-case the title, strip non-`[a-z0-9-]` characters, max 60 chars.
|
|
62
|
-
3. **Compute the filename** —
|
|
62
|
+
3. **Compute the filename** — `<dir>/YYYY-MM-DD-<slug>.md` using today's date. `<dir>` defaults to `notes/`; the user may relocate it with `lyt capture --dir <vault-relative>` (fail-closed: rejects empty / absolute / `..`-escape / vault-root / the reserved `.lyt`,`.obsidian`,`.git` trees), or opt into a topic-named folder with `--topic-folder` (routes into `topics/<topic-slug>/`; explicit `--dir` wins).
|
|
63
63
|
4. **If a file already exists at that path**, append `-2`, `-3`, etc. to the slug until the path is free. Never overwrite.
|
|
64
|
-
5. **Fill the 8 mandatory frontmatter fields
|
|
64
|
+
5. **Fill the 8 mandatory frontmatter fields** per the contract SoT — run `lyt contract --json` for the canonical order, sources, and defaults (source: `FRONTMATTER_CONTRACT` in `packages/lyt-vault/src/templates/contract.ts`). Do NOT hand-maintain a divergent field list. Summary (verify against `lyt contract --json`; not auto-generated):
|
|
65
65
|
|
|
66
66
|
| Field | Source | Notes |
|
|
67
67
|
| ----------------- | ------------------------------------- | ---------------------------------------------------------------------------------------- |
|
|
@@ -122,7 +122,7 @@ e.g. `lyt capture --index-only notes/2026-06-10-my-note.md --vault personal/main
|
|
|
122
122
|
- **`mesh-visibility` default = `local`; `weight` default = `3`.** Override only when the user signals a non-default.
|
|
123
123
|
- **User Figments are plain Obsidian-flavored markdown.** Wikilinks (`[[other-note]]`), tags (`#tag`), callouts, embeds — all fine. **Do NOT write YON inside user Figments.** YON is reserved for system files (`.lyt/vault.yon`, `.lyt/memscope.yon`, pattern.yon).
|
|
124
124
|
- **Never overwrite an existing Figment.** Always pick a fresh slug suffix.
|
|
125
|
-
- **
|
|
125
|
+
- **Capture lands in `<vault>/notes/` by default;** `--dir <vault-relative>` and `--topic-folder` (opt-in → `topics/<slug>/`) may relocate it. Both are fail-closed (no `..`-escape, no absolute path, no reserved `.lyt`/`.obsidian`/`.git` tree). Do not write outside the resolved capture dir, and do not touch unrelated vault files unless the user explicitly says so.
|
|
126
126
|
- **Never run `git add`/`git commit`** — sync is a separate step (`/lyt-sync` or `lyt sync --watch`).
|
|
127
127
|
- If the user's content references other Figments by name, use `[[wikilinks]]` so Obsidian resolves them; don't expand them yourself.
|
|
128
128
|
|
|
@@ -128,6 +128,48 @@ Show each result as `[<confidence>] <vault>/<figment_path> — <snippet>`. Trunc
|
|
|
128
128
|
|
|
129
129
|
On **empty results**: surface _"No matches for `"<query>"` across <scope>."_ and offer scope-widening hints (`--mesh` → federation; `--vault` → `--mesh`). If a vault that should contain the figment still returns nothing, its FTS index may be stale — suggest rebuilding it with `lyt vault rebuild-index <name>` (or `lyt reindex` across the pod), then re-running the search.
|
|
130
130
|
|
|
131
|
+
## Phase 5 — Concept-search discovery nudge (only when `trace.nudge.eligible` is true)
|
|
132
|
+
|
|
133
|
+
The `--json` output may carry a `trace.nudge` block. It is the signal for a one-time offer to enable **concept search** — finding notes by meaning, not just keywords. Read it; only voice the offer when it explicitly says to.
|
|
134
|
+
|
|
135
|
+
```json
|
|
136
|
+
"trace": {
|
|
137
|
+
"nudge": {
|
|
138
|
+
"eligible": true,
|
|
139
|
+
"state": "not-yet-asked",
|
|
140
|
+
"reason": null,
|
|
141
|
+
"declines": 0,
|
|
142
|
+
"daysSince": null,
|
|
143
|
+
"searchesSince": 1
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
- **`eligible: true`** → voice the offer once (see below). A null `reason` confirms it.
|
|
149
|
+
- **`eligible: false`** → say nothing about it. The `reason` explains why (`model-present` = already set up; `disabled` = the user chose never to be asked; `auto-quiet` = declined enough times; `cadence` = asked recently). Never override an ineligible verdict.
|
|
150
|
+
- **`trace.nudge` absent** → nothing to do; proceed normally.
|
|
151
|
+
|
|
152
|
+
### Voicing the offer (only when eligible)
|
|
153
|
+
|
|
154
|
+
Relay it to the user in plain language, **framed as a benefit to them — never "to help improve Lyt"**:
|
|
155
|
+
|
|
156
|
+
> _"I can also search your notes by meaning, not just keywords. It needs a one-time local setup (nothing leaves your machine). Want me to set it up?"_
|
|
157
|
+
|
|
158
|
+
Then **capture an explicit yes or no** before doing anything else.
|
|
159
|
+
|
|
160
|
+
### Response-capture contract — map the reply to exactly one verb
|
|
161
|
+
|
|
162
|
+
| User reply | Do |
|
|
163
|
+
|---|---|
|
|
164
|
+
| **Yes** (set it up) | `lyt model fetch` — runs the one-time local setup and marks the offer resolved. |
|
|
165
|
+
| **No** (explicit decline) | `lyt model nudge --decline` — records ONE decline (three declines → auto-quiet). |
|
|
166
|
+
| **"Never ask again"** | `lyt model nudge --never` — turns the offer off permanently. |
|
|
167
|
+
| **Surfaced / bookkeeping only** | `lyt model nudge --asked` — records that the offer was shown (stamps the ask, resets the cadence counter) when you voiced it without yet capturing a yes/no. |
|
|
168
|
+
|
|
169
|
+
- **A non-response is NOT a decline.** If the user doesn't answer the offer, record nothing — do not run `nudge --decline`. Only an explicit "no" counts as a decline.
|
|
170
|
+
- **Inspect anytime** with `lyt model nudge --status` (read-only; prints the current offer-state).
|
|
171
|
+
- Honor a `disabled` / `auto-quiet` state — once the user has opted out, never re-raise the offer.
|
|
172
|
+
|
|
131
173
|
## Rules
|
|
132
174
|
|
|
133
175
|
- **MUST pass the user's query as a single quoted argv argument**, not template-interpolated into a shell command string. Filenames or queries containing shell metacharacters (`` ` ``, `$(...)`, `;`, `&&`) inside the query MUST be safely conveyed as argv.
|
|
@@ -139,6 +181,7 @@ On **empty results**: surface _"No matches for `"<query>"` across <scope>."_ and
|
|
|
139
181
|
- **MUST NOT re-interpret confidence tiers.** The CLI emits them as `0.95 / 0.90 / 0.70 / 0.50` per Tier 0/1/2/3 spec. Display verbatim; do not "smooth" or "round" or invent a derived score.
|
|
140
182
|
- **MUST NOT modify or write any vault file.** This is a read-only skill (`requires_writable_vault: false`). If the user wants results persisted to a Figment, run `/lyt-capture` separately on the formatted output.
|
|
141
183
|
- **MUST NOT widen scope without user signal.** If the user said "in my work vault", do not silently fall back to federation when the named vault is missing — surface the miss and stop.
|
|
184
|
+
- **MUST voice the concept-search offer ONLY when `trace.nudge.eligible` is true**, and MUST capture an explicit yes/no before acting. A non-response records nothing — never run `lyt model nudge --decline` on silence. Honor a `disabled` / `auto-quiet` state and never re-raise.
|
|
142
185
|
|
|
143
186
|
## Companion skills
|
|
144
187
|
|