@skill-map/cli 0.67.0 → 0.68.1
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/cli/tutorial/sm-tutorial/SKILL.md +30 -23
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/agents-hub/providers/agent-skills/en/agents-hub.md +2 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/agents-hub/providers/agent-skills/es/agents-hub.md +2 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/content-editor-style/providers/agent-skills/en/content-editor-style.md +1 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/content-editor-style/providers/agent-skills/es/content-editor-style.md +1 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/agent-skills/en/todo-bullet-guideline.md +1 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/agent-skills/en/todo-bullet-guideline2.md +1 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/agent-skills/en/todo-bullet-skill.md +1 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/agent-skills/es/todo-bullet-guideline.md +1 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/agent-skills/es/todo-bullet-guideline2.md +1 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/agent-skills/es/todo-bullet-skill.md +1 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/manifest.json +9 -4
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/harness/providers/agent-skills/en/__PROVIDER__/skills/publish/SKILL.md +15 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/harness/providers/agent-skills/es/__PROVIDER__/skills/publish/SKILL.md +16 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/harness/providers/codex/en/__PROVIDER__/skills/publish/SKILL.md +15 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/harness/providers/codex/es/__PROVIDER__/skills/publish/SKILL.md +16 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/master/providers/agent-skills/en/__PROVIDER__/skills/master-agent/SKILL.md +13 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/master/providers/agent-skills/es/__PROVIDER__/skills/master-agent/SKILL.md +14 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/master/providers/codex/en/.codex/agents/master-agent.toml +10 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/master/providers/codex/es/.codex/agents/master-agent.toml +10 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/providers/agent-skills/en/AGENTS.md +7 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/providers/agent-skills/en/__PROVIDER__/skills/content-editor/SKILL.md +20 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/providers/agent-skills/es/AGENTS.md +7 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/providers/agent-skills/es/__PROVIDER__/skills/content-editor/SKILL.md +20 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/providers/agent-skills/shared/CLAUDE.md +1 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/providers/codex/en/.codex/agents/content-editor.toml +19 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/providers/codex/es/.codex/agents/content-editor.toml +19 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/providers/codex/en/.codex/agents/demo-agent.toml +13 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/providers/codex/en/__PROVIDER__/skills/demo-command/SKILL.md +11 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/providers/codex/es/.codex/agents/demo-agent.toml +13 -0
- package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/providers/codex/es/__PROVIDER__/skills/demo-command/SKILL.md +12 -0
- package/dist/cli/tutorial/sm-tutorial/references/_core.md +102 -49
- package/dist/cli/tutorial/sm-tutorial/references/_manifest.json +168 -20
- package/dist/cli/tutorial/sm-tutorial/references/_manifest.yml +85 -19
- package/dist/cli/tutorial/sm-tutorial/references/fixtures.md +6 -7
- package/dist/cli/tutorial/sm-tutorial/references/part-authoring.md +2 -2
- package/dist/cli/tutorial/sm-tutorial/references/part-basic-daily.md +241 -0
- package/dist/cli/tutorial/sm-tutorial/references/part-basic-fundamentals.md +351 -0
- package/dist/cli/tutorial/sm-tutorial/references/part-basic-kickoff.md +285 -0
- package/dist/cli/tutorial/sm-tutorial/references/part-cli.md +1 -1
- package/dist/cli/tutorial/sm-tutorial/references/part-daily-loop.md +62 -99
- package/dist/cli/tutorial/sm-tutorial/references/part-fundamentals.md +35 -34
- package/dist/cli/tutorial/sm-tutorial/references/part-mcp.md +3 -6
- package/dist/cli/tutorial/sm-tutorial/references/part-plugins.md +1 -1
- package/dist/cli/tutorial/sm-tutorial/references/part-project-kickoff.md +198 -26
- package/dist/cli/tutorial/sm-tutorial/references/part-settings.md +19 -15
- package/dist/cli/tutorial/sm-tutorial/scripts/fixtures.js +85 -22
- package/dist/cli/tutorial/sm-tutorial/scripts/lib/paths.js +74 -4
- package/dist/cli/tutorial/sm-tutorial/scripts/state.js +22 -6
- package/dist/cli.js +409 -168
- package/dist/conformance/index.js +42 -2
- package/dist/index.js +43 -30
- package/dist/kernel/index.d.ts +28 -5
- package/dist/kernel/index.js +43 -30
- package/dist/ui/chunk-22EQLC23.js +1845 -0
- package/dist/ui/chunk-3ANNEMV4.js +499 -0
- package/dist/ui/{chunk-5BJGO7GH.js → chunk-3U4QZKU2.js} +4 -4
- package/dist/ui/chunk-3ZAHOYQ7.js +1 -0
- package/dist/ui/{chunk-56CBK7LB.js → chunk-6FGV5O5J.js} +1 -1
- package/dist/ui/chunk-7WMT2LX4.js +1 -0
- package/dist/ui/{chunk-276RLZR4.js → chunk-BSIR3ADF.js} +14 -14
- package/dist/ui/{chunk-FC22ZJQZ.js → chunk-CG25RHMO.js} +1 -1
- package/dist/ui/chunk-EFSC6SOL.js +3 -0
- package/dist/ui/chunk-EJVWTBMV.js +4 -0
- package/dist/ui/chunk-EZI3BXQN.js +1 -0
- package/dist/ui/{chunk-JZ2YF7EL.js → chunk-GUPPOK7U.js} +8 -8
- package/dist/ui/{chunk-CJURGJTN.js → chunk-HLALESGR.js} +1 -1
- package/dist/ui/chunk-I3I4KHR5.js +2 -0
- package/dist/ui/{chunk-BOVJVOLH.js → chunk-I6ED2OW7.js} +1 -1
- package/dist/ui/chunk-JKPG5PO7.js +375 -0
- package/dist/ui/chunk-K3ZRQNN5.js +2 -0
- package/dist/ui/chunk-KHDWXSGR.js +1 -0
- package/dist/ui/{chunk-HEK4PH5A.js → chunk-KMHXNOFZ.js} +1 -1
- package/dist/ui/chunk-KWT7E2RJ.js +16 -0
- package/dist/ui/{chunk-WHZVGOS3.js → chunk-MQSU6EFZ.js} +1 -1
- package/dist/ui/{chunk-43S72FTV.js → chunk-OGEE252A.js} +1 -1
- package/dist/ui/{chunk-J4J42HJ4.js → chunk-PU5OP5RN.js} +1 -1
- package/dist/ui/{chunk-UTRZTB6V.js → chunk-QVG7J2MP.js} +1 -1
- package/dist/ui/chunk-TLMV4LOQ.js +3 -0
- package/dist/ui/chunk-TQBXK5JN.js +1 -0
- package/dist/ui/chunk-Z7SOKILO.js +2 -0
- package/dist/ui/{chunk-WCABR6TI.js → chunk-ZRJ5ZCFR.js} +1 -1
- package/dist/ui/index.html +2 -2
- package/dist/ui/main-R7BIU4HU.js +4 -0
- package/dist/ui/styles-VEGETYWD.css +1 -0
- package/package.json +17 -18
- package/dist/cli/tutorial/sm-tutorial/references/part-connect-harness.md +0 -173
- package/dist/ui/chunk-34ZZDYNQ.js +0 -1
- package/dist/ui/chunk-444BFYGR.js +0 -3
- package/dist/ui/chunk-44VNNUSQ.js +0 -2
- package/dist/ui/chunk-4SG4352Z.js +0 -7
- package/dist/ui/chunk-5ITZXW3A.js +0 -1
- package/dist/ui/chunk-7ANZW2OI.js +0 -499
- package/dist/ui/chunk-BJ6X6WBO.js +0 -4
- package/dist/ui/chunk-CZSLV6YD.js +0 -1
- package/dist/ui/chunk-DLYJHLJX.js +0 -2
- package/dist/ui/chunk-LGFABCIA.js +0 -16
- package/dist/ui/chunk-LPDD2DHE.js +0 -369
- package/dist/ui/chunk-P3SNMV4X.js +0 -2
- package/dist/ui/chunk-S4S5ZMXJ.js +0 -3
- package/dist/ui/chunk-VHEFRMK3.js +0 -1
- package/dist/ui/chunk-X6TRIDBI.js +0 -1845
- package/dist/ui/main-V77F2KZX.js +0 -4
- package/dist/ui/styles-I4ULXD3V.css +0 -1
- /package/dist/ui/{chunk-Y2Z26SRI.js → chunk-5RNLC6V4.js} +0 -0
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
The live-UI prologue: the tester runs `sm init`, opens the browser, and watches the map update in real time as files are written and edited. `pace: per-step` (one chapter per exchange; the chapter's own confirmation advances to the next, NO separate "¿seguimos?"), `preflight: taught-init` (the tester runs `sm init` as the first taught step, not pre-flight), and the chapters lay the basics fixture progressively, one node at a time. Shared conventions (tone, provider detection / substitution, the `> ` rendering rule, the per-step cycle) live in `_core.md`; do not restate them here.
|
|
4
4
|
|
|
5
|
+
**Codex deltas (rich track).** When `tutorial.provider == codex` the lay commands are unchanged (the `--only` ids match the Codex overlay), but the on-disk shapes differ; substitute in the tester-facing prose:
|
|
6
|
+
|
|
7
|
+
- `init`: the boot node `demo-agent` is a **TOML agent** at `.codex/agents/demo-agent.toml`.
|
|
8
|
+
- `kinds`: the node list reads `.codex/agents/demo-agent.toml` (agent), `.agents/skills/demo-command/SKILL.md` (Codex has no `command`, so this node is a **skill**), `.agents/skills/demo-skill/SKILL.md` (skill), and the `notes/*.md`. Name the kinds as agent + skill + markdown.
|
|
9
|
+
- `first-edit`: the description to edit lives in `.codex/agents/demo-agent.toml` (the `description = "…"` TOML field, not YAML frontmatter).
|
|
10
|
+
- `connectors` onward: identical, the `@`/`/` bullets resolve the same on Codex; only the `ignore` chapter's directory tree shows `.codex/agents/` + `.agents/skills/` instead of `.claude/`.
|
|
11
|
+
|
|
5
12
|
## Chapter `init` - Your first node (~2 min)
|
|
6
13
|
|
|
7
14
|
Agent background (do NOT render this as a separate context paragraph; the tester-facing version is folded into the message below): `sm init` creates a hidden `.skill-map/` folder in the cwd holding the database where skill-map stores what it learns about the project, and runs an initial scan (mandatory first step). Typing `sm` alone (no arguments) in an initialised dir then starts the UI server with the watcher built in (it is just an alias of `sm serve` with all defaults; the moment you need any flag you write `sm serve --flag ...` explicitly). One process, one terminal: it boots the server, scans the `.md` files, detects changes, and pushes events over WebSocket to the live UI. The next chapters all run against this same `sm` session, you boot it here and keep it alive through the `ignore` chapter.
|
|
@@ -38,7 +45,7 @@ Wait for confirmation. Mark `init`: done.
|
|
|
38
45
|
|
|
39
46
|
Leave the browser open and the terminal with `sm` running. You create five more nodes **without any cross-fixture links** yet, pure standalone nodes, so the tester sees five new nodes pop in. Three new **kinds** show up in this step (skill, command, markdown); the last two files are sibling `markdown` notes (`demo-guideline`, `demo-guideline2`) the hub in the `connectors` chapter reaches two ways, a bare mention that resolves to nothing (which lands as a broken reference, no arrow drawn) and the same handle plus `.md` that resolves to a real file (a solid arrow).
|
|
40
47
|
|
|
41
|
-
Lay these five files in one go (their content + translation live in `fixtures-data/`). The script resolves `__PROVIDER__`
|
|
48
|
+
Lay these five files in one go (their content + translation live in `fixtures-data/`). The script resolves `__PROVIDER__` to the claude layout (this is the rich track). Backstage (silent):
|
|
42
49
|
|
|
43
50
|
```
|
|
44
51
|
node .claude/skills/sm-tutorial/scripts/fixtures.js lay prologue --only "__PROVIDER__/skills/demo-skill/SKILL.md,__PROVIDER__/commands/demo-command.md,notes/todo.md,notes/demo-guideline.md,notes/demo-guideline2.md" --provider <provider> --lang <lang>
|
|
@@ -109,7 +116,7 @@ You edit `notes/todo.md` so it becomes the **hub** that points to each of the ot
|
|
|
109
116
|
|
|
110
117
|
Five bullets, three kinds: `invokes` and `mentions` each appear twice, `references` once. The last two bullets are the resolution lesson: a bare `@demo-guideline` mention (which resolves to no agent, so it lands as a broken reference and draws no arrow) next to `@demo-guideline2.md`, the same handle shape plus a `.md` extension that points at a real sibling file (so it resolves and draws a solid arrow). Two separate nodes, one broken and one resolved. Five bullets but only four arrows on the canvas.
|
|
111
118
|
|
|
112
|
-
Apply the hub bullets (their content + translation live in `fixtures-data/`). The edit appends after the `# Pending` heading
|
|
119
|
+
Apply the hub bullets (their content + translation live in `fixtures-data/`). The edit appends after the `# Pending` heading. Backstage (silent):
|
|
113
120
|
|
|
114
121
|
```
|
|
115
122
|
node .claude/skills/sm-tutorial/scripts/fixtures.js edit todo-connectors --provider <provider> --lang <lang>
|
|
@@ -145,14 +152,10 @@ Tell the tester:
|
|
|
145
152
|
> (That is also why `@demo-agent` drew fine: an `@name` mention
|
|
146
153
|
> resolves when an agent by that name really exists.)
|
|
147
154
|
>
|
|
148
|
-
>
|
|
149
|
-
>
|
|
150
|
-
>
|
|
151
|
-
>
|
|
152
|
-
> simple, a reference
|
|
153
|
-
> that resolves draws a solid arrow, a reference that points at
|
|
154
|
-
> nothing is not drawn at all and gets flagged instead. The exact
|
|
155
|
-
> per-link numbers live in the inspector, next chapter.
|
|
155
|
+
> 💡 Tip: if all these changes left the nodes crowded together, the
|
|
156
|
+
> map toolbar has a **Re-arrange layout** button: it tidies the
|
|
157
|
+
> layout so everything reads better. If you've moved nodes by hand it
|
|
158
|
+
> asks for confirmation first, otherwise it just re-arranges.
|
|
156
159
|
>
|
|
157
160
|
> Confirm when you see the four arrows plus the broken-reference
|
|
158
161
|
> marker on the hub. If an arrow is missing, refresh the browser and
|
|
@@ -164,12 +167,6 @@ Expected: four drawn arrows plus one `core/reference-broken` error on `notes/tod
|
|
|
164
167
|
|
|
165
168
|
The canvas only draws the resolved arrows; the full per-link breakdown, including the broken one that never drew, lives in the Inspector. Open it on the hub so the tester registers the surface before the `edit-link` chapter changes topology.
|
|
166
169
|
|
|
167
|
-
> 💡 Tip: if all these changes left the nodes crowded together, the
|
|
168
|
-
> map toolbar has a **Re-arrange layout** button (tooltip "Re-arrange
|
|
169
|
-
> the visible nodes"): it tidies the layout so everything reads
|
|
170
|
-
> better. If you've moved nodes by hand it asks for confirmation
|
|
171
|
-
> first, otherwise it just re-arranges.
|
|
172
|
-
>
|
|
173
170
|
> 🆕 Open the Inspector for **Demo TODO list** (click the node on
|
|
174
171
|
> the map). Find the **Connections** section: it has two sections,
|
|
175
172
|
> **Outgoing** and **Incoming**.
|
|
@@ -180,7 +177,7 @@ The canvas only draws the resolved arrows; the full per-link breakdown, includin
|
|
|
180
177
|
> confidence: the numeric value. Here you'll see the contrast, the
|
|
181
178
|
> `references` to `demo-guideline2` reads `1.00` (resolved), while the
|
|
182
179
|
> `mentions` to `demo-guideline` reads `0.50` and is marked broken,
|
|
183
|
-
> that 0.5 is the broken-reference penalty, not
|
|
180
|
+
> that 0.5 is the broken-reference penalty, not "half sure".
|
|
184
181
|
>
|
|
185
182
|
> Now open the Inspector for a couple of the nodes to read their
|
|
186
183
|
> Incoming count. The four resolved nodes (`demo-agent`,
|
|
@@ -189,6 +186,11 @@ The canvas only draws the resolved arrows; the full per-link breakdown, includin
|
|
|
189
186
|
> mention never landed on it, so nothing points in. Five outgoing
|
|
190
187
|
> links on the hub, but only four of them reach a node.
|
|
191
188
|
>
|
|
189
|
+
> 💡 Tip: skill-map draws each connector's **confidence** as opacity.
|
|
190
|
+
> Every arrow here is solid (1.00) because it lands on a real node; a
|
|
191
|
+
> reference that points at nothing is flagged instead of drawn. The
|
|
192
|
+
> fainter, partial case shows up later in the campaign.
|
|
193
|
+
>
|
|
192
194
|
> Let me know when you see it.
|
|
193
195
|
|
|
194
196
|
Mark `inspector`: done.
|
|
@@ -223,14 +225,12 @@ Once they confirm, the second edit fixes the broken reference. Tell the tester:
|
|
|
223
225
|
>
|
|
224
226
|
> Confirm when the new arrow is in and the red marker is gone.
|
|
225
227
|
|
|
226
|
-
You verify by reading `notes/todo.md` to confirm both edits landed (the `@demo-agent` bullet gone, `@demo-guideline` now `@demo-guideline.md`); the prologue's broken reference is now resolved.
|
|
228
|
+
You verify by reading `notes/todo.md` to confirm both edits landed (the `@demo-agent` bullet gone, `@demo-guideline` now `@demo-guideline.md`); the prologue's broken reference is now resolved. Once they confirm, leave the server running, the next chapter reuses it. Mark `edit-link`: done.
|
|
227
229
|
|
|
228
230
|
## Chapter `workspace` - Navigate the workspace (files, search, isolate) (~2 min)
|
|
229
231
|
|
|
230
232
|
**Context**: you've built the graph and understood it; this beat is about *moving around* it. The workspace has two halves: the **Map** you've been working in, and a **Files** panel, a folder tree of every node. You'll open that tree and filter it with the search box. The same `sm` session you booted back in the `init` chapter is still running.
|
|
231
233
|
|
|
232
|
-
Per §Provider detection, on `agent-skills` / Antigravity the fixture has fewer nodes (`demo-skill` plus the two `notes/` files), so swap the node names below for ones that exist in that set; the gestures are identical.
|
|
233
|
-
|
|
234
234
|
Walk the three tester actions below one at a time (open the Files
|
|
235
235
|
panel, then search, then isolate); each ends with its own
|
|
236
236
|
confirmation, so present one and wait for the tester before the next.
|
|
@@ -247,18 +247,20 @@ action itself.
|
|
|
247
247
|
> Tell me when the tree is open.
|
|
248
248
|
|
|
249
249
|
> At the top of that sidebar there's a search box (placeholder
|
|
250
|
-
> `Search…`). Type `guideline`. Watch
|
|
251
|
-
>
|
|
252
|
-
>
|
|
253
|
-
>
|
|
254
|
-
>
|
|
250
|
+
> `Search…`). Type `guideline`. Watch the tree narrow down to the
|
|
251
|
+
> two guideline nodes (`demo-guideline` and `demo-guideline2`). The
|
|
252
|
+
> search matches a node's name, path, or description, and filters
|
|
253
|
+
> live as you type, no Enter needed. The **Map** stays put: by
|
|
254
|
+
> default the search filters only the files list, not the map (the
|
|
255
|
+
> tip below changes that).
|
|
255
256
|
>
|
|
256
|
-
> Now clear the box. All six nodes come back
|
|
257
|
-
>
|
|
257
|
+
> Now clear the box. All six nodes come back in the tree. Confirm you
|
|
258
|
+
> saw it filter and then restore.
|
|
258
259
|
|
|
259
|
-
> Last one. In the tree, find the **Demo TODO
|
|
260
|
-
>
|
|
261
|
-
>
|
|
260
|
+
> Last one. In the tree, find the `notes/todo` row (the **Demo TODO
|
|
261
|
+
> list** hub, the tree labels rows by file name): at its right edge
|
|
262
|
+
> there's a small **sitemap** icon (its tooltip reads "Isolate this
|
|
263
|
+
> node and its direct links on the map"). Click it.
|
|
262
264
|
>
|
|
263
265
|
> The Map collapses to **Demo TODO list** plus only the nodes it
|
|
264
266
|
> draws an arrow to (`demo-command`, `demo-skill`,
|
|
@@ -271,10 +273,9 @@ action itself.
|
|
|
271
273
|
>
|
|
272
274
|
> 💡 Tip: remember the search box from a moment ago? The map-icon
|
|
273
275
|
> button right next to it controls whether the search also filters
|
|
274
|
-
> the **Map**. It's
|
|
275
|
-
>
|
|
276
|
-
>
|
|
277
|
-
> in place.
|
|
276
|
+
> the **Map**. It's off by default, which is why the **Map** stayed
|
|
277
|
+
> put while only the tree narrowed when you searched `guideline`.
|
|
278
|
+
> Click it on if you want a search to filter the map too.
|
|
278
279
|
>
|
|
279
280
|
> Did the map isolate and then restore?
|
|
280
281
|
|
|
@@ -27,12 +27,9 @@ an external service, not a file on disk). If several harness members
|
|
|
27
27
|
named the same server, skill-map would draw a single shared
|
|
28
28
|
`mcp://images` node, not one per caller.
|
|
29
29
|
|
|
30
|
-
**Preparation**: `Edit`
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
frontmatter the same way). Do NOT rewrite the file. Change only the
|
|
34
|
-
`tools:` line in the frontmatter so the MCP tool joins the existing
|
|
35
|
-
two:
|
|
30
|
+
**Preparation**: `Edit` `.claude/agents/content-editor.md`. Do NOT
|
|
31
|
+
rewrite the file. Change only the `tools:` line in the frontmatter so
|
|
32
|
+
the MCP tool joins the existing two:
|
|
36
33
|
|
|
37
34
|
```yaml
|
|
38
35
|
tools: [Read, Write, mcp__images__search]
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Part
|
|
1
|
+
# Part 3 (b): Extend skill-map - plugins (step library, `tour-*` ids)
|
|
2
2
|
|
|
3
3
|
Guided tour of the **built-in plugins** that ship with `sm`. Three
|
|
4
4
|
steps: a quick mental model of what plugins are plus a peek at
|
|
@@ -5,9 +5,13 @@ starts an actual project: a tiny personal **portfolio website**,
|
|
|
5
5
|
fully static, served by a ~15-line Express server, plus the
|
|
6
6
|
`.claude/` **harness** that maintains it. skill-map maps the harness
|
|
7
7
|
(the `.md` assets and how they reference each other); the site itself
|
|
8
|
-
is plain HTML the harness produces (the daily loop, Part
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
is plain HTML the harness produces (the daily loop, Part 2, runs and ships it).
|
|
9
|
+
This part runs end to end: it boots the project and grows its harness
|
|
10
|
+
members (the `kickoff` to `real-kinds` chapters), then wires them into a
|
|
11
|
+
connected graph, a link checker, a publish command, the handbook turned
|
|
12
|
+
hub, and a close-up on connector confidence (the `check-links` to
|
|
13
|
+
`confidence` chapters). `pace: per-step`, `preflight: portfolio-init`.
|
|
14
|
+
Shared conventions live in `_core.md`.
|
|
11
15
|
|
|
12
16
|
The orchestrator's `portfolio-init` pre-flight (backstage, silent)
|
|
13
17
|
has already laid the bare project skeleton before the tester runs
|
|
@@ -16,6 +20,27 @@ which are `.md`, so the scan ignores them), the portfolio
|
|
|
16
20
|
`.skillmapignore`, and the handbook `AGENTS.md` (the one boot node).
|
|
17
21
|
The chapters grow the harness from there.
|
|
18
22
|
|
|
23
|
+
**Codex deltas (rich track).** When `tutorial.provider == codex`:
|
|
24
|
+
|
|
25
|
+
- `kickoff` / `manual`: identical. A `.codex/` project resolves the `codex`
|
|
26
|
+
lens; `CLAUDE.md`'s `@AGENTS.md` reference resolves the same (Codex has the
|
|
27
|
+
`@`-directive). `AGENTS.md` is still the one boot node.
|
|
28
|
+
- `first-agent`: the `content-editor` is a **TOML agent** at
|
|
29
|
+
`.codex/agents/content-editor.toml`, not a `.claude/agents/*.md` file; point
|
|
30
|
+
the tester at the `.toml` if they want to peek. Its body references the style
|
|
31
|
+
guide from the start (baked into `developer_instructions`), so lay
|
|
32
|
+
`docs/STYLE.md` together with it (`fixtures.js lay portfolio --only
|
|
33
|
+
"__PROVIDER__/agents/content-editor.md,docs/STYLE.md" --provider codex …`,
|
|
34
|
+
the `--only` matches the TOML overlay by node id) so the
|
|
35
|
+
`content-editor -> docs/STYLE.md` arrow resolves immediately instead of
|
|
36
|
+
showing a transient broken-reference.
|
|
37
|
+
- `real-kinds`: Codex's kinds are `agent` (TOML) + `skill` + `markdown`, there is
|
|
38
|
+
no `command`. Lay only `docs/DEPLOY.md` here (STYLE landed in `first-agent`),
|
|
39
|
+
and name the kinds as agent + skill + markdown (the skill + the publish piece
|
|
40
|
+
arrive later in this part as skills).
|
|
41
|
+
- `publish`: Codex has no `command` kind, so the tester creates a **skill** at `.agents/skills/publish/SKILL.md` instead of `.claude/commands/publish.md`. The body is the Codex one (same `/check-links` + `@content-editor` + deploy reference); fetch it with `fixtures.js cat harness --file "__PROVIDER__/skills/publish/SKILL.md" --provider codex --lang <lang>`. Tell the tester they are creating a `skill` (one node, three connectors, same as the claude command). The fixture lays no `publish` for codex in this chapter (the tester authors it), so the `cat` is the source.
|
|
42
|
+
- `links`: the `content-editor-style` reference is baked into the Codex content-editor's TOML (`developer_instructions`) at lay time, so the `edit content-editor-style` step is a no-op on Codex, the `content-editor -> docs/STYLE.md` arrow is already drawn from earlier in this part. Run only `edit agents-hub` and narrate the two `AGENTS.md` arrows; mention the style-guide arrow as already present.
|
|
43
|
+
|
|
19
44
|
## Chapter `kickoff` - Start the portfolio (~2 min)
|
|
20
45
|
|
|
21
46
|
**Context**: same `sm init` the tester learned in the prologue, but
|
|
@@ -28,14 +53,13 @@ disk. The orchestrator's `portfolio-init` already cleared it during
|
|
|
28
53
|
pre-flight, so the tester sees only the portfolio. If anything demo
|
|
29
54
|
lingers, mention it once and move on.
|
|
30
55
|
|
|
31
|
-
**Context (agent, do not narrate the plumbing): the lens.**
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
lens prompt here.
|
|
56
|
+
**Context (agent, do not narrate the plumbing): the lens.** The skill
|
|
57
|
+
was scaffolded under `.claude/` (the `claude` marker, where the tutorial
|
|
58
|
+
skill itself lives), so `sm init` auto-detects the `claude` lens with no
|
|
59
|
+
prompt. The root `AGENTS.md` is the vendor-neutral handbook, NOT a lens
|
|
60
|
+
marker, so it never forces an ambiguous prompt. (This is the rich track;
|
|
61
|
+
a Codex project resolves the `codex` lens the same way from its
|
|
62
|
+
`.codex/` marker.) Do not promise the tester a lens prompt here.
|
|
39
63
|
|
|
40
64
|
```bash
|
|
41
65
|
sm init
|
|
@@ -49,9 +73,8 @@ Tell the tester:
|
|
|
49
73
|
> `.claude/` folder is the **harness** (the helpers that maintain the
|
|
50
74
|
> site). skill-map maps that harness.
|
|
51
75
|
>
|
|
52
|
-
> Run `sm init`, it auto-detects the `claude` lens
|
|
53
|
-
>
|
|
54
|
-
> live UI.
|
|
76
|
+
> Run `sm init`, it auto-detects the `claude` lens from the `.claude/`
|
|
77
|
+
> folder. Then run `sm` to boot the live UI.
|
|
55
78
|
>
|
|
56
79
|
> Open the URL `sm` printed. You'll see **one node**: `AGENTS.md`,
|
|
57
80
|
> the project's handbook (the operating manual for the site).
|
|
@@ -89,8 +112,7 @@ then render it in the fenced block the tester copies:
|
|
|
89
112
|
> as a file pointer (the same `@name.md` reference you met in the
|
|
90
113
|
> prologue), and since the handbook is right there
|
|
91
114
|
> the link resolves with full confidence. It tells anyone (and
|
|
92
|
-
> skill-map) that `CLAUDE.md` defers to the handbook.
|
|
93
|
-
> how this tool's own repo is wired.
|
|
115
|
+
> skill-map) that `CLAUDE.md` defers to the handbook.
|
|
94
116
|
>
|
|
95
117
|
> Did the connector light up?
|
|
96
118
|
|
|
@@ -99,9 +121,7 @@ Wait for confirmation. Mark `manual`: done.
|
|
|
99
121
|
## Chapter `first-agent` - The first harness agent (~2 min)
|
|
100
122
|
|
|
101
123
|
Lay the first harness agent (its content + translation live in
|
|
102
|
-
`fixtures-data/`).
|
|
103
|
-
`agent-skills` / Antigravity, which has no `agent` kind, adjust the
|
|
104
|
-
prose to the skill the set lays there. Backstage (silent):
|
|
124
|
+
`fixtures-data/`). Backstage (silent):
|
|
105
125
|
|
|
106
126
|
```
|
|
107
127
|
node .claude/skills/sm-tutorial/scripts/fixtures.js lay portfolio --only "__PROVIDER__/agents/content-editor.md" --provider <provider> --lang <lang>
|
|
@@ -111,8 +131,8 @@ Tell the tester:
|
|
|
111
131
|
|
|
112
132
|
> I added the first real member of your harness: an agent called
|
|
113
133
|
> `content-editor` (its job is to write the site's pages). A new
|
|
114
|
-
> `agent` node appeared on the map. Right now it stands alone; in
|
|
115
|
-
>
|
|
134
|
+
> `agent` node appeared on the map. Right now it stands alone; later in
|
|
135
|
+
> this part we wire it to the handbook and the style guide.
|
|
116
136
|
>
|
|
117
137
|
> 💡 Tip: I create these harness files for you. If you'd like to see
|
|
118
138
|
> what's inside, open `<provider_dir>/agents/content-editor.md` in your
|
|
@@ -147,14 +167,166 @@ Tell the tester:
|
|
|
147
167
|
> - **agent**: `content-editor` (does work on your behalf).
|
|
148
168
|
> - **markdown**: `AGENTS.md`, `CLAUDE.md`, the two docs (plain notes
|
|
149
169
|
> and manuals).
|
|
150
|
-
> - **skill** and **command**: you add these
|
|
151
|
-
> the publish command)
|
|
170
|
+
> - **skill** and **command**: you add these later in this part (the
|
|
171
|
+
> link checker and the publish command).
|
|
152
172
|
>
|
|
153
173
|
> Your handbook now has a real harness around it: a `content-editor`
|
|
154
174
|
> agent plus its docs, all on the map.
|
|
155
175
|
>
|
|
156
176
|
> See the agent and the docs in the map?
|
|
157
177
|
|
|
158
|
-
Wait for confirmation. Mark `real-kinds`: done.
|
|
159
|
-
|
|
160
|
-
|
|
178
|
+
Wait for confirmation. Mark `real-kinds`: done.
|
|
179
|
+
|
|
180
|
+
## Chapter `check-links` - The link checker (~3 min)
|
|
181
|
+
|
|
182
|
+
**Context**: the harness needs a guard that runs before publishing, a skill that checks the site's internal links resolve before it ships. We only create the `skill` node here; the `publish` command in the next chapter is its caller.
|
|
183
|
+
|
|
184
|
+
Lay the `check-links` skill (its content + translation live in
|
|
185
|
+
`fixtures-data/`; this kind exists on every provider, so no skip).
|
|
186
|
+
Backstage (silent):
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
node .claude/skills/sm-tutorial/scripts/fixtures.js lay harness --only "__PROVIDER__/skills/check-links/SKILL.md" --provider <provider> --lang <lang>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Tell the tester:
|
|
193
|
+
|
|
194
|
+
> So I added that guard: a skill called `check-links`. A new `skill`
|
|
195
|
+
> node appeared on the **Map**, alone for now; the next chapter gives
|
|
196
|
+
> it a caller.
|
|
197
|
+
>
|
|
198
|
+
> See the new skill node?
|
|
199
|
+
|
|
200
|
+
Wait for confirmation. Mark `check-links`: done.
|
|
201
|
+
|
|
202
|
+
## Chapter `publish` - The publish command (~4 min)
|
|
203
|
+
|
|
204
|
+
**Context**: this is the chapter where the graph comes alive. The `/publish` command ties three pieces together in one body: it invokes the link checker, mentions the content editor, and references the deploy runbook. Three connectors light up from a single new node, one per link syntax.
|
|
205
|
+
|
|
206
|
+
Tell the tester to create the file themselves (it is their project's file, Inviolable rule #2). Substitute `<provider_dir>` per `_core.md` in the path you give them. Backstage, get the content: `node .claude/skills/sm-tutorial/scripts/fixtures.js cat harness --file "__PROVIDER__/commands/publish.md" --provider <provider> --lang <lang>`, then render it as a **top-level fenced code block**: at column 0, NOT inside the `> ` blockquote and with NO leading indentation, so the tester's copy keeps every line flush left. The frontmatter fences (`---`) MUST land on column 0. If the block is rendered (or pasted) indented, the opening and closing `---` shift off column 0, the YAML never parses, and the `publish` node loads body-only without its `name` / `description` (`sm check` then warns `frontmatter-malformed`). Present the block below exactly as written.
|
|
207
|
+
|
|
208
|
+
> Create `.claude/commands/publish.md` with exactly this content (the first line is `---`, nothing before it):
|
|
209
|
+
|
|
210
|
+
```markdown
|
|
211
|
+
---
|
|
212
|
+
name: publish
|
|
213
|
+
description: |
|
|
214
|
+
Publishes the portfolio: runs the link check, hands off to the
|
|
215
|
+
content editor for any last fixes, then follows the deploy runbook.
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
# publish
|
|
219
|
+
|
|
220
|
+
The one command you run when the site is ready to go out.
|
|
221
|
+
|
|
222
|
+
## Steps
|
|
223
|
+
1. Run /check-links on the pages in public/. If it reports broken links, stop and fix them first.
|
|
224
|
+
2. If a page needs a content fix, brief @content-editor with the change.
|
|
225
|
+
3. Follow the [deploy runbook](../../docs/DEPLOY.md): regenerate pages, run the link check, start the server.
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
Continue the tester message:
|
|
229
|
+
|
|
230
|
+
> Save it. Watch the **Map**: **three** new arrows light up at once
|
|
231
|
+
> from the new `publish` node, and each one is a different colour
|
|
232
|
+
> because each one is a different kind of link:
|
|
233
|
+
>
|
|
234
|
+
> - `publish -> check-links` (kind: `invokes`), from the `/check-links`
|
|
235
|
+
> token in the body.
|
|
236
|
+
> - `publish -> content-editor` (kind: `mentions`), from the
|
|
237
|
+
> `@content-editor` token.
|
|
238
|
+
> - `publish -> docs/DEPLOY.md` (kind: `references`), from the
|
|
239
|
+
> `[deploy runbook](../../docs/DEPLOY.md)` markdown link.
|
|
240
|
+
>
|
|
241
|
+
> One node, three connectors, three link kinds. The harness is
|
|
242
|
+
> starting to look like a real graph.
|
|
243
|
+
>
|
|
244
|
+
> 💡 Tip: to tidy every node into a clean layout, click the
|
|
245
|
+
> **Re-arrange layout** button in the map toolbar. Handy whenever the
|
|
246
|
+
> graph starts to look crowded.
|
|
247
|
+
>
|
|
248
|
+
> Did the three arrows appear?
|
|
249
|
+
|
|
250
|
+
Wait for confirmation. You MAY use `Read` on the file afterwards to verify it landed, in particular that the opening and closing `---` are flush at column 0. If a later `sm check` flags `frontmatter-malformed` on `publish.md`, the fences got indented on paste: have the tester re-align every line flush left (strip the leading spaces so `---` is at column 0), then the next scan reads it clean. Mark `publish`: done.
|
|
251
|
+
|
|
252
|
+
## Chapter `links` - The handbook becomes the hub (~4 min)
|
|
253
|
+
|
|
254
|
+
**Context**: the handbook (`AGENTS.md`) has been a lonely node since the start of this part. Here it becomes the hub: we add two bullets so it mentions the content editor and invokes the publish command. We also give the content editor a reference to the style guide it follows. Several connectors land, and we recap the three link kinds and which syntax produced each.
|
|
255
|
+
|
|
256
|
+
Apply both edits (their content + translation live in `fixtures-data/`).
|
|
257
|
+
The first appends the two hub bullets to `AGENTS.md`; the second adds
|
|
258
|
+
the style-guide reference line to the content-editor. Backstage (silent):
|
|
259
|
+
|
|
260
|
+
```
|
|
261
|
+
node .claude/skills/sm-tutorial/scripts/fixtures.js edit agents-hub --provider <provider> --lang <lang>
|
|
262
|
+
node .claude/skills/sm-tutorial/scripts/fixtures.js edit content-editor-style --provider <provider> --lang <lang>
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
Tell the tester:
|
|
266
|
+
|
|
267
|
+
> Two edits, and the **Map** fills in. Your handbook (`AGENTS.md`) is
|
|
268
|
+
> now the hub: it points at the content editor and at the publish
|
|
269
|
+
> command. And the content editor now reaches the style guide it
|
|
270
|
+
> follows. New arrows:
|
|
271
|
+
>
|
|
272
|
+
> - `AGENTS.md -> content-editor` (kind: `mentions`), from `@content-editor`.
|
|
273
|
+
> - `AGENTS.md -> /publish` (kind: `invokes`), from `/publish`.
|
|
274
|
+
> - `content-editor -> docs/STYLE.md` (kind: `references`), from the
|
|
275
|
+
> `[style guide](../../docs/STYLE.md)` markdown link.
|
|
276
|
+
>
|
|
277
|
+
> Here is the whole recap of the three link kinds, one per syntax:
|
|
278
|
+
>
|
|
279
|
+
> - an `@handle` token is always a **mention**.
|
|
280
|
+
> - a `/slash` token is always an **invoke**.
|
|
281
|
+
> - a `[text](path.md)` markdown link is always a **reference**.
|
|
282
|
+
>
|
|
283
|
+
> The kind comes purely from how you wrote it. Your harness is wired
|
|
284
|
+
> end to end now: the handbook reaches the work, the work reaches the
|
|
285
|
+
> docs, and `/publish` pulls the whole publish flow together.
|
|
286
|
+
>
|
|
287
|
+
> Did the new arrows light up?
|
|
288
|
+
|
|
289
|
+
Wait for confirmation. You MAY use `Read` on the two files afterwards to verify the edits landed before moving on. Mark `links`: done.
|
|
290
|
+
|
|
291
|
+
## Chapter `confidence` - How sure is each link (~3 min)
|
|
292
|
+
|
|
293
|
+
No file edits in this chapter, pure observation on the graph the tester just built.
|
|
294
|
+
|
|
295
|
+
Tell the tester:
|
|
296
|
+
|
|
297
|
+
> Last beat of this part: how sure is skill-map about each connection?
|
|
298
|
+
> It records a **confidence** for every link and draws it as opacity:
|
|
299
|
+
> a link that resolves to a real node is solid (**1.00**), a link that
|
|
300
|
+
> does not lands fainter, so a glance at the **Map** separates the
|
|
301
|
+
> solid wiring from the problem links.
|
|
302
|
+
>
|
|
303
|
+
> Open the Inspector for the `publish` node (click it on the **Map**).
|
|
304
|
+
> Scroll down to the **Connections** panel and read the **Outgoing**
|
|
305
|
+
> rows. Each row shows the link kind and a confidence badge, and here
|
|
306
|
+
> every one reads **1.00**:
|
|
307
|
+
>
|
|
308
|
+
> - `publish -> docs/DEPLOY.md` (`references`) is a markdown link to a
|
|
309
|
+
> file that exists on disk, so skill-map is certain.
|
|
310
|
+
> - `publish -> content-editor` (`mentions`) resolves to the real
|
|
311
|
+
> content-editor agent, and `publish -> check-links` (`invokes`)
|
|
312
|
+
> resolves to the real check-links skill, so both are certain too.
|
|
313
|
+
>
|
|
314
|
+
> Your whole harness reads solid because every link lands on a real
|
|
315
|
+
> node, that is what a clean, fully wired graph looks like. So what
|
|
316
|
+
> does a link that does NOT resolve look like? You met one back in the
|
|
317
|
+
> prologue: `@demo-guideline` was a reference skill-map could not
|
|
318
|
+
> resolve, it had nothing to land on, so skill-map drew no arrow and
|
|
319
|
+
> flagged it as a **broken reference**, its confidence knocked down to
|
|
320
|
+
> **0.50** by the broken penalty. The fix was one character: adding
|
|
321
|
+
> `.md` (`@demo-guideline.md`) turned it into a file reference to the
|
|
322
|
+
> real `demo-guideline.md`, and it drew a solid arrow at **1.00**.
|
|
323
|
+
>
|
|
324
|
+
> **IMPORTANT:** why does confidence matter? It mirrors how the runtime itself
|
|
325
|
+
> resolves a reference: a deterministic name-and-path lookup, no guessing
|
|
326
|
+
> and no scanning the tree for a file under some other extension. That is
|
|
327
|
+
> cheaper and it does not fail, so the agent spends fewer tokens and less
|
|
328
|
+
> time, the same reason a clean, well-named harness is worth keeping.
|
|
329
|
+
>
|
|
330
|
+
> Do you see every badge reading 1.00 in the Inspector?
|
|
331
|
+
|
|
332
|
+
Wait for confirmation. Mark `confidence`: done. Last chapter of the part: apply §Closing a part (the close names the part by its title and routes back to the menu; do NOT lead into the next part from here).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# Part
|
|
1
|
+
# Part 3 (a): Extend skill-map - settings (step library, `settings-*` ids)
|
|
2
2
|
|
|
3
|
-
Step bodies for the settings chapters of Part
|
|
3
|
+
Step bodies for the settings chapters of Part 3 (config layers, the
|
|
4
4
|
`sm config` verbs, the active provider lens). The SKILL.md
|
|
5
5
|
orchestrator dispatches each `settings-*` chapter id here;
|
|
6
6
|
`authoring-*` ids it dispatches to `part-authoring.md`.
|
|
@@ -125,16 +125,19 @@ Mark `settings-2-resolve: done`.
|
|
|
125
125
|
|
|
126
126
|
**Context**: the single most consequential setting, the lens that
|
|
127
127
|
decides which provider types the project's files. It auto-detects and
|
|
128
|
-
never touches your `.md` files.
|
|
128
|
+
never touches your `.md` files. (Agent: substitute `<provider>` with
|
|
129
|
+
`tutorial.provider`, the lens this run was scaffolded for.)
|
|
129
130
|
|
|
130
131
|
> One setting earns its own step: the **active provider lens**. A
|
|
131
132
|
> skill-map project reads its files through exactly **one** provider
|
|
132
133
|
> at a time, and that lens decides how each file is interpreted, so
|
|
133
134
|
> the same files can read differently depending on which lens is active.
|
|
134
135
|
|
|
135
|
-
> The lens auto-detects on the first scan from
|
|
136
|
-
>
|
|
137
|
-
>
|
|
136
|
+
> The lens auto-detects on the first scan from the project's layout. A
|
|
137
|
+
> marker folder selects its lens: `.claude/` → `claude`, `.codex/` →
|
|
138
|
+
> `codex`, `.agent/workflows/` → `antigravity`; a project with only
|
|
139
|
+
> `.agents/skills/` and no vendor marker falls back to the open-standard
|
|
140
|
+
> `agent-skills` lens. Scan once and check where it landed:
|
|
138
141
|
|
|
139
142
|
```bash
|
|
140
143
|
sm scan
|
|
@@ -142,17 +145,18 @@ sm config get activeProvider
|
|
|
142
145
|
```
|
|
143
146
|
|
|
144
147
|
Expected: the scan prints a line like `Auto-detected activeProvider
|
|
145
|
-
=
|
|
146
|
-
.skill-map/settings.json`, and `get` then reports
|
|
148
|
+
= <provider> from filesystem markers; persisted to
|
|
149
|
+
.skill-map/settings.json`, and `get` then reports `<provider>`. The lens
|
|
147
150
|
is just a key in `settings.json`, persisted like any other setting.
|
|
148
151
|
|
|
149
|
-
>
|
|
150
|
-
> `agent-skills
|
|
151
|
-
>
|
|
152
|
-
>
|
|
153
|
-
>
|
|
154
|
-
>
|
|
155
|
-
>
|
|
152
|
+
> The other lenses are just as real: `claude` and the open-standard
|
|
153
|
+
> `agent-skills` are stable; `codex` (OpenAI) and `antigravity` (Google)
|
|
154
|
+
> are beta but ship enabled and auto-detect their own marker. The open
|
|
155
|
+
> `agent-skills` lens is the default a project falls back to when no
|
|
156
|
+
> vendor marker is present. The idea to keep: one project reads through
|
|
157
|
+
> exactly one lens at a time, chosen by `activeProvider`, and it is cheap
|
|
158
|
+
> to change later because the graph is always rebuilt from your files,
|
|
159
|
+
> never the other way around.
|
|
156
160
|
|
|
157
161
|
Mark `settings-3-lens: done`.
|
|
158
162
|
|