@erclx/canon 5.52.0 → 5.54.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/CHANGELOG.md +17 -0
- package/README.md +11 -13
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/canon-cli/SKILL.md +5 -8
- package/claude/skills/context-fold/REQUIREMENT.md +0 -1
- package/claude/skills/design-identity/REQUIREMENT.md +2 -2
- package/claude/skills/design-identity/SKILL.md +6 -6
- package/claude/skills/design-record/REQUIREMENT.md +2 -2
- package/claude/skills/design-record/SKILL.md +4 -4
- package/claude/skills/design-record/references/folder.md +1 -1
- package/claude/skills/design-taste/REQUIREMENT.md +1 -1
- package/claude/skills/design-taste/references/kinds.md +0 -1
- package/claude/skills/draw-figure/REQUIREMENT.md +3 -4
- package/claude/skills/draw-figure/SKILL.md +5 -6
- package/claude/skills/draw-figure/references/figures.md +0 -1
- package/claude/skills/draw-figure/references/hand-drawn.md +1 -1
- package/claude/skills/pick-by-eye/REQUIREMENT.md +4 -5
- package/claude/skills/pick-by-eye/SKILL.md +34 -41
- package/claude/skills/pick-by-eye/references/board.md +42 -0
- package/claude/skills/pick-by-eye/references/live-arms.md +3 -3
- package/claude/skills/plan-groundwork/SKILL.md +1 -1
- package/claude/skills/teach-craft/REQUIREMENT.md +30 -0
- package/claude/skills/teach-craft/SKILL.md +70 -0
- package/claude/skills/teach-craft/references/adopted.md +113 -0
- package/claude/skills/teach-craft/references/lesson-craft.md +60 -0
- package/claude/skills/{teach-workspace → teach-craft}/references/pedagogy.md +41 -6
- package/docs/agents/audits.md +0 -1
- package/docs/agents/install-and-sync.md +0 -8
- package/docs/target/migrations.md +16 -2
- package/docs/target/projects.md +1 -1
- package/docs/workflow/parallel-features.md +1 -1
- package/docs/workflow/skill-map-on-request.md +10 -22
- package/docs/workflow/skill-map.md +11 -14
- package/docs/workflow/visual-design-workflow.md +1 -4
- package/governance/detect.toml +1 -6
- package/governance/renames.toml +0 -1
- package/package.json +2 -8
- package/scripts/core/regen-web-previews.ts +2 -67
- package/src/audits/catalog.ts +0 -1
- package/src/browser/engine.ts +3 -6
- package/src/capture/render.ts +1 -1
- package/src/claude/cases/authoring.ts +0 -12
- package/src/claude/cases/misc.ts +0 -22
- package/src/claude/cases/workflow.ts +2 -38
- package/src/claude/skills-audit.ts +1 -1
- package/src/cli/help.ts +0 -10
- package/src/cli.ts +0 -8
- package/src/commands/design.ts +16 -315
- package/src/commands/records.ts +0 -1
- package/src/commands/serve.ts +2 -2
- package/src/commands/sync.ts +4 -5
- package/src/design/components.ts +8 -1514
- package/src/design/css.ts +5 -6
- package/src/design/fonts.ts +3 -5
- package/src/design/regen.ts +5 -32
- package/src/design/render.ts +1 -1
- package/src/design/tokens.ts +3 -2
- package/src/driver/drive.ts +3 -4
- package/src/driver/steps.ts +2 -5
- package/src/gate/stages.ts +4 -10
- package/src/gov/audit.ts +1 -6
- package/src/inventory/walk.ts +1 -1
- package/src/markdown/scope.ts +6 -35
- package/src/records/validate.ts +4 -176
- package/src/sandbox/equivalence.ts +0 -5
- package/src/shipped/references.ts +1 -2
- package/src/sync/check.ts +4 -29
- package/src/sync/stamp.ts +6 -6
- package/src/sync/target.ts +1 -4
- package/tooling/claude/reference.md +1 -1
- package/tooling/claude/seeds/canon/DESIGN.md +1 -1
- package/claude/skills/canvas-board/REQUIREMENT.md +0 -35
- package/claude/skills/canvas-board/SKILL.md +0 -143
- package/claude/skills/canvas-board/references/canvas.md +0 -170
- package/claude/skills/draft-and-pick/REQUIREMENT.md +0 -26
- package/claude/skills/draft-and-pick/SKILL.md +0 -11
- package/claude/skills/draft-doc/REQUIREMENT.md +0 -26
- package/claude/skills/draft-doc/SKILL.md +0 -11
- package/claude/skills/draft-figure/REQUIREMENT.md +0 -26
- package/claude/skills/draft-figure/SKILL.md +0 -11
- package/claude/skills/draft-identity/REQUIREMENT.md +0 -26
- package/claude/skills/draft-identity/SKILL.md +0 -11
- package/claude/skills/draft-ready/REQUIREMENT.md +0 -26
- package/claude/skills/draft-ready/SKILL.md +0 -11
- package/claude/skills/draft-screencast/REQUIREMENT.md +0 -26
- package/claude/skills/draft-screencast/SKILL.md +0 -11
- package/claude/skills/draft-slides/REQUIREMENT.md +0 -26
- package/claude/skills/draft-slides/SKILL.md +0 -11
- package/claude/skills/make-deck/REQUIREMENT.md +0 -36
- package/claude/skills/make-deck/SKILL.md +0 -80
- package/claude/skills/make-deck/references/deck.md +0 -183
- package/claude/skills/read-frames/REQUIREMENT.md +0 -30
- package/claude/skills/read-frames/SKILL.md +0 -55
- package/claude/skills/record-screencast/REQUIREMENT.md +0 -35
- package/claude/skills/record-screencast/SKILL.md +0 -99
- package/claude/skills/script-screencast/REQUIREMENT.md +0 -34
- package/claude/skills/script-screencast/SKILL.md +0 -70
- package/claude/skills/script-screencast/references/beats-template.md +0 -119
- package/claude/skills/teach-workspace/REQUIREMENT.md +0 -34
- package/claude/skills/teach-workspace/SKILL.md +0 -196
- package/claude/skills/teach-workspace/references/glossary.md +0 -90
- package/claude/skills/teach-workspace/references/lesson-build.md +0 -106
- package/claude/skills/teach-workspace/references/lesson-craft.md +0 -135
- package/claude/skills/teach-workspace/references/promotion-fold.md +0 -35
- package/claude/skills/teach-workspace/references/promotion.md +0 -116
- package/claude/skills/teach-workspace/references/revisit.md +0 -28
- package/claude/skills/teach-workspace/references/teach.md +0 -211
- package/claude/skills/video-craft/REQUIREMENT.md +0 -35
- package/claude/skills/video-craft/SKILL.md +0 -96
- package/claude/skills/video-craft/references/adopted.md +0 -110
- package/governance/rules/ui/canvas.md +0 -13
- package/src/canvas/address.ts +0 -227
- package/src/canvas/arrange.ts +0 -66
- package/src/canvas/capture.ts +0 -391
- package/src/canvas/client/app.tsx +0 -188
- package/src/canvas/client/inspector/align-grid.tsx +0 -162
- package/src/canvas/client/inspector/color-field.tsx +0 -398
- package/src/canvas/client/inspector/color-inputs.tsx +0 -139
- package/src/canvas/client/inspector/color-picker.tsx +0 -668
- package/src/canvas/client/inspector/color-space.ts +0 -240
- package/src/canvas/client/inspector/field.tsx +0 -263
- package/src/canvas/client/inspector/fields.css +0 -763
- package/src/canvas/client/inspector/section.tsx +0 -27
- package/src/canvas/client/inspector/size-field.tsx +0 -69
- package/src/canvas/client/inspector/token-select.tsx +0 -109
- package/src/canvas/client/inspector/values.ts +0 -297
- package/src/canvas/client/inspector.tsx +0 -692
- package/src/canvas/client/keys.ts +0 -71
- package/src/canvas/client/layers.tsx +0 -118
- package/src/canvas/client/main.tsx +0 -71
- package/src/canvas/client/pages-panel.tsx +0 -212
- package/src/canvas/client/panel-handle.tsx +0 -90
- package/src/canvas/client/selection.tsx +0 -199
- package/src/canvas/client/shell.css +0 -762
- package/src/canvas/client/state.ts +0 -792
- package/src/canvas/client/surface.tsx +0 -803
- package/src/canvas/client/theme-panel.tsx +0 -55
- package/src/canvas/client/tools.tsx +0 -153
- package/src/canvas/content.ts +0 -781
- package/src/canvas/edit.ts +0 -575
- package/src/canvas/editing.ts +0 -203
- package/src/canvas/fit.ts +0 -238
- package/src/canvas/global.d.ts +0 -15
- package/src/canvas/history.ts +0 -116
- package/src/canvas/index.html +0 -20
- package/src/canvas/server.ts +0 -766
- package/src/canvas/tokens.ts +0 -221
- package/src/commands/canvas.ts +0 -1097
- package/src/commands/demo.ts +0 -542
- package/src/commands/slides.ts +0 -184
- package/src/commands/teach.ts +0 -1401
- package/src/demo/beats.ts +0 -135
- package/src/demo/compile.ts +0 -350
- package/src/demo/container.ts +0 -219
- package/src/demo/cursors.ts +0 -55
- package/src/demo/drive.ts +0 -442
- package/src/demo/pointer.ts +0 -178
- package/src/demo/theme.ts +0 -112
- package/src/demo/timeline.ts +0 -64
- package/src/design/adapter.ts +0 -59
- package/src/design/base.css +0 -203
- package/src/design/brand-favicon.ts +0 -18
- package/src/design/neutral.ts +0 -127
- package/src/design/project-fonts.ts +0 -392
- package/src/slides/convert/chart.ts +0 -165
- package/src/slides/convert/deck.ts +0 -244
- package/src/slides/convert/export.ts +0 -567
- package/src/slides/convert/master.ts +0 -198
- package/src/slides/convert/shapes.ts +0 -804
- package/src/slides/convert/svg.ts +0 -38
- package/src/slides/convert/walk.ts +0 -671
- package/src/slides/decks.ts +0 -110
- package/src/slides/open.ts +0 -18
- package/src/slides/package/fonts.ts +0 -301
- package/src/slides/package/motion.ts +0 -316
- package/src/slides/package/test-face.ts +0 -113
- package/src/teach/browser/compile.ts +0 -44
- package/src/teach/browser/dismiss.ts +0 -76
- package/src/teach/browser/focus-line.ts +0 -19
- package/src/teach/browser/glossary-filter.ts +0 -44
- package/src/teach/browser/head.ts +0 -30
- package/src/teach/browser/quiz.ts +0 -19
- package/src/teach/browser/reload.ts +0 -9
- package/src/teach/browser/sidebar.ts +0 -233
- package/src/teach/browser/theme.ts +0 -18
- package/src/teach/components/code.tsx +0 -24
- package/src/teach/components/heading.tsx +0 -11
- package/src/teach/components/list.tsx +0 -17
- package/src/teach/components/paragraph.tsx +0 -29
- package/src/teach/components/refs.tsx +0 -28
- package/src/teach/cross-references.ts +0 -78
- package/src/teach/fonts.ts +0 -16
- package/src/teach/highlight.ts +0 -71
- package/src/teach/html/jsx-dev-runtime.ts +0 -13
- package/src/teach/html/jsx-runtime.ts +0 -113
- package/src/teach/html/raw.ts +0 -28
- package/src/teach/lesson.ts +0 -178
- package/src/teach/nav.ts +0 -1337
- package/src/teach/render.ts +0 -240
- package/src/teach/workspace.ts +0 -1164
- package/src/teach/write-if-changed.ts +0 -17
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Canvas reference
|
|
3
|
-
description: Page folders, frame files, the layout.json shape, token resolution, and what a frame must not assume on a local design canvas
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Canvas reference
|
|
7
|
-
|
|
8
|
-
Applies to the canvas content under `.canon/canvas/`, where each page is a folder of HTML frames and a layout file placing them. A frame is a draft drawn to be looked at and picked from, so it changes whenever someone tries a direction, and the operator clears it once the direction lands where the project keeps its design.
|
|
9
|
-
|
|
10
|
-
The folder is gitignored, so nothing in a repository checks its shape and nothing backs it up by default.
|
|
11
|
-
|
|
12
|
-
## Contents
|
|
13
|
-
|
|
14
|
-
- [Scope](#scope)
|
|
15
|
-
- [What a working canvas looks like](#what-a-working-canvas-looks-like)
|
|
16
|
-
- [Pages](#pages)
|
|
17
|
-
- [Frames](#frames)
|
|
18
|
-
- [House style](#house-style)
|
|
19
|
-
- [Layout](#layout)
|
|
20
|
-
- [Tokens](#tokens)
|
|
21
|
-
- [What a frame must not assume](#what-a-frame-must-not-assume)
|
|
22
|
-
- [Template](#template)
|
|
23
|
-
|
|
24
|
-
## Scope
|
|
25
|
-
|
|
26
|
-
Governs the canvas content under `.canon/canvas/`: page folder names, frame files, the `layout.json` shape, how tokens reach a frame, and what a frame must not assume about where it renders.
|
|
27
|
-
|
|
28
|
-
- Also governs the house style of an explanation frame, being a diagram, a board of notes, or a comparison
|
|
29
|
-
- A mockup of the project's own interface is not an explanation frame, and follows the project's design document for type, color, and layout
|
|
30
|
-
|
|
31
|
-
Does not govern:
|
|
32
|
-
|
|
33
|
-
- The design decisions a mockup frame is drafting, such as type, color, and layout taste: the project's own design document
|
|
34
|
-
- The project's design document and the token module it renders from, which a picked direction is carried into: `design.md`
|
|
35
|
-
- The procedure that starts the canvas, reads the operator's selection, and carries a pick back, which belongs to the surface driving the canvas
|
|
36
|
-
- Voice, rhythm, and sentence construction in any text a frame shows: the `write-human` skill
|
|
37
|
-
|
|
38
|
-
## What a working canvas looks like
|
|
39
|
-
|
|
40
|
-
A canvas works when the operator and a session can point at the same thing and see the same thing:
|
|
41
|
-
|
|
42
|
-
- Which pages exist, and which frames sit on each?
|
|
43
|
-
- Where does each frame sit on its page, and at what width does it render?
|
|
44
|
-
- Does each frame show the project's own tokens rather than values copied into it?
|
|
45
|
-
- Does a frame render the same in the live canvas as in a capture?
|
|
46
|
-
|
|
47
|
-
A canvas failing these is non-conforming even when it satisfies every shape rule below.
|
|
48
|
-
|
|
49
|
-
## Pages
|
|
50
|
-
|
|
51
|
-
- Make one folder per page directly under `.canon/canvas/`. A page groups the frames compared side by side, such as the candidates for one decision.
|
|
52
|
-
- Name a page as one path segment of letters, digits, dots, dashes, and underscores, starting with a letter or a digit. A name opening with a dot is hidden from every listing.
|
|
53
|
-
- Never write a folder whose name opens with a dot. Those names are reserved for files the canvas generates and removes itself.
|
|
54
|
-
- Rename a page rather than copying it under a new name, so its layout and frames stay together.
|
|
55
|
-
|
|
56
|
-
## Frames
|
|
57
|
-
|
|
58
|
-
- Write one frame as one `.html` file inside its page folder. The filename without its extension is the frame's name, and the name follows the page naming rule.
|
|
59
|
-
- Write a frame as a whole document or as a fragment. The server writes in the `html`, `head`, and `body` a fragment leaves out, marked so a pick still matches the file.
|
|
60
|
-
- State a `body` whenever the frame states a `head`. The browser builds one the file leaves out, and an address the operator picks inside the frame can no longer be matched to the file.
|
|
61
|
-
- Write every table with its `tbody` stated, for the same reason. A browser adds one the file leaves out.
|
|
62
|
-
|
|
63
|
-
### Content and edits
|
|
64
|
-
|
|
65
|
-
A frame is the only copy of its markup, so it carries everything it needs.
|
|
66
|
-
|
|
67
|
-
- Keep a frame self-contained. Inline its own styles and scripts, or link a file inside the same page folder, since a frame is served from its page and nothing outside the canvas resolves.
|
|
68
|
-
- Use the project's custom properties, `var(--<name>)`, for every value the token stylesheet defines. A literal copied from it shows the right color today and the wrong one after the next token change.
|
|
69
|
-
- Edit a frame by rewriting its file. The file is the frame, and nothing else holds a copy of its markup.
|
|
70
|
-
|
|
71
|
-
## House style
|
|
72
|
-
|
|
73
|
-
Applies to an explanation frame only. A mockup of the project's interface renders at the app's own sizes and follows the project's design document instead.
|
|
74
|
-
|
|
75
|
-
- Write text in sentence case. Use no all-caps text and no `text-transform: uppercase`.
|
|
76
|
-
- Keep lines short, one fact a line.
|
|
77
|
-
- Set body text at 20px or larger and headings at 44px or larger. Set nothing under 16px.
|
|
78
|
-
- Render an explanation frame about 1100px wide.
|
|
79
|
-
|
|
80
|
-
### Colors, faces, and fit
|
|
81
|
-
|
|
82
|
-
Take colors from the project's custom properties. A frame defining colors of its own sets the dark values on `:root` and the light ones under `[data-theme="light"]`, since the shell sets `data-theme` on each frame's root.
|
|
83
|
-
|
|
84
|
-
- Name only the faces the canvas serves into every frame, being `Geist Variable` for text, `Noto Sans Mono` for code, and `Excalifont` for a hand-drawn look
|
|
85
|
-
- Those render the same in a capture and in any browser, so a height fitted against them holds
|
|
86
|
-
- Make each box tall enough to show all its content, with no scrollbar and no clipped line
|
|
87
|
-
- Run `canon canvas fit <page>/<frame>` rather than estimating, since it measures the content in the capture browser and sets the height
|
|
88
|
-
- Read frames left to right in reading order. Let `frame add` place each frame after the last with the standard gap, and move one only when the operator asks for a position.
|
|
89
|
-
|
|
90
|
-
## Layout
|
|
91
|
-
|
|
92
|
-
- Keep one `layout.json` per page, beside its frames. It holds each frame's box and nothing else, so moving a frame never rewrites its markup.
|
|
93
|
-
- Key each box by the frame's name, under one top-level `frames` object.
|
|
94
|
-
- Give every box four finite numbers in pixels: `x` and `y` for its top-left corner on the page, `width` for the width the frame renders at, and `height` for the height it shows on the canvas.
|
|
95
|
-
|
|
96
|
-
### Missing boxes and writes
|
|
97
|
-
|
|
98
|
-
The layout file is shared state, so a write never discards a box another writer or reader holds.
|
|
99
|
-
|
|
100
|
-
- Leave a frame out of the layout only when its position does not matter yet. A reader places an unnamed frame in a row after the others, at the default size of 1440 by 900.
|
|
101
|
-
- Never write the file while a writer holds its lock, which is the same name with `.lock` appended. Two writers each replacing the whole file lose one of the two edits.
|
|
102
|
-
- Treat a layout that does not parse as a defect to repair, never as an empty one to overwrite. Writing over it erases every box it held.
|
|
103
|
-
|
|
104
|
-
The keys below are the ones a reader parses. The frame names are placeholders.
|
|
105
|
-
|
|
106
|
-
```json
|
|
107
|
-
{
|
|
108
|
-
"frames": {
|
|
109
|
-
"hero-a": { "x": 0, "y": 0, "width": 1440, "height": 900 },
|
|
110
|
-
"hero-b": { "x": 1520, "y": 0, "width": 1440, "height": 900 }
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
## Tokens
|
|
116
|
-
|
|
117
|
-
- Expect the token stylesheet first in every frame's `head` when it is served, ahead of anything the frame links. A stylesheet the frame links itself still wins the cascade.
|
|
118
|
-
- Read the tokens from the canvas tool's own module inside its own checkout, else the project's installed base stylesheet plus its project override folder, else none
|
|
119
|
-
- A canvas with no token source renders unstyled and says so
|
|
120
|
-
- Never paste the token stylesheet into a frame. The injected copy follows the project, and a pasted one stops following it the moment it is written.
|
|
121
|
-
|
|
122
|
-
## What a frame must not assume
|
|
123
|
-
|
|
124
|
-
- Do not assume a viewport. A frame renders at its layout width on the canvas and in a capture alike, so size it with media queries against that width rather than against the operator's window.
|
|
125
|
-
- Do not assume the theme. The canvas theme toggle is the operator's own state, and a capture shows each frame in its default theme.
|
|
126
|
-
- Do not assume a network. Name a served face, or ship the font beside the frame, since a capture refuses a frame naming a font it cannot find.
|
|
127
|
-
|
|
128
|
-
### Font, source, and checkout
|
|
129
|
-
|
|
130
|
-
Do not assume a default font. Set `font-family` with a served face first on an element the frame's text inherits from, since a capture checks the first family of the text it renders and the browser's default serif is absent from many machines.
|
|
131
|
-
|
|
132
|
-
- A frame naming a machine family such as `DejaVu Sans` renders at another height in another browser, which `canon canvas fit` reports
|
|
133
|
-
- Do not assume the frame is the source. A picked direction is carried into the project's design document or a plan, and the operator clears the frame once it has been carried.
|
|
134
|
-
- Do not assume the canvas survives the checkout. The folder is gitignored, so a lost checkout loses every page in it.
|
|
135
|
-
|
|
136
|
-
## Template
|
|
137
|
-
|
|
138
|
-
A new frame starts from this skeleton. The names in it are placeholders.
|
|
139
|
-
|
|
140
|
-
```html
|
|
141
|
-
<!doctype html>
|
|
142
|
-
<html lang="en">
|
|
143
|
-
<head>
|
|
144
|
-
<meta charset="utf-8" />
|
|
145
|
-
<title>frame-name</title>
|
|
146
|
-
<style>
|
|
147
|
-
html {
|
|
148
|
-
font-family: installed-family, sans-serif;
|
|
149
|
-
}
|
|
150
|
-
main {
|
|
151
|
-
padding: var(--space-lg);
|
|
152
|
-
color: var(--color-text);
|
|
153
|
-
background: var(--color-background);
|
|
154
|
-
}
|
|
155
|
-
/* only a color the frame defines itself: dark on :root, light here */
|
|
156
|
-
:root {
|
|
157
|
-
--frame-accent: #7aa2ff;
|
|
158
|
-
}
|
|
159
|
-
[data-theme='light'] {
|
|
160
|
-
--frame-accent: #1f4fd8;
|
|
161
|
-
}
|
|
162
|
-
</style>
|
|
163
|
-
</head>
|
|
164
|
-
<body>
|
|
165
|
-
<main>
|
|
166
|
-
<h1>frame-name</h1>
|
|
167
|
-
</main>
|
|
168
|
-
</body>
|
|
169
|
-
</html>
|
|
170
|
-
```
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: draft-and-pick
|
|
3
|
-
description: Why a pointer answers under the old `draft-and-pick` name, and the test that retires it
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Draft and pick requirement
|
|
7
|
-
|
|
8
|
-
## Gap
|
|
9
|
-
|
|
10
|
-
Without this skill, a person typing the old name after the rename to `pick-by-eye` meets an unknown command that names no successor. A target that has not run `canon migrate skill-names` still tells people to type it, and so does a live gitignored record, which the sweep never reads.
|
|
11
|
-
|
|
12
|
-
## Must
|
|
13
|
-
|
|
14
|
-
- Name `pick-by-eye` as the skill to run, so a typed invocation of the old name reaches the new one in one step
|
|
15
|
-
- Carry `disable-model-invocation: true`, so routing never matches the old description against a request `pick-by-eye` owns
|
|
16
|
-
- Retire once `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name
|
|
17
|
-
|
|
18
|
-
## Must not
|
|
19
|
-
|
|
20
|
-
- Carry any part of the draft and pick loop, which would give one behavior two bodies that drift apart
|
|
21
|
-
- Retire on a release number, which retires it on a date nothing measured
|
|
22
|
-
|
|
23
|
-
## Out of scope
|
|
24
|
-
|
|
25
|
-
- The work itself, which `pick-by-eye` owns
|
|
26
|
-
- Rewriting a stale citation, which `canon migrate skill-names` owns in a tracked file and the controlling session owns on the board
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: draft-and-pick
|
|
3
|
-
description: Renamed from `draft-and-pick` to `pick-by-eye`. Answers a typed invocation of the old pick skill name by pointing at the new one.
|
|
4
|
-
disable-model-invocation: true
|
|
5
|
-
metadata:
|
|
6
|
-
family: decide
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Draft and pick
|
|
10
|
-
|
|
11
|
-
This skill is now `pick-by-eye`. Run `/canon:pick-by-eye` instead, and change any file that still names this one.
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: draft-doc
|
|
3
|
-
description: Why a pointer answers under the old `draft-doc` name, and the test that retires it
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Draft doc requirement
|
|
7
|
-
|
|
8
|
-
## Gap
|
|
9
|
-
|
|
10
|
-
Without this skill, a person typing the old name after the rename to `write-doc` meets an unknown command that names no successor. A target that has not run `canon migrate skill-names` still tells people to type it, and so does a live gitignored record, which the sweep never reads.
|
|
11
|
-
|
|
12
|
-
## Must
|
|
13
|
-
|
|
14
|
-
- Name `write-doc` as the skill to run, so a typed invocation of the old name reaches the new one in one step
|
|
15
|
-
- Carry `disable-model-invocation: true`, so routing never matches the old description against a request `write-doc` owns
|
|
16
|
-
- Retire once `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name
|
|
17
|
-
|
|
18
|
-
## Must not
|
|
19
|
-
|
|
20
|
-
- Carry any part of the document draft, which would give one behavior two bodies that drift apart
|
|
21
|
-
- Retire on a release number, which retires it on a date nothing measured
|
|
22
|
-
|
|
23
|
-
## Out of scope
|
|
24
|
-
|
|
25
|
-
- The work itself, which `write-doc` owns
|
|
26
|
-
- Rewriting a stale citation, which `canon migrate skill-names` owns in a tracked file and the controlling session owns on the board
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: draft-doc
|
|
3
|
-
description: Renamed from `draft-doc` to `write-doc`. Answers a typed invocation of the old doc skill name by pointing at the new one.
|
|
4
|
-
disable-model-invocation: true
|
|
5
|
-
metadata:
|
|
6
|
-
family: generate
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Draft doc
|
|
10
|
-
|
|
11
|
-
This skill is now `write-doc`. Run `/canon:write-doc` instead, and change any file that still names this one.
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: draft-figure
|
|
3
|
-
description: Why a pointer answers under the old `draft-figure` name, and the test that retires it
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Draft figure requirement
|
|
7
|
-
|
|
8
|
-
## Gap
|
|
9
|
-
|
|
10
|
-
Without this skill, a person typing the old name after the rename to `draw-figure` meets an unknown command that names no successor. A target that has not run `canon migrate skill-names` still tells people to type it, and so does a live gitignored record, which the sweep never reads.
|
|
11
|
-
|
|
12
|
-
## Must
|
|
13
|
-
|
|
14
|
-
- Name `draw-figure` as the skill to run, so a typed invocation of the old name reaches the new one in one step
|
|
15
|
-
- Carry `disable-model-invocation: true`, so routing never matches the old description against a request `draw-figure` owns
|
|
16
|
-
- Retire once `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name
|
|
17
|
-
|
|
18
|
-
## Must not
|
|
19
|
-
|
|
20
|
-
- Carry any part of the figure draft, which would give one behavior two bodies that drift apart
|
|
21
|
-
- Retire on a release number, which retires it on a date nothing measured
|
|
22
|
-
|
|
23
|
-
## Out of scope
|
|
24
|
-
|
|
25
|
-
- The work itself, which `draw-figure` owns
|
|
26
|
-
- Rewriting a stale citation, which `canon migrate skill-names` owns in a tracked file and the controlling session owns on the board
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: draft-figure
|
|
3
|
-
description: Renamed from `draft-figure` to `draw-figure`. Answers a typed invocation of the old figure skill name by pointing at the new one.
|
|
4
|
-
disable-model-invocation: true
|
|
5
|
-
metadata:
|
|
6
|
-
family: generate
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Draft figure
|
|
10
|
-
|
|
11
|
-
This skill is now `draw-figure`. Run `/canon:draw-figure` instead, and change any file that still names this one.
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: draft-identity
|
|
3
|
-
description: Why a pointer answers under the old `draft-identity` name, and the test that retires it
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Draft identity requirement
|
|
7
|
-
|
|
8
|
-
## Gap
|
|
9
|
-
|
|
10
|
-
Without this skill, a person typing the old name after the rename to `design-identity` meets an unknown command that names no successor. A target that has not run `canon migrate skill-names` still tells people to type it, and so does a live gitignored record, which the sweep never reads.
|
|
11
|
-
|
|
12
|
-
## Must
|
|
13
|
-
|
|
14
|
-
- Name `design-identity` as the skill to run, so a typed invocation of the old name reaches the new one in one step
|
|
15
|
-
- Carry `disable-model-invocation: true`, so routing never matches the old description against a request `design-identity` owns
|
|
16
|
-
- Retire once `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name
|
|
17
|
-
|
|
18
|
-
## Must not
|
|
19
|
-
|
|
20
|
-
- Carry any part of the logo and social card draft, which would give one behavior two bodies that drift apart
|
|
21
|
-
- Retire on a release number, which retires it on a date nothing measured
|
|
22
|
-
|
|
23
|
-
## Out of scope
|
|
24
|
-
|
|
25
|
-
- The work itself, which `design-identity` owns
|
|
26
|
-
- Rewriting a stale citation, which `canon migrate skill-names` owns in a tracked file and the controlling session owns on the board
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: draft-identity
|
|
3
|
-
description: Renamed from `draft-identity` to `design-identity`. Answers a typed invocation of the old identity skill name by pointing at the new one.
|
|
4
|
-
disable-model-invocation: true
|
|
5
|
-
metadata:
|
|
6
|
-
family: generate
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Draft identity
|
|
10
|
-
|
|
11
|
-
This skill is now `design-identity`. Run `/canon:design-identity` instead, and change any file that still names this one.
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: draft-ready
|
|
3
|
-
description: Why a pointer answers under the old `draft-ready` name, and the test that retires it
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Draft ready requirement
|
|
7
|
-
|
|
8
|
-
## Gap
|
|
9
|
-
|
|
10
|
-
Without this skill, a person typing the old name after the rename to `plan-ready` meets an unknown command that names no successor. A target that has not run `canon migrate skill-names` still tells people to type it, and so does a live gitignored record, which the sweep never reads.
|
|
11
|
-
|
|
12
|
-
## Must
|
|
13
|
-
|
|
14
|
-
- Name `plan-ready` as the skill to run, so a typed invocation of the old name reaches the new one in one step
|
|
15
|
-
- Carry `disable-model-invocation: true`, so routing never matches the old description against a request `plan-ready` owns
|
|
16
|
-
- Retire once `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name
|
|
17
|
-
|
|
18
|
-
## Must not
|
|
19
|
-
|
|
20
|
-
- Carry any part of the ready folder packaging, which would give one behavior two bodies that drift apart
|
|
21
|
-
- Retire on a release number, which retires it on a date nothing measured
|
|
22
|
-
|
|
23
|
-
## Out of scope
|
|
24
|
-
|
|
25
|
-
- The work itself, which `plan-ready` owns
|
|
26
|
-
- Rewriting a stale citation, which `canon migrate skill-names` owns in a tracked file and the controlling session owns on the board
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: draft-ready
|
|
3
|
-
description: Renamed from `draft-ready` to `plan-ready`. Answers a typed invocation of the old ready skill name by pointing at the new one.
|
|
4
|
-
disable-model-invocation: true
|
|
5
|
-
metadata:
|
|
6
|
-
family: generate
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Draft ready
|
|
10
|
-
|
|
11
|
-
This skill is now `plan-ready`. Run `/canon:plan-ready` instead, and change any file that still names this one.
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: draft-screencast
|
|
3
|
-
description: Why a pointer answers under the old `draft-screencast` name, and the test that retires it
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Draft screencast requirement
|
|
7
|
-
|
|
8
|
-
## Gap
|
|
9
|
-
|
|
10
|
-
Without this skill, a person typing the old name after the rename to `script-screencast` meets an unknown command that names no successor. A target that has not run `canon migrate skill-names` still tells people to type it, and so does a live gitignored record, which the sweep never reads.
|
|
11
|
-
|
|
12
|
-
## Must
|
|
13
|
-
|
|
14
|
-
- Name `script-screencast` as the skill to run, so a typed invocation of the old name reaches the new one in one step
|
|
15
|
-
- Carry `disable-model-invocation: true`, so routing never matches the old description against a request `script-screencast` owns
|
|
16
|
-
- Retire once `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name
|
|
17
|
-
|
|
18
|
-
## Must not
|
|
19
|
-
|
|
20
|
-
- Carry any part of the screencast script draft, which would give one behavior two bodies that drift apart
|
|
21
|
-
- Retire on a release number, which retires it on a date nothing measured
|
|
22
|
-
|
|
23
|
-
## Out of scope
|
|
24
|
-
|
|
25
|
-
- The work itself, which `script-screencast` owns
|
|
26
|
-
- Rewriting a stale citation, which `canon migrate skill-names` owns in a tracked file and the controlling session owns on the board
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: draft-screencast
|
|
3
|
-
description: Renamed from `draft-screencast` to `script-screencast`. Answers a typed invocation of the old screencast skill name by pointing at the new one.
|
|
4
|
-
disable-model-invocation: true
|
|
5
|
-
metadata:
|
|
6
|
-
family: generate
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Draft screencast
|
|
10
|
-
|
|
11
|
-
This skill is now `script-screencast`. Run `/canon:script-screencast` instead, and change any file that still names this one.
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: draft-slides
|
|
3
|
-
description: Why a pointer answers under the old `draft-slides` name, and the test that retires it
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Draft slides requirement
|
|
7
|
-
|
|
8
|
-
## Gap
|
|
9
|
-
|
|
10
|
-
Without this skill, a person typing the old name after the rename to `make-deck` meets an unknown command that names no successor. A target that has not run `canon migrate skill-names` still tells people to type it, and so does a live gitignored record, which the sweep never reads.
|
|
11
|
-
|
|
12
|
-
## Must
|
|
13
|
-
|
|
14
|
-
- Name `make-deck` as the skill to run, so a typed invocation of the old name reaches the new one in one step
|
|
15
|
-
- Carry `disable-model-invocation: true`, so routing never matches the old description against a request `make-deck` owns
|
|
16
|
-
- Retire once `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name
|
|
17
|
-
|
|
18
|
-
## Must not
|
|
19
|
-
|
|
20
|
-
- Carry any part of the deck draft, which would give one behavior two bodies that drift apart
|
|
21
|
-
- Retire on a release number, which retires it on a date nothing measured
|
|
22
|
-
|
|
23
|
-
## Out of scope
|
|
24
|
-
|
|
25
|
-
- The work itself, which `make-deck` owns
|
|
26
|
-
- Rewriting a stale citation, which `canon migrate skill-names` owns in a tracked file and the controlling session owns on the board
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: draft-slides
|
|
3
|
-
description: Renamed from `draft-slides` to `make-deck`. Answers a typed invocation of the old slides skill name by pointing at the new one.
|
|
4
|
-
disable-model-invocation: true
|
|
5
|
-
metadata:
|
|
6
|
-
family: generate
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Draft slides
|
|
10
|
-
|
|
11
|
-
This skill is now `make-deck`. Run `/canon:make-deck` instead, and change any file that still names this one.
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: make-deck
|
|
3
|
-
description: Why the skill draws a deck as HTML in the project's tokens inside its own folder, why the CLI owns the conversion, and why one render is read back before the deck is called done
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Make deck requirement
|
|
7
|
-
|
|
8
|
-
## Gap
|
|
9
|
-
|
|
10
|
-
Without this skill, a session writes a deck into whatever path occurs to it, so a second deck overwrites the first and nothing lists either. It writes pptxgenjs code or hex colors, so the deck ignores the project's design. Every slide comes out as a title over bullets, which reads as a document rather than a deck.
|
|
11
|
-
|
|
12
|
-
It invents attributes the converter does not read, so a section, a chart, or an entrance silently goes missing. A first render shipped unread hands the audience the overlap, the overflow, and every element the converter fell back to a picture for.
|
|
13
|
-
|
|
14
|
-
## Must
|
|
15
|
-
|
|
16
|
-
- The existing decks and the slide format are read from the CLI before drawing, and a new deck takes a name no listed deck carries unless the request names one
|
|
17
|
-
- Each deck lands in its own folder under the slides record folder, one HTML file per slide in filename order, drawn with the project's custom properties
|
|
18
|
-
- The composition varies across the deck, and content fits the slide frame with short titles and tight lines
|
|
19
|
-
- The render command produces the deck itself
|
|
20
|
-
- Every fallback and refusal the render reports is read, one QA pass runs over the rendered images, and what both report is fixed once
|
|
21
|
-
|
|
22
|
-
## Must not
|
|
23
|
-
|
|
24
|
-
- Hardcode a deck name, an attribute, or a chart type, or reimplement the conversion, the master, or the packaging the CLI owns
|
|
25
|
-
- Write a deck into the shared layouts folder, which is never listed as a deck
|
|
26
|
-
- Invent token values when the project has no token stylesheet, rather than saying the deck renders unstyled
|
|
27
|
-
- Write centered body text or content that overflows a slide
|
|
28
|
-
- Loop on aesthetics past a single fix pass, or fail the render when the image tools for the QA pass are missing
|
|
29
|
-
|
|
30
|
-
## Out of scope
|
|
31
|
-
|
|
32
|
-
- Converting HTML to PowerPoint, which the CLI owns end to end
|
|
33
|
-
- The project's palette and faces, which its token stylesheet owns
|
|
34
|
-
- Writing the content the deck is about, which the caller owns
|
|
35
|
-
- Drafting a deck as a canvas page, which no skill owns until that authoring surface is measured
|
|
36
|
-
- Recording a demo, which `script-screencast` owns
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: make-deck
|
|
3
|
-
description: Draws a deck as HTML slides in the project's own design, one folder under `.canon/slides/` per deck, then renders it to an editable PowerPoint file via `canon slides render`. Use when asked to "draft slides", "make a deck", "build a presentation", "turn this into slides", or "render the deck". Holds the deck design rules. Do NOT reimplement the conversion. The CLI owns layout into PowerPoint shapes, the master, and packaging. Assumes the `canon` CLI is on PATH.
|
|
4
|
-
metadata:
|
|
5
|
-
family: generate
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Make deck
|
|
9
|
-
|
|
10
|
-
Draw each slide as an HTML file in a deck folder, then shell out to `canon slides render`. The CLI lays every slide out in a browser and rebuilds it as editable PowerPoint shapes. This skill owns the content, the slide markup, and the design choices the markup encodes.
|
|
11
|
-
|
|
12
|
-
## Read the decks and the format
|
|
13
|
-
|
|
14
|
-
Run the list first, then read the format. Never hardcode a deck name, an attribute, or a chart type.
|
|
15
|
-
|
|
16
|
-
```bash
|
|
17
|
-
canon slides list --json 2>/dev/null
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
The list returns one row per deck, carrying its `name`, `title`, slide count, and `path`. When the request names a deck the list holds, edit that folder. Otherwise pick a new kebab-case name no row carries.
|
|
21
|
-
|
|
22
|
-
Read `${CLAUDE_SKILL_DIR}/references/deck.md`. It states what `deck.json` holds, what each slide declares on its `<body>`, the motion attributes, speaker notes, and charts. Each refusal prints as a `✗` line from the render.
|
|
23
|
-
|
|
24
|
-
## Draw the deck
|
|
25
|
-
|
|
26
|
-
A deck folder sits at `.canon/slides/<deck>/` from the project root, and holds:
|
|
27
|
-
|
|
28
|
-
- One `.html` file per slide, rendered in filename order. Number them with a zero-padded prefix, such as `01-cover.html`, so a slide inserted later sorts where it belongs.
|
|
29
|
-
- `deck.json`, optional, for the title, the header and footer bands, slide numbers, the mark, and embedded faces.
|
|
30
|
-
- `assets/` for images the slides reference by a relative path.
|
|
31
|
-
|
|
32
|
-
Never write a slide into `.canon/slides/layouts/`. That folder holds the project's shared layouts and is never listed as a deck.
|
|
33
|
-
|
|
34
|
-
Each slide is a full HTML document laid out at 1280 by 720 CSS pixels. Position its blocks absolutely or with a flex or grid container sized to that frame, and keep every element inside it.
|
|
35
|
-
|
|
36
|
-
## Design rules
|
|
37
|
-
|
|
38
|
-
The render injects the project's token stylesheet ahead of each slide's own styles, so the deck takes the project's design rather than the toolkit's.
|
|
39
|
-
|
|
40
|
-
- Use the project's custom properties, such as `var(--color-accent)`, for every color, face, and spacing value, read from `.claude/design/base.css` and overrides under `.claude/design/project/`
|
|
41
|
-
- When neither exists, say the deck renders unstyled rather than inventing values to cover it
|
|
42
|
-
- Leave the `--color-*` roles to the stylesheet. The master reads its colors off the first slide's `<html>`, so a slide computing its own `--color-text` is reported, since the bands keep the master's.
|
|
43
|
-
- Vary the composition across slides. Never repeat a title over bullets on every slide. Reach for columns, a row of large numbers, a grid of cards, a chart, a pull quote, and section dividers.
|
|
44
|
-
|
|
45
|
-
### Fit and shapes
|
|
46
|
-
|
|
47
|
-
Text and shapes have to survive the conversion.
|
|
48
|
-
|
|
49
|
-
- Keep titles short and lines tight, so text fits its box at the size the design sets rather than overflowing the frame.
|
|
50
|
-
- Never write centered body text.
|
|
51
|
-
- Prefer CSS the converter maps to native shapes. An unmappable property is drawn as a picture and reported on stderr, so a slide full of gradients and filters stops being editable.
|
|
52
|
-
|
|
53
|
-
## Render
|
|
54
|
-
|
|
55
|
-
Shell out to the CLI. It writes the deck and reports the path.
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
canon slides render <deck>
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
With one deck in the project the name can be left out. The render refuses with the deck list when there are several. Pass `--open` to open the deck, and `--mirror <dir>`, or set `CANON_SLIDES_MIRROR`, to copy it into a synced folder.
|
|
62
|
-
|
|
63
|
-
Read every `✗` line the render prints. A picture fallback, a refused link, chart, or effect, and a missing token each leave the deck written with that piece degraded or left out.
|
|
64
|
-
|
|
65
|
-
## QA loop
|
|
66
|
-
|
|
67
|
-
Run this once after the first render, then stop.
|
|
68
|
-
|
|
69
|
-
1. Convert the deck with `soffice --headless --convert-to pdf <deck>.pptx`, then `pdftoppm -r 90 -png <deck>.pdf slide`. If either is missing, skip the image pass and say so rather than fail the render.
|
|
70
|
-
2. Open and inspect every rendered image in this session, checking each slide for overlap, overflow, low contrast, and empty regions.
|
|
71
|
-
3. Fix the reported issues and the `✗` lines in the slide files once, re-render, and stop. Do not loop indefinitely on aesthetics.
|
|
72
|
-
|
|
73
|
-
## Response
|
|
74
|
-
|
|
75
|
-
After rendering, report:
|
|
76
|
-
|
|
77
|
-
- The deck folder, the slide count, and the written `.pptx` path
|
|
78
|
-
- Whether the project's token stylesheet was found
|
|
79
|
-
- Each `✗` line the final render printed, or that it printed none
|
|
80
|
-
- Any QA issues found and what changed, or that the deck passed clean
|