markilo 0.4.0 → 1.0.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 (140) hide show
  1. package/README.md +70 -47
  2. package/THIRD_PARTY_NOTICES.md +26 -12
  3. package/package.json +15 -1
  4. package/plugin/.claude-plugin/plugin.json +1 -1
  5. package/plugin/THIRD_PARTY_NOTICES.md +26 -12
  6. package/plugin/agents/concept-designer.md +14 -5
  7. package/plugin/agents/design-critic.md +32 -3
  8. package/plugin/dist/markilo.mjs +213 -146
  9. package/plugin/fonts/alegreya-sans/OFL.txt +93 -0
  10. package/plugin/fonts/alegreya-sans/alegreya-sans-latin-400-normal.woff +0 -0
  11. package/plugin/fonts/alegreya-sans/alegreya-sans-latin-500-normal.woff +0 -0
  12. package/plugin/fonts/alegreya-sans/alegreya-sans-latin-700-normal.woff +0 -0
  13. package/plugin/fonts/alegreya-sans/alegreya-sans-latin-800-normal.woff +0 -0
  14. package/plugin/fonts/alegreya-sans/alegreya-sans-latin-ext-400-normal.woff +0 -0
  15. package/plugin/fonts/alegreya-sans/alegreya-sans-latin-ext-500-normal.woff +0 -0
  16. package/plugin/fonts/alegreya-sans/alegreya-sans-latin-ext-700-normal.woff +0 -0
  17. package/plugin/fonts/alegreya-sans/alegreya-sans-latin-ext-800-normal.woff +0 -0
  18. package/plugin/fonts/archivo/OFL.txt +93 -0
  19. package/plugin/fonts/archivo/archivo-latin-400-normal.woff +0 -0
  20. package/plugin/fonts/archivo/archivo-latin-500-normal.woff +0 -0
  21. package/plugin/fonts/archivo/archivo-latin-600-normal.woff +0 -0
  22. package/plugin/fonts/archivo/archivo-latin-700-normal.woff +0 -0
  23. package/plugin/fonts/archivo/archivo-latin-800-normal.woff +0 -0
  24. package/plugin/fonts/archivo/archivo-latin-900-normal.woff +0 -0
  25. package/plugin/fonts/archivo/archivo-latin-ext-400-normal.woff +0 -0
  26. package/plugin/fonts/archivo/archivo-latin-ext-500-normal.woff +0 -0
  27. package/plugin/fonts/archivo/archivo-latin-ext-600-normal.woff +0 -0
  28. package/plugin/fonts/archivo/archivo-latin-ext-700-normal.woff +0 -0
  29. package/plugin/fonts/archivo/archivo-latin-ext-800-normal.woff +0 -0
  30. package/plugin/fonts/archivo/archivo-latin-ext-900-normal.woff +0 -0
  31. package/plugin/fonts/atkinson-hyperlegible-next/OFL.txt +93 -0
  32. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-400-normal.woff +0 -0
  33. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-500-normal.woff +0 -0
  34. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-600-normal.woff +0 -0
  35. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-700-normal.woff +0 -0
  36. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-800-normal.woff +0 -0
  37. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-ext-400-normal.woff +0 -0
  38. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-ext-500-normal.woff +0 -0
  39. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-ext-600-normal.woff +0 -0
  40. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-ext-700-normal.woff +0 -0
  41. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-ext-800-normal.woff +0 -0
  42. package/plugin/fonts/bricolage-grotesque/OFL.txt +93 -0
  43. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-400-normal.woff +0 -0
  44. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-500-normal.woff +0 -0
  45. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-600-normal.woff +0 -0
  46. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-700-normal.woff +0 -0
  47. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-800-normal.woff +0 -0
  48. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-ext-400-normal.woff +0 -0
  49. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-ext-500-normal.woff +0 -0
  50. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-ext-600-normal.woff +0 -0
  51. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-ext-700-normal.woff +0 -0
  52. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-ext-800-normal.woff +0 -0
  53. package/plugin/fonts/dm-serif-display/OFL.txt +93 -0
  54. package/plugin/fonts/dm-serif-display/dm-serif-display-latin-400-normal.woff +0 -0
  55. package/plugin/fonts/dm-serif-display/dm-serif-display-latin-ext-400-normal.woff +0 -0
  56. package/plugin/fonts/familjen-grotesk/OFL.txt +93 -0
  57. package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-400-normal.woff +0 -0
  58. package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-500-normal.woff +0 -0
  59. package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-600-normal.woff +0 -0
  60. package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-700-normal.woff +0 -0
  61. package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-ext-400-normal.woff +0 -0
  62. package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-ext-500-normal.woff +0 -0
  63. package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-ext-600-normal.woff +0 -0
  64. package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-ext-700-normal.woff +0 -0
  65. package/plugin/fonts/fonts.json +628 -0
  66. package/plugin/fonts/instrument-serif/OFL.txt +93 -0
  67. package/plugin/fonts/instrument-serif/instrument-serif-latin-400-normal.woff +0 -0
  68. package/plugin/fonts/instrument-serif/instrument-serif-latin-ext-400-normal.woff +0 -0
  69. package/plugin/fonts/newsreader/OFL.txt +93 -0
  70. package/plugin/fonts/newsreader/newsreader-latin-400-normal.woff +0 -0
  71. package/plugin/fonts/newsreader/newsreader-latin-500-normal.woff +0 -0
  72. package/plugin/fonts/newsreader/newsreader-latin-600-normal.woff +0 -0
  73. package/plugin/fonts/newsreader/newsreader-latin-700-normal.woff +0 -0
  74. package/plugin/fonts/newsreader/newsreader-latin-800-normal.woff +0 -0
  75. package/plugin/fonts/newsreader/newsreader-latin-ext-400-normal.woff +0 -0
  76. package/plugin/fonts/newsreader/newsreader-latin-ext-500-normal.woff +0 -0
  77. package/plugin/fonts/newsreader/newsreader-latin-ext-600-normal.woff +0 -0
  78. package/plugin/fonts/newsreader/newsreader-latin-ext-700-normal.woff +0 -0
  79. package/plugin/fonts/newsreader/newsreader-latin-ext-800-normal.woff +0 -0
  80. package/plugin/fonts/schibsted-grotesk/OFL.txt +93 -0
  81. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-400-normal.woff +0 -0
  82. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-500-normal.woff +0 -0
  83. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-600-normal.woff +0 -0
  84. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-700-normal.woff +0 -0
  85. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-800-normal.woff +0 -0
  86. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-900-normal.woff +0 -0
  87. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-400-normal.woff +0 -0
  88. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-500-normal.woff +0 -0
  89. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-600-normal.woff +0 -0
  90. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-700-normal.woff +0 -0
  91. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-800-normal.woff +0 -0
  92. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-900-normal.woff +0 -0
  93. package/plugin/fonts/space-mono/OFL.txt +93 -0
  94. package/plugin/fonts/space-mono/space-mono-latin-400-normal.woff +0 -0
  95. package/plugin/fonts/space-mono/space-mono-latin-700-normal.woff +0 -0
  96. package/plugin/fonts/space-mono/space-mono-latin-ext-400-normal.woff +0 -0
  97. package/plugin/fonts/space-mono/space-mono-latin-ext-700-normal.woff +0 -0
  98. package/plugin/fonts/syne/OFL.txt +93 -0
  99. package/plugin/fonts/syne/syne-latin-400-normal.woff +0 -0
  100. package/plugin/fonts/syne/syne-latin-500-normal.woff +0 -0
  101. package/plugin/fonts/syne/syne-latin-600-normal.woff +0 -0
  102. package/plugin/fonts/syne/syne-latin-700-normal.woff +0 -0
  103. package/plugin/fonts/syne/syne-latin-800-normal.woff +0 -0
  104. package/plugin/fonts/syne/syne-latin-ext-400-normal.woff +0 -0
  105. package/plugin/fonts/syne/syne-latin-ext-500-normal.woff +0 -0
  106. package/plugin/fonts/syne/syne-latin-ext-600-normal.woff +0 -0
  107. package/plugin/fonts/syne/syne-latin-ext-700-normal.woff +0 -0
  108. package/plugin/fonts/syne/syne-latin-ext-800-normal.woff +0 -0
  109. package/plugin/fonts/unbounded/OFL.txt +93 -0
  110. package/plugin/fonts/unbounded/unbounded-latin-400-normal.woff +0 -0
  111. package/plugin/fonts/unbounded/unbounded-latin-500-normal.woff +0 -0
  112. package/plugin/fonts/unbounded/unbounded-latin-600-normal.woff +0 -0
  113. package/plugin/fonts/unbounded/unbounded-latin-700-normal.woff +0 -0
  114. package/plugin/fonts/unbounded/unbounded-latin-800-normal.woff +0 -0
  115. package/plugin/fonts/unbounded/unbounded-latin-900-normal.woff +0 -0
  116. package/plugin/fonts/unbounded/unbounded-latin-ext-400-normal.woff +0 -0
  117. package/plugin/fonts/unbounded/unbounded-latin-ext-500-normal.woff +0 -0
  118. package/plugin/fonts/unbounded/unbounded-latin-ext-600-normal.woff +0 -0
  119. package/plugin/fonts/unbounded/unbounded-latin-ext-700-normal.woff +0 -0
  120. package/plugin/fonts/unbounded/unbounded-latin-ext-800-normal.woff +0 -0
  121. package/plugin/fonts/unbounded/unbounded-latin-ext-900-normal.woff +0 -0
  122. package/plugin/fonts/young-serif/OFL.txt +93 -0
  123. package/plugin/fonts/young-serif/young-serif-latin-400-normal.woff +0 -0
  124. package/plugin/fonts/young-serif/young-serif-latin-ext-400-normal.woff +0 -0
  125. package/plugin/fonts/zilla-slab/OFL.txt +93 -0
  126. package/plugin/fonts/zilla-slab/zilla-slab-latin-400-normal.woff +0 -0
  127. package/plugin/fonts/zilla-slab/zilla-slab-latin-500-normal.woff +0 -0
  128. package/plugin/fonts/zilla-slab/zilla-slab-latin-600-normal.woff +0 -0
  129. package/plugin/fonts/zilla-slab/zilla-slab-latin-700-normal.woff +0 -0
  130. package/plugin/fonts/zilla-slab/zilla-slab-latin-ext-400-normal.woff +0 -0
  131. package/plugin/fonts/zilla-slab/zilla-slab-latin-ext-500-normal.woff +0 -0
  132. package/plugin/fonts/zilla-slab/zilla-slab-latin-ext-600-normal.woff +0 -0
  133. package/plugin/fonts/zilla-slab/zilla-slab-latin-ext-700-normal.woff +0 -0
  134. package/plugin/skills/concepts/SKILL.md +4 -4
  135. package/plugin/skills/design/SKILL.md +35 -12
  136. package/plugin/skills/design/references/cli.md +37 -36
  137. package/plugin/skills/design/references/construction.md +34 -1
  138. package/plugin/skills/design/references/design-principles.md +30 -0
  139. package/plugin/skills/export/SKILL.md +4 -2
  140. package/plugin/skills/gallery/SKILL.md +7 -6
@@ -0,0 +1,93 @@
1
+ Copyright 2023 The Young Serif Project Authors (https://github.com/noirblancrouge/YoungSerif)
2
+
3
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
+ This license is copied below, and is also available with a FAQ at:
5
+ http://scripts.sil.org/OFL
6
+
7
+
8
+ -----------------------------------------------------------
9
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10
+ -----------------------------------------------------------
11
+
12
+ PREAMBLE
13
+ The goals of the Open Font License (OFL) are to stimulate worldwide
14
+ development of collaborative font projects, to support the font creation
15
+ efforts of academic and linguistic communities, and to provide a free and
16
+ open framework in which fonts may be shared and improved in partnership
17
+ with others.
18
+
19
+ The OFL allows the licensed fonts to be used, studied, modified and
20
+ redistributed freely as long as they are not sold by themselves. The
21
+ fonts, including any derivative works, can be bundled, embedded,
22
+ redistributed and/or sold with any software provided that any reserved
23
+ names are not used by derivative works. The fonts and derivatives,
24
+ however, cannot be released under any other type of license. The
25
+ requirement for fonts to remain under this license does not apply
26
+ to any document created using the fonts or their derivatives.
27
+
28
+ DEFINITIONS
29
+ "Font Software" refers to the set of files released by the Copyright
30
+ Holder(s) under this license and clearly marked as such. This may
31
+ include source files, build scripts and documentation.
32
+
33
+ "Reserved Font Name" refers to any names specified as such after the
34
+ copyright statement(s).
35
+
36
+ "Original Version" refers to the collection of Font Software components as
37
+ distributed by the Copyright Holder(s).
38
+
39
+ "Modified Version" refers to any derivative made by adding to, deleting,
40
+ or substituting -- in part or in whole -- any of the components of the
41
+ Original Version, by changing formats or by porting the Font Software to a
42
+ new environment.
43
+
44
+ "Author" refers to any designer, engineer, programmer, technical
45
+ writer or other person who contributed to the Font Software.
46
+
47
+ PERMISSION & CONDITIONS
48
+ Permission is hereby granted, free of charge, to any person obtaining
49
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
50
+ redistribute, and sell modified and unmodified copies of the Font
51
+ Software, subject to the following conditions:
52
+
53
+ 1) Neither the Font Software nor any of its individual components,
54
+ in Original or Modified Versions, may be sold by itself.
55
+
56
+ 2) Original or Modified Versions of the Font Software may be bundled,
57
+ redistributed and/or sold with any software, provided that each copy
58
+ contains the above copyright notice and this license. These can be
59
+ included either as stand-alone text files, human-readable headers or
60
+ in the appropriate machine-readable metadata fields within text or
61
+ binary files as long as those fields can be easily viewed by the user.
62
+
63
+ 3) No Modified Version of the Font Software may use the Reserved Font
64
+ Name(s) unless explicit written permission is granted by the corresponding
65
+ Copyright Holder. This restriction only applies to the primary font name as
66
+ presented to the users.
67
+
68
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69
+ Software shall not be used to promote, endorse or advertise any
70
+ Modified Version, except to acknowledge the contribution(s) of the
71
+ Copyright Holder(s) and the Author(s) or with their explicit written
72
+ permission.
73
+
74
+ 5) The Font Software, modified or unmodified, in part or in whole,
75
+ must be distributed entirely under this license, and must not be
76
+ distributed under any other license. The requirement for fonts to
77
+ remain under this license does not apply to any document created
78
+ using the Font Software.
79
+
80
+ TERMINATION
81
+ This license becomes null and void if any of the above conditions are
82
+ not met.
83
+
84
+ DISCLAIMER
85
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -0,0 +1,93 @@
1
+ Copyright 2017, The Mozilla Foundation ZillaSlab-LightItalic.ttf: Copyright 2017, The Mozilla Foundation ZillaSlab-Regular.ttf: Copyright 2017, The Mozilla Foundation ZillaSlab-Italic.ttf: Copyright 2017, The Mozilla Foundation ZillaSlab-Medium.ttf: Copyright 2017, The Mozilla Foundation ZillaSlab-MediumItalic.ttf: Copyright 2017, The Mozilla Foundation ZillaSlab-SemiBold.ttf: Copyright 2017, The Mozilla Foundation ZillaSlab-SemiBoldItalic.ttf: Copyright 2017, The Mozilla Foundation ZillaSlab-Bold.ttf: Copyright 2017, The Mozilla Foundation ZillaSlab-BoldItalic.ttf: Copyright 2017, The Mozilla Foundation
2
+
3
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
+ This license is copied below, and is also available with a FAQ at:
5
+ http://scripts.sil.org/OFL
6
+
7
+
8
+ -----------------------------------------------------------
9
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10
+ -----------------------------------------------------------
11
+
12
+ PREAMBLE
13
+ The goals of the Open Font License (OFL) are to stimulate worldwide
14
+ development of collaborative font projects, to support the font creation
15
+ efforts of academic and linguistic communities, and to provide a free and
16
+ open framework in which fonts may be shared and improved in partnership
17
+ with others.
18
+
19
+ The OFL allows the licensed fonts to be used, studied, modified and
20
+ redistributed freely as long as they are not sold by themselves. The
21
+ fonts, including any derivative works, can be bundled, embedded,
22
+ redistributed and/or sold with any software provided that any reserved
23
+ names are not used by derivative works. The fonts and derivatives,
24
+ however, cannot be released under any other type of license. The
25
+ requirement for fonts to remain under this license does not apply
26
+ to any document created using the fonts or their derivatives.
27
+
28
+ DEFINITIONS
29
+ "Font Software" refers to the set of files released by the Copyright
30
+ Holder(s) under this license and clearly marked as such. This may
31
+ include source files, build scripts and documentation.
32
+
33
+ "Reserved Font Name" refers to any names specified as such after the
34
+ copyright statement(s).
35
+
36
+ "Original Version" refers to the collection of Font Software components as
37
+ distributed by the Copyright Holder(s).
38
+
39
+ "Modified Version" refers to any derivative made by adding to, deleting,
40
+ or substituting -- in part or in whole -- any of the components of the
41
+ Original Version, by changing formats or by porting the Font Software to a
42
+ new environment.
43
+
44
+ "Author" refers to any designer, engineer, programmer, technical
45
+ writer or other person who contributed to the Font Software.
46
+
47
+ PERMISSION & CONDITIONS
48
+ Permission is hereby granted, free of charge, to any person obtaining
49
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
50
+ redistribute, and sell modified and unmodified copies of the Font
51
+ Software, subject to the following conditions:
52
+
53
+ 1) Neither the Font Software nor any of its individual components,
54
+ in Original or Modified Versions, may be sold by itself.
55
+
56
+ 2) Original or Modified Versions of the Font Software may be bundled,
57
+ redistributed and/or sold with any software, provided that each copy
58
+ contains the above copyright notice and this license. These can be
59
+ included either as stand-alone text files, human-readable headers or
60
+ in the appropriate machine-readable metadata fields within text or
61
+ binary files as long as those fields can be easily viewed by the user.
62
+
63
+ 3) No Modified Version of the Font Software may use the Reserved Font
64
+ Name(s) unless explicit written permission is granted by the corresponding
65
+ Copyright Holder. This restriction only applies to the primary font name as
66
+ presented to the users.
67
+
68
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69
+ Software shall not be used to promote, endorse or advertise any
70
+ Modified Version, except to acknowledge the contribution(s) of the
71
+ Copyright Holder(s) and the Author(s) or with their explicit written
72
+ permission.
73
+
74
+ 5) The Font Software, modified or unmodified, in part or in whole,
75
+ must be distributed entirely under this license, and must not be
76
+ distributed under any other license. The requirement for fonts to
77
+ remain under this license does not apply to any document created
78
+ using the Font Software.
79
+
80
+ TERMINATION
81
+ This license becomes null and void if any of the above conditions are
82
+ not met.
83
+
84
+ DISCLAIMER
85
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -27,9 +27,9 @@ Toolchain: `node "${CLAUDE_PLUGIN_ROOT}/dist/markilo.mjs" <command>` (written `m
27
27
  4. After the agents finish: `markilo diversity --brand <slug>`. Merge or replace directions that are too similar.
28
28
  5. Ask the `markilo:design-critic` agent to review all concepts (it reads the review sheets and records judgment).
29
29
  Apply the quality gate: the critic's blind brand-fit, distinctiveness and memorability each ≥ 6 and its "would a
30
- senior designer present this?" is yes (`markilo concept list` shows `gate` per concept); else back to a
31
- concept-designer with the critique and a request for a different move (max 2 rounds; a `nearMiss` first gets one
32
- targeted round on its lowest criteria). What still misses is set to `rejected` so the gallery hides it; if fewer than
33
- two pass, tell the user plainly and propose new directions instead of showing weak work.
30
+ senior designer present this?" is yes (`markilo concept list` shows `gate` per concept). A failed concept's `next`
31
+ decides: `fix` goes back to a concept-designer once with exactly what the critic named; `reject` is set to `rejected`
32
+ so the gallery hides it — reworking a failed idea almost never works (1 of 34 in the benchmark). If fewer than two
33
+ pass, tell the user plainly and propose new directions instead of showing weak work.
34
34
  6. `markilo gallery` and present: per concept, two lines (idea + measured strengths/risks) and the gallery path.
35
35
  Ask the user which to refine.
@@ -67,12 +67,25 @@ Work through these stages. Tell the user which stage you are in. If they asked f
67
67
  3. **Brief** — synthesize `markilo profile show --brand <slug>` into the brief
68
68
  (`markilo brief update --brand <slug> --file …`). Ask only what you truly cannot infer — usually 2–5
69
69
  questions, asked together, each with your suggested answer.
70
- 4. **Explore** — propose 3–5 genuinely different creative directions (idea, metaphor, form language,
70
+ 4. **Ideas, then directions.** Before any direction, write the idea longlist: at least 12 one-line visual hooks with
71
+ `markilo ideas --brand <slug> --add "<what a stranger sees at 32 px>" --means "<what it says>" --source
72
+ product|audience|name|type|abstract`, from at least three sources (see "Ideas before directions" in
73
+ `references/design-principles.md`). Then one `markilo:design-critic` agent in `ideas` mode strikes or keeps each one
74
+ from the words alone and ranks the kept ones — words are the cheapest place to lose a weak idea. In real-project runs
75
+ every direction drawn from a mechanism metaphor (a round trip, a crossing, a threshold, a keystone) became a bracket,
76
+ a cross, an arch or a gauge, and was read as a UI glyph. Build directions from the kept ideas, strongest first, and
77
+ record which idea each concept comes from (`markilo ideas --brand <slug> --idea <id> --concept <concept id>`). When
78
+ the user is here, show them the kept ideas before sketching; they often know which one is theirs.
79
+ **Explore** — propose 3–5 genuinely different creative directions (idea, metaphor, form language,
71
80
  type, color, why it fits, risks). Different ideas, not variations of one idea. For each, write the visual hook —
72
81
  the one thing the eye catches at 32 px — and what a stranger would see first; at most one direction may draw the product's own object or the name's literal noun (a page for
73
82
  documents, a chart for finance, a moon for sleep — see "The product's own object is a cliché too" in
74
83
  `references/design-principles.md`), and only with a named transformation; at most one may be built on the name's
75
84
  initial; at least one must come from what the product does or the audience's world, with no letter and no object.
85
+ Unless the user wants a symbol above all, one direction is **wordmark-led** (`concept new … --lead wordmark`): the
86
+ name drawn from a good typeface with one or two letters changed so the word carries the idea, and a symbol cut from
87
+ that same drawing for icons. Where a category is full of pictograms (developer tools, SaaS), symbols drift into UI
88
+ icons; a crafted word starts from professionally drawn letters and is often the stronger identity.
76
89
  Name each direction's form language from the brief's adjectives ("Form language follows the brief's character").
77
90
  Let the user steer.
78
91
  5. **Design**, in two passes so weak ideas die cheap:
@@ -81,9 +94,13 @@ Work through these stages. Tell the user which stage you are in. If they asked f
81
94
  Before the review, every sketch must be `ready` in `markilo sketches` (no hairline gaps or failing checks); send
82
95
  boards that are not back to their designer with the `fix` lines.
83
96
  b. **Sketch review** — one `markilo:design-critic` agent reviews every board and records a pick or `none` per
84
- concept (`--sketch-pick`). For `none`, send the direction back for one more sketch pass with the critic's
85
- suggested move and a second sketch review, or drop it (`--status rejected`). The pick is the critic's: never
86
- override a `none` with your own pick.
97
+ concept (`--sketch-pick`). When the user is here, show them the boards before anything is developed — a sketch is
98
+ cheap, a developed mark that fails the gate is not: open the gallery (`markilo gallery --serve`; it shows every
99
+ board with the critic's reading and pick), ask them to pick a sketch per direction or accept the critic's picks,
100
+ then `markilo feedback --brand <slug> --apply` records their picks (a user's pick wins over the critic's, `none`
101
+ included). For `none`, send the direction back for one more sketch pass with the suggested move and a second
102
+ review, or drop it (`--status rejected`). Never override the critic with your own pick; with nobody to ask
103
+ (unattended), the critic's pick stands.
87
104
  c. **Develop** — for each picked sketch, a concept-designer in `develop <sketch id>` mode finishes the mark:
88
105
  measured variants, `symbol.svg`, `construction.json` and a wordmark that carries the idea in one or two letters.
89
106
  6. **Verify** — `markilo verify --brand <slug> --concept <id>` for every concept, then
@@ -92,17 +109,23 @@ Work through these stages. Tell the user which stage you are in. If they asked f
92
109
  to "would a senior designer present this as is?" (`--present`) and adds informed scores as feedback (`--judgment`).
93
110
  **Quality gate:** a concept goes to the user only if the critic's blind brand-fit, distinctiveness and memorability
94
111
  are each ≥ 6 and its answer is yes — read the result
95
- from `markilo concept list --brand <slug>` (`gate: passed|failed`); `finalize` refuses a failed concept unless the
96
- user chose it anyway (`--user-choice "<their reason>"`). A `nearMiss` (only the average is short, every required
97
- criterion ≥ 6 and the critic said yes) gets one targeted round on its lowest-scored criteria before anything else,
98
- then a fresh critique; the bar does not move. Otherwise send it
99
- back to a concept-designer with the critique (up to 2 rounds), asking for a different move, not a polish. A concept
100
- that still misses is set to `rejected` (`markilo concept update --status rejected`) so the gallery hides it.
112
+ from `markilo concept list --brand <slug>` (`gate: passed|failed|undecided`); `finalize` refuses any concept that has
113
+ not passed unless the user chose it anyway (`--user-choice "<their reason>"`). `undecided` (`next: second-look`)
114
+ means the first cold look landed on the edge of the bar: start two fresh `markilo:design-critic` agents in parallel,
115
+ each told only `second-look <concept id>`, the brand slug and whether the concept is wordmark-led (never the
116
+ direction, the rationale or the first critic's notes), then read the gate
117
+ again — the majority of the three looks decides. The gate's `next` says what to do with a concept that
118
+ failed: `fix` (the cold scores clear the bar and only the critic's no, for a reason it named, stands in the way) gets
119
+ one round on exactly that, then a fresh critique; `reject` is set to `rejected`
120
+ (`markilo concept update --status rejected`) so the gallery hides it. Do not rework a rejected idea: in Markilo's
121
+ benchmark 1 of 34 concepts sent back after a failed gate passed later (after three rounds); every other pass came
122
+ from a first look. Spend the budget on new directions instead.
101
123
  If fewer than two concepts pass, say so plainly, show what passed, and propose new directions — do not fill the
102
124
  gallery with weak work. Two strong concepts beat four mediocre ones.
103
125
  7. **Review** — open the gallery as the gallery skill describes (`markilo gallery --serve` in the background, or the
104
- offline file), summarize each concept in two lines with its measured strengths and risks, and ask the user to
105
- decide there: Keep / Refine / Drop, pins on the mark, side-by-side comparison, then "Send to Claude". Read the
126
+ offline file), summarize each concept in two lines with its measured strengths and risks (a concept that passed on
127
+ second looks passed at the edge: say so — in Markilo's 1.0 validation an independent panel rejected such passes), and ask the user to
128
+ decide there: Keep / Refine / Drop, pins on the mark, side-by-side comparison, then "Send to your agent". Read the
106
129
  decisions with `markilo feedback --brand <slug>` instead of asking the user to retype them.
107
130
  8. **Refine** — iterate on the chosen concept (optical corrections, construction, wordmark spacing,
108
131
  palette), re-verifying each round. Then `markilo finalize --brand <slug> --concept <id> --tagline …`.
@@ -48,48 +48,49 @@ Topics: product, audience, market, competitor, visual-identity, typography, colo
48
48
 
49
49
  ## Design
50
50
 
51
- | Command | Purpose |
52
- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
53
- | `concept new --brand s --id ID --title T --direction D --rationale R --semantics a,b --primary '#hex' [--secondary --accent --ink --paper] [--font id --weight n]` | Create `concepts/ID/`; then write `symbol.svg` there. |
54
- | `concept list --brand s` | Concepts with status, files, palette and `gate` (`passed`, `failed`, `not-reviewed`) with the critic average. |
55
- | `concept show --brand s --concept ID` | One concept with its files, palette, typography, critique and `gate`. |
56
- | `wordmarks --brand s --concept ID [--fonts a,b] [--weights 500,700] [--tracking -20,0,20] \| --pick wN` | The name in several faces next to the symbol on `review/wordmarks.png`, measured; `--pick` commits one as `wordmark.svg` with its typography. |
57
- | `sketches --brand s --concept ID` | Build `sketches/*.json` in the concept palette into `sketches/board.png` for the critic's sketch review; says which are `ready` (with `fix` lines). Specs with `members` also get `sketches/family.png`. |
58
- | `construct spec.json -o out.svg [--guides c.png] [--set k=v,…]` | Build a mark from a construction spec (see construction.md). |
59
- | `construct spec.json --brand s --concept ID [--vary [--max 24]] [--set k=v,…] [--member name] [--role small]` | Into the concept: `symbol.svg`, `construction.json`, `review/construction.png`; `--vary` ranks variants in `sketches/variants/`. |
60
- | `wordmark --text T --font id --weight n -o out.svg [--tracking=-10] [--case lower] [--color '#hex'] [--locale tr]` | Outlined wordmark with real kerning. Negative tracking needs `=`. |
61
- | `lockup --symbol a.svg --wordmark b.svg --layout horizontal\|stacked -o out.svg` | Cap-height aligned lockup. |
62
- | `concept update --brand s --concept ID [--wordmark wordmark.svg] [--status shortlisted\|rejected] [--judgment memorability=8:"reason"] [--present yes\|no:"reason"] [--blind distinctiveness=n,memorability=n,brand-fit=n,craft=n,versatility=n] [--reads-as "a; b; c"] [--sketch-pick s3\|none --sketch-notes "…"]` | Update files/status/judgment. Criteria: brand-fit, semantic-relevance, distinctiveness, memorability, simplicity, balance, craft, typography, color, cultural-fit, timelessness, premium-perception, versatility. Prints the `gate` (blind scores when recorded). |
63
- | `color compare #a #b [#c…]` | ΔE00 and WCAG contrast between colors (e.g. an accent vs a well-known brand color). |
64
- | `palette '#primary' [--secondary '#…'] [--accent '#…']` | OKLCH scales, neutrals, semantic colors, WCAG pairs. |
65
- | `fonts` | Bundled OFL fonts (inter, manrope, space-grotesk, sora, dm-sans, outfit, plus-jakarta-sans, fraunces, ibm-plex-serif, jetbrains-mono). |
51
+ | Command | Purpose |
52
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
53
+ | `concept new --brand s --id ID --title T --direction D --rationale R --semantics a,b --primary '#hex' [--secondary --accent --ink --paper] [--font id --weight n] [--lead wordmark]` | Create `concepts/ID/`; then write `symbol.svg` there. |
54
+ | `concept list --brand s` | Concepts with status, files, palette and `gate` (`passed`, `failed`, `not-reviewed`) with the critic average. |
55
+ | `concept show --brand s --concept ID` | One concept with its files, palette, typography, critique and `gate`. |
56
+ | `wordmarks --brand s --concept ID [--fonts a,b] [--weights 500,700] [--tracking -20,0,20] \| --pick wN` | The name in several faces next to the symbol on `review/wordmarks.png`, measured; `--pick` commits one as `wordmark.svg` with its typography. |
57
+ | `sketches --brand s --concept ID` | Build `sketches/*.json` in the concept palette into `sketches/board.png` for the critic's sketch review; says which are `ready` (with `fix` lines). Specs with `members` also get `sketches/family.png`. |
58
+ | `construct spec.json -o out.svg [--guides c.png] [--set k=v,…]` | Build a mark from a construction spec (see construction.md). |
59
+ | `construct spec.json --brand s --concept ID [--vary [--max 24]] [--set k=v,…] [--member name] [--role small]` | Into the concept: `symbol.svg`, `construction.json`, `review/construction.png`; `--vary` ranks variants in `sketches/variants/`. |
60
+ | `wordmark --text T --font id --weight n -o out.svg [--tracking=-10] [--case lower] [--color '#hex'] [--locale tr]` | Outlined wordmark with real kerning. Negative tracking needs `=`. |
61
+ | `lockup --symbol a.svg --wordmark b.svg --layout horizontal\|stacked -o out.svg` | Cap-height aligned lockup. |
62
+ | `ideas --brand s [--add "<hook>" --means "<why>" --source product\|audience\|name\|type\|abstract] [--idea iN (--keep "<reading>" [--rank n] \| --strike "<reading>") \| --concept ID]` | The idea longlist before directions: designer adds hooks, critic keeps/strikes from the words and ranks; `next` says what follows. |
63
+ | `concept update --brand s --concept ID [--wordmark wordmark.svg] [--status shortlisted\|rejected] [--judgment memorability=8:"reason"] [--present yes\|no:"reason"] [--blind distinctiveness=n,memorability=n,brand-fit=n,craft=n,versatility=n] [--reviewer <model>] [--reads-as "a; b; c"] [--sketch-pick s3\|none --sketch-notes "…"] [--look <five scores> --look-present yes\|no:"reason"]` | Update files/status/judgment; `--look` records a fresh critic's second look when the gate says `second-look`. Criteria: brand-fit, semantic-relevance, distinctiveness, memorability, simplicity, balance, craft, typography, color, cultural-fit, timelessness, premium-perception, versatility. Prints the `gate` (blind scores when recorded) with `next` (`present`, `fix` once, `reject`, `second-look`), the `reviewer` and whether the gate was calibrated on it. |
64
+ | `color compare #a #b [#c…]` | ΔE00 and WCAG contrast between colors (e.g. an accent vs a well-known brand color). |
65
+ | `palette '#primary' [--secondary '#…'] [--accent '#…']` | OKLCH scales, neutrals, semantic colors, WCAG pairs. |
66
+ | `fonts` | Bundled OFL fonts (inter, manrope, space-grotesk, sora, dm-sans, outfit, plus-jakarta-sans, fraunces, ibm-plex-serif, jetbrains-mono). |
66
67
 
67
68
  ## Verify
68
69
 
69
- | Command | Purpose |
70
- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
71
- | `verify --brand s --concept ID` | All checks; writes reports + `concepts/ID/review/symbol-sheet.png`. **Read the PNG.** |
72
- | `diversity --brand s` | Pairwise similarity of active concepts. |
73
- | `originality --brand s --concept ID [--names a,b]` | Originality & Similarity Report only. |
74
- | `score file.svg [--role symbol\|wordmark\|lockup]` / `analyze file` / `compare a b` | Standalone measurements. |
75
- | `svg lint file.svg [--master]` | Master-file rules. |
76
- | `name check "Name" --against a,b,c` / `name trademark "Name" --describe "…"` | Name confusion and registry pre-screen plan. |
77
- | `render file.svg -o out.png [--sheet]` | PNG or review contact sheet. |
70
+ | Command | Purpose |
71
+ | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
72
+ | `verify --brand s --concept ID` | All checks; writes reports + `concepts/ID/review/symbol-sheet.png` (and `wordmark-sheet.png`). **Read the PNGs.** |
73
+ | `diversity --brand s` | Pairwise similarity of active concepts. |
74
+ | `originality --brand s --concept ID [--names a,b]` | Originality & Similarity Report only. |
75
+ | `score file.svg [--role symbol\|wordmark\|lockup]` / `analyze file` / `compare a b` | Standalone measurements. |
76
+ | `svg lint file.svg [--master]` | Master-file rules. |
77
+ | `name check "Name" --against a,b,c` / `name trademark "Name" --describe "…"` | Name confusion and registry pre-screen plan. |
78
+ | `render file.svg -o out.png [--sheet]` | PNG or review contact sheet. |
78
79
 
79
80
  ## Deliver
80
81
 
81
- | Command | Purpose |
82
- | ------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
83
- | `finalize --brand s --concept ID [--tagline T] [--note "usage rule"]... [--accept-risk] [--user-choice "why"] [--force]` | Freeze masters, build lockups (horizontal/stacked/compact), write `final/brand.json`. Refuses a concept that failed the critic gate unless `--user-choice`. |
84
- | `lock --brand s --primary '#hex' [--symbol f] [--wordmark f] [--lockup f]` | Register an existing identity to preserve byte-for-byte. |
85
- | `deliverables --brand s [--set g,…] [--add g,…] [--remove g,…]` | Which groups this brand needs; suggests from product type and platforms. |
86
- | `export --brand s [--only logos,web,ios,macos,android,windows,social,marketing,tokens,guidelines] [--all] [--clean]` | Chosen groups (deliverables) + `asset-manifest.json`. |
87
- | `gallery [--brand s] [--serve [--port N]]` | `brand/gallery/index.html`; `--serve` serves it on 127.0.0.1 (token, read-only, stops when idle) so "Send to Claude" saves decisions. |
88
- | `feedback [--brand s] [--import file] [--apply]` | Decisions from the gallery: keep/refine/drop, tags, notes, pinned spots, preferred concept, ready-to-act requests; `--apply` sets concept status. |
89
- | `install-assets --brand s --framework auto\|next\|laravel\|flutter\|static [--project <dir>] [--apply] [--force]` | Files where the framework expects them (plan unless `--apply`; replaced files backed up). Without `--framework`: `--group web --into public`. |
90
- | `agent-setup --target codex\|cursor\|generic [--apply]` | Instruction file so another coding agent can run Markilo's workflow with this CLI. |
91
- | `shortcut install\|uninstall\|status [--yes]` | Optional personal `/markilo` skill. |
92
- | `doctor` | Environment check. |
82
+ | Command | Purpose |
83
+ | ------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
84
+ | `finalize --brand s --concept ID [--tagline T] [--note "usage rule"]... [--accept-risk] [--user-choice "why"] [--force]` | Freeze masters, build lockups (horizontal/stacked/compact), write `final/brand.json`. Refuses a concept that failed the critic gate unless `--user-choice`. |
85
+ | `lock --brand s --primary '#hex' [--symbol f] [--wordmark f] [--lockup f]` | Register an existing identity to preserve byte-for-byte. |
86
+ | `deliverables --brand s [--set g,…] [--add g,…] [--remove g,…]` | Which groups this brand needs; suggests from product type and platforms. |
87
+ | `export --brand s [--only logos,web,ios,macos,android,windows,social,marketing,tokens,guidelines] [--all] [--clean]` | Chosen groups (deliverables) + `asset-manifest.json`. |
88
+ | `gallery [--brand s] [--serve [--port N]]` | `brand/gallery/index.html`; `--serve` serves it on 127.0.0.1 (token, read-only, stops when idle) so "Send to your agent" saves decisions. |
89
+ | `feedback [--brand s] [--import file] [--apply]` | Decisions from the gallery: keep/refine/drop, tags, notes, pinned spots, preferred concept, ready-to-act requests; `--apply` sets concept status. |
90
+ | `install-assets --brand s --framework auto\|next\|laravel\|flutter\|static [--project <dir>] [--apply [--expect <planId>]] [--force]` | Files where the framework expects them (plan unless `--apply`; one transaction, replaced files backed up; `--expect` refuses a stale plan). Without `--framework`: `--group web --into public`. `install-assets --undo [--apply]` reverses the last installation. |
91
+ | `agent-setup --target codex\|cursor\|vscode\|generic [--model critic=<id>]... [--apply]` | The workflow for another coding agent, and the researcher, designer and critic as its sub-agents (`.codex/agents`, `.cursor/agents`, `.github/agents`) on the models named with `--model`. Dry run unless `--apply`. |
92
+ | `shortcut install\|uninstall\|status [--yes]` | Optional personal `/markilo` skill. |
93
+ | `doctor` | Environment check. |
93
94
 
94
95
  Error codes: USAGE, NOT_FOUND, EXISTS, UNSAFE_PATH, INVALID_INPUT, INVALID_SVG, NETWORK_DISABLED, NETWORK,
95
96
  ROBOTS_DISALLOWED, LOCKED, NO_WORKSPACE, INTERNAL.
@@ -58,7 +58,7 @@ With `--brand/--concept`, palette roles come from the concept, the result is wri
58
58
  | `ring` | `c`, `r` (outer), `width` |
59
59
  | `arc` | `c`, `r` (centre line), `from`, `to`, `width`, `cap` `butt`/`round`/`square` — a stroked arc as a filled shape |
60
60
  | `sector` | `c`, `r`, `from`, `to`, `inner` (0 = pie slice) |
61
- | `polygon` | `points` |
61
+ | `polygon` | `points`; `smooth: true` draws one curved, filled outline through them (`tension`, and `sharp: [i…]` keeps those points as corners — the tip of a drop, the point of a leaf) |
62
62
  | `regular` | `c`, `r`, `sides`, `rotate` |
63
63
  | `star` | `c`, `r`, `inner`, `points`, `rotate` |
64
64
  | `line` | `points`, `width`, `cap`, `join`, `smooth` (curve through the points), `closed` |
@@ -162,6 +162,10 @@ Each is a construction technique, not a shape to copy. Combine at most two.
162
162
  - **Cut and shift**: `subtract` a thin band (`rect` rotated) through a solid, then `move` one side — motion,
163
163
  precision, a "slice" of something.
164
164
  - **Truncation**: `intersect` a form with a frame so it is cropped by the edge — tension, scale beyond the frame.
165
+ - **One silhouette**: the object as a single filled outline — a `polygon` with `smooth: true` through 6–12 points,
166
+ sharp only where the object has a point — instead of a stack of circles, bars and triangles. An object assembled
167
+ from separate primitives reads as a pictogram (a plumb bob built from a ring, a bar, a trapezoid and a triangle read
168
+ as a download arrow); one drawn outline with a particular proportion reads as a drawing.
165
169
  - **Single gesture**: one `line` with `smooth: true`, consistent `width`, round caps, that draws the idea in one
166
170
  movement. Avoid the generic swoosh; the path must describe something specific.
167
171
  - **Modular system**: one unit (`defs`) repeated with `repeat` along a grid, where the arrangement itself is the
@@ -193,6 +197,35 @@ a terminal), on top of a calm, well-spaced typeface. Rebuilding every letter fro
193
197
  harder to read, and it reads as a display face rather than a brand. Every letter must still be readable on its own:
194
198
  check `e`, `a`, `w`, `m` and other complex forms at 1200 px and at 64 px wide.
195
199
 
200
+ A treatment can also run through the whole word instead of living in one letter — the usual way a coined name gets
201
+ character. Transforms on a `glyph` apply to every letter at once: `"round": 18` softens every corner and terminal,
202
+ `"grow": 6` adds weight evenly, and a `subtract` of one repeated `rect` (`repeat` with `step`) cuts every stem at the
203
+ same angle. Pick one treatment from the brief's form language, check it at 12 px, and keep the letters themselves
204
+ untouched.
205
+
206
+ ### Wordmark-led concepts (`--lead wordmark`)
207
+
208
+ The word is the identity, so it is built, not typeset:
209
+
210
+ 1. Choose the face on the wordmark board: `markilo wordmarks --brand <slug> --concept <id>` (the bundled faces,
211
+ weights and spacing, measured), and commit one with `--pick`.
212
+ 2. Build the word as one spec with `glyph` and `"role": "wordmark"`, then change one or two letters with booleans so
213
+ they carry the idea — join two letters into a ligature, reshape a counter, extend or cut a terminal, share a stroke
214
+ between neighbours. Aim the change by the printed `glyphs` boxes (stem, bowl, x-height), not by eye.
215
+ 3. Cut the icon from the same drawing: a second spec with the same `glyph` and the same change, keeping only the
216
+ changed letter or pair (`"letters": [i]`), fitted to the square — `construct … --role symbol`. Add a small version
217
+ when the change disappears at 16 px.
218
+ 4. `markilo verify` writes `review/wordmark-sheet.png` (the word at 12–64 px on light, dark, black and white). Read it
219
+ as a stranger: the word must stay readable at 12 px, and the change must be visible at 24 px.
220
+
221
+ `construct` and `sketches` measure every changed letter against the font's own alphabet. A letter that now looks more
222
+ like another letter ("o" cut open on the right is a "c": the word reads "necn") makes the sketch not `ready`; a letter
223
+ that lost its counter (an e without its eye) or two letters merged into one shape is a note the critic weighs. Most
224
+ misread wordmarks in Markilo's benchmark came from exactly these: "portwise" read as "partwise", an "ll" as a "4" or
225
+ an "n", a "pinehold" whose e lost its eye. Change a terminal, a join or a counter's shape; keep the stroke that names
226
+ the letter. A separate element dropped into the word is read as punctuation: between letters a hyphen ("searve-x"),
227
+ over a letter an accent ("jourílo"), after the word a full stop. Put it inside a counter or attach it to a letter.
228
+
196
229
  ## Craft checklist
197
230
 
198
231
  - One unit `u` and a few multiples of it for all widths, radii and gaps; a single corner radius family.
@@ -35,6 +35,27 @@ a bent arm. Independent judges call it "a common monogram device" every time. A
35
35
  letter becomes something else at first sight (the reading is the idea, not "the letter T"), or when the letterform
36
36
  itself is drawn with a character no font has.
37
37
 
38
+ ## Ideas before directions
39
+
40
+ Write ideas as what a stranger would see, not as what they mean: "a lamp seen from above, its shade cut into the
41
+ initial" is a hook; "reliability" or "a round trip from audit to fix" is a meaning still looking for a picture. Rules
42
+ for the longlist (`markilo ideas`):
43
+
44
+ - At least 12 hooks from at least three sources: the product's mechanism, the audience's world (a tool, a gesture, a
45
+ material they know), the name (its letters, sound, meaning, the parts of a compound name), type (a face and a
46
+ treatment that carry the brand across the whole word) and abstract character.
47
+ - **Mechanism metaphors drawn with primitives become UI glyphs.** On three real developer products every such
48
+ direction — a round trip, a crossing point, a threshold, a keystone, an undertrace, a hinge — was drawn as brackets,
49
+ crosses, arches, gauges or loops, and read as a D, a return key, a headstone, a speedometer. Keep one only if the
50
+ hook names a specific, unusual form, not the concept.
51
+ - **Compound and meaningful names are the strongest source when they exist**: both identities that passed in the
52
+ benchmark drew the name's meaning inside its own letters (a q holding a dot like an egg in a nest; an n sheltering a
53
+ seed for a name that means a held pine). Coined names (no meaning to draw) lean on type: a distinctive face and one
54
+ treatment that runs through every letter, not one gimmick letter with a coloured accent ("a letter-plus-dot of the
55
+ generic kind").
56
+ - A coloured block, dot or tab added to one letter is the default move of every wordmark board; critics read it as
57
+ a cursor, a flag or a full stop. It needs a reason a stranger can see.
58
+
38
59
  ## Form language follows the brief's character
39
60
 
40
61
  The same idea drawn with the wrong form language fails on brand fit. Decide the form language from the brief's
@@ -58,6 +79,15 @@ pictorial metaphor, an abstract geometric system, a typographic-only wordmark, a
58
79
  directions that share the same idea are one direction. `markilo diversity` must report `low` risk between
59
80
  directions at the explore stage.
60
81
 
82
+ **One direction is usually wordmark-led** (`concept new --lead wordmark`). A symbol has to be invented from nothing,
83
+ and in categories full of pictograms (developer tools, SaaS, analytics) an invented symbol is most often read as a
84
+ UI icon — a camera, a download arrow, a toggle. A wordmark starts from letters a type designer already drew well;
85
+ the identity is the word with one or two letters changed so they carry the idea (a ligature that joins two letters
86
+ the way the product joins two things, a counter that holds the product's object, a terminal that points), and the
87
+ icon is that changed letter or pair cut from the same drawing. It is judged as a word first: on the wordmark sheet
88
+ at 12–64 px, then the icon at 16 px. The change must be more than a slice or offset of a letter — that is the
89
+ initial-with-a-cut cliché again.
90
+
61
91
  ## Form
62
92
 
63
93
  - **Simplicity**: as few elements as the idea allows. Aim for something a child could redraw from memory.