@younndai/lyt-skills 0.9.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.
Files changed (43) hide show
  1. package/LICENSE +200 -0
  2. package/NOTICE +23 -0
  3. package/README.md +124 -0
  4. package/dist/commands/skills-install.d.ts +3 -0
  5. package/dist/commands/skills-install.d.ts.map +1 -0
  6. package/dist/commands/skills-install.js +89 -0
  7. package/dist/commands/skills-install.js.map +1 -0
  8. package/dist/commands/skills-list.d.ts +3 -0
  9. package/dist/commands/skills-list.d.ts.map +1 -0
  10. package/dist/commands/skills-list.js +79 -0
  11. package/dist/commands/skills-list.js.map +1 -0
  12. package/dist/commands/skills.d.ts +3 -0
  13. package/dist/commands/skills.d.ts.map +1 -0
  14. package/dist/commands/skills.js +26 -0
  15. package/dist/commands/skills.js.map +1 -0
  16. package/dist/index.d.ts +6 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +19 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/list.d.ts +19 -0
  21. package/dist/list.d.ts.map +1 -0
  22. package/dist/list.js +65 -0
  23. package/dist/list.js.map +1 -0
  24. package/dist/symlink.d.ts +41 -0
  25. package/dist/symlink.d.ts.map +1 -0
  26. package/dist/symlink.js +233 -0
  27. package/dist/symlink.js.map +1 -0
  28. package/package.json +72 -0
  29. package/skills/lyt-capture/SKILL.md +137 -0
  30. package/skills/lyt-decision/SKILL.md +52 -0
  31. package/skills/lyt-handoff/SKILL.md +52 -0
  32. package/skills/lyt-insight/SKILL.md +55 -0
  33. package/skills/lyt-mesh-explore/SKILL.md +190 -0
  34. package/skills/lyt-pattern/SKILL.md +71 -0
  35. package/skills/lyt-plan/SKILL.md +60 -0
  36. package/skills/lyt-pod/SKILL.md +205 -0
  37. package/skills/lyt-primer-context/SKILL.md +206 -0
  38. package/skills/lyt-progress/SKILL.md +48 -0
  39. package/skills/lyt-recall/SKILL.md +98 -0
  40. package/skills/lyt-result/SKILL.md +49 -0
  41. package/skills/lyt-retro/SKILL.md +54 -0
  42. package/skills/lyt-search/SKILL.md +144 -0
  43. package/skills/lyt-sync/SKILL.md +145 -0
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: lyt-handoff
3
+ description: >
4
+ Write an inter-session handoff brief — what a fresh agent or human needs to pick up the work. Trigger when the user runs /lyt-handoff, or says "write a handoff", "brief the next session", "hand this off", "what does the next agent need". Wraps `lyt pattern run work-management handoff`. Writes to <vault>/Handoffs/<project>/<date>-<slug>.md.
5
+ visibility: public
6
+ lyt-version: 0.2.0
7
+ capabilities: [write]
8
+ runtimes: [claude, codex, agents]
9
+ requires_writable_vault: true
10
+ ---
11
+
12
+ # /lyt-handoff
13
+
14
+ Write a handoff brief — a self-contained document a fresh agent (or person) can pick up cold to continue work. Distinct from `/lyt-result` (which is about THIS session); a handoff is forward-looking for the NEXT session.
15
+
16
+ ## When to invoke
17
+
18
+ - `/lyt-handoff` slash trigger
19
+ - "write a handoff brief for the next agent"
20
+ - "I need to leave a brief"
21
+ - end of a multi-session arc when a fresh session needs to pick up
22
+
23
+ ## Phase 1 — Resolve target
24
+
25
+ Same chain as `/lyt-plan`. Slug describes the work being handed off (e.g., `phase-7-session-3-npm-precheck-readmes`).
26
+
27
+ ## Phase 2 — Run the verb
28
+
29
+ ```
30
+ lyt pattern run work-management handoff --vault <vault> --project <project> --slug <slug>
31
+ ```
32
+
33
+ The verb writes to `<vault>/Handoffs/<project>/<date>-<slug>.md` (not under `work/` — handoffs live at vault root in their own folder per Work-Management convention).
34
+
35
+ ## Phase 3 — Fill the body
36
+
37
+ A good handoff has:
38
+
39
+ - **Acceptance sentence** — one paragraph that captures what "done" looks like
40
+ - **State snapshot (@CONTINUATION)** — current branch, last commit, modified files, in-flight artifacts, pushed/unpushed state, test count
41
+ - **Sources (@SOURCES.required + .optional)** — every file the next agent MUST read before drafting any plan
42
+ - **Resume command** — numbered steps the next agent should follow
43
+ - **Sign-off** — canonical retro path; structured @SESSION_REPORT format if applicable
44
+ - **Activation phrase** — the `/handoff-execute "..."` command to paste into the fresh session
45
+
46
+ The frontmatter `acceptance` field is load-bearing: the executing agent (via `/handoff-execute`) walks its clauses to verify the work matches the brief.
47
+
48
+ ## Companion skills
49
+
50
+ - `/handoff-execute` (in the handoff-execute skill) — consumes briefs written by this skill
51
+ - `/lyt-result` — what the prior session shipped (context for the handoff)
52
+ - `/lyt-retro` — usually written alongside or after the next-session retro
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: lyt-insight
3
+ description: >
4
+ Capture a distilled project-specific learning as a Lyt Figment. Trigger when the user runs /lyt-insight, or says "this is a project insight", "promote this lesson", "make this durable", "extract the lesson". Wraps `lyt pattern run work-management insight`. Writes to <vault>/Projects/<project>/work/<date>-insight-<slug>.md. For project-agnostic lessons use Nuggets instead.
5
+ visibility: public
6
+ lyt-version: 0.2.0
7
+ capabilities: [write]
8
+ runtimes: [claude, codex, agents]
9
+ requires_writable_vault: true
10
+ ---
11
+
12
+ # /lyt-insight
13
+
14
+ Distilled learning specific to THIS project. Promotion target from a `result-` or `retro-` when the lesson earns durable value.
15
+
16
+ ## When to invoke
17
+
18
+ - `/lyt-insight` slash trigger
19
+ - "this is a project insight"
20
+ - "promote this"
21
+ - "we keep learning this — write it down"
22
+
23
+ If the lesson is project-AGNOSTIC (applies to any future project), use `/lyt-capture` with a `Nuggets/<subject>/` target instead.
24
+
25
+ ## Phase 1 — Resolve target
26
+
27
+ Same chain as `/lyt-plan`. If promoting from a result, prefer renaming the existing result file in place: `<date>-result-<slug>.md` → `<date>-insight-<slug>.md`, update `type:` in frontmatter, set `derived_from_session:`. No folder move; no wikilink rot.
28
+
29
+ If writing a fresh insight that doesn't promote from a specific result, run the verb to create a new file.
30
+
31
+ ## Phase 2 — Run the verb (when creating fresh)
32
+
33
+ ```
34
+ lyt pattern run work-management insight --vault <vault> --project <project> --slug <slug>
35
+ ```
36
+
37
+ ## Phase 3 — Fill the body
38
+
39
+ Sections to fill:
40
+
41
+ - **The insight** — state the lesson sharply, one paragraph
42
+ - **Why it matters** — where this changes future decisions
43
+ - **Evidence** — sessions, commits, decisions that support it
44
+ - **Edge cases / qualifiers** — when this does NOT apply
45
+ - **Related** — wikilinks to source results, decisions, plans
46
+
47
+ ## Promotion to Nuggets
48
+
49
+ If after writing the insight you realize the lesson is project-agnostic, ALSO write a `Nuggets/<subject>/<date>-nugget-<slug>.md` at vault root. (Or: rename in place to the Nuggets folder if it's exclusively agnostic.) Two files are fine when the lesson is project-specific in flavor but applies elsewhere too.
50
+
51
+ ## Companion skills
52
+
53
+ - `/lyt-result` — source of most insight promotions
54
+ - `/lyt-retro` — source of retro-derived insights
55
+ - `/lyt-decision` — for choices that warrant a separate decision artifact
@@ -0,0 +1,190 @@
1
+ ---
2
+ name: lyt-mesh-explore
3
+ description: >
4
+ Drill into a single Lyt mesh — surface mesh metadata, member home vaults, update cadences, and the published @MESH_PUBLIC description for one named mesh. Trigger when the user runs /lyt-mesh-explore <mesh>, or says "show me the X mesh", "what's in mesh X", "drill into X mesh", "explore the X mesh", "give me X mesh details", or similar phrasing on mesh-scoped browsing. Wraps `lyt mesh info <mesh> [--remote] [--json]` (v1.B.6) — local mode reads the mesh's `.lyt/mesh.yon` SoT; `--remote` peeks at the published mesh.yon via gh api without cloning. Read-only; pairs with /lyt-pod (pod-level enumeration across all meshes) for breadth and /lyt-search (tiered query) for content.
5
+ visibility: public
6
+ lyt-version: 0.8.0
7
+ capabilities: [read]
8
+ runtimes: [claude, codex, agents]
9
+ requires_writable_vault: false
10
+ ---
11
+
12
+ # /lyt-mesh-explore
13
+
14
+ Render a handler-facing overview of a single Lyt **mesh** — its metadata, its home vaults, its update cadences, and its published `@MESH_PUBLIC` description — by wrapping one primary CLI verb (plus an upstream `lyt mesh list --json` for mesh-name resolution per Phase 1):
15
+
16
+ - `lyt mesh info <mesh> [--remote] [--json]` (shipped v1.B.6). Canonical mesh-info verb per `packages/lyt-vault/src/commands/mesh-info.ts:20` (definition; registered at `commands/mesh.ts:37`). Local mode reads the registered mesh's main-vault `.lyt/mesh.yon` SoT; `--remote` peeks at the published mesh.yon via `gh api repos/<owner>/<mesh-main>/contents/.lyt/mesh.yon` without cloning the repo.
17
+
18
+ The skill is pure prose around existing CLI verbs — no new CLI verb, no new helper, no lyt-vault change. The CLI does the parsing (mesh.yon → typed `MeshInfoResult`); the skill resolves the user's intent (mesh name + local-or-remote), invokes the verb with `--json`, and formats the deterministic emission into a handler-facing mesh summary.
19
+
20
+ User-facing language uses **"mesh"** throughout per the LYT vocabulary convention (D1) — "pod" is reserved for the user's _full_ set of meshes (which is `/lyt-pod`'s scope); "mesh" is the individual group of vaults sharing a GitHub push target.
21
+
22
+ ## When to invoke
23
+
24
+ When the user runs `/lyt-mesh-explore <mesh>`, or says something like:
25
+
26
+ - "show me the `<name>` mesh"
27
+ - "what's in mesh `<name>`"
28
+ - "drill into `<name>` mesh"
29
+ - "explore the `<name>` mesh"
30
+ - "give me `<name>` mesh details"
31
+ - "what vaults are in `<name>`"
32
+ - "peek at the remote `<name>` mesh without cloning" — _use `--remote`_
33
+
34
+ If the user wants a survey across _all_ their meshes (the pod-level view), prefer `/lyt-pod`. If the user wants to search content _inside_ the mesh's vaults, prefer `/lyt-search --mesh <name>`. This skill is the mesh-scoped drill-down between those two surfaces.
35
+
36
+ ## Phase 1 — Resolve mesh name from user signal
37
+
38
+ The CLI verb takes one required positional `<mesh>` (the mesh name). Pick by the user's wording:
39
+
40
+ - **Explicit mesh name from invocation.** When the user runs `/lyt-mesh-explore <name>` or names the mesh directly ("explore the `younndai` mesh"), use that name as the candidate.
41
+ - **Keyword in natural language.** When the user says "show me the X mesh" / "what's in mesh X" / "drill into X", extract X as the candidate.
42
+
43
+ **Resolve the candidate against `lyt mesh list --json` before passing it.** Don't guess — when the user names a mesh:
44
+
45
+ 1. Run `lyt mesh list --json` first (canonical mesh-enumeration verb per `packages/lyt-vault/src/commands/mesh.ts:277` — `buildMeshListSubcommand` definition; registered at `commands/mesh.ts:32`). The output's `meshes[].name` field is the source of truth for registered mesh names.
46
+ 2. Match the user's term to the listed names (exact, then case-insensitive, then prefix).
47
+ 3. **Reject any resolved name that begins with `-` or `--`** before passing it to the positional `<mesh>` argument — closes the flag-injection surface the same way lyt-sync, lyt-search, and lyt-pod close theirs (family: G.2 CR-1 gh-flag-injection). Mesh names are user-controlled at `lyt mesh init` time; a mesh literally named `--evil` would otherwise smuggle a flag-shaped token into the verb's argv.
48
+ 4. If no match (or the only match is `--`-leading), tell the user the available mesh names from `lyt mesh list --json` and stop — do not invent a name.
49
+
50
+ **Decide `--remote` from explicit user signal only.** Pass `--remote` ONLY when the user explicitly says "without cloning" / "from GitHub" / "peek at the published mesh.yon" / "remote mesh info". The default is LOCAL invocation (no `--remote`) — it reads the locally-registered mesh's `.lyt/mesh.yon` SoT, which is faster, offline-safe, and authoritative for meshes the user owns. `--remote` requires the mesh to be registered locally with a `push_target` (the verb resolves the remote owner from the registry; it does NOT take a `--owner` override in v1.B.6).
51
+
52
+ ## Phase 2 — Invoke `lyt mesh info`
53
+
54
+ Run the verb via the Bash tool (or your runtime's shell equivalent). **Pass argv as an array; never shell-compose the command.** Precedent: lyt-sync's Phase 3 (`spawnSync("git", [..., "-m", message])`), lyt-search's Phase 2 (`spawnSync("lyt", ["search", userQuery, "--json"])`), lyt-pod's Phases 2 + 3 (`spawnSync("lyt", ["mesh", "list", "--json"])` + `spawnSync("lyt", ["vault", "list", "--json"])`) — same argv-array shape, cross-platform-safe.
55
+
56
+ ```
57
+ # Shell-syntax (DOCUMENTATION ONLY — do NOT compose this as a string):
58
+ lyt mesh info <mesh> [--remote] --json
59
+
60
+ # Actual exec shape (argv array; cross-platform-safe):
61
+ spawnSync("lyt", ["mesh", "info", meshName, "--json"]);
62
+
63
+ # With --remote (only on explicit user signal):
64
+ spawnSync("lyt", ["mesh", "info", meshName, "--remote", "--json"]);
65
+ ```
66
+
67
+ Key rules:
68
+
69
+ - The first positional argument is the mesh name — a single string already resolved + sanitized in Phase 1. Quote it in shell-equivalent docs; in argv form it is one element.
70
+ - `--json` is **mandatory** for this skill. The deterministic JSON emission is the contract the skill parses below; human-readable output is not.
71
+ - `--remote` is a boolean flag; pass it (or omit) per the Phase 1 decision. Never pass `--remote=true` or `--remote=<anything>` — the flag is bare.
72
+
73
+ The CLI emits Lock 0.3 stable-key-ordered JSON on stdout (exit 0 on success). The actual emitted shape (per `packages/lyt-vault/src/flows/mesh-info.ts:103-118`, the `MeshInfoResult` interface — `mesh-info.ts:40` does `JSON.stringify(result, null, 2)` verbatim with no transformation, so the TypeScript shape IS the JSON contract):
74
+
75
+ ```json
76
+ {
77
+ "source": "local" | "remote",
78
+ "mesh": {
79
+ "rid": "mesh:<uuid-dashed>",
80
+ "ridHex": "<hex>",
81
+ "name": "<mesh-name>",
82
+ "pushTarget": "<gh-target>" | null,
83
+ "pushKind": "handle" | "org" | null,
84
+ "mainVaultRid": "vault:<uuid-dashed>",
85
+ "createdAt": "<iso>",
86
+ "defaultVaultUpdateCadence": "<cadence-string>" | null
87
+ },
88
+ "publicMeta": {
89
+ "description": "<string>",
90
+ "topics": "<comma-separated>",
91
+ "maintainerContact": "<string>",
92
+ "maintainerHandle": "<string>",
93
+ "licenseOverride": "<spdx-id>",
94
+ "acceptContributions": true,
95
+ "contributionUrl": "<url>",
96
+ "homepageUrl": "<url>",
97
+ "chatUrl": "<url>",
98
+ "createdAt": "<iso>"
99
+ } | null,
100
+ "updateCadences": [
101
+ {
102
+ "vaultRid": "vault:<uuid-dashed>",
103
+ "vaultRidHex": "<hex>",
104
+ "cadenceType": "cron" | "interval" | "on-demand",
105
+ "cron": "<expr>",
106
+ "intervalSeconds": <number>,
107
+ "timezone": "<tz>",
108
+ "peakHours": "<expr>",
109
+ "onDemandAllowed": <boolean>
110
+ }
111
+ ],
112
+ "homeVaults": [
113
+ {
114
+ "vaultRid": "vault:<uuid-dashed>",
115
+ "vaultRidHex": "<hex>",
116
+ "vaultName": "<name>"
117
+ }
118
+ ]
119
+ }
120
+ ```
121
+
122
+ Within `publicMeta` and `updateCadences[]`, every field except `description` (in publicMeta) and `vaultRid` / `vaultRidHex` / `cadenceType` (in updateCadences[]) is omitted from the emission when undefined — they are conditional object-literal spreads at flow-emission time. Treat missing keys as "field not set on this mesh", not "field is null".
123
+
124
+ Failure modes (CLI emits to stderr; exits non-zero):
125
+
126
+ - **Mesh not registered locally** (`MeshInfoNotFoundError`, exit 2) → `{ "error": "mesh-info-not-found", "mesh_name": "<name>", "message": "..." }`. Surface the message verbatim and suggest `lyt mesh list --json` to see registered meshes.
127
+ - **--remote requested, gh unavailable** (`MeshInfoRemoteGhUnavailableError`, exit 4) → `{ "error": "remote-gh-unavailable", "mesh_name": "<name>", "message": "..." }`. Most common causes: the mesh has no `push_target` (initialized with `--no-push`), or `gh` is not authenticated. Surface the message and suggest dropping `--remote` to fall back to LOCAL mode.
128
+ - **--remote requested, remote mesh.yon missing** (`MeshInfoRemoteMeshYonMissingError`, exit 4) → `{ "error": "remote-mesh-yon-missing", "mesh_name": "<name>", "message": "..." }`. The remote repo exists but `.lyt/mesh.yon` is absent at the repo root — the mesh has not yet been published via `lyt mesh publish`. Surface verbatim and suggest LOCAL mode.
129
+
130
+ ## Phase 3 — Format mesh-overview for handler
131
+
132
+ Render the mesh summary as a markdown block. The handler-facing layout:
133
+
134
+ ```
135
+ # Mesh: `<mesh-name>` (<local | remote>)
136
+
137
+ **Metadata:**
138
+ - rid: `<mesh.rid>`
139
+ - push target: `<mesh.pushKind>:<mesh.pushTarget>` (omit line when pushTarget is null)
140
+ - main vault rid: `<mesh.mainVaultRid>`
141
+ - created: `<mesh.createdAt>`
142
+ - default cadence: `<mesh.defaultVaultUpdateCadence>` (omit line when null)
143
+
144
+ **Public description:** (omit entire block when publicMeta is null)
145
+ - description: <publicMeta.description>
146
+ - topics: <publicMeta.topics> (omit when undefined)
147
+ - maintainer: <publicMeta.maintainerContact> (omit when undefined)
148
+ - license: <publicMeta.licenseOverride> (omit when undefined)
149
+ - homepage: <publicMeta.homepageUrl> (omit when undefined)
150
+ - chat: <publicMeta.chatUrl> (omit when undefined)
151
+
152
+ **Home vaults:** (count = homeVaults.length)
153
+ - ★ `<main-vault-name>` (`vault:<vaultRidHex>`) — main vault, marked ★
154
+ - `<vault-name>` (`vault:<vaultRidHex>`)
155
+ - ...
156
+
157
+ **Update cadences:** (count = updateCadences.length; omit entire block when length is 0)
158
+ - `<vault-ridHex truncated to 12 chars>…` — <cadenceType> <detail>
159
+ - ...
160
+ ```
161
+
162
+ Synthesis rules:
163
+
164
+ - **Source line.** Render `(local)` or `(remote)` next to the mesh name based on `source` — handlers seeing the rendered output should know whether they're looking at on-disk SoT or a remote peek.
165
+ - **Main-vault marker.** The home vault whose `vaultRid` equals `mesh.mainVaultRid` is the main vault — render it first with a `★` marker (parity with `lyt mesh list`'s human output per `packages/lyt-vault/src/commands/mesh.ts:333`). Other home vaults follow, sorted alphabetically by `vaultName`. Do not double-render the main vault.
166
+ - **Cadence detail.** For `cadenceType: "cron"`, render the `cron` expression. For `"interval"`, render `every <intervalSeconds>s`. For `"on-demand"`, render `on-demand`. Truncate `vaultRidHex` to the first 12 chars with `…` for readability (parity with `mesh-info.ts:104`).
167
+ - **Optional-field omission.** Treat absent keys in `publicMeta` + `updateCadences[]` as "field not set on this mesh"; omit those lines entirely rather than rendering `undefined` or `null` placeholders.
168
+ - **No edges / subscriptions sections.** `lyt mesh info` surfaces mesh metadata + publicMeta + home vaults + update cadences ONLY — it does not emit mesh-edges (`@MESH_EDGE`) or cross-mesh subscriptions (`@MESH_SUBSCRIPTION`). Those are inspected via other surfaces (`lyt mesh list` exposes per-mesh `subscribed_vaults`; mesh-edges live in `.lyt/mesh.yon` but are not surfaced by this verb). Do NOT invent edge / subscription bullets — the verb does not expose them. Mention `/lyt-pod` as the path to subscription overview if the user asks.
169
+ - **Empty publicMeta.** When `publicMeta === null`, the mesh was initialized without a `@MESH_PUBLIC` block. Omit the entire "Public description" section — do NOT render an empty heading.
170
+ - **Use "mesh" framing throughout.** Never write "federation" or "pod" in this skill's user-facing prose. "Mesh" is the unit of grouping; "pod" is the user's full set of meshes (different scope; that's `/lyt-pod`'s domain).
171
+ - **Remote-mode caveat.** When `source === "remote"`, the data is whatever the remote `.lyt/mesh.yon` currently advertises — it may be stale relative to the mesh's owner's local state if they haven't run `lyt mesh publish` recently. Mention this when the user explicitly asked for `--remote`, so they know what they're looking at.
172
+
173
+ ## Rules
174
+
175
+ - **MUST pass the mesh name as a separate argv argument**, not template-interpolated into a shell command string. Mesh names are user-controlled at init time; argv-array protects against shell-meta or flag-shaped tokens.
176
+ - **MUST pass `--json`** on every invocation. Human-readable output is not a contract this skill parses.
177
+ - **MUST resolve mesh names via `lyt mesh list --json` before passing them.** The canonical mesh-enumeration verb is `lyt mesh list` per `packages/lyt-vault/src/commands/mesh.ts:277` (`buildMeshListSubcommand` definition; registered at `commands/mesh.ts:32`). Do not guess names.
178
+ - **MUST reject `--`-leading resolved mesh names** before passing them to the positional `<mesh>` argument (G.2 CR-1 flag-injection family defense).
179
+ - **MUST NOT cite `lyt mesh status`** as a verb. It does not exist. The canonical mesh-listing verb is `lyt mesh list`; the canonical single-mesh-inspection verb is `lyt mesh info` (this skill).
180
+ - **MUST NOT modify or write any vault file.** This is a read-only skill (`requires_writable_vault: false`). If the user wants the mesh overview persisted to a Figment, run `/lyt-capture` separately on the formatted output.
181
+ - **MUST NOT pass `--remote` by default.** LOCAL is the default; pass `--remote` only on explicit user signal ("without cloning", "from GitHub", "peek at the published mesh.yon", "remote").
182
+ - **MUST NOT invent edge or subscription bullets.** `lyt mesh info` does not emit them. For pod-wide subscription overview use `/lyt-pod`; for cross-mesh edges, inspect `.lyt/mesh.yon` directly (out of scope for this skill).
183
+ - **MUST NOT shell-compose any verb invocation.** Argv-array always (parity with lyt-sync + lyt-search + lyt-primer-context + lyt-pod).
184
+
185
+ ## Companion skills
186
+
187
+ - **`/lyt-pod`** — pod-level overview across _all_ the user's meshes and vaults on this machine. Use when the user wants breadth (every mesh, every vault, orphans surfaced) rather than depth into one mesh.
188
+ - **`/lyt-search`** — query _content_ across the pod (or a single mesh / vault) via the tiered-cascade engine. Pair after `/lyt-mesh-explore` when the user has picked a mesh and now wants to look for specific content inside it (`lyt search "<q>" --mesh <name> --json`).
189
+ - **`/lyt-primer-context`** — prime an agent with Lyt-scoped context for a single vault (active arcs, writable status, primer files). Pair after `/lyt-mesh-explore` when the user picks a vault from this mesh's home-vaults list to start working in.
190
+ - **`/lyt-sync`** — pull/commit/push a vault. Run before `/lyt-mesh-explore` if the user has unpublished mesh-config edits and wants the `--remote` path to reflect them.
@@ -0,0 +1,71 @@
1
+ ---
2
+ name: lyt-pattern
3
+ description: >
4
+ Manage Lyt patterns from the agent harness — list/install/uninstall/link/unlink/fork/verbs/run via the `lyt pattern *` CLI verb set. Trigger when the user runs /lyt-pattern, or says "list my patterns", "install a pattern", "link this pattern into my vault", "fork this pattern", "run a pattern verb directly". Meta-skill: every other /lyt-* skill calls `lyt pattern run` under the hood; this skill exposes the full management surface.
5
+ visibility: public
6
+ lyt-version: 0.2.0
7
+ capabilities: [manage]
8
+ runtimes: [claude, codex, agents]
9
+ requires_writable_vault: false
10
+ ---
11
+
12
+ # /lyt-pattern
13
+
14
+ Manage Lyt patterns: install, link/unlink, fork for customization, list available verbs, and run verbs directly.
15
+
16
+ ## When to invoke
17
+
18
+ - `/lyt-pattern list` — show installed patterns
19
+ - `/lyt-pattern verbs <name>` — show a pattern's verbs
20
+ - `/lyt-pattern install --from <local-dir>` — install a custom pattern
21
+ - `/lyt-pattern link <name> --vault <v>` — symlink into a vault
22
+ - `/lyt-pattern fork <name> --as <new>` — customize without modifying the master
23
+ - `/lyt-pattern run <pattern> <verb> ...` — direct verb invocation (the other /lyt-\* skills are thin wrappers; this is the escape hatch)
24
+
25
+ ## When NOT to invoke
26
+
27
+ For the common write-a-Figment-of-type-X flow, use the dedicated skill:
28
+
29
+ - `/lyt-plan`, `/lyt-progress`, `/lyt-result`, `/lyt-retro`, `/lyt-insight`, `/lyt-handoff` (work-management)
30
+ - `/lyt-capture`, `/lyt-recall` (knowledge-capture)
31
+ - `/lyt-decision` (decision-log)
32
+
33
+ Use `/lyt-pattern` for pattern management itself OR for verbs that don't yet have a dedicated skill wrapper (e.g., `project-lifecycle/project-init`, `project-lifecycle/checkpoint`, `decision-log/rationale`).
34
+
35
+ ## The verb surface
36
+
37
+ ```bash
38
+ lyt pattern list [--vault <name>] [--json]
39
+ lyt pattern install --from <local-dir> [--as <name>] [--force]
40
+ lyt pattern uninstall <name> [--force]
41
+ lyt pattern link <name> --vault <vault-name>
42
+ lyt pattern unlink <name> --vault <vault-name>
43
+ lyt pattern fork <source> --as <name>
44
+ lyt pattern verbs <name> [--json]
45
+ lyt pattern run <pattern> <verb> --vault <v> [--project <p>] [--slug <s>] [--vars k=v...]
46
+ ```
47
+
48
+ ## Symlink + fork mechanics
49
+
50
+ Patterns live at `~/lyt/patterns/<name>/` (per-machine, per-user, like the registry). `pattern link` creates `<vault>/Patterns/<name>` as a junction symlink to the master. Symlinks are gitignored from vault repos — `lyt vault adopt` and `lyt vault join` auto-rebuild them per-machine.
51
+
52
+ To customize without touching the master, use `pattern fork`:
53
+
54
+ ```bash
55
+ lyt pattern fork work-management --as wm-custom
56
+ # edit ~/lyt/patterns/wm-custom/
57
+ lyt pattern unlink work-management --vault <v>
58
+ lyt pattern link wm-custom --vault <v>
59
+ ```
60
+
61
+ ## Version migration (v1 caveat)
62
+
63
+ Newer pattern versions replace the master at `~/lyt/patterns/<name>/`. Files already written from the old template are NOT migrated; the new template only affects NEW writes. (A `lyt pattern migrate` verb is post-v1.)
64
+
65
+ ## Verb-name conflicts
66
+
67
+ If two installed patterns both declare a `plan` verb, address via explicit qualification: `lyt pattern run work-management plan` (not just `lyt pattern run plan`). Skills wrap by pattern convention: `/lyt-plan` ties to work-management; a second pattern with `plan` would generate as `/lyt-<pattern2-id>-plan`.
68
+
69
+ ## Companion skills
70
+
71
+ All `/lyt-*` skills above are pattern-verb wrappers that this meta-skill manages.
@@ -0,0 +1,60 @@
1
+ ---
2
+ name: lyt-plan
3
+ description: >
4
+ Write a pre-action plan as a Lyt Figment. Trigger when the user runs /lyt-plan, or says "plan this", "write a plan", "design before coding", "let's plan first". Wraps `lyt pattern run work-management plan` under the hood. Writes to <vault>/Projects/<project>/work/<date>-plan-<slug>.md with frontmatter (date, slug, project, owner).
5
+ visibility: public
6
+ lyt-version: 0.2.0
7
+ capabilities: [write]
8
+ runtimes: [claude, codex, agents]
9
+ requires_writable_vault: true
10
+ ---
11
+
12
+ # /lyt-plan
13
+
14
+ Capture a pre-action plan as a structured Work-Management artifact in a Lyt vault. Plans answer: what are you about to do, why, how, and what does success look like.
15
+
16
+ ## When to invoke
17
+
18
+ When the user runs `/lyt-plan`, or says something like:
19
+
20
+ - "let's plan this out"
21
+ - "design before coding"
22
+ - "what's the plan"
23
+ - "write a plan for X"
24
+
25
+ ## Phase 1 — Resolve vault + project + slug
26
+
27
+ 1. **Vault resolution:** `--vault <name>` arg → `$LYT_ACTIVE_VAULT` env → cwd-based detection via `lyt vault info --by-path <cwd>` → default `<handle>/main`.
28
+ 2. **Project:** `--project <name>` arg → infer from current directory name → ask the user.
29
+ 3. **Slug:** ask the user, or generate from the plan's title (lowercase kebab-case, ≤7 words).
30
+
31
+ ## Phase 2 — Run the verb
32
+
33
+ Invoke the CLI:
34
+
35
+ ```
36
+ lyt pattern run work-management plan --vault <vault> --project <project> --slug <slug>
37
+ ```
38
+
39
+ The CLI fills frontmatter (`date`, `slug`, `project`, `owner`) and writes to the resolved path: `<vault>/Projects/<project>/work/<date>-plan-<slug>.md`.
40
+
41
+ If the file already exists, the CLI returns `ALREADY-EXISTS` and the path; do not overwrite. Append a `-2` slug or pick a different slug.
42
+
43
+ ## Phase 3 — Fill in the body
44
+
45
+ After the file is created, edit it to fill in:
46
+
47
+ - **Goal** — one-paragraph statement of intent
48
+ - **Background** — context, references, prior decisions
49
+ - **Approach** — steps, sequence, who/what does each
50
+ - **Risks + open questions**
51
+ - **Success criteria**
52
+ - **Estimate**
53
+
54
+ Use Obsidian-flavored markdown. Use `[[wikilinks]]` to cross-reference prior plans, results, or thoughts.
55
+
56
+ ## Companion skills
57
+
58
+ - `/lyt-progress` — mid-session status update on this plan
59
+ - `/lyt-result` — post-action outcome closing this plan
60
+ - `/lyt-retro` — deliberate retrospective after the plan executes