@skill-map/cli 0.53.6 → 0.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/tutorial/sm-tutorial/SKILL.md +22 -24
- package/dist/cli/tutorial/sm-tutorial/references/_core.md +8 -7
- package/dist/cli/tutorial/sm-tutorial/references/_manifest.yml +21 -42
- package/dist/cli/tutorial/sm-tutorial/references/fixtures.md +15 -7
- package/dist/cli/tutorial/sm-tutorial/references/part-authoring.md +2 -2
- package/dist/cli/tutorial/sm-tutorial/references/part-cli.md +1 -1
- package/dist/cli/tutorial/sm-tutorial/references/part-connect-harness.md +9 -10
- package/dist/cli/tutorial/sm-tutorial/references/part-daily-loop.md +563 -0
- package/dist/cli/tutorial/sm-tutorial/references/part-mcp.md +5 -1
- package/dist/cli/tutorial/sm-tutorial/references/part-plugins.md +7 -7
- package/dist/cli/tutorial/sm-tutorial/references/part-project-kickoff.md +24 -12
- package/dist/cli/tutorial/sm-tutorial/references/part-settings.md +2 -2
- package/dist/cli.js +1019 -718
- package/dist/index.js +129 -15
- package/dist/kernel/index.d.ts +209 -89
- package/dist/kernel/index.js +129 -15
- package/dist/migrations/001_initial.sql +6 -1
- package/dist/ui/chunk-CN6IOM67.js +2 -0
- package/dist/ui/chunk-HPKRDGLH.js +123 -0
- package/dist/ui/{chunk-NBXEOYS4.js → chunk-LREXXX7T.js} +1 -1
- package/dist/ui/{chunk-7OJPO3XD.js → chunk-RGB5FBZL.js} +31 -30
- package/dist/ui/{chunk-4CXAL43H.js → chunk-XAM6VKXM.js} +1 -1
- package/dist/ui/index.html +2 -2
- package/dist/ui/{main-O4DGYJ62.js → main-7YXBWYHE.js} +3 -3
- package/dist/ui/{styles-L6FZYH7X.css → styles-HRJG67XW.css} +1 -1
- package/migrations/001_initial.sql +6 -1
- package/package.json +2 -2
- package/dist/cli/tutorial/sm-tutorial/references/part-live-site.md +0 -155
- package/dist/cli/tutorial/sm-tutorial/references/part-maintain.md +0 -284
- package/dist/cli/tutorial/sm-tutorial/references/part-run-harness.md +0 -181
- package/dist/ui/chunk-HWQTV6ZL.js +0 -2
- package/dist/ui/chunk-PRP3JSUU.js +0 -123
|
@@ -0,0 +1,563 @@
|
|
|
1
|
+
# Part 3: The daily loop (step library, `daily-loop`)
|
|
2
|
+
|
|
3
|
+
The campaign's payoff and finale fused into one part: the tester operates the
|
|
4
|
+
harness they built the way they would on any normal day, **for real**. Three
|
|
5
|
+
acts: **add** content, **modify / improve** it (where skill-map earns its
|
|
6
|
+
keep), and **publish** it through the real pipeline. Every agent, skill, and
|
|
7
|
+
command runs for real, no role-play: the orchestrator invokes the
|
|
8
|
+
`content-editor` via the Task tool, and the publish + link-check flow actually
|
|
9
|
+
executes. `pace: auto-advance`, `preflight: seed` (`harness-connected`, so a
|
|
10
|
+
tester can jump straight here). Shared conventions (tone, provider detection /
|
|
11
|
+
substitution, the `> ` rendering rule, the per-step cycle, §Closing a part,
|
|
12
|
+
§Final wrap-up) live in `_core.md`; do not restate them.
|
|
13
|
+
|
|
14
|
+
**The site is the tester's.** The `setup` chapter asks who it is for and builds
|
|
15
|
+
it around that answer. Identity lives in Layer 2 (the HTML / CSS under
|
|
16
|
+
`public/`), which skill-map does not map, so the graph stays identical no matter
|
|
17
|
+
what the tester names their portfolio. Persist the answer in `tutorial-state.yml`
|
|
18
|
+
under `tester.site_identity` (`{ name, tagline }`).
|
|
19
|
+
|
|
20
|
+
**Provider note (read once).** Substitute `.claude/` with the detected
|
|
21
|
+
`<provider_dir>`. On `agent-skills` / Antigravity the `content-editor` is a
|
|
22
|
+
**skill**, not an agent (invoke it as a skill); there is no `command` kind, so
|
|
23
|
+
the `reserved` chapter is skipped and the `broken-ref` / `publish` chapters use
|
|
24
|
+
their agent-skills variant (notes inline).
|
|
25
|
+
|
|
26
|
+
**Real-execution contract (read once).** When invoking the `content-editor` via
|
|
27
|
+
the Task tool, instruct it explicitly to write ONLY `.html` files under
|
|
28
|
+
`public/`, to NOT create any `.md` file, and to NOT touch the harness or its own
|
|
29
|
+
definition. After it runs, `Read` what it wrote before telling the tester what
|
|
30
|
+
landed (this keeps the node-count promises honest). If the subagent is not
|
|
31
|
+
invocable in the tester's setup, act as the `content-editor` yourself following
|
|
32
|
+
its rules and `docs/STYLE.md`, so the beat still lands.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
**Act A - Add**
|
|
37
|
+
|
|
38
|
+
## Chapter `setup` - Make it yours, make it presentable (~3 min)
|
|
39
|
+
|
|
40
|
+
**Context**: the harness is wired (you built it in the earlier parts). Now you
|
|
41
|
+
put it to work on a real day. First, make the site yours and give it a look you
|
|
42
|
+
would not be embarrassed to share. The honest beat: the HTML and CSS are
|
|
43
|
+
Layer 2 (the harness's output); skill-map maps the harness (Layer 1, the `.md`
|
|
44
|
+
files), so the site landing on disk does NOT move the graph, and that is
|
|
45
|
+
correct, not a bug.
|
|
46
|
+
|
|
47
|
+
**Preparation**:
|
|
48
|
+
|
|
49
|
+
1. Ask the tester, in one short exchange: what the site should be called (their
|
|
50
|
+
name or a title) and one line about what it is for. Keep it light; if they do
|
|
51
|
+
not care, offer defaults ("My Portfolio" / "Small, sturdy things on the
|
|
52
|
+
web"). Save both into `tutorial-state.yml` under `tester.site_identity`
|
|
53
|
+
(`{ name, tagline }`).
|
|
54
|
+
2. Backstage, `Write` `public/style.css` exactly as below (Layer 2, ignored by
|
|
55
|
+
the scan; one stylesheet shared by every page).
|
|
56
|
+
3. `Write` `public/index.html` and `public/about.html` from the templates below,
|
|
57
|
+
substituting the identity. These overwrite the placeholder `public/index.html`
|
|
58
|
+
the kickoff left.
|
|
59
|
+
|
|
60
|
+
`public/style.css`:
|
|
61
|
+
```css
|
|
62
|
+
:root {
|
|
63
|
+
--bg: #fbfbfa; --surface: #fff; --ink: #1a1a1a; --ink-soft: #585858;
|
|
64
|
+
--accent: #3b5bdb; --border: #e7e7e3; --radius: 10px; --maxw: 46rem;
|
|
65
|
+
}
|
|
66
|
+
@media (prefers-color-scheme: dark) {
|
|
67
|
+
:root {
|
|
68
|
+
--bg: #14151a; --surface: #1c1e26; --ink: #f0f0f2; --ink-soft: #a0a3ad;
|
|
69
|
+
--accent: #8aa1ff; --border: #2a2d38;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
* { box-sizing: border-box; }
|
|
73
|
+
body {
|
|
74
|
+
margin: 0; background: var(--bg); color: var(--ink); line-height: 1.65;
|
|
75
|
+
font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
|
|
76
|
+
-webkit-font-smoothing: antialiased;
|
|
77
|
+
}
|
|
78
|
+
.wrap { max-width: var(--maxw); margin: 0 auto; padding: 0 1.25rem; }
|
|
79
|
+
header.site { border-bottom: 1px solid var(--border); padding: 1.4rem 0; margin-bottom: 2.5rem; }
|
|
80
|
+
header.site .wrap { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; flex-wrap: wrap; }
|
|
81
|
+
.brand { font-weight: 700; font-size: 1.15rem; letter-spacing: -0.01em; text-decoration: none; color: var(--ink); }
|
|
82
|
+
nav a { color: var(--ink-soft); text-decoration: none; margin-left: 1.25rem; font-size: 0.95rem; transition: color 0.15s ease; }
|
|
83
|
+
nav a:hover { color: var(--accent); }
|
|
84
|
+
main { padding-bottom: 4rem; }
|
|
85
|
+
h1 { font-size: 2.4rem; line-height: 1.1; letter-spacing: -0.02em; margin: 0 0 0.4rem; }
|
|
86
|
+
h2 { font-size: 1.3rem; margin: 2.5rem 0 0.75rem; letter-spacing: -0.01em; }
|
|
87
|
+
.tagline { font-size: 1.2rem; color: var(--ink-soft); margin: 0 0 2rem; }
|
|
88
|
+
p { margin: 0 0 1.1rem; }
|
|
89
|
+
a { color: var(--accent); }
|
|
90
|
+
ul.cards { list-style: none; padding: 0; display: grid; gap: 1rem; }
|
|
91
|
+
ul.cards li { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.1rem 1.25rem; }
|
|
92
|
+
ul.cards h3 { margin: 0 0 0.3rem; font-size: 1.05rem; }
|
|
93
|
+
ul.cards p { margin: 0; color: var(--ink-soft); font-size: 0.95rem; }
|
|
94
|
+
footer.site { border-top: 1px solid var(--border); padding: 2rem 0; color: var(--ink-soft); font-size: 0.9rem; }
|
|
95
|
+
@media (max-width: 30rem) {
|
|
96
|
+
h1 { font-size: 1.9rem; }
|
|
97
|
+
header.site .wrap { flex-direction: column; gap: 0.5rem; }
|
|
98
|
+
nav a { margin: 0 1.25rem 0 0; }
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
`public/index.html` (substitute `[NAME]`, `[TAGLINE]`, `[INTRO]` with the identity):
|
|
103
|
+
```html
|
|
104
|
+
<!doctype html>
|
|
105
|
+
<html lang="en">
|
|
106
|
+
<head>
|
|
107
|
+
<meta charset="utf-8" />
|
|
108
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
109
|
+
<title>[NAME]</title>
|
|
110
|
+
<link rel="stylesheet" href="/style.css" />
|
|
111
|
+
</head>
|
|
112
|
+
<body>
|
|
113
|
+
<header class="site">
|
|
114
|
+
<div class="wrap">
|
|
115
|
+
<a class="brand" href="/">[NAME]</a>
|
|
116
|
+
<nav>
|
|
117
|
+
<a href="/">Home</a>
|
|
118
|
+
<a href="/about.html">About</a>
|
|
119
|
+
</nav>
|
|
120
|
+
</div>
|
|
121
|
+
</header>
|
|
122
|
+
<main class="wrap">
|
|
123
|
+
<h1>[NAME]</h1>
|
|
124
|
+
<p class="tagline">[TAGLINE]</p>
|
|
125
|
+
<p>[INTRO]</p>
|
|
126
|
+
</main>
|
|
127
|
+
<footer class="site"><div class="wrap">© [NAME]</div></footer>
|
|
128
|
+
</body>
|
|
129
|
+
</html>
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
`public/about.html` (same shell, substitute `[NAME]` and a short `[ABOUT]`):
|
|
133
|
+
```html
|
|
134
|
+
<!doctype html>
|
|
135
|
+
<html lang="en">
|
|
136
|
+
<head>
|
|
137
|
+
<meta charset="utf-8" />
|
|
138
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
139
|
+
<title>About · [NAME]</title>
|
|
140
|
+
<link rel="stylesheet" href="/style.css" />
|
|
141
|
+
</head>
|
|
142
|
+
<body>
|
|
143
|
+
<header class="site">
|
|
144
|
+
<div class="wrap">
|
|
145
|
+
<a class="brand" href="/">[NAME]</a>
|
|
146
|
+
<nav>
|
|
147
|
+
<a href="/">Home</a>
|
|
148
|
+
<a href="/about.html">About</a>
|
|
149
|
+
</nav>
|
|
150
|
+
</div>
|
|
151
|
+
</header>
|
|
152
|
+
<main class="wrap">
|
|
153
|
+
<h1>About</h1>
|
|
154
|
+
<p>[ABOUT]</p>
|
|
155
|
+
</main>
|
|
156
|
+
<footer class="site"><div class="wrap">© [NAME]</div></footer>
|
|
157
|
+
</body>
|
|
158
|
+
</html>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Then tell the tester to serve it (the tester runs these; do not run them):
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
npm install
|
|
165
|
+
node server.js
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
> Your portfolio has a face now. `npm install` pulls the one small library the
|
|
169
|
+
> server needs (Express, on the Node you already have), and `node server.js`
|
|
170
|
+
> starts it and prints a line like `Listening on http://localhost:3000`.
|
|
171
|
+
>
|
|
172
|
+
> Open `http://localhost:3000`: there is your site, named after you, with a
|
|
173
|
+
> clean layout. Click **About** and back to **Home**.
|
|
174
|
+
>
|
|
175
|
+
> Now glance at the Map: it did not move. Everything you watched grow on the
|
|
176
|
+
> canvas is your harness, the `.md` files and how they reference each other
|
|
177
|
+
> (Layer 1). The pages and the stylesheet are Layer 2, what the harness
|
|
178
|
+
> produces, and skill-map maps the harness, not its output. Two layers, one
|
|
179
|
+
> project.
|
|
180
|
+
>
|
|
181
|
+
> Does the site load and look clean?
|
|
182
|
+
|
|
183
|
+
Wait for confirmation. Mark `setup`: done. Auto-advance to `add-page`.
|
|
184
|
+
|
|
185
|
+
## Chapter `add-page` - Add a page with your agent (~4 min)
|
|
186
|
+
|
|
187
|
+
**Context**: the daily move. You want a new page, so you ask your
|
|
188
|
+
`content-editor` to write it. This is the first time it runs **for real** (no
|
|
189
|
+
more playing the agent). It reads `docs/STYLE.md` and the shared stylesheet and
|
|
190
|
+
writes a new page into `public/`. The graph does not move (HTML is Layer 2).
|
|
191
|
+
|
|
192
|
+
**Preparation**: none until the tester asks.
|
|
193
|
+
|
|
194
|
+
Tell the tester:
|
|
195
|
+
|
|
196
|
+
> Your turn to delegate, the way you would on a real day. Tell me what page to
|
|
197
|
+
> add, in your own words, for example "add a projects page" or "add a page about
|
|
198
|
+
> my talks". I'll hand it to your `content-editor` agent and let it write the
|
|
199
|
+
> page.
|
|
200
|
+
|
|
201
|
+
When the tester answers, invoke the project's `content-editor` (the
|
|
202
|
+
`<provider_dir>/agents/content-editor.md` agent, or the skill on `agent-skills`)
|
|
203
|
+
via the Task tool, honouring the real-execution contract above: write ONE new
|
|
204
|
+
`.html` page under `public/` named after the topic (default `public/projects.html`),
|
|
205
|
+
following the agent's own steps and `docs/STYLE.md` (the shared shell, link
|
|
206
|
+
`/style.css`, one `<h1>`, a nav link back to Home), and add the new page to the
|
|
207
|
+
home nav. Do NOT write any `.md`, do NOT touch the harness. Then `Read` the file
|
|
208
|
+
it produced.
|
|
209
|
+
|
|
210
|
+
> Your `content-editor` ran for real and wrote `public/projects.html`, linked
|
|
211
|
+
> from the home nav. Refresh the site: the new page is there, in the same style
|
|
212
|
+
> as the rest.
|
|
213
|
+
>
|
|
214
|
+
> Now glance at the Map: same nodes as before, nothing new. The page is Layer 2
|
|
215
|
+
> output; the harness on the canvas is Layer 1. Your nodes are not a diagram,
|
|
216
|
+
> they are runnable, and you just ran one.
|
|
217
|
+
>
|
|
218
|
+
> See the new page on the site, and the Map unchanged?
|
|
219
|
+
|
|
220
|
+
Wait for confirmation. Mark `add-page`: done. Auto-advance to `orphan-draft`.
|
|
221
|
+
|
|
222
|
+
## Chapter `orphan-draft` - A page nobody links to yet (~2 min)
|
|
223
|
+
|
|
224
|
+
**Context**: mid-day you jot an idea for the next page but do not wire it up yet.
|
|
225
|
+
skill-map shows it as an **orphan**: a real node with nothing pointing at it.
|
|
226
|
+
|
|
227
|
+
**Preparation**: `Write` `docs/draft.md` (markdown kind):
|
|
228
|
+
```markdown
|
|
229
|
+
---
|
|
230
|
+
name: draft
|
|
231
|
+
description: |
|
|
232
|
+
A rough idea for the next page. Not linked from anywhere yet.
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
# Draft
|
|
236
|
+
|
|
237
|
+
Notes toward a posts page. Nothing wired up.
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Tell the tester to run:
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
sm scan
|
|
244
|
+
sm show docs/draft.md
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
> A new `docs/draft` node appeared on the Map as a floating dot, no arrows in or
|
|
248
|
+
> out. `sm show docs/draft.md` has no "Links in" section: nothing references it.
|
|
249
|
+
> That is an **orphan**, a valid node with no incoming links.
|
|
250
|
+
>
|
|
251
|
+
> An orphan is NOT an error: run `sm check` and the harness still reads clean.
|
|
252
|
+
> It is just a node nobody points at yet. Keep three ideas apart: an **orphan**
|
|
253
|
+
> (a real node, no incoming link), a **broken reference** (a link with no target
|
|
254
|
+
> on the other end), and an **issue** (a rule violation `sm check` flags). You
|
|
255
|
+
> will meet the other two in a moment.
|
|
256
|
+
>
|
|
257
|
+
> See the floating dot, and the empty "Links in"?
|
|
258
|
+
|
|
259
|
+
Wait for confirmation. Mark `orphan-draft`: done. Auto-advance to `wire-and-improve`.
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
**Act B - Modify / improve**
|
|
264
|
+
|
|
265
|
+
## Chapter `wire-and-improve` - Wire the draft in (~3 min)
|
|
266
|
+
|
|
267
|
+
**Context**: you turn the draft into a real page and link it, so it stops being
|
|
268
|
+
an orphan. Two moves: the `content-editor` writes the actual page (Layer 2), and
|
|
269
|
+
you add a link to the draft note from the handbook (Layer 1), which gives the
|
|
270
|
+
orphan an incoming edge.
|
|
271
|
+
|
|
272
|
+
**Preparation**: invoke the `content-editor` via the Task tool (real-execution
|
|
273
|
+
contract) to write `public/posts.html` from the draft idea (a couple of short
|
|
274
|
+
sample posts, shared shell, nav link back to Home). `Read` it afterwards.
|
|
275
|
+
|
|
276
|
+
Then tell the tester to wire the note in (their file, Inviolable rule #2):
|
|
277
|
+
|
|
278
|
+
> Two moves to close the loop on that draft. First, I had your `content-editor`
|
|
279
|
+
> turn it into a real page: `public/posts.html` now exists (Layer 2, so the Map
|
|
280
|
+
> stays put for it). Second, your turn: open `AGENTS.md` and add this line to
|
|
281
|
+
> the body, so the handbook actually points at the draft note:
|
|
282
|
+
>
|
|
283
|
+
> ```markdown
|
|
284
|
+
> - The next page started as notes in [draft](docs/draft.md).
|
|
285
|
+
> ```
|
|
286
|
+
>
|
|
287
|
+
> Save it, then re-scan and look at the draft again:
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
sm scan
|
|
291
|
+
sm show docs/draft.md
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
> `docs/draft` is no longer an orphan: `sm show` now lists `Links in (1)
|
|
295
|
+
> ← references AGENTS.md`, and on the Map the floating dot is connected to the
|
|
296
|
+
> handbook. One incoming link is all it took to fold it into the graph.
|
|
297
|
+
>
|
|
298
|
+
> Did the draft connect to the handbook?
|
|
299
|
+
|
|
300
|
+
Wait for confirmation. Mark `wire-and-improve`: done. Auto-advance to `broken-ref`.
|
|
301
|
+
|
|
302
|
+
## Chapter `broken-ref` - A rename breaks a link (~4 min)
|
|
303
|
+
|
|
304
|
+
**Context**: real reorganizing breaks things, and this is where skill-map earns
|
|
305
|
+
its keep. You rename a doc, and a link that pointed at the old name goes stale.
|
|
306
|
+
skill-map catches it the moment you re-scan.
|
|
307
|
+
|
|
308
|
+
On `agent-skills` / Antigravity there is no `/publish` command holding the deploy
|
|
309
|
+
link; use the variant in the note at the end of this chapter (rename
|
|
310
|
+
`docs/STYLE.md` to break the `content-editor`'s style-guide reference instead).
|
|
311
|
+
|
|
312
|
+
**Preparation**: none (the tester drives).
|
|
313
|
+
|
|
314
|
+
Tell the tester to rename the deploy runbook (their file):
|
|
315
|
+
|
|
316
|
+
```bash
|
|
317
|
+
mv docs/DEPLOY.md docs/DEPLOYMENT.md
|
|
318
|
+
sm scan
|
|
319
|
+
sm check
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
> You renamed the deploy runbook, but `/publish` still links to the old path.
|
|
323
|
+
> `sm check` flags it:
|
|
324
|
+
>
|
|
325
|
+
> ```
|
|
326
|
+
> sm check: 1 error
|
|
327
|
+
>
|
|
328
|
+
> .claude/commands/publish.md
|
|
329
|
+
> ✕ reference-broken Broken references reference → docs/DEPLOY.md
|
|
330
|
+
> ```
|
|
331
|
+
>
|
|
332
|
+
> That is the `reference-broken` analyzer: a link whose target no longer exists.
|
|
333
|
+
> On the Map the `publish → docs/DEPLOY.md` arrow has gone faint. `sm check` runs
|
|
334
|
+
> the full analyzer catalogue (around a dozen rules); to narrow it to one rule:
|
|
335
|
+
|
|
336
|
+
```bash
|
|
337
|
+
sm check --analyzers reference-broken
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
> Now fix it the way you would for real: open `.claude/commands/publish.md` and
|
|
341
|
+
> point the deploy-runbook link at `docs/DEPLOYMENT.md` (the new name). Then
|
|
342
|
+
> re-scan and re-check:
|
|
343
|
+
|
|
344
|
+
```bash
|
|
345
|
+
sm scan
|
|
346
|
+
sm check
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
> `✓ No issues`. The arrow is solid again. That is the daily safety net: rename
|
|
350
|
+
> and move things freely, and skill-map tells you exactly what you forgot to
|
|
351
|
+
> update, before it ships broken.
|
|
352
|
+
>
|
|
353
|
+
> Did `sm check` go from 1 error back to clean?
|
|
354
|
+
|
|
355
|
+
Wait for confirmation. The harness MUST read `✓ No issues` before Act C (the
|
|
356
|
+
real `/publish` later follows this runbook). Mark `broken-ref`: done.
|
|
357
|
+
Auto-advance to `reserved`.
|
|
358
|
+
|
|
359
|
+
On `agent-skills` / Antigravity (no `command` kind), run the same beat on a link
|
|
360
|
+
that exists there: `mv docs/STYLE.md docs/STYLE-GUIDE.md`, which breaks the
|
|
361
|
+
`content-editor` skill's `[style guide]` reference; `sm check` flags
|
|
362
|
+
`reference-broken` on the `content-editor`; fix the link in the skill body and
|
|
363
|
+
re-check to clean.
|
|
364
|
+
|
|
365
|
+
## Chapter `reserved` - A reserved name collides (~2 min)
|
|
366
|
+
|
|
367
|
+
**Context**: you add a quick command to scaffold new pages and, without
|
|
368
|
+
thinking, name it `init`, a name Claude Code already owns for its own slash
|
|
369
|
+
command. skill-map warns you before the runtime silently ignores your file.
|
|
370
|
+
|
|
371
|
+
On `agent-skills` / Antigravity there is no `command` kind: **skip this chapter**
|
|
372
|
+
and fold a one-line mention ("skill-map also warns when a file's name collides
|
|
373
|
+
with a runtime built-in") into the close of the previous chapter. Adjust the
|
|
374
|
+
section's chapter count accordingly.
|
|
375
|
+
|
|
376
|
+
**Preparation**: `Write` `.claude/commands/init.md`:
|
|
377
|
+
```markdown
|
|
378
|
+
---
|
|
379
|
+
name: init
|
|
380
|
+
description: |
|
|
381
|
+
Scaffolds a new empty page in public/ from the shared template.
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
# init
|
|
385
|
+
|
|
386
|
+
Creates a blank page so you can start writing.
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
Tell the tester to scan and check:
|
|
390
|
+
|
|
391
|
+
```bash
|
|
392
|
+
sm scan
|
|
393
|
+
sm check
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
> `sm check` warns:
|
|
397
|
+
>
|
|
398
|
+
> ```
|
|
399
|
+
> sm check: 1 warning
|
|
400
|
+
>
|
|
401
|
+
> .claude/commands/init.md
|
|
402
|
+
> ⚠ name-reserved .claude/commands/init.md shadows a built-in claude command. The runtime ignores this file in favour of its own built-in. Rename the file or `frontmatter.name` to a non-reserved value.
|
|
403
|
+
> ```
|
|
404
|
+
>
|
|
405
|
+
> `init` is one of Claude Code's own slash commands (like `/help`, `/clear`,
|
|
406
|
+
> `/config`), so your file would be silently ignored, it never runs. The fix is
|
|
407
|
+
> to give it a name the runtime does not own.
|
|
408
|
+
|
|
409
|
+
Rename the command to `new-page`: rename the file `.claude/commands/init.md` to
|
|
410
|
+
`.claude/commands/new-page.md`, AND change `frontmatter.name` to `new-page` and
|
|
411
|
+
the H1 to `# new-page` (a command's H1 stays a plain title, never `# /new-page`).
|
|
412
|
+
Then have the tester re-scan and re-check:
|
|
413
|
+
|
|
414
|
+
```bash
|
|
415
|
+
sm scan
|
|
416
|
+
sm check
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
> `✓ No issues`. Notice what cleared the warning: changing the **name**, not
|
|
420
|
+
> just the filename. The reserved check looks at the command's name (its
|
|
421
|
+
> `frontmatter.name`), which is why the warning told you to rename "the file or
|
|
422
|
+
> `frontmatter.name`". Now `new-page` is yours and the runtime will actually run
|
|
423
|
+
> it.
|
|
424
|
+
>
|
|
425
|
+
> Did the warning clear after the rename?
|
|
426
|
+
|
|
427
|
+
Wait for confirmation. Mark `reserved`: done. Auto-advance to `publish`.
|
|
428
|
+
|
|
429
|
+
---
|
|
430
|
+
|
|
431
|
+
**Act C - Publish**
|
|
432
|
+
|
|
433
|
+
## Chapter `publish` - Ship it: run /publish for real (~4 min)
|
|
434
|
+
|
|
435
|
+
**Context**: the harness is not a picture, it is a set of instructions, and
|
|
436
|
+
`/publish` ties them together. You run it **for real** now: it invokes the link
|
|
437
|
+
checker over your pages, briefs the `content-editor` if anything needs a fix,
|
|
438
|
+
then follows the deploy runbook. This is the same Layer 1 / Layer 2 split, the
|
|
439
|
+
pages are output, so the Map stays put while the pipeline runs.
|
|
440
|
+
|
|
441
|
+
On `agent-skills` / Antigravity there is no `/publish` command: run the
|
|
442
|
+
`check-links` skill directly over `public/`, then follow `docs/DEPLOYMENT.md` by
|
|
443
|
+
hand. Everything else in this chapter is identical.
|
|
444
|
+
|
|
445
|
+
**Preparation**: make sure the pages exist (`index`, `about`, `projects`,
|
|
446
|
+
`posts` from the earlier chapters; lay any that are missing from the templates in
|
|
447
|
+
`setup`). When the tester asks to publish, **execute the publish flow for real**
|
|
448
|
+
by following `.claude/commands/publish.md`: run the `check-links` logic over
|
|
449
|
+
every `.html` under `public/` (does each internal `href` resolve to a file that
|
|
450
|
+
exists?); if any link is broken, brief the `content-editor` to fix it and
|
|
451
|
+
re-run the check; then walk the deploy runbook steps. Do not role-play it.
|
|
452
|
+
|
|
453
|
+
Tell the tester:
|
|
454
|
+
|
|
455
|
+
> The site is ready. Tell me to publish (or type `/publish`) and I'll run your
|
|
456
|
+
> publish command for real: I follow its steps, run the link check across your
|
|
457
|
+
> pages, fix anything through the `content-editor`, and walk the deploy runbook,
|
|
458
|
+
> exactly what the command says to do.
|
|
459
|
+
|
|
460
|
+
After running the flow, report what actually happened (keep the promises
|
|
461
|
+
conditional on the real result):
|
|
462
|
+
|
|
463
|
+
> Here is what just ran, for real:
|
|
464
|
+
>
|
|
465
|
+
> - **check-links** walked every page under `public/` and followed each internal
|
|
466
|
+
> link. Result: 0 broken links. (Had it found one, the next step would have
|
|
467
|
+
> briefed `content-editor` to fix it, then re-checked, that is what step 2 is
|
|
468
|
+
> for.)
|
|
469
|
+
> - the **deploy runbook** (`docs/DEPLOYMENT.md`) lists the ship steps:
|
|
470
|
+
> regenerate the pages (done), run the link check (done), start the server
|
|
471
|
+
> (next chapter).
|
|
472
|
+
>
|
|
473
|
+
> And the Map did not move while the pipeline ran: the pages are Layer 2 output;
|
|
474
|
+
> the harness on the canvas is Layer 1, and that is what skill-map maps.
|
|
475
|
+
>
|
|
476
|
+
> Did the publish run report the link check clean?
|
|
477
|
+
|
|
478
|
+
Wait for confirmation. Mark `publish`: done. Auto-advance to `sidecar`.
|
|
479
|
+
|
|
480
|
+
## Chapter `sidecar` - Annotate the handbook (.sm and consent) (~3 min)
|
|
481
|
+
|
|
482
|
+
**Context**: skill-map keeps its own metadata in co-located `.sm` sidecars, right
|
|
483
|
+
next to each file, leaving the vendor file untouched. Writing the first one needs
|
|
484
|
+
your consent. Good moment now that the site shipped: leave a metadata note on the
|
|
485
|
+
handbook.
|
|
486
|
+
|
|
487
|
+
**Preparation**: none for a first-time tester. (If re-entering a dir where the
|
|
488
|
+
sidecar already exists, reset consent first with `rm -f AGENTS.sm
|
|
489
|
+
.skill-map/settings.local.json` so the prompt shows again.)
|
|
490
|
+
|
|
491
|
+
Tell the tester:
|
|
492
|
+
|
|
493
|
+
```bash
|
|
494
|
+
sm sidecar annotate AGENTS.md
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
> The first time you write a `.sm`, skill-map asks for consent: answer `y` at the
|
|
498
|
+
> `[Y/n]` prompt. It then scaffolds `AGENTS.sm` next to `AGENTS.md`:
|
|
499
|
+
>
|
|
500
|
+
> ```
|
|
501
|
+
> ✓ Created AGENTS.sm. Edit it, then run `sm bump AGENTS.md` to commit the version.
|
|
502
|
+
> ```
|
|
503
|
+
>
|
|
504
|
+
> Look at the two new artifacts:
|
|
505
|
+
|
|
506
|
+
```bash
|
|
507
|
+
cat AGENTS.sm
|
|
508
|
+
cat .skill-map/settings.local.json
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
> `AGENTS.sm` holds an `identity:` block (hashes that tie it to the live file)
|
|
512
|
+
> and an empty `annotations: {}` ready for you to fill in. And
|
|
513
|
+
> `.skill-map/settings.local.json` now records your consent,
|
|
514
|
+
> `{ "allowEditSmFiles": true }`, so skill-map will not ask again in this
|
|
515
|
+
> project. Open the Inspector for the `AGENTS` node: it now has a **Metadata**
|
|
516
|
+
> section it did not have before.
|
|
517
|
+
>
|
|
518
|
+
> See `AGENTS.sm` and the consent flag?
|
|
519
|
+
|
|
520
|
+
Wait for confirmation. Mark `sidecar`: done. Auto-advance to `golive`.
|
|
521
|
+
|
|
522
|
+
## Chapter `golive` - Your portfolio, live next to the graph (~3 min)
|
|
523
|
+
|
|
524
|
+
**Context**: the climax. Serve the finished multi-page site and click through it,
|
|
525
|
+
ending with the running portfolio on one side and the full harness graph on the
|
|
526
|
+
other. One of the few chapters where the tester runs non-`sm` commands
|
|
527
|
+
themselves; guide them, do not run it for them. `npm install` is idempotent, so
|
|
528
|
+
it is safe whether or not they ran it in `setup`.
|
|
529
|
+
|
|
530
|
+
**Preparation**: none. `server.js` / `package.json` exist from the kickoff; the
|
|
531
|
+
pages exist from the earlier chapters.
|
|
532
|
+
|
|
533
|
+
```bash
|
|
534
|
+
npm install
|
|
535
|
+
node server.js
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
> Last step, the fun one. `npm install` confirms the one small library is there,
|
|
539
|
+
> and `node server.js` starts the server (`Listening on http://localhost:3000`).
|
|
540
|
+
>
|
|
541
|
+
> Open `http://localhost:3000` and click through Home, About, Projects, and
|
|
542
|
+
> Posts, the pages your harness produced and shipped through the publish flow you
|
|
543
|
+
> just ran.
|
|
544
|
+
>
|
|
545
|
+
> Now take it in at once. On one side, your real running portfolio, named after
|
|
546
|
+
> you, that you could deploy as-is. On the other, the skill-map graph of the
|
|
547
|
+
> harness that built it: the handbook, the content-editor, the style guide, the
|
|
548
|
+
> publish command, the link checker, the deploy runbook, all wired together. You
|
|
549
|
+
> started in an empty folder and ended with a real, running site and a living
|
|
550
|
+
> map of how it all fits.
|
|
551
|
+
>
|
|
552
|
+
> Does the site load, and can you click between all the pages?
|
|
553
|
+
|
|
554
|
+
Wait for confirmation. The tester runs the commands; do not run them. If
|
|
555
|
+
`npm install` fails, check they are in the project root and Node is on PATH
|
|
556
|
+
(`node --version` should print 24 or higher). If the port is busy, stop the
|
|
557
|
+
server with Ctrl+C and apply the ports edge case.
|
|
558
|
+
|
|
559
|
+
This is the campaign finale. Congratulate them plainly: they went from an empty
|
|
560
|
+
directory to a real, running portfolio plus a complete map of its harness. Mark
|
|
561
|
+
`golive`: done. Last chapter of the part: apply §Closing a part (name the part
|
|
562
|
+
by its title); since this closes the campaign spine, if every active part is now
|
|
563
|
+
done route to the §Final wrap-up instead of the menu.
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# MCP (parked appendix, `mcp-*` ids)
|
|
2
|
+
|
|
3
|
+
> Parked: this part is `status: planned` in `_manifest.yml` (hidden from
|
|
4
|
+
> the menu) while MCP is reworked as its own iteration. The body below is
|
|
5
|
+
> kept intact; re-enable by flipping the status back to `active`.
|
|
2
6
|
|
|
3
7
|
This is a chapter apart, a standalone appendix that comes last in the
|
|
4
8
|
book. Pace `auto-advance`, preflight `seed` (`harness-connected`, so it
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Part
|
|
1
|
+
# Part 4 (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
|
|
@@ -115,10 +115,10 @@ Mark `tour-1-intro: done`.
|
|
|
115
115
|
> in your second terminal:
|
|
116
116
|
|
|
117
117
|
```bash
|
|
118
|
-
sm plugins
|
|
118
|
+
sm plugins list core
|
|
119
119
|
```
|
|
120
120
|
|
|
121
|
-
Expected: the
|
|
121
|
+
Expected: the extensions grouped by kind, each row showing its
|
|
122
122
|
kind and qualified id (e.g. `extractor core/markdown-link`). You
|
|
123
123
|
can spot at least one of each of the six kinds you just read about,
|
|
124
124
|
all packed into a single plugin.
|
|
@@ -151,7 +151,7 @@ line (`✓ core/external-url-counter built-in`) plus its Kind
|
|
|
151
151
|
sm plugins doctor
|
|
152
152
|
```
|
|
153
153
|
|
|
154
|
-
Expected on a clean machine: `
|
|
154
|
+
Expected on a clean machine: `35 enabled extensions · 0 issues · 0 warnings`.
|
|
155
155
|
If any plugin reports a load error, manifest validity issue, or
|
|
156
156
|
spec-compatibility mismatch, `doctor` is the verb that flags it.
|
|
157
157
|
|
|
@@ -161,12 +161,12 @@ spec-compatibility mismatch, `doctor` is the verb that flags it.
|
|
|
161
161
|
|
|
162
162
|
```bash
|
|
163
163
|
sm plugins disable core/external-url-counter
|
|
164
|
-
sm plugins
|
|
164
|
+
sm plugins list core
|
|
165
165
|
sm plugins enable core/external-url-counter
|
|
166
|
-
sm plugins
|
|
166
|
+
sm plugins list core
|
|
167
167
|
```
|
|
168
168
|
|
|
169
|
-
Expected: between the two `
|
|
169
|
+
Expected: between the two `list core` calls, the
|
|
170
170
|
`core/external-url-counter` row flips its marker from `✓` (enabled)
|
|
171
171
|
to `✕` (disabled) and back. The change persists in the project DB;
|
|
172
172
|
if you restarted `sm`, the disabled state would still be there.
|
|
@@ -5,7 +5,7 @@ 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 (Part 3 runs
|
|
8
|
+
is plain HTML the harness produces (the daily loop, Part 3, runs and ships it).
|
|
9
9
|
`pace: per-step`, `preflight: portfolio-init`. Shared
|
|
10
10
|
conventions live in `_core.md`.
|
|
11
11
|
|
|
@@ -104,13 +104,16 @@ model: sonnet
|
|
|
104
104
|
|
|
105
105
|
# content-editor
|
|
106
106
|
|
|
107
|
-
Turns a short brief into a finished portfolio page.
|
|
108
|
-
conventions in the style guide and writes the result as static HTML
|
|
109
|
-
under public/.
|
|
107
|
+
Turns a short brief into a finished portfolio page.
|
|
110
108
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
109
|
+
## How to write a page
|
|
110
|
+
1. Read the style guide and the shared stylesheet in public/.
|
|
111
|
+
2. Write one HTML file under public/, named after the page (a projects page becomes `public/projects.html`).
|
|
112
|
+
3. Start from `<!doctype html>`, link the stylesheet with `<link rel="stylesheet" href="/style.css">`, and set a `<title>`.
|
|
113
|
+
4. Use one `<h1>`, group sections under `<h2>`, and reuse the shared header, nav, and footer so every page matches.
|
|
114
|
+
5. Add a link back to Home, and link the new page from the home nav.
|
|
115
|
+
|
|
116
|
+
Rules: plain static HTML, no framework, no client JS, one page per file.
|
|
114
117
|
```
|
|
115
118
|
|
|
116
119
|
Tell the tester:
|
|
@@ -129,7 +132,7 @@ Wait for confirmation. Mark `first-agent`: done.
|
|
|
129
132
|
**Context**: the prologue showed the four kinds on abstract demo
|
|
130
133
|
nodes. Now name them on the real project, and add the two markdown
|
|
131
134
|
docs the harness references later (the style guide and the deploy
|
|
132
|
-
runbook), so
|
|
135
|
+
runbook), so the Daily Loop's maintenance beats have something to point at.
|
|
133
136
|
|
|
134
137
|
`Write` two docs (markdown kind):
|
|
135
138
|
|
|
@@ -143,9 +146,18 @@ description: |
|
|
|
143
146
|
|
|
144
147
|
# Style guide
|
|
145
148
|
|
|
149
|
+
## Voice
|
|
146
150
|
- Short, plain sentences. No marketing fluff.
|
|
151
|
+
|
|
152
|
+
## Structure
|
|
147
153
|
- One H1 per page; sections under H2.
|
|
148
|
-
- Every page
|
|
154
|
+
- Every page shares the same header, nav, and footer.
|
|
155
|
+
- Every page links back to Home.
|
|
156
|
+
|
|
157
|
+
## Markup
|
|
158
|
+
- Plain static HTML: no framework, no client JS.
|
|
159
|
+
- Link the shared stylesheet `/style.css` in every page head.
|
|
160
|
+
- Use semantic tags: header, nav, main, footer.
|
|
149
161
|
```
|
|
150
162
|
|
|
151
163
|
`docs/DEPLOY.md`:
|
|
@@ -158,9 +170,9 @@ description: |
|
|
|
158
170
|
|
|
159
171
|
# Deploy runbook
|
|
160
172
|
|
|
161
|
-
1. Generate the pages
|
|
162
|
-
2. Run the link check.
|
|
163
|
-
3. Start the server
|
|
173
|
+
1. Generate or update the pages in public/.
|
|
174
|
+
2. Run the link check and fix anything it reports.
|
|
175
|
+
3. Start the server with `node server.js`, then open the site in your browser.
|
|
164
176
|
```
|
|
165
177
|
|
|
166
178
|
Tell the tester:
|