@erclx/canon 5.23.0 → 5.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/claude/.claude-plugin/plugin.json +1 -1
  2. package/claude/skills/backlog-triage/REQUIREMENT.md +2 -2
  3. package/claude/skills/backlog-triage/SKILL.md +19 -6
  4. package/claude/skills/canon-operator/REQUIREMENT.md +1 -0
  5. package/claude/skills/canon-operator/SKILL.md +5 -1
  6. package/claude/skills/canvas/REQUIREMENT.md +49 -0
  7. package/claude/skills/canvas/SKILL.md +106 -0
  8. package/claude/skills/design-extract/REQUIREMENT.md +1 -1
  9. package/claude/skills/draft-doc/REQUIREMENT.md +2 -1
  10. package/claude/skills/draft-doc/references/readme/agent-facing.md +59 -0
  11. package/claude/skills/draft-doc/references/readme/application.md +66 -0
  12. package/claude/skills/draft-doc/references/readme/cli.md +64 -0
  13. package/claude/skills/draft-doc/references/readme/library.md +57 -0
  14. package/claude/skills/draft-doc/references/readme/plugin.md +66 -0
  15. package/claude/skills/draft-doc/references/readme.md +33 -4
  16. package/claude/skills/draft-figure/REQUIREMENT.md +14 -3
  17. package/claude/skills/draft-figure/SKILL.md +24 -51
  18. package/claude/skills/draft-figure/references/architecture-set.md +35 -0
  19. package/claude/skills/draft-figure/references/hand-drawn.md +31 -0
  20. package/claude/skills/draft-figure/references/mermaid.md +55 -0
  21. package/claude/skills/git-followup/SKILL.md +17 -6
  22. package/claude/skills/git-pr/references/evidence.md +4 -2
  23. package/claude/skills/git-split/SKILL.md +1 -1
  24. package/claude/skills/index-lookup/SKILL.md +2 -2
  25. package/claude/skills/review-address/SKILL.md +6 -13
  26. package/claude/skills/review-address/references/rest-reads.md +43 -0
  27. package/claude/skills/review-craft/references/ui.md +7 -1
  28. package/claude/skills/review-pr/REQUIREMENT.md +1 -0
  29. package/claude/skills/review-pr/SKILL.md +9 -3
  30. package/claude/skills/review-pr/references/close-out.md +2 -2
  31. package/claude/skills/review-pr/references/post.md +17 -5
  32. package/claude/skills/review-pr/references/scope.md +10 -8
  33. package/claude/skills/review-ui/SKILL.md +12 -4
  34. package/claude/skills/role-orchestrator/references/orchestrator-cloud-launch.md +30 -1
  35. package/claude/skills/role-orchestrator/references/orchestrator-launch.md +4 -0
  36. package/claude/skills/role-orchestrator/references/orchestrator-poll.md +4 -4
  37. package/claude/skills/role-orchestrator/references/orchestrator-review-dispatch.md +6 -0
  38. package/claude/skills/role-orchestrator/scripts/poll.ts +90 -27
  39. package/claude/skills/role-orchestrator/scripts/repo.ts +3 -5
  40. package/claude/skills/role-orchestrator/scripts/watch.ts +4 -7
  41. package/docs/agents/canvas.md +6 -2
  42. package/docs/agents/commands.md +45 -45
  43. package/docs/agents/context-audit-checks.md +2 -2
  44. package/docs/agents/index.md +0 -1
  45. package/docs/agents/key-changes.md +3 -3
  46. package/docs/agents/pr-evidence.md +11 -2
  47. package/docs/agents/pr-reads.md +5 -4
  48. package/docs/target/projects.md +4 -4
  49. package/docs/workflow/ai-workflow.md +0 -1
  50. package/docs/workflow/skill-map.md +3 -3
  51. package/docs/workflow/visual-design-workflow.md +2 -1
  52. package/governance/renames.toml +0 -4
  53. package/governance/rules/standards/markdown.md +1 -0
  54. package/package.json +1 -2
  55. package/scripts/core/install-check.sh +1 -1
  56. package/src/audits/catalog.ts +2 -2
  57. package/src/canvas/client/inspector/field.tsx +200 -0
  58. package/src/canvas/client/inspector/fields.css +151 -0
  59. package/src/canvas/client/inspector/section.tsx +27 -0
  60. package/src/canvas/client/inspector/values.ts +60 -0
  61. package/src/canvas/client/inspector.tsx +192 -111
  62. package/src/canvas/client/shell.css +0 -94
  63. package/src/canvas/tokens.ts +9 -1
  64. package/src/claude/cases/misc.ts +5 -0
  65. package/src/claude/cases/workflow.ts +1 -1
  66. package/src/claude/seeds.ts +0 -1
  67. package/src/commands/canvas.ts +29 -0
  68. package/src/commands/design.ts +2 -64
  69. package/src/commands/pr.ts +219 -202
  70. package/src/context/audit.ts +7 -6
  71. package/src/design/budget.ts +149 -0
  72. package/src/design/document.ts +22 -10
  73. package/src/design/render.ts +11 -1
  74. package/src/design/tokens.ts +40 -61
  75. package/src/gate/measures.ts +49 -0
  76. package/src/gate/stages.ts +5 -1
  77. package/src/help.ts +2 -2
  78. package/src/migrate/skill-names.ts +7 -1
  79. package/src/pr/evidence.ts +25 -5
  80. package/src/pr/rest.ts +137 -0
  81. package/standards/canvas.md +112 -0
  82. package/standards/context.md +2 -1
  83. package/standards/design.md +13 -3
  84. package/standards/figures.md +0 -1
  85. package/standards/index.md +1 -1
  86. package/standards/markdown.md +1 -0
  87. package/standards/mermaid.md +1 -7
  88. package/tooling/claude/reference.md +0 -5
  89. package/tooling/claude/seeds/.claude/hooks/scratch-guard.sh +1 -1
  90. package/claude/skills/draft-diagram/REQUIREMENT.md +0 -45
  91. package/claude/skills/draft-diagram/SKILL.md +0 -177
  92. package/docs/agents/design-board.md +0 -33
  93. package/governance/rules/standards/diagrams.md +0 -14
  94. package/governance/rules/standards/mermaid.md +0 -15
  95. package/scripts/core/check-gallery-exclusion.sh +0 -50
  96. package/src/design/board.ts +0 -576
  97. package/standards/diagrams.md +0 -132
  98. package/tooling/claude/seeds/.claude/diagrams/index.md +0 -8
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "canon",
3
3
  "description": "Runs your agent's work and keeps its code good, on one setup for every repo.",
4
- "version": "5.23.0",
4
+ "version": "5.25.0",
5
5
  "author": {
6
6
  "name": "Eric Le",
7
7
  "url": "https://github.com/erclx"
@@ -9,12 +9,12 @@ description: Why the backlog gets a measured verdict per row with a lean toward
9
9
 
10
10
  Without this skill, the backlog only grows. `task-board` declines or archives one named task, and nothing reads the backlog as a whole, so a row stays until somebody happens to remember it and decides by hand. The orchestrator's backlog re-test only clears a row upward onto the board, so no sweep ever takes one off. A backlog past fifty rows had no surface that could say which of them still mattered.
11
11
 
12
- Three failure modes cost more than the rest. A pass that judges a row by what its task file says rather than by the tree keeps every row, since a task file reads as live the day it was written and every day after. A pass that applies its own verdicts decides rows on silence, which ships a decline nobody approved on a board with no history to restore it from. And a keep that carries no measurement is the default nobody argues with, so a triage without a lean toward decline ends with the same backlog it started with.
12
+ Four failure modes cost more than the rest. A pass that judges a row by what its task file says rather than by the tree keeps every row, since a task file reads as live the day it was written and every day after. A pass that applies its own verdicts decides rows on silence, which ships a decline nobody approved on a board with no history to restore it from. A keep that carries no measurement is the default nobody argues with, so a triage without a lean toward decline ends with the same backlog it started with. And a keep that measures only that the defect still exists keeps nearly everything, since a row filed against the tree almost always still reproduces. One pass suggested keeping 24 of 27 rows that way, where the operator kept 6 and promoted 1.
13
13
 
14
14
  ## Must
15
15
 
16
16
  - Measure every row against the tree and the log during the pass, carrying a count, a path, or a commit rather than the task file's own claim
17
- - Suggest decline for any row this pass cannot argue for, putting the burden of proof on keep and promote
17
+ - Suggest keep or promote only for a row that names a cost, being a wrong result the pass observed or a case someone hit, including a user asking for a feature or working around its absence, or a reach, being a defect on a path the project ships that changes what its users or targets receive, hit or not, and suggest decline for a row whose defect merely still exists
18
18
  - Name the commit or pull request per outcome position before suggesting archive
19
19
  - File into an ordinary intake folder, so the intake list and answer verbs read and write it unchanged
20
20
  - Carry the verdict in the suggestion line and the task stem in the item heading, rather than in new fields
@@ -45,18 +45,31 @@ A row whose link resolves to no file gets an item anyway, carrying `decline` and
45
45
 
46
46
  Measure every claim the task makes against the tree and `git log` during this pass. Grep for the construct its defect names and count the sites, check whether each open outcome's behavior exists, and search the log for a commit or pull request that shipped it under another task. Never carry a figure from the task file forward as current, since the task states what was true when it was filed.
47
47
 
48
+ Then gather the evidence Step 5 reads for each row that reproduces. Check whether its origin line or `## Findings` names an issue, a run, or a person it bit. Search the log for a commit or pull request that worked around it rather than fixing it. For a defect in something the project ships, whether a route or a page its users call or a rule, a seed, a scaffold, or a verb other repositories copy or run, name the shipped path it sits on. Record each one that is absent as absent rather than inferring it.
49
+
48
50
  Name the commit the pass measured against in the overview body.
49
51
 
50
52
  ### Step 5: pick the verdict
51
53
 
52
- Keep and promote carry the burden of proof. A row nobody can argue for from this pass's measurement is declined.
54
+ Keep and promote carry the burden of proof, and a defect that still exists does not meet it. A row filed against the tree nearly always still reproduces, so a test of reproduction alone keeps almost every row.
55
+
56
+ A row earns keep or promote only by naming one of two things from the evidence Step 4 gathered:
57
+
58
+ - **A cost**: the defect gives a wrong result that this pass observed, by running the verb that carries it or reading the committed output that shows it, or that the row's evidence shows an issue, a run, or a person hit, a workaround commit included. A hit counts only while the pass does not measure it as fixed or as no longer recurring.
59
+ - **A reach**: the defect sits on a path the project ships, and everyone who reaches that path, whether a user calling it or a target copying or running it, receives the defect as a wrong instruction, a broken, failing, or unbounded behavior, or a wrong output. Reach needs no hit, since the path's users meet the defect whether or not anyone reported it.
60
+
61
+ A plausible cost names nothing. A row arguing what could go wrong off a shipped path, with no observed output and no hit, is declined however likely the argument sounds. Three things are not a reach: a missing feature on a shipped surface, a defect that changes nothing a user or a target receives, such as dead code on a shipped path, and a defect that shows only in this repository's own config, workflows, scripts, or fixtures.
62
+
63
+ A missing protection is a defect, not a missing feature. Read a row as a missing protection when the shipped path lacks a bound, a check, or a guard on what it does at run time, such as a limit, a timeout, or input validation, so that the path can fail, run unbounded, or return a wrong output for every user who reaches it. That is a reach. A missing feature leaves the path working as it does today and adds a capability, a document kind, or a sentence of guidance, and it is not a reach.
64
+
65
+ A missing feature can still earn keep or promote through the cost arm. A user asking for it in an issue or a report, or working around its absence on their side, is a case someone hit, so that row is never declined for being a feature. A feature nobody asked for is declined. A passing mention is not a request, and neither is one the project's own planning records filed with no user behind it.
53
66
 
54
- - **keep**: the defect or gap reproduces this pass, stated with a count or a path.
55
- - **promote**: it reproduces, and the thing it was waiting on has cleared, naming what cleared it.
67
+ - **keep**: the defect reproduces this pass, stated with a count or a path, and the row names a cost or a reach, stated with the observation, the hit, or the shipped path.
68
+ - **promote**: it qualifies for keep, and the thing it was waiting on has cleared, naming what cleared it.
56
69
  - **archive**: every open outcome is measured shipped, naming the commit or pull request per outcome position.
57
- - **decline**: anything else, including a defect the tree no longer holds, work superseded by another task, and a row whose argument rests only on its original filing.
70
+ - **decline**: anything else, including a defect that reproduces but names no cost and no reach, a defect the tree no longer holds, work superseded by another task, and a row whose argument rests only on its original filing.
58
71
 
59
- Age is evidence in neither direction. A row untouched for months is not more declinable than one filed yesterday, and a row filed yesterday is not more worth keeping.
72
+ Age is evidence in neither direction. A row untouched for months is not more declinable than one filed yesterday, and a row filed yesterday is not more worth keeping. An old hit is read the same way as a new one, by whether the pass measures it as still able to recur.
60
73
 
61
74
  ### Step 6: write the items
62
75
 
@@ -64,7 +77,7 @@ Write one item per row in the intake item format, one cluster file per domain th
64
77
 
65
78
  - `Problem:` states what this pass measured, with the count, path, or commit behind it
66
79
  - `Fix:` states what applying the verdict does to the board
67
- - `Worth it:` carries the verdict's reason in one clause
80
+ - `Worth it:` names the cost or the reach the verdict rests on in one clause, or says the row names neither. A `yes` or a `later` carries no verdict on its own, so a decline can follow either word
68
81
  - `Open:` reads `decline, archive, keep, or promote?` on every item
69
82
  - `Suggested:` opens with exactly one of the four verdict tokens, then the reason. An archive suggestion lists every outcome position it closes, as `archive 1, 3: shipped in #NNN`
70
83
  - `Overlaps:` names a live board task that already carries the work, where one does
@@ -27,6 +27,7 @@ The last failure is a section no route reaches. `## Route` maps an intent or a d
27
27
  - Run the CLI non-interactively and report the command run, what changed, and the full path of anything written
28
28
  - Read the overwrite contract from the body before any install or sync, and name each surface it lists as overwritten before running one
29
29
  - Read the reverse walk beside the forward sections, so a folder the toolkit stopped shipping reaches the user
30
+ - Read `unmovedSurfaces` from the report itself, since the drift status ignores it by design, and name `canon migrate surface-roots` without running either form
30
31
  - Name an unmigrated domain's root and install path for the user to move themselves, since no skill covers the move
31
32
  - Route a measurement intent to the audit offers from the route table itself, rather than leaving the section reachable only by reading past the table
32
33
  - Rank a lifecycle row against the audit offers where the route table itself states it, so a session acting on the lifecycle row reads the ranking without opening the section being ranked
@@ -22,10 +22,11 @@ Load a domain doc with `canon docs <topic>` only when the intent touches that do
22
22
 
23
23
  Run `canon sync --check . --json` before routing. It reports what a target is behind on across every surface, so the intent comes from the project state rather than from the user having to know it already. Skip only when the user named a single operation to run.
24
24
 
25
- Read seven fields off the report and carry each to `## Route`:
25
+ Read eight fields off the report and carry each to `## Route`:
26
26
 
27
27
  - `unmigrated`: a domain sitting at the root layout with nothing under `.claude/`. The most urgent finding, because that domain reports no drift of its own while being entirely behind
28
28
  - `superseded`: a file a newer seed folder replaced. No command moves it, since the content is the project's own, so this routes to `canon:target-check` for the full per-domain reading rather than ending at the report
29
+ - `unmovedSurfaces`: a surface held only at its `.claude/` spelling, each entry carrying `rel` and `movesTo`. Every other field reads clean for such a target, and the report's drift status ignores it by design, so read the array itself rather than an exit status
29
30
  - `seeds`: entries are `matching`, `stale`, `drifted`, or `missing`. Anything but `matching` needs the seed handoff
30
31
  - `domains[].entries`: per-file `stale`, `customized`, `stranded`, and `orphaned` as before, plus `retired` for a rule the toolkit no longer ships, which the next sync deletes
31
32
  - `reverse`: what the target holds that no live catalog claims. `unclaimed` lists folders at roots the toolkit stopped shipping, each with an `attribution` of `dropped`, `unattributed`, or `project`. Act on the first two and leave `project` alone, which history proved the project owns
@@ -34,6 +35,8 @@ Read seven fields off the report and carry each to `## Route`:
34
35
 
35
36
  State what the report found in one line per finding before acting on any of it.
36
37
 
38
+ An `unmovedSurfaces` key the report does not carry at all is likewise a CLI predating the field rather than a target with nothing to move. Say the section was unread and name the installed CLI version as the cause.
39
+
37
40
  A `reverse` key the report does not carry at all is a CLI predating the field rather than a target with nothing unclaimed. Say the walk did not run and name the CLI version as the cause. Reading the absent key as an empty answer reports a clean target to a project nobody has looked at, and answering it from a filesystem walk of your own is worse, since that reaches a verdict the attribution the field carries is the only thing entitled to make.
38
41
 
39
42
  ## Route
@@ -44,6 +47,7 @@ The two can name different rows, and a reply answers both rather than picking on
44
47
 
45
48
  - A domain in `unmigrated`: name it, the root path, and the install path. No command moves it, so the user runs the relocation themselves
46
49
  - Anything in `superseded`: name which files and what replaced them, then hand off to `canon:target-check`, which reports and never moves or deletes the file
50
+ - Anything in `unmovedSurfaces`: name `canon migrate surface-roots`, which only reports its plan until `--write` is passed, with each entry's `rel` and `movesTo`, and run neither form, since the move rewrites tracked paths
47
51
  - A folder in `unclaimed`: name it and the attribution it carries. No command moves it and the content may be the project's own, so the decision is the user's
48
52
 
49
53
  - First-time scaffold of a fresh project: hand off to `target-setup`
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: canvas
3
+ description: Scope boundary for driving the local design canvas, and the line between a drafted frame and the design it feeds
4
+ ---
5
+
6
+ # Canvas requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a session asked to draw on the canvas writes frames into a folder nothing is serving, so the operator sees nothing and the session reports the frames as drawn. When the server is running, the session trusts a passing capture as proof the canvas works. Captures go through the frame route, so a shell that answers its address with an empty page passes every capture while the operator looks at a blank tab.
11
+
12
+ It reads "this one" from the conversation rather than from the operator's selection, and when it does read the selection it acts on an element index recorded against an earlier version of the file, which lands the edit on a different element. It restyles through a class while the operator's inspector edit sits on the element as inline style, so the change never shows and the session reports it as made.
13
+
14
+ It writes frames from a linked worktree with the file tools, which refuse the main-root path and offer a worktree copy the canvas never serves. It captures after every edit, filling session scratch with images of drafts nobody picked.
15
+
16
+ When the operator picks a frame, the session leaves the decision on the canvas and cites the frame as the design, so the project's design document never learns it and a gitignored file becomes the only record.
17
+
18
+ ## Must
19
+
20
+ - Start the canvas when it is not serving, before writing any frame
21
+ - Confirm the live shell loads at the address the server reported, rather than trusting a capture
22
+ - Read the address off the server's record rather than composing one
23
+ - Make pages and frames through the verbs, so a box and the operator's drags share one locked writer
24
+ - Name the main-root write route for a frame written from a linked worktree
25
+ - Read the operator's selection when they point at something, and treat a stale element pick as unknown
26
+ - Read a frame's inline styles before restyling it, and say which operator edits were kept and which dropped
27
+ - Capture once per finished frame or page rather than after every edit
28
+ - Carry a picked direction into the project's design document or wireframes
29
+
30
+ ## Must not
31
+
32
+ - Present the canvas as the project's source of truth for design
33
+ - Promise the canvas survives a lost checkout
34
+ - Name any third-party design tool, or the canvas's predecessor surface
35
+ - Be invoked only by the author typing its name. A request to draw, select, or capture on the canvas should reach it by description, and a run where it never fires on such a request is a defect in the description
36
+
37
+ ## Guards
38
+
39
+ - No `canon` on PATH, or an installed CLI with no canvas command, stop rather than writing files nothing serves
40
+ - A server that refuses to start, or a shell that answers blank, stop and report it rather than drawing into it
41
+
42
+ ## Out of scope
43
+
44
+ - What the canvas verbs do internally, which is the CLI's own contract
45
+ - The content format a frame and a layout take, which the canvas standard fixes
46
+ - Drafting candidates for a taste decision and taking the pick, which `draft-and-pick` runs on its own render path
47
+ - Tracing reference images into design values, which is `sketch-design`
48
+ - Writing the design document itself, which is `design-extract`
49
+ - Backing up the canvas folder off one disk
@@ -0,0 +1,106 @@
1
+ ---
2
+ name: canvas
3
+ description: Drives the local design canvas, where pages hold HTML frames the operator sees, drags, selects, and edits in the browser. Starts the canvas when it is not running, confirms the live shell loads, makes pages and frames, edits a frame through its file, reads what the operator selected or restyled, captures finished frames, and carries a picked direction into the project's design document. Use when asked to "open the canvas", "put this on the canvas", "draw a frame for X", "change the one I selected", "what did I pick", "capture this frame", or "move that frame on the canvas". Do NOT use to trace reference images into design values, which is `sketch-design`, or to write the design document from code, which is `design-extract`.
4
+ ---
5
+
6
+ # Canvas
7
+
8
+ Drive the canvas the operator is looking at. A page is a folder of HTML frames and a frame is one file, so a session draws by writing files and the operator sees each write land in the browser. The content format is fixed by `${CLAUDE_SKILL_DIR}/../../standards/canvas.md`. Read it before writing a frame.
9
+
10
+ Every verb below is `canon canvas`. Run `canon docs canvas` for the full verb reference, its records, and its refusals.
11
+
12
+ ## Guards
13
+
14
+ - If `canon` is not on PATH, stop: `❌ canon CLI not found.`
15
+ - If `canon canvas --help` reports no such command, stop: `❌ The installed canon carries no canvas command. Update the CLI and re-run.`
16
+ - Write no frame before the canvas is serving and the shell has loaded. A frame nobody can see is a draft reported as delivered.
17
+ - Never present a frame as the project's design. The canvas is a drafting surface and the project's design document or wireframes hold what was decided.
18
+ - Never promise the canvas survives a lost checkout. Its folder is gitignored and nothing backs it up.
19
+
20
+ ## Step 1: start the canvas and confirm the shell
21
+
22
+ Read the pages first, which also proves the verb resolves:
23
+
24
+ ```bash
25
+ canon canvas list --json
26
+ ```
27
+
28
+ The record carries `content`, the folder every page lives in. It sits at the main worktree root whichever worktree the session runs in, so write through that path rather than one composed from the current directory.
29
+
30
+ Start the server in the background unless the operator named an address that already answers, since it runs until interrupted. No verb reports a running server, and a second one is harmless, since it walks to the next free port and serves the same folder:
31
+
32
+ ```bash
33
+ canon canvas serve --json
34
+ ```
35
+
36
+ Read `url` off the record rather than composing one, since the server walks past a port already in use. Report the refusal and its `reason` when `ok` is false, and stop there.
37
+
38
+ Then fetch the printed address and check the shell itself, not a capture:
39
+
40
+ - The body is non-empty and carries a `<script` tag. An empty `200` means the shell failed to build, usually a dependency missing from the canvas tool's install, and every capture still passes because captures go through the frame route alone. Report it as a blank shell and stop.
41
+ - `<url>/api/pages` answers with JSON listing the pages.
42
+
43
+ Hand the operator the address as a markdown link carrying the URL as its text and its target.
44
+
45
+ ## Step 2: make pages and frames
46
+
47
+ - Add a page for each decision being drafted: `canon canvas page add <page> --json`.
48
+ - Add each frame through the verb, which writes the starting file and its box in one locked step: `canon canvas frame add <page> <frame> --width <px> --height <px> --json`. Give the width the frame should render at, since a capture and the canvas both render at it.
49
+ - Lay frames out with `canon canvas frame move <page> <frame> --x <px> --y <px> --json` rather than writing `layout.json` by hand, since the operator's drags write the same file under a lock.
50
+ - Name pages and frames for what they hold, such as `pricing` and `pricing-dense`, so the operator can say which one by name.
51
+
52
+ ## Step 3: edit a frame through its file
53
+
54
+ Write the frame's whole document to the `path` the add verb reported. The open canvas reloads the frame when its file changes.
55
+
56
+ - From a linked worktree, `Edit` and `Write` refuse a main-root path. Write the whole file through one plain `Bash` heredoc instead, the route `session-worktree` states for a main-root write, and never take the redirect to a worktree copy.
57
+ - Change one property of one element with `canon canvas edit <page>/<frame> --element <index> --set <property>=<value> --json` when the set it accepts covers the change, since it leaves every other byte as it was.
58
+ - Use the project's custom properties for every value the token stylesheet defines. The record from `serve` names the token source under `tokens`, and a `none` source means frames render unstyled, so say so rather than inventing values to cover it.
59
+
60
+ ## Step 4: read what the operator pointed at
61
+
62
+ Read the selection when the operator says "this one", "the selected frame", or "that button":
63
+
64
+ ```bash
65
+ canon canvas selection --json
66
+ ```
67
+
68
+ - `selection: null` means nothing is selected or the selected frame is gone. Ask which one rather than guessing.
69
+ - An `element` carrying `stale: true` was picked against an earlier version of the file, so its `index` may now land on a different element. Treat the pick as unknown and ask the operator to pick again, rather than acting on the index or matching its `tag` and `text` by eye.
70
+ - A fresh `element` gives the `index` that `canvas edit` takes.
71
+
72
+ ## Step 5: respect the operator's inspector edits
73
+
74
+ The operator restyles elements from the inspector, and each edit lands as inline `style` on the element. Inline style beats a class, so a class change made afterwards does not show.
75
+
76
+ - Read the frame's inline `style` attributes before restyling anything in it.
77
+ - Keep an inline property the operator set unless the change replaces it, and drop it, through `canvas edit` with an empty value or by rewriting the file, when it does.
78
+ - Say which operator edits were kept and which were dropped.
79
+
80
+ ## Step 6: capture finished work
81
+
82
+ - Capture a frame once it is finished: `canon canvas capture <page>/<frame> --json`. Each PNG is the frame's whole document, so its height follows the content rather than the box.
83
+ - Capture a whole page once its frames are finished: `canon canvas capture <page> --composite --json`. The image shows each frame clipped to its box at its layout position.
84
+ - Capture once per finished frame or page, not after every edit. The live canvas is the working view, and a capture is the record handed on.
85
+ - Read each `path` off the record rather than composing one.
86
+ - A capture refused because a font is not installed names the family it read off the frame's `html` element. Set that element's `font-family` to a family the machine has and capture again, rather than reporting the frame as captured.
87
+
88
+ ## Step 7: carry a picked direction back
89
+
90
+ When the operator picks a frame, the decision leaves the canvas.
91
+
92
+ - Carry visual values, being color, type, spacing, and radius, into the project's design document, through the skill that owns it. Carry structure and layout into the project's wireframes.
93
+ - Name the frame the decision came from in the reply, and leave the frame on the canvas until the operator clears it.
94
+ - Never cite a frame path from a tracked file. The folder is gitignored, so the citation resolves on this machine alone.
95
+
96
+ ## Output
97
+
98
+ ```plaintext
99
+ ✅ Canvas: <url the serve verb reported>
100
+ Page: <page>, <n> frames
101
+ Selected: <page>/<frame>, element <index>, or none, or stale
102
+ Capture: <path of each capture written>
103
+ Carried: <the design document or wireframe the pick went to, or not yet>
104
+ ```
105
+
106
+ Write the canvas line's URL as a markdown link. Omit the capture line when nothing was captured and the carried line when no direction was picked. Emit every path from the project root.
@@ -39,4 +39,4 @@ The greenfield case is the one that fails quietly. A project with no UI code sti
39
39
  - Mutating an existing design system, which is a direct edit of the file rather than a skill
40
40
  - Producing the HTML and CSS preview, which `canon design render` owns
41
41
  - Auditing the implemented UI against the tokens, which `ux-audit` owns
42
- - Architecture and flow diagrams, which `draft-diagram` owns
42
+ - Architecture and flow diagrams, which `draft-figure` owns
@@ -19,6 +19,7 @@ The same procedure ran as five skills, one per kind, each restating the read, th
19
19
  - Check the catalog by exact name and by title and description, since a subject can be covered under a name the request does not guess
20
20
  - Confirm the resolved path, the kind's detections, and the full content with the user before writing, since placement and detection are judgment calls with no diff to preview them against
21
21
  - Regenerate the catalog of the folder the document landed in, where the kind keeps one, so the next run's collision check sees it
22
+ - Draft a README from the template for every detected project type and combine them, never the closest one, since a project that is a CLI and a plugin owes its reader both
22
23
  - Carry each kind's own musts in its reference: the root check for context and wireframes, tier detection and the two modes for wireframes, both placement tests and a fetched source for the wiki, and project detection and rendered-value badges for the readme
23
24
 
24
25
  ## Must not
@@ -41,5 +42,5 @@ The same procedure ran as five skills, one per kind, each restating the read, th
41
42
  - Rewriting or syncing an existing `docs/` page or an authored README against a diff: `docs-sync`
42
43
  - Refreshing an existing context entry or wireframe, or stubbing a surface a diff touched: `context-fold`
43
44
  - Drafting a standard or a governance rule: `create-standard`, `create-rule`
44
- - Drawing a figure or a diagram for a document: `draft-figure`, `draft-diagram`
45
+ - Drawing a figure or a diagram for a document: `draft-figure`
45
46
  - Voice, rhythm, punctuation, and formatting in the drafted document: the `write-human` skill and the markdown standard
@@ -0,0 +1,59 @@
1
+ ![<Project name> logo](<committed logo path>)
2
+
3
+ # <Project name>
4
+
5
+ [![<build status>](<badge image URL>)](<run history URL>)
6
+ [![<license>](<badge image URL>)](<license URL>)
7
+
8
+ <One-line claim taken from the repository description.>
9
+
10
+ <Two or three sentences expanding the claim: the conventions or tooling an agent working here picks up, and what a session gains from them.>
11
+
12
+ ## Installation
13
+
14
+ ### Requirements
15
+
16
+ - <Agent tool and minimum version>
17
+ - <Runtime the listing command needs>
18
+
19
+ ### Set up
20
+
21
+ ```bash
22
+ <clone command>
23
+ <setup command, when a session needs one>
24
+ ```
25
+
26
+ ## Usage
27
+
28
+ ### What an agent loads first
29
+
30
+ `<file an agent reads at session start>` carries <what that file holds>. It points at <the files it imports or links>.
31
+
32
+ ### List what the project exposes
33
+
34
+ ```bash
35
+ <command that lists skills, rules, or commands>
36
+ ```
37
+
38
+ ### Where things live
39
+
40
+ | Path | Holds |
41
+ | ---------- | ------------ |
42
+ | `<folder>` | <What it is> |
43
+
44
+ ## Documentation
45
+
46
+ <Link to the full conventions reference.>
47
+
48
+ ## Support
49
+
50
+ - <Where to open an issue>
51
+ - <Where to ask a question>
52
+
53
+ ## Contributing
54
+
55
+ See the [contributing guidelines](<CONTRIBUTING.md path>).
56
+
57
+ ## License
58
+
59
+ [<License name>](<LICENSE path>)
@@ -0,0 +1,66 @@
1
+ ![<Project name> logo](<committed logo path>)
2
+
3
+ # <Project name>
4
+
5
+ [![<build status>](<badge image URL>)](<run history URL>)
6
+ [![<license>](<badge image URL>)](<license URL>)
7
+
8
+ <One-line claim taken from the manifest or repository description.>
9
+
10
+ [<Live site name>](<live URL>)
11
+
12
+ ![<What the screenshot depicts>](<committed image path>)
13
+
14
+ <Two or three sentences expanding the claim: who the product is for, then what they do with it.>
15
+
16
+ ## Features
17
+
18
+ - <Benefit the user gets>
19
+ - <Benefit the user gets>
20
+
21
+ ## Installation
22
+
23
+ ### Requirements
24
+
25
+ - <Runtime and version>
26
+ - <Service the app depends on>
27
+
28
+ ### Set up
29
+
30
+ ```bash
31
+ <clone command>
32
+ <dependency install command>
33
+ ```
34
+
35
+ ## Usage
36
+
37
+ ### Run locally
38
+
39
+ ```bash
40
+ <dev server command>
41
+ ```
42
+
43
+ <Address the app serves on.>
44
+
45
+ ### Configuration
46
+
47
+ | Variable | Purpose | Default |
48
+ | -------- | ------------------ | ----------- |
49
+ | `<NAME>` | <What it controls> | `<default>` |
50
+
51
+ ### Deploy
52
+
53
+ <Where the app deploys and the command or workflow that does it.>
54
+
55
+ ## Support
56
+
57
+ - <Where to open an issue>
58
+ - <Where to ask a question>
59
+
60
+ ## Contributing
61
+
62
+ See the [contributing guidelines](<CONTRIBUTING.md path>).
63
+
64
+ ## License
65
+
66
+ [<License name>](<LICENSE path>)
@@ -0,0 +1,64 @@
1
+ ![<Project name> logo](<committed logo path>)
2
+
3
+ # <Project name>
4
+
5
+ [![<package version>](<badge image URL>)](<registry page URL>)
6
+ [![<build status>](<badge image URL>)](<run history URL>)
7
+ [![<license>](<badge image URL>)](<license URL>)
8
+
9
+ <One-line claim taken from the manifest description.>
10
+
11
+ <Two or three sentences expanding the claim: the task a reader repeats by hand, then what the command does about it.>
12
+
13
+ ## Features
14
+
15
+ - <Benefit the reader gets>
16
+ - <Benefit the reader gets>
17
+
18
+ ## Installation
19
+
20
+ ```bash
21
+ <global install or one-shot run command>
22
+ ```
23
+
24
+ <Runtime or platform requirement, when one exists.>
25
+
26
+ ## Usage
27
+
28
+ ### Run a command
29
+
30
+ ```bash
31
+ <command> <argument>
32
+ ```
33
+
34
+ ### Flags
35
+
36
+ ```bash
37
+ <command> --<flag> <value>
38
+ <command> --<flag>
39
+ ```
40
+
41
+ | Flag | Effect |
42
+ | ---------- | -------------- |
43
+ | `--<flag>` | <What it does> |
44
+
45
+ ### Exit codes
46
+
47
+ <What each non-zero exit means, when a script depends on it.>
48
+
49
+ ## Documentation
50
+
51
+ <Link to the full command reference.>
52
+
53
+ ## Support
54
+
55
+ - <Where to open an issue>
56
+ - <Where to ask a question>
57
+
58
+ ## Contributing
59
+
60
+ See the [contributing guidelines](<CONTRIBUTING.md path>).
61
+
62
+ ## License
63
+
64
+ [<License name>](<LICENSE path>)
@@ -0,0 +1,57 @@
1
+ ![<Project name> logo](<committed logo path>)
2
+
3
+ # <Project name>
4
+
5
+ [![<package version>](<badge image URL>)](<registry page URL>)
6
+ [![<build status>](<badge image URL>)](<run history URL>)
7
+ [![<license>](<badge image URL>)](<license URL>)
8
+
9
+ <One-line claim taken from the manifest description.>
10
+
11
+ [<Live site name>](<live URL>)
12
+
13
+ ![<What the screenshot depicts>](<committed image path>)
14
+
15
+ <Two or three sentences expanding the claim: the problem a reader recognizes, then what the library does about it.>
16
+
17
+ ## Features
18
+
19
+ - <Benefit the reader gets>
20
+ - <Benefit the reader gets>
21
+
22
+ ## Installation
23
+
24
+ ```bash
25
+ <install command for the package manager the project uses>
26
+ ```
27
+
28
+ ## Usage
29
+
30
+ ### Quickstart
31
+
32
+ ```<language>
33
+ <Import and one call that shows the core behavior>
34
+ ```
35
+
36
+ ### <Second common task>
37
+
38
+ ```<language>
39
+ <Snippet for the task>
40
+ ```
41
+
42
+ ## Documentation
43
+
44
+ <Link to the full API reference.>
45
+
46
+ ## Support
47
+
48
+ - <Where to open an issue>
49
+ - <Where to ask a question>
50
+
51
+ ## Contributing
52
+
53
+ See the [contributing guidelines](<CONTRIBUTING.md path>).
54
+
55
+ ## License
56
+
57
+ [<License name>](<LICENSE path>)
@@ -0,0 +1,66 @@
1
+ ![<Project name> logo](<committed logo path>)
2
+
3
+ # <Project name>
4
+
5
+ [![<build status>](<badge image URL>)](<run history URL>)
6
+ [![<license>](<badge image URL>)](<license URL>)
7
+
8
+ <One-line claim taken from the plugin manifest description.>
9
+
10
+ <Two or three sentences expanding the claim: the work a session repeats, then what the plugin adds to it.>
11
+
12
+ ## Features
13
+
14
+ - <Skill, command, or hook and what it gives the user>
15
+ - <Skill, command, or hook and what it gives the user>
16
+
17
+ ## Installation
18
+
19
+ ### <First channel name>
20
+
21
+ ```bash
22
+ <install command for this channel>
23
+ ```
24
+
25
+ ### <Second channel name>
26
+
27
+ ```bash
28
+ <install command for this channel>
29
+ ```
30
+
31
+ ### Update
32
+
33
+ ```bash
34
+ <update command>
35
+ ```
36
+
37
+ ## Usage
38
+
39
+ ### Invoke a skill
40
+
41
+ ```text
42
+ /<plugin name>:<skill name> <argument>
43
+ ```
44
+
45
+ ### What the plugin adds
46
+
47
+ | Name | Kind | Purpose |
48
+ | -------- | ------------------------- | -------------- |
49
+ | `<name>` | <skill, command, or hook> | <What it does> |
50
+
51
+ ### Configuration
52
+
53
+ <Setting the plugin reads and where the user sets it, when one exists.>
54
+
55
+ ## Support
56
+
57
+ - <Where to open an issue>
58
+ - <Where to ask a question>
59
+
60
+ ## Contributing
61
+
62
+ See the [contributing guidelines](<CONTRIBUTING.md path>).
63
+
64
+ ## License
65
+
66
+ [<License name>](<LICENSE path>)