@maccesar/aiskills 1.16.1 → 1.17.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/README.md +26 -19
- package/commands/release.md +415 -0
- package/package.json +3 -2
- package/skills/humaniza/SKILL.md +1 -1
- package/skills/refactoring-ui/SKILL.md +35 -41
- package/skills/session-log/SKILL.md +80 -336
- package/skills/session-log/evals/README.md +16 -52
- package/skills/session-log/evals/ab-ronda-1.md +22 -67
- package/skills/session-log/evals/ab-ronda-2.md +28 -113
- package/skills/session-log/evals/defecto-experimento.md +3 -8
- package/skills/session-log/references/file-layout.md +69 -119
- package/skills/session-log/references/verification.md +22 -56
- package/skills/stitch-showcase/SKILL.md +7 -3
- package/skills/stitch-showcase/references/14-troubleshooting-known-issues.md +18 -47
- package/skills/vscode-extension-dev/SKILL.md +54 -50
- package/skills/vscode-extension-dev/references/architecture.md +13 -0
- package/skills/vscode-extension-dev/references/package-json-schema.md +12 -0
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
# The four files
|
|
2
2
|
|
|
3
|
-
Read this when installing the convention in a project or migrating one that keeps
|
|
4
|
-
|
|
3
|
+
Read this when installing the convention in a project or migrating one that keeps its notes somewhere else.
|
|
4
|
+
|
|
5
|
+
<!-- TOC-START -->
|
|
6
|
+
## Contents
|
|
7
|
+
|
|
8
|
+
- [Layout](#layout)
|
|
9
|
+
- [The pointer block](#the-pointer-block)
|
|
10
|
+
- [Two variants](#two-variants)
|
|
11
|
+
- [Repos that come in pairs](#repos-that-come-in-pairs)
|
|
12
|
+
- [Templates](#templates)
|
|
13
|
+
- [Migrating an existing project](#migrating-an-existing-project)
|
|
14
|
+
- [Sizing](#sizing)
|
|
15
|
+
|
|
16
|
+
<!-- TOC-END -->
|
|
5
17
|
|
|
6
18
|
## Layout
|
|
7
19
|
|
|
@@ -23,8 +35,7 @@ Same names in every project. That's what makes them findable without asking.
|
|
|
23
35
|
|
|
24
36
|
## The pointer block
|
|
25
37
|
|
|
26
|
-
Identical in every context file. Keep it this short — duplicated prose drifts,
|
|
27
|
-
three lines don't.
|
|
38
|
+
Identical in every context file. Keep it this short — duplicated prose drifts, three lines don't.
|
|
28
39
|
|
|
29
40
|
```markdown
|
|
30
41
|
## Project state
|
|
@@ -46,15 +57,13 @@ Where the tool supports imports, import the three stable files:
|
|
|
46
57
|
@docs/project/decisions.md
|
|
47
58
|
```
|
|
48
59
|
|
|
49
|
-
Never `@docs/project/status.md`. That single line is the difference between a
|
|
50
|
-
cache that survives and one that gets thrown away on every update.
|
|
60
|
+
Never `@docs/project/status.md`. That single line is the difference between a cache that survives and one that gets thrown away on every update.
|
|
51
61
|
|
|
52
62
|
## Two variants
|
|
53
63
|
|
|
54
64
|
### One repo, several packages
|
|
55
65
|
|
|
56
|
-
A monorepo takes the opposite answer from two sibling repos: **one `docs/project/`
|
|
57
|
-
at the root**, with a heading per package.
|
|
66
|
+
A monorepo takes the opposite answer from two sibling repos: **one `docs/project/` at the root**, with a heading per package.
|
|
58
67
|
|
|
59
68
|
```
|
|
60
69
|
docs/project/
|
|
@@ -62,19 +71,13 @@ docs/project/
|
|
|
62
71
|
requirements.md same headings
|
|
63
72
|
```
|
|
64
73
|
|
|
65
|
-
Sibling repos get their own files because each has its own branch, its own deploy
|
|
66
|
-
state and its own history — three things that go stale independently. A monorepo has
|
|
67
|
-
one of each. Splitting the notes per package there would invent a boundary git
|
|
68
|
-
doesn't have, and the cross-package work — the half that actually goes wrong, the
|
|
69
|
-
API change that breaks the web build — would have no obvious home.
|
|
74
|
+
Sibling repos get their own files because each has its own branch, its own deploy state and its own history — three things that go stale independently. A monorepo has one of each. Splitting the notes per package there would invent a boundary git doesn't have, and the cross-package work — the half that actually goes wrong, the API change that breaks the web build — would have no obvious home.
|
|
70
75
|
|
|
71
76
|
The vocabulary rule is unchanged: `apps/api` is a heading, not a directory of notes.
|
|
72
77
|
|
|
73
78
|
### More than one person writing
|
|
74
79
|
|
|
75
|
-
`status.md` is rewritten whole, by whoever is working, every session. Two people or
|
|
76
|
-
two live branches means merge conflicts in it, reliably. That's a fact to plan for
|
|
77
|
-
rather than a flaw to design around, because both obvious fixes are worse:
|
|
80
|
+
`status.md` is rewritten whole, by whoever is working, every session. Two people or two live branches means merge conflicts in it, reliably. That's a fact to plan for rather than a flaw to design around, because both obvious fixes are worse:
|
|
78
81
|
|
|
79
82
|
| Tempting fix | What it costs |
|
|
80
83
|
| --- | --- |
|
|
@@ -82,17 +85,30 @@ rather than a flaw to design around, because both obvious fixes are worse:
|
|
|
82
85
|
| `.gitignore` it | The notes never reach the person they were written for |
|
|
83
86
|
| Only the lead updates it | It goes stale the first week the lead is busy |
|
|
84
87
|
|
|
85
|
-
Resolve conflicts by **keeping both sides and merging by section** — two people's
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
88
|
+
Resolve conflicts by **keeping both sides and merging by section** — two people's "In flight" entries are both true, and whichever loses a conflict is information nobody gets back. If the friction is constant rather than occasional, the team wants a heading per workstream inside the file. Still one file.
|
|
89
|
+
|
|
90
|
+
## Repos that come in pairs
|
|
91
|
+
|
|
92
|
+
A web backend and the mobile client that consumes it. The mechanics of installing and closing both are in the skill; what follows is the detail that didn't need to load every session.
|
|
93
|
+
|
|
94
|
+
**Install from inside each repo, separately.** Open the backend, install; open the app, install. It's a one-time act per repo and it's worth doing from the right place: sitting inside the project means its own context file loads, its own MCP servers connect, and its stack-specific skills detect themselves. Installing a repo's notes from its sibling means describing a project you're looking at from outside — and the result reads like it, because the detail that makes `context.md` useful is exactly what you don't see from across the fence.
|
|
95
|
+
|
|
96
|
+
Put the sibling's **path** in the header of `status.md`, not just its name, so whoever reads it next can actually go there:
|
|
97
|
+
|
|
98
|
+
```markdown
|
|
99
|
+
**Sibling:** `../../Apps/EM Industrial` (Titanium client) — waiting on
|
|
100
|
+
`/work-orders/{id}/progress`, not built here yet.
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Once both are installed, updating them from one session is fine** — that's the day-to-day case, and it's different from installing. The files already exist and carry the project's own vocabulary; you're appending what changed, not inventing a description of a repo you can't see.
|
|
104
|
+
|
|
105
|
+
Write the sibling's status from what you did to it, not from what you assume about it. "Added the client call for `/work-orders/{id}/progress`" is something you know. "The app is now feature-complete for E5" is something the app would have to tell you. And if the sibling isn't reachable from where you're working, say so in the handoff rather than guessing: "endpoint added here; the app side needs its status updated, I couldn't reach that repo" is honest and actionable. A confident claim about a repo you didn't open is neither.
|
|
89
106
|
|
|
90
107
|
## Templates
|
|
91
108
|
|
|
92
109
|
### `docs/project/status.md`
|
|
93
110
|
|
|
94
|
-
The only file that changes every session. Keep it short enough that someone
|
|
95
|
-
actually reads it.
|
|
111
|
+
The only file that changes every session. Keep it short enough that someone actually reads it.
|
|
96
112
|
|
|
97
113
|
```markdown
|
|
98
114
|
# Status — <YYYY-MM-DD>
|
|
@@ -130,17 +146,11 @@ actually reads it.
|
|
|
130
146
|
|
|
131
147
|
Absolute dates, never "yesterday" — the file outlives the session that wrote it.
|
|
132
148
|
|
|
133
|
-
The three header lines exist because they're the questions asked first and
|
|
134
|
-
answered worst. **Deployed is not the same as committed**: on a project that
|
|
135
|
-
deploys by file sync, a change can be live and uncommitted, or committed and never
|
|
136
|
-
uploaded. Write what you know and mark what you don't; a confident wrong answer
|
|
137
|
-
here sends someone debugging the wrong copy of the code.
|
|
149
|
+
The three header lines exist because they're the questions asked first and answered worst. **Deployed is not the same as committed**: on a project that deploys by file sync, a change can be live and uncommitted, or committed and never uploaded. Write what you know and mark what you don't; a confident wrong answer here sends someone debugging the wrong copy of the code.
|
|
138
150
|
|
|
139
151
|
### `docs/project/requirements.md`
|
|
140
152
|
|
|
141
|
-
The contract: what the system must do and how you'd know it does. Stable — it
|
|
142
|
-
changes when scope changes, not when work happens. **Progress lives in
|
|
143
|
-
`status.md`**, not here.
|
|
153
|
+
The contract: what the system must do and how you'd know it does. Stable — it changes when scope changes, not when work happens. **Progress lives in `status.md`**, not here.
|
|
144
154
|
|
|
145
155
|
```markdown
|
|
146
156
|
# Requirements
|
|
@@ -172,33 +182,19 @@ if nothing else exists>
|
|
|
172
182
|
acceptance criterion belongs here, not in the table above.>
|
|
173
183
|
```
|
|
174
184
|
|
|
175
|
-
**Invariants** are for projects where the risk isn't forgetting a feature — it's
|
|
176
|
-
breaking a property while improving something else. Offline-first, no polling, a
|
|
177
|
-
storage schema other code depends on, a latency budget. They read like
|
|
178
|
-
conventions but they're stronger: a convention is how the team writes code, an
|
|
179
|
-
invariant is a promise the system makes. Write what breaking it would look like,
|
|
180
|
-
not just the rule, so it's recognizable when someone is about to do it.
|
|
185
|
+
**Invariants** are for projects where the risk isn't forgetting a feature — it's breaking a property while improving something else. Offline-first, no polling, a storage schema other code depends on, a latency budget. They read like conventions but they're stronger: a convention is how the team writes code, an invariant is a promise the system makes. Write what breaking it would look like, not just the rule, so it's recognizable when someone is about to do it.
|
|
181
186
|
|
|
182
|
-
Not every project has them. Skip the section when the honest answer is that
|
|
183
|
-
nothing here is that load-bearing.
|
|
187
|
+
Not every project has them. Skip the section when the honest answer is that nothing here is that load-bearing.
|
|
184
188
|
|
|
185
|
-
**When the requirements live in another repo**, this file is an index pointing
|
|
186
|
-
outward rather than a self-contained contract — half its rows may reference
|
|
187
|
-
`../other-repo/…`. That's correct: copying the spec across creates a second copy
|
|
188
|
-
that drifts. Say plainly at the top which repo owns the contract.
|
|
189
|
+
**When the requirements live in another repo**, this file is an index pointing outward rather than a self-contained contract — half its rows may reference `../other-repo/…`. That's correct: copying the spec across creates a second copy that drifts. Say plainly at the top which repo owns the contract.
|
|
189
190
|
|
|
190
|
-
Write acceptance criteria you could hand to someone else to check. "Payments
|
|
191
|
-
work" is not one; "charging a member writes a Payment row and the receipt shows
|
|
192
|
-
the folio" is. If you can't write one, the requirement isn't specified — say so
|
|
193
|
-
in **Unspecified** rather than pretending the table is complete.
|
|
191
|
+
Write acceptance criteria you could hand to someone else to check. "Payments work" is not one; "charging a member writes a Payment row and the receipt shows the folio" is. If you can't write one, the requirement isn't specified — say so in **Unspecified** rather than pretending the table is complete.
|
|
194
192
|
|
|
195
|
-
The **Out of scope** section earns its place on client work: it's the cheapest
|
|
196
|
-
insurance against a disagreement six weeks later about what was included.
|
|
193
|
+
The **Out of scope** section earns its place on client work: it's the cheapest insurance against a disagreement six weeks later about what was included.
|
|
197
194
|
|
|
198
195
|
### `docs/project/decisions.md`
|
|
199
196
|
|
|
200
|
-
Append-only. Old entries stay even when superseded; a decision that was reversed
|
|
201
|
-
is more informative than one that was deleted.
|
|
197
|
+
Append-only. Old entries stay even when superseded; a decision that was reversed is more informative than one that was deleted.
|
|
202
198
|
|
|
203
199
|
```markdown
|
|
204
200
|
## <YYYY-MM-DD> — <the decision in one line>
|
|
@@ -209,10 +205,7 @@ is more informative than one that was deleted.
|
|
|
209
205
|
**Reverses:** <link to an earlier entry, when applicable>
|
|
210
206
|
```
|
|
211
207
|
|
|
212
|
-
**When the date isn't knowable**, don't invent one. A repo with a single commit,
|
|
213
|
-
or everything still under `[Unreleased]`, has real decisions with no traceable
|
|
214
|
-
date — and stamping them with the commit date is a fabrication that later reads
|
|
215
|
-
as fact. Put them in a separate section that says why:
|
|
208
|
+
**When the date isn't knowable**, don't invent one. A repo with a single commit, or everything still under `[Unreleased]`, has real decisions with no traceable date — and stamping them with the commit date is a fabrication that later reads as fact. Put them in a separate section that says why:
|
|
216
209
|
|
|
217
210
|
```markdown
|
|
218
211
|
## Decisions without a traceable date
|
|
@@ -224,13 +217,9 @@ reasoning is recovered from the code and the docs; the dates are not known.
|
|
|
224
217
|
**Chose / Over / Because:** <as above>
|
|
225
218
|
```
|
|
226
219
|
|
|
227
|
-
These are usually the most valuable entries in the file, because they're the ones
|
|
228
|
-
that explain why the code doesn't match the spec. Losing them to keep the template
|
|
229
|
-
tidy is the wrong trade.
|
|
220
|
+
These are usually the most valuable entries in the file, because they're the ones that explain why the code doesn't match the spec. Losing them to keep the template tidy is the wrong trade.
|
|
230
221
|
|
|
231
|
-
**Archiving.** Append-only and imported-at-startup is a combination with a shelf
|
|
232
|
-
life: every session pays for the whole file, and most of what it's paying for is a
|
|
233
|
-
decision from two years ago that nobody is about to revisit.
|
|
222
|
+
**Archiving.** Append-only and imported-at-startup is a combination with a shelf life: every session pays for the whole file, and most of what it's paying for is a decision from two years ago that nobody is about to revisit.
|
|
234
223
|
|
|
235
224
|
Past roughly two hundred lines, split it:
|
|
236
225
|
|
|
@@ -239,23 +228,15 @@ docs/project/decisions.md current year — imported
|
|
|
239
228
|
docs/project/decisions-archive.md everything older — NOT imported
|
|
240
229
|
```
|
|
241
230
|
|
|
242
|
-
Move entries oldest-first, keep them verbatim, and leave a line at the top of
|
|
243
|
-
`decisions.md` saying where the rest went. Then check the import chain again — the
|
|
244
|
-
archive must not be pulled in by any `@` line, or the split bought nothing.
|
|
231
|
+
Move entries oldest-first, keep them verbatim, and leave a line at the top of `decisions.md` saying where the rest went. Then check the import chain again — the archive must not be pulled in by any `@` line, or the split bought nothing.
|
|
245
232
|
|
|
246
|
-
Two rules keep the archive honest. A superseded entry stays with its reverser, even
|
|
247
|
-
if that means keeping an old entry in the current file — a reversal that outlives
|
|
248
|
-
the decision it reversed reads as if the original never happened. And an entry the
|
|
249
|
-
project still argues about is current by definition, whatever its date.
|
|
233
|
+
Two rules keep the archive honest. A superseded entry stays with its reverser, even if that means keeping an old entry in the current file — a reversal that outlives the decision it reversed reads as if the original never happened. And an entry the project still argues about is current by definition, whatever its date.
|
|
250
234
|
|
|
251
|
-
Two hundred lines is a prompt to look, not a threshold to enforce. A project with
|
|
252
|
-
twelve decisions in four years never needs this.
|
|
235
|
+
Two hundred lines is a prompt to look, not a threshold to enforce. A project with twelve decisions in four years never needs this.
|
|
253
236
|
|
|
254
237
|
### `docs/project/context.md`
|
|
255
238
|
|
|
256
|
-
How the project is put together, and what a newcomer would get wrong on day one.
|
|
257
|
-
Anything derivable from reading the code doesn't belong here — this is for what
|
|
258
|
-
the code *doesn't* say.
|
|
239
|
+
How the project is put together, and what a newcomer would get wrong on day one. Anything derivable from reading the code doesn't belong here — this is for what the code *doesn't* say.
|
|
259
240
|
|
|
260
241
|
```markdown
|
|
261
242
|
# Context
|
|
@@ -275,62 +256,31 @@ the code *doesn't* say.
|
|
|
275
256
|
- <The thing that cost someone a day, and how to avoid it.>
|
|
276
257
|
```
|
|
277
258
|
|
|
278
|
-
The map goes first because it's what someone new needs first: knowing what exists
|
|
279
|
-
saves them from rewriting it. List every document you found, including the ones
|
|
280
|
-
that turned out to be stale — marked as stale. A document omitted from the map is
|
|
281
|
-
a document nobody will open again.
|
|
259
|
+
The map goes first because it's what someone new needs first: knowing what exists saves them from rewriting it. List every document you found, including the ones that turned out to be stale — marked as stale. A document omitted from the map is a document nobody will open again.
|
|
282
260
|
|
|
283
261
|
## Migrating an existing project
|
|
284
262
|
|
|
285
|
-
Projects that already keep notes somewhere — `.claude/memory/`, a roadmap under
|
|
286
|
-
`docs/`, a planning doc — get migrated rather than duplicated. Two locations is
|
|
287
|
-
the problem this convention exists to solve.
|
|
263
|
+
Projects that already keep notes somewhere — `.claude/memory/`, a roadmap under `docs/`, a planning doc — get migrated rather than duplicated. Two locations is the problem this convention exists to solve.
|
|
288
264
|
|
|
289
|
-
1. **Read what's there** and sort it: is this line status, a decision, or context?
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
living in an imported file — especially then.
|
|
293
|
-
3. **Delete the old location** and update anything that referenced it, including
|
|
294
|
-
`@import` lines in context files.
|
|
265
|
+
1. **Read what's there** and sort it: is this line status, a decision, or context? Most existing notes are a mix, and that's exactly why they're hard to use.
|
|
266
|
+
2. **Split it into the four files.** Status goes to `status.md` even if it was living in an imported file — especially then.
|
|
267
|
+
3. **Delete the old location** and update anything that referenced it, including `@import` lines in context files.
|
|
295
268
|
4. **Add the pointer block** to every context file.
|
|
296
|
-
5. **Tell the person what moved where**, concretely. They need to be able to check
|
|
297
|
-
that nothing was lost, and a migration they can't audit is one they won't trust.
|
|
269
|
+
5. **Tell the person what moved where**, concretely. They need to be able to check that nothing was lost, and a migration they can't audit is one they won't trust.
|
|
298
270
|
|
|
299
|
-
If the project has a planning doc with real structure — a numbered checklist, a
|
|
300
|
-
PRD — don't flatten it into `status.md`. Leave it where it is and reference it
|
|
301
|
-
from `status.md`. The convention is about knowing where to look, not about
|
|
302
|
-
destroying work that already has a shape.
|
|
271
|
+
If the project has a planning doc with real structure — a numbered checklist, a PRD — don't flatten it into `status.md`. Leave it where it is and reference it from `status.md`. The convention is about knowing where to look, not about destroying work that already has a shape.
|
|
303
272
|
|
|
304
273
|
### Upgrading an earlier version of this convention
|
|
305
274
|
|
|
306
|
-
Repos installed before the four-file layout settled look almost right and aren't:
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
1. **`git mv` into the fixed names**, so the history follows the file. Copying and
|
|
313
|
-
deleting loses the one thing that made the old file trustworthy.
|
|
314
|
-
2. **Split by volatility, not by topic.** The usual finding is a single file mixing
|
|
315
|
-
a stable architecture description with three lines of "where I left off". The
|
|
316
|
-
stable half goes to `context.md` or `requirements.md`; only the volatile half
|
|
317
|
-
ends up in `status.md`.
|
|
318
|
-
3. **Update every pointer**, including `@import` lines and any reference from
|
|
319
|
-
`README.md` or a sibling repo's header. A pointer to the old path is worse than
|
|
320
|
-
no pointer: it resolves to nothing and looks maintained.
|
|
321
|
-
4. **Say what moved where**, path by path. An upgrade someone can't audit is one
|
|
322
|
-
they won't trust, and this one moves files they wrote.
|
|
275
|
+
Repos installed before the four-file layout settled look almost right and aren't: a lone `docs/status/current.md`, a `docs/project/` holding three files named by hand, an `estado-actual.md` next to a `decisiones.md`. This is an upgrade, not a migration, and the difference matters — the content was written by someone who was there, so it's correct until the repo contradicts it.
|
|
276
|
+
|
|
277
|
+
1. **`git mv` into the fixed names**, so the history follows the file. Copying and deleting loses the one thing that made the old file trustworthy.
|
|
278
|
+
2. **Split by volatility, not by topic.** The usual finding is a single file mixing a stable architecture description with three lines of "where I left off". The stable half goes to `context.md` or `requirements.md`; only the volatile half ends up in `status.md`.
|
|
279
|
+
3. **Update every pointer**, including `@import` lines and any reference from `README.md` or a sibling repo's header. A pointer to the old path is worse than no pointer: it resolves to nothing and looks maintained.
|
|
280
|
+
4. **Say what moved where**, path by path. An upgrade someone can't audit is one they won't trust, and this one moves files they wrote.
|
|
323
281
|
|
|
324
282
|
## Sizing
|
|
325
283
|
|
|
326
|
-
A repo with one commit doesn't need four files with nothing in them. Start with
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
there's something real to put in them. A `decisions.md` whose only entry is the decision to keep decisions is a
|
|
330
|
-
file that exists to look organized.
|
|
331
|
-
|
|
332
|
-
**The pointer block lists the files that exist.** Listing all four from the start is
|
|
333
|
-
tempting — it shows the shape — but three of the four lines then point at nothing,
|
|
334
|
-
and a pointer that resolves to a missing file trains the next reader to distrust the
|
|
335
|
-
block. Add the line when the file arrives; it's one line, at the moment it becomes
|
|
336
|
-
true.
|
|
284
|
+
A repo with one commit doesn't need four files with nothing in them. Start with whichever ones have content — often `requirements.md` and `status.md` early on, `context.md` and `decisions.md` once the thing exists — and add the rest when there's something real to put in them. A `decisions.md` whose only entry is the decision to keep decisions is a file that exists to look organized.
|
|
285
|
+
|
|
286
|
+
**The pointer block lists the files that exist.** Listing all four from the start is tempting — it shows the shape — but three of the four lines then point at nothing, and a pointer that resolves to a missing file trains the next reader to distrust the block. Add the line when the file arrives; it's one line, at the moment it becomes true.
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
# Verifying that work actually exists
|
|
2
2
|
|
|
3
|
-
Read this before marking anything as done. The goal is narrow: turn "I finished
|
|
4
|
-
X" into "I found the artifacts X would have produced."
|
|
3
|
+
Read this before marking anything as done. The goal is narrow: turn "I finished X" into "I found the artifacts X would have produced."
|
|
5
4
|
|
|
6
5
|
## What "done" is allowed to mean
|
|
7
6
|
|
|
8
|
-
Be careful with the word — these are different claims, and a record that collapses
|
|
9
|
-
them into one checkmark loses the distinction exactly when someone needs it:
|
|
7
|
+
Be careful with the word — these are different claims, and a record that collapses them into one checkmark loses the distinction exactly when someone needs it:
|
|
10
8
|
|
|
11
9
|
| Claim | What it means |
|
|
12
10
|
| --- | --- |
|
|
@@ -15,39 +13,24 @@ them into one checkmark loses the distinction exactly when someone needs it:
|
|
|
15
13
|
| Reviewed | A human looked at it |
|
|
16
14
|
| Shipped | It's deployed or released |
|
|
17
15
|
|
|
18
|
-
Use the distinction to be *more* precise, not to avoid answering. "Implemented,
|
|
19
|
-
not yet verified — no test covers it" is a useful record. Marking nothing at all
|
|
20
|
-
because verification was impossible is not.
|
|
16
|
+
Use the distinction to be *more* precise, not to avoid answering. "Implemented, not yet verified — no test covers it" is a useful record. Marking nothing at all because verification was impossible is not.
|
|
21
17
|
|
|
22
18
|
## Three ways records go bad
|
|
23
19
|
|
|
24
|
-
**Percentages the repo can't support.** A percentage needs a fixed denominator —
|
|
25
|
-
a checklist with a known number of items. Without one, any number is invented.
|
|
26
|
-
Count what's enumerable or describe status in words.
|
|
20
|
+
**Percentages the repo can't support.** A percentage needs a fixed denominator — a checklist with a known number of items. Without one, any number is invented. Count what's enumerable or describe status in words.
|
|
27
21
|
|
|
28
|
-
**Duplicating what the repo already records.** Git history, the CHANGELOG and the
|
|
29
|
-
code are better sources than a note paraphrasing them. Record what they *can't*
|
|
30
|
-
say: why an approach was abandoned, what failed, what looks wrong but is deliberate.
|
|
22
|
+
**Duplicating what the repo already records.** Git history, the CHANGELOG and the code are better sources than a note paraphrasing them. Record what they *can't* say: why an approach was abandoned, what failed, what looks wrong but is deliberate.
|
|
31
23
|
|
|
32
|
-
**Padding.** A handoff nobody reads is a handoff that failed. Three specific lines
|
|
33
|
-
beat a page of headers. Length is not thoroughness.
|
|
24
|
+
**Padding.** A handoff nobody reads is a handoff that failed. Three specific lines beat a page of headers. Length is not thoroughness.
|
|
34
25
|
|
|
35
26
|
## The method
|
|
36
27
|
|
|
37
|
-
Someone's claim is about behavior. The repo holds artifacts. Verification is
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
you happen to find as sufficient.
|
|
44
|
-
2. **Search for those specific things**, not for the feature name. Grepping for
|
|
45
|
-
"payment" finds comments, TODOs, and unrelated strings. Grepping for the route
|
|
46
|
-
registration or the class definition finds the thing itself.
|
|
47
|
-
3. **Distinguish existence from completeness.** A file that exists but contains a
|
|
48
|
-
stub is not the feature. Open what you find when the claim is substantial.
|
|
49
|
-
4. **Report the gap, not just the verdict.** "Found the service and the routes;
|
|
50
|
-
no tests and no migration" is useful. "Not done" is not.
|
|
28
|
+
Someone's claim is about behavior. The repo holds artifacts. Verification is translating between the two:
|
|
29
|
+
|
|
30
|
+
1. **Name the artifacts before searching.** "Finished the payments module" should produce a concrete list first — a service class, a route, a migration, a test. Writing that list before you look is what stops you from accepting whatever you happen to find as sufficient.
|
|
31
|
+
2. **Search for those specific things**, not for the feature name. Grepping for "payment" finds comments, TODOs, and unrelated strings. Grepping for the route registration or the class definition finds the thing itself.
|
|
32
|
+
3. **Distinguish existence from completeness.** A file that exists but contains a stub is not the feature. Open what you find when the claim is substantial.
|
|
33
|
+
4. **Report the gap, not just the verdict.** "Found the service and the routes; no tests and no migration" is useful. "Not done" is not.
|
|
51
34
|
|
|
52
35
|
## What to search for, by stack
|
|
53
36
|
|
|
@@ -80,8 +63,7 @@ A Livewire feature that has a class but no Blade view is not done. Check both.
|
|
|
80
63
|
| Native module | Declared in `tiapp.xml` under `<modules>` **and** present in `modules/` |
|
|
81
64
|
| Platform config | `tiapp.xml` |
|
|
82
65
|
|
|
83
|
-
A controller without its view compiles to nothing usable. A string added to one
|
|
84
|
-
locale and not the others ships as a raw key in the missing language.
|
|
66
|
+
A controller without its view compiles to nothing usable. A string added to one locale and not the others ships as a raw key in the missing language.
|
|
85
67
|
|
|
86
68
|
### Node / TypeScript
|
|
87
69
|
|
|
@@ -124,27 +106,17 @@ locale and not the others ships as a raw key in the missing language.
|
|
|
124
106
|
|
|
125
107
|
## Claims in a status file you didn't write
|
|
126
108
|
|
|
127
|
-
Resuming work means reading claims written weeks ago by someone — possibly you —
|
|
128
|
-
who is no longer available to ask. The method above applies unchanged, with one
|
|
129
|
-
addition: an old record has a **direction of error**. It says what was true when it
|
|
130
|
-
was written, so its claims rot toward being *understated* about what exists and
|
|
131
|
-
*overstated* about what's blocked.
|
|
109
|
+
Resuming work means reading claims written weeks ago by someone — possibly you — who is no longer available to ask. The method above applies unchanged, with one addition: an old record has a **direction of error**. It says what was true when it was written, so its claims rot toward being *understated* about what exists and *overstated* about what's blocked.
|
|
132
110
|
|
|
133
|
-
- "Not started" from three weeks ago may well be finished. Check the artifacts
|
|
134
|
-
|
|
135
|
-
- "
|
|
136
|
-
since. Flag it as needing a human check rather than carrying it forward as fact.
|
|
137
|
-
- "Next step: X" may be stale in a way the file cannot know. If X is already in the
|
|
138
|
-
code, say so instead of proposing it again.
|
|
111
|
+
- "Not started" from three weeks ago may well be finished. Check the artifacts before repeating it — this is the most common way a resumed session redoes work.
|
|
112
|
+
- "Blocked on the client" has a date attached to a person who has probably answered since. Flag it as needing a human check rather than carrying it forward as fact.
|
|
113
|
+
- "Next step: X" may be stale in a way the file cannot know. If X is already in the code, say so instead of proposing it again.
|
|
139
114
|
|
|
140
|
-
The safe form is attribution: "the file says the payments module was left half-done
|
|
141
|
-
on 2026-07-14; the routes and the service exist now, so part of that landed after it
|
|
142
|
-
was written". That gives the person both the record and the correction.
|
|
115
|
+
The safe form is attribution: "the file says the payments module was left half-done on 2026-07-14; the routes and the service exist now, so part of that landed after it was written". That gives the person both the record and the correction.
|
|
143
116
|
|
|
144
117
|
## Claims that can't be verified from the repo
|
|
145
118
|
|
|
146
|
-
Some are legitimate and simply live elsewhere: work in another repository, a
|
|
147
|
-
deploy, a conversation with a client, a design decision.
|
|
119
|
+
Some are legitimate and simply live elsewhere: work in another repository, a deploy, a conversation with a client, a design decision.
|
|
148
120
|
|
|
149
121
|
Record them. Label them. The pattern that keeps the log trustworthy is:
|
|
150
122
|
|
|
@@ -158,16 +130,10 @@ The distinction costs one word and preserves the whole point of the record.
|
|
|
158
130
|
|
|
159
131
|
## Deployment is not git state
|
|
160
132
|
|
|
161
|
-
A change can be live on a server without being committed, and committed without
|
|
162
|
-
being live. Repos with file-sync deployment (SFTP-on-save watchers, rsync hooks)
|
|
163
|
-
break the assumption that git reflects production entirely.
|
|
133
|
+
A change can be live on a server without being committed, and committed without being live. Repos with file-sync deployment (SFTP-on-save watchers, rsync hooks) break the assumption that git reflects production entirely.
|
|
164
134
|
|
|
165
|
-
Never infer deployment state from git. When it matters, check the deployment
|
|
166
|
-
configuration in the repo, or ask.
|
|
135
|
+
Never infer deployment state from git. When it matters, check the deployment configuration in the repo, or ask.
|
|
167
136
|
|
|
168
137
|
## Tests: the output is the evidence
|
|
169
138
|
|
|
170
|
-
"Tests pass" is a claim like any other. If you ran them, quote the count and the
|
|
171
|
-
result. If you didn't, say so. A log that records passing tests nobody ran is
|
|
172
|
-
worse than one that records nothing, because it stops the next session from
|
|
173
|
-
running them.
|
|
139
|
+
"Tests pass" is a claim like any other. If you ran them, quote the count and the result. If you didn't, say so. A log that records passing tests nobody ran is worse than one that records nothing, because it stops the next session from running them.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: stitch-showcase
|
|
3
|
-
description: '
|
|
3
|
+
description: 'Turns Google Stitch design exports (zips holding `code.html` + `screen.png`) into a navigable showcase — gallery, viewer, component catalog — in about three seconds, and enriches it on demand. Use this for anything involving those exports: "organiza mis diseños de Stitch", "arma el muestrario", "organize my Stitch designs", "build the showcase", "tengo los zips de Stitch", "mis exports de Stitch", or a bare path to a folder of design zips. Also for maintaining one that already exists: "optimiza el showcase", "mejora las descripciones", "agrega estas pantallas nuevas", "el cliente pidió otra pantalla", "estandariza los navbars", "make all the footers the same". Not for: Figma or Sketch exports, loose screenshots, redesigning the screens themselves, or building the real app from them.'
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# stitch-showcase
|
|
7
7
|
|
|
8
8
|
Converts Google Stitch exports (zips with `code.html` + `screen.png`) into a navigable showcase with `index.html` + `viewer.html` + `catalog.html`.
|
|
9
9
|
|
|
10
|
-
**Architecture**: Python script generates all HTML from pre-built templates in ~3 seconds. AI enrichment (descriptions, sections, hero text) is **optional and on-demand** — only when the user asks to optimize.
|
|
10
|
+
**Architecture**: a Python script generates all HTML from pre-built templates in ~3 seconds. AI enrichment (descriptions, sections, hero text) is **optional and on-demand** — only when the user asks to optimize.
|
|
11
11
|
|
|
12
12
|
## Prerequisites
|
|
13
13
|
|
|
@@ -39,7 +39,11 @@ digraph showcase {
|
|
|
39
39
|
}
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
Two things about this that are easy to get wrong and expensive to undo:
|
|
43
|
+
|
|
44
|
+
Run `build_showcase.py` **without** `--context`, since that's the invocation that writes the HTML. `--context` only dumps the data JSON for inspection, so a run with it leaves you with no showcase and no error saying why.
|
|
45
|
+
|
|
46
|
+
Don't write `index.html` or `viewer.html` by hand. The templates already carry the layout, grid, viewer, theme, tabs, search and every interactive behavior, and every build regenerates both files — so hand-written HTML costs a lot to produce and disappears on the next rebuild.
|
|
43
47
|
|
|
44
48
|
## Mode 1: Build (default — instant)
|
|
45
49
|
|
|
@@ -2,39 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
## Purpose
|
|
4
4
|
|
|
5
|
-
Working notes on issues that have shown up in real projects, the cause
|
|
6
|
-
when it's understood, and the workaround. New issues should be added here
|
|
7
|
-
before they show up a second time.
|
|
5
|
+
Working notes on issues that have shown up in real projects, the cause when it's understood, and the workaround. New issues should be added here before they show up a second time.
|
|
8
6
|
|
|
9
7
|
---
|
|
10
8
|
|
|
11
9
|
## `catalog.html` stays on "Loading…"
|
|
12
10
|
|
|
13
|
-
**Symptom**: opening `catalog.html` shows the skeleton header but the
|
|
14
|
-
component grid never appears.
|
|
11
|
+
**Symptom**: opening `catalog.html` shows the skeleton header but the component grid never appears.
|
|
15
12
|
|
|
16
|
-
**Cause** (suspected, not yet confirmed): in projects with very dense
|
|
17
|
-
HTMLs or many near-duplicate variants, `extract_catalog.py` either times
|
|
18
|
-
out or returns a structure the catalog viewer chokes on.
|
|
13
|
+
**Cause** (suspected, not yet confirmed): in projects with very dense HTMLs or many near-duplicate variants, `extract_catalog.py` either times out or returns a structure the catalog viewer chokes on.
|
|
19
14
|
|
|
20
|
-
**Workaround**: the `index.html` template ships without the "Catalog"
|
|
21
|
-
button in the header, so end users don't hit the broken page. If you
|
|
22
|
-
want to inspect the catalog data, open `component_catalog.json` directly.
|
|
15
|
+
**Workaround**: the `index.html` template ships without the "Catalog" button in the header, so end users don't hit the broken page. If you want to inspect the catalog data, open `component_catalog.json` directly.
|
|
23
16
|
|
|
24
|
-
**Status**: open. Restore the Catalog button in
|
|
25
|
-
`references/index.html` once the root cause is fixed.
|
|
17
|
+
**Status**: open. Restore the Catalog button in `references/index.html` once the root cause is fixed.
|
|
26
18
|
|
|
27
19
|
---
|
|
28
20
|
|
|
29
21
|
## Chrome shows "Translate this page" banner
|
|
30
22
|
|
|
31
|
-
**Symptom**: Chrome offers to translate the showcase, sometimes to a
|
|
32
|
-
language that isn't even one of the two involved (Portuguese is common).
|
|
23
|
+
**Symptom**: Chrome offers to translate the showcase, sometimes to a language that isn't even one of the two involved (Portuguese is common).
|
|
33
24
|
|
|
34
|
-
**Cause**: the `<html lang="…">` attribute on `index.html` or
|
|
35
|
-
`viewer.html` disagrees with the actual text content. See
|
|
36
|
-
[`13-language-detection.md`](13-language-detection.md) for the full
|
|
37
|
-
resolution order.
|
|
25
|
+
**Cause**: the `<html lang="…">` attribute on `index.html` or `viewer.html` disagrees with the actual text content. See [`13-language-detection.md`](13-language-detection.md) for the full resolution order.
|
|
38
26
|
|
|
39
27
|
**Workaround**: add an override.
|
|
40
28
|
|
|
@@ -59,62 +47,45 @@ Then rebuild.
|
|
|
59
47
|
|
|
60
48
|
## Video doesn't preview in Finder / Safari rejects it
|
|
61
49
|
|
|
62
|
-
**Symptom**: a `.mp4` downloaded from Facebook / YouTube / TikTok plays
|
|
63
|
-
fine in VLC and Chrome but shows a black square in macOS Finder and
|
|
64
|
-
fails to play in Safari < 17.
|
|
50
|
+
**Symptom**: a `.mp4` downloaded from Facebook / YouTube / TikTok plays fine in VLC and Chrome but shows a black square in macOS Finder and fails to play in Safari < 17.
|
|
65
51
|
|
|
66
|
-
**Cause**: the source was encoded in AV1, which neither macOS Finder
|
|
67
|
-
nor older Safari can decode.
|
|
52
|
+
**Cause**: the source was encoded in AV1, which neither macOS Finder nor older Safari can decode.
|
|
68
53
|
|
|
69
|
-
**Workaround**: re-encode to H.264 with ffmpeg. See
|
|
70
|
-
[`12-video-embedding.md`](12-video-embedding.md) for the exact command.
|
|
54
|
+
**Workaround**: re-encode to H.264 with ffmpeg. See [`12-video-embedding.md`](12-video-embedding.md) for the exact command.
|
|
71
55
|
|
|
72
56
|
---
|
|
73
57
|
|
|
74
58
|
## Skill installed both as plugin and standalone
|
|
75
59
|
|
|
76
|
-
**Symptom**: after `aiskills install`, the skill folder exists at both
|
|
77
|
-
`~/.claude/skills/<name>/` (from the standalone CLI) **and**
|
|
78
|
-
`~/.claude/plugins/cache/<plugin>/<version>/skills/<name>/` (from the
|
|
79
|
-
marketplace plugin), so changes to one path are invisible to the other.
|
|
60
|
+
**Symptom**: after `aiskills install`, the skill folder exists at both `~/.claude/skills/<name>/` (from the standalone CLI) **and** `~/.claude/plugins/cache/<plugin>/<version>/skills/<name>/` (from the marketplace plugin), so changes to one path are invisible to the other.
|
|
80
61
|
|
|
81
|
-
**Cause**: older versions of the `aiskills` CLI didn't detect when the
|
|
82
|
-
plugin marketplace had already installed the skill and dropped a
|
|
83
|
-
duplicate symlink.
|
|
62
|
+
**Cause**: older versions of the `aiskills` CLI didn't detect when the plugin marketplace had already installed the skill and dropped a duplicate symlink.
|
|
84
63
|
|
|
85
64
|
**Workaround**:
|
|
86
65
|
|
|
87
66
|
1. Update the CLI: `npm install -g @maccesar/aiskills@latest`.
|
|
88
67
|
2. Remove the standalone copy: `rm -rf ~/.claude/skills/<skill-name>`.
|
|
89
|
-
3. Reinstall: `aiskills install`. The CLI now skips skills that the
|
|
90
|
-
plugin already provides.
|
|
68
|
+
3. Reinstall: `aiskills install`. The CLI now skips skills that the plugin already provides.
|
|
91
69
|
|
|
92
70
|
---
|
|
93
71
|
|
|
94
72
|
## Showcase background and app background match (thumbnails disappear)
|
|
95
73
|
|
|
96
|
-
**Symptom**: every card in `index.html` shows a blank rectangle because
|
|
97
|
-
the screen has the same background color as the showcase canvas.
|
|
74
|
+
**Symptom**: every card in `index.html` shows a blank rectangle because the screen has the same background color as the showcase canvas.
|
|
98
75
|
|
|
99
|
-
**Cause**: someone reused the project's brand color as the showcase
|
|
100
|
-
background instead of a neutral surface.
|
|
76
|
+
**Cause**: someone reused the project's brand color as the showcase background instead of a neutral surface.
|
|
101
77
|
|
|
102
|
-
**Workaround**: see `07-theme-system.md` and the Color Strategy section
|
|
103
|
-
of `SKILL.md` — never use a brand color for large showcase surfaces.
|
|
78
|
+
**Workaround**: see `07-theme-system.md` and the Color Strategy section of `SKILL.md` — never use a brand color for large showcase surfaces.
|
|
104
79
|
|
|
105
80
|
---
|
|
106
81
|
|
|
107
82
|
## Stitch slugs come with `_` in place of accents
|
|
108
83
|
|
|
109
|
-
**Symptom**: filenames like `configuraci_n_oscuro.html` and the showcase
|
|
110
|
-
displays them as "Configuraci_N Oscuro".
|
|
84
|
+
**Symptom**: filenames like `configuraci_n_oscuro.html` and the showcase displays them as "Configuraci_N Oscuro".
|
|
111
85
|
|
|
112
86
|
**Cause**: Google Stitch strips accented characters from filenames.
|
|
113
87
|
|
|
114
|
-
**Workaround**: the build now de-mangles slugs automatically through
|
|
115
|
-
`scripts/slug_demangle.py`. If a slug doesn't appear in the demangler's
|
|
116
|
-
dictionary, override the title explicitly in `DESIGN.md` using the
|
|
117
|
-
`Title | Description` format:
|
|
88
|
+
**Workaround**: the build now de-mangles slugs automatically through `scripts/slug_demangle.py`. If a slug doesn't appear in the demangler's dictionary, override the title explicitly in `DESIGN.md` using the `Title | Description` format:
|
|
118
89
|
|
|
119
90
|
```markdown
|
|
120
91
|
### Cuenta
|