@cohortapp/agent-sdk 2.12.0 → 2.13.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 (127) hide show
  1. package/bin/maestro.mjs +6 -2
  2. package/docs/guides/front-door-session.md +49 -0
  3. package/lib/cli/design.mjs +185 -0
  4. package/lib/cli/design.test.mjs +270 -0
  5. package/lib/cli/global-setup-extras.mjs +44 -0
  6. package/lib/cli/global-setup-extras.test.mjs +95 -0
  7. package/lib/cli/session.mjs +11 -1
  8. package/lib/cli/session.test.mjs +17 -6
  9. package/lib/collective/global-config.mjs +5 -0
  10. package/lib/collective/global-config.test.mjs +5 -0
  11. package/lib/collective/vendor-skills.mjs +305 -0
  12. package/lib/collective/vendor-skills.test.mjs +306 -0
  13. package/lib/design/design-md.mjs +793 -0
  14. package/lib/design/design-md.test.mjs +318 -0
  15. package/lib/design/fixtures/DESIGN.golden.md +238 -0
  16. package/lib/design/fixtures/PRODUCT.golden.md +67 -0
  17. package/lib/design/fixtures/foundation.json +133 -0
  18. package/lib/design/refresh-gate.mjs +154 -0
  19. package/lib/design/refresh-gate.test.mjs +144 -0
  20. package/lib/design/write.mjs +275 -0
  21. package/lib/design/write.test.mjs +241 -0
  22. package/lib/prompts/parallelism.mjs +79 -0
  23. package/lib/prompts/parallelism.test.mjs +177 -0
  24. package/package.json +1 -1
  25. package/plugins/maestro-skills/plugin.json +4 -0
  26. package/plugins/maestro-skills/skills/cohort-design.md +153 -0
  27. package/plugins/maestro-skills/vendor/emilkowalski/LICENSE +21 -0
  28. package/plugins/maestro-skills/vendor/emilkowalski/UPSTREAM.json +70 -0
  29. package/plugins/maestro-skills/vendor/emilkowalski/skills/animate/RECIPES.md +324 -0
  30. package/plugins/maestro-skills/vendor/emilkowalski/skills/animate/SKILL.md +199 -0
  31. package/plugins/maestro-skills/vendor/emilkowalski/skills/animation-vocabulary/SKILL.md +173 -0
  32. package/plugins/maestro-skills/vendor/emilkowalski/skills/apple-design/SKILL.md +282 -0
  33. package/plugins/maestro-skills/vendor/emilkowalski/skills/emil-design-eng/SKILL.md +674 -0
  34. package/plugins/maestro-skills/vendor/emilkowalski/skills/find-animation-opportunities/SKILL.md +132 -0
  35. package/plugins/maestro-skills/vendor/emilkowalski/skills/improve-animations/AUDIT.md +115 -0
  36. package/plugins/maestro-skills/vendor/emilkowalski/skills/improve-animations/PLAN-TEMPLATE.md +73 -0
  37. package/plugins/maestro-skills/vendor/emilkowalski/skills/improve-animations/SKILL.md +101 -0
  38. package/plugins/maestro-skills/vendor/emilkowalski/skills/prototype/PICKER.md +197 -0
  39. package/plugins/maestro-skills/vendor/emilkowalski/skills/prototype/SKILL.md +90 -0
  40. package/plugins/maestro-skills/vendor/emilkowalski/skills/review-animations/SKILL.md +112 -0
  41. package/plugins/maestro-skills/vendor/emilkowalski/skills/review-animations/STANDARDS.md +187 -0
  42. package/plugins/maestro-skills/vendor/impeccable/LICENSE +191 -0
  43. package/plugins/maestro-skills/vendor/impeccable/NOTICE.md +11 -0
  44. package/plugins/maestro-skills/vendor/impeccable/SKILL.md +86 -0
  45. package/plugins/maestro-skills/vendor/impeccable/UPSTREAM.json +201 -0
  46. package/plugins/maestro-skills/vendor/impeccable/agents/impeccable-asset-producer.md +42 -0
  47. package/plugins/maestro-skills/vendor/impeccable/agents/impeccable-documenter.md +29 -0
  48. package/plugins/maestro-skills/vendor/impeccable/agents/impeccable-finish-reviewer.md +43 -0
  49. package/plugins/maestro-skills/vendor/impeccable/agents/impeccable-manual-edit-applier.md +97 -0
  50. package/plugins/maestro-skills/vendor/impeccable/reference/adapt.md +312 -0
  51. package/plugins/maestro-skills/vendor/impeccable/reference/adapt.native.md +58 -0
  52. package/plugins/maestro-skills/vendor/impeccable/reference/android.md +46 -0
  53. package/plugins/maestro-skills/vendor/impeccable/reference/animate.md +89 -0
  54. package/plugins/maestro-skills/vendor/impeccable/reference/audit.md +136 -0
  55. package/plugins/maestro-skills/vendor/impeccable/reference/audit.native.md +139 -0
  56. package/plugins/maestro-skills/vendor/impeccable/reference/bolder.md +33 -0
  57. package/plugins/maestro-skills/vendor/impeccable/reference/clarify.md +94 -0
  58. package/plugins/maestro-skills/vendor/impeccable/reference/colorize.md +86 -0
  59. package/plugins/maestro-skills/vendor/impeccable/reference/craft-floor.md +44 -0
  60. package/plugins/maestro-skills/vendor/impeccable/reference/craft.md +5 -0
  61. package/plugins/maestro-skills/vendor/impeccable/reference/critique.md +806 -0
  62. package/plugins/maestro-skills/vendor/impeccable/reference/degraded/asset-producer.md +37 -0
  63. package/plugins/maestro-skills/vendor/impeccable/reference/degraded/documenter.md +24 -0
  64. package/plugins/maestro-skills/vendor/impeccable/reference/degraded/finish-reviewer.md +38 -0
  65. package/plugins/maestro-skills/vendor/impeccable/reference/degraded/manual-edit-applier.md +92 -0
  66. package/plugins/maestro-skills/vendor/impeccable/reference/delight.md +70 -0
  67. package/plugins/maestro-skills/vendor/impeccable/reference/distill.md +111 -0
  68. package/plugins/maestro-skills/vendor/impeccable/reference/doctor.md +54 -0
  69. package/plugins/maestro-skills/vendor/impeccable/reference/document.md +416 -0
  70. package/plugins/maestro-skills/vendor/impeccable/reference/extract.md +69 -0
  71. package/plugins/maestro-skills/vendor/impeccable/reference/harden.md +336 -0
  72. package/plugins/maestro-skills/vendor/impeccable/reference/hooks.md +111 -0
  73. package/plugins/maestro-skills/vendor/impeccable/reference/init.md +131 -0
  74. package/plugins/maestro-skills/vendor/impeccable/reference/ios.md +51 -0
  75. package/plugins/maestro-skills/vendor/impeccable/reference/layout.md +84 -0
  76. package/plugins/maestro-skills/vendor/impeccable/reference/live-setup.md +104 -0
  77. package/plugins/maestro-skills/vendor/impeccable/reference/live.md +325 -0
  78. package/plugins/maestro-skills/vendor/impeccable/reference/new-work.md +147 -0
  79. package/plugins/maestro-skills/vendor/impeccable/reference/onboard.md +234 -0
  80. package/plugins/maestro-skills/vendor/impeccable/reference/operate.md +61 -0
  81. package/plugins/maestro-skills/vendor/impeccable/reference/optimize.md +258 -0
  82. package/plugins/maestro-skills/vendor/impeccable/reference/overdrive.md +127 -0
  83. package/plugins/maestro-skills/vendor/impeccable/reference/polish.md +105 -0
  84. package/plugins/maestro-skills/vendor/impeccable/reference/quieter.md +99 -0
  85. package/plugins/maestro-skills/vendor/impeccable/reference/routing.md +24 -0
  86. package/plugins/maestro-skills/vendor/impeccable/reference/shape.md +59 -0
  87. package/plugins/maestro-skills/vendor/impeccable/reference/typeset.md +80 -0
  88. package/plugins/maestro-skills/vendor/impeccable/reference/visualize.md +46 -0
  89. package/plugins/maestro-skills/vendor/taste-skill/LICENSE +21 -0
  90. package/plugins/maestro-skills/vendor/taste-skill/UPSTREAM.json +37 -0
  91. package/plugins/maestro-skills/vendor/taste-skill/skills/minimalist-skill/SKILL.md +85 -0
  92. package/plugins/maestro-skills/vendor/taste-skill/skills/redesign-skill/SKILL.md +178 -0
  93. package/plugins/maestro-skills/vendor/taste-skill/skills/soft-skill/SKILL.md +98 -0
  94. package/plugins/maestro-skills/vendor/taste-skill/skills/taste-skill/SKILL.md +1206 -0
  95. package/plugins/maestro-skills/vendor/unlazy/LICENSE +21 -0
  96. package/plugins/maestro-skills/vendor/unlazy/SECURITY.md +72 -0
  97. package/plugins/maestro-skills/vendor/unlazy/SKILL.md +104 -0
  98. package/plugins/maestro-skills/vendor/unlazy/UPSTREAM.json +94 -0
  99. package/plugins/maestro-skills/vendor/unlazy/references/dispatch.md +82 -0
  100. package/plugins/maestro-skills/vendor/unlazy/references/gates.md +149 -0
  101. package/plugins/maestro-skills/vendor/unlazy/references/method.md +49 -0
  102. package/plugins/maestro-skills/vendor/unlazy/references/orchestration.md +107 -0
  103. package/plugins/maestro-skills/vendor/unlazy/references/parallel.md +133 -0
  104. package/plugins/maestro-skills/vendor/unlazy/references/token-economy.md +48 -0
  105. package/plugins/maestro-skills/vendor/unlazy/scripts/dispatch-check.mjs +139 -0
  106. package/plugins/maestro-skills/vendor/unlazy/scripts/gate-check.mjs +960 -0
  107. package/plugins/maestro-skills/vendor/unlazy/scripts/gate-lint.mjs +245 -0
  108. package/plugins/maestro-skills/vendor/unlazy/scripts/lib/check-supervisor.mjs +46 -0
  109. package/plugins/maestro-skills/vendor/unlazy/scripts/lib/dispatch.mjs +293 -0
  110. package/plugins/maestro-skills/vendor/unlazy/scripts/lib/gates.mjs +953 -0
  111. package/plugins/maestro-skills/vendor/unlazy/scripts/lib/process-tree.mjs +161 -0
  112. package/plugins/maestro-skills/vendor/unlazy/scripts/lib/regex-worker.mjs +9 -0
  113. package/plugins/maestro-skills/vendor/unlazy/templates/PLAN.md +116 -0
  114. package/plugins/maestro-skills/vendor/unlazy/templates/gates-leaf.md +51 -0
  115. package/plugins/maestro-skills/vendor/unlazy/templates/gates-node.md +51 -0
  116. package/scripts/ci/check-skill-packs.mjs +388 -0
  117. package/scripts/ci/check-skill-packs.test.mjs +495 -0
  118. package/scripts/ci/check.mjs +3 -0
  119. package/scripts/daemon/agent-daemon-design.test.mjs +238 -0
  120. package/scripts/daemon/agent-daemon.mjs +108 -0
  121. package/scripts/daemon/cadence-consumer-frontdoor.test.mjs +61 -2
  122. package/scripts/daemon/cadence-consumer.mjs +46 -22
  123. package/scripts/daemon/prompt-builder.mjs +19 -3
  124. package/scripts/local-triggers/autoupdate.test.mjs +33 -3
  125. package/scripts/vendor/skill-packs.mjs +354 -0
  126. package/scripts/vendor/sync-skill-packs.mjs +242 -0
  127. package/scripts/vendor/sync-skill-packs.test.mjs +103 -0
@@ -0,0 +1,177 @@
1
+ /**
2
+ * parallelism.test.mjs — the fleet-wide parallelism directive (WP-M7 mechanic 5).
3
+ *
4
+ * Three things are pinned here, and each has a distinct failure it prevents:
5
+ *
6
+ * 1. THE BYTES. The directive is quoted verbatim in the design spec and is the
7
+ * one place a fleet-wide behaviour change is auditable. A silent reword —
8
+ * dropping the file-scope sentence, say — would turn "maximum safe
9
+ * parallelism" into two agents editing one file. So the expected text is
10
+ * written out longhand below, NOT derived from the constant.
11
+ * 2. IDEMPOTENCE. Two seams apply it (`session spawn` and the daemon's
12
+ * prompt-builder) and they compose. A doubled directive reads as emphasis
13
+ * to a model, which is exactly how the safety sentence loses to the
14
+ * permission sentence.
15
+ * 3. BOTH WIRINGS. A constant nothing calls is worth nothing; the two seams
16
+ * are driven for real here.
17
+ */
18
+
19
+ import { test } from "node:test";
20
+ import assert from "node:assert/strict";
21
+
22
+ import { PARALLELISM_DIRECTIVE, withParallelism, countParallelism } from "./parallelism.mjs";
23
+
24
+ /**
25
+ * The directive, longhand. Deliberately NOT built from the import: a test that
26
+ * compares a constant to itself proves nothing about the wording.
27
+ */
28
+ const EXPECTED = [
29
+ "You are allowed to run multiple sub-agents concurrently.",
30
+ "",
31
+ "When the plan contains independent tasks, dispatch them together in a single parallel batch rather than waiting for each task to finish before starting the next.",
32
+ "",
33
+ "Only run tasks sequentially when one task genuinely depends on the output of another.",
34
+ "",
35
+ "Before dispatching any batch, check the planned file scope for each task and ensure that no two agents are assigned to edit the same file. If tasks would overlap on a file, sequence those tasks or redefine their scope to eliminate the conflict.",
36
+ "",
37
+ "Default to maximum safe parallelism.",
38
+ ].join("\n");
39
+
40
+ test("PARALLELISM_DIRECTIVE is the spec's text, byte for byte", () => {
41
+ assert.equal(PARALLELISM_DIRECTIVE, EXPECTED);
42
+ // The two sentences that carry the whole point, named individually so a
43
+ // partial reword fails with a readable diff rather than one giant blob.
44
+ assert.match(PARALLELISM_DIRECTIVE, /single parallel batch/);
45
+ assert.match(PARALLELISM_DIRECTIVE, /no two agents are assigned to edit the same file/);
46
+ assert.ok(!PARALLELISM_DIRECTIVE.endsWith("\n"), "no trailing newline — the joiner adds the separator");
47
+ });
48
+
49
+ test("withParallelism prepends once and is idempotent", () => {
50
+ const prompt = "Reply to the message below.";
51
+ const once = withParallelism(prompt);
52
+ assert.ok(once.startsWith(PARALLELISM_DIRECTIVE), "the directive leads");
53
+ assert.ok(once.endsWith(prompt), "the caller's prompt survives intact");
54
+ assert.equal(countParallelism(once), 1);
55
+
56
+ const twice = withParallelism(once);
57
+ assert.equal(twice, once, "a second application changes nothing");
58
+ assert.equal(countParallelism(twice), 1);
59
+
60
+ const thrice = withParallelism(withParallelism(withParallelism(prompt)));
61
+ assert.equal(countParallelism(thrice), 1);
62
+ });
63
+
64
+ test("withParallelism tolerates an empty or non-string prompt", () => {
65
+ assert.equal(withParallelism(""), PARALLELISM_DIRECTIVE);
66
+ assert.equal(withParallelism(" \n "), PARALLELISM_DIRECTIVE);
67
+ assert.equal(withParallelism(undefined), PARALLELISM_DIRECTIVE);
68
+ assert.equal(withParallelism(null), PARALLELISM_DIRECTIVE);
69
+ assert.equal(withParallelism(42), PARALLELISM_DIRECTIVE);
70
+ });
71
+
72
+ test("a prompt that already carries the directive mid-body is not re-led", () => {
73
+ const embedded = `Context first.\n\n${PARALLELISM_DIRECTIVE}\n\nThen the task.`;
74
+ assert.equal(withParallelism(embedded), embedded);
75
+ assert.equal(countParallelism(withParallelism(embedded)), 1);
76
+ });
77
+
78
+ test("countParallelism counts non-overlapping occurrences", () => {
79
+ assert.equal(countParallelism(""), 0);
80
+ assert.equal(countParallelism(null), 0);
81
+ assert.equal(countParallelism("nothing here"), 0);
82
+ assert.equal(countParallelism(`${PARALLELISM_DIRECTIVE}\n\n${PARALLELISM_DIRECTIVE}`), 2);
83
+ });
84
+
85
+ // ── the two wired seams ─────────────────────────────────────────────────────
86
+
87
+ test("maestro session spawn leads every peer prompt with the directive, exactly once", async () => {
88
+ const { buildSpawnArgs } = await import("../cli/session.mjs");
89
+ const prompt = "Sweep the backlog and file what you find.";
90
+ const args = buildSpawnArgs({ first: "nova", slug: "sweep", prompt, env: {}, allowedTools: [] });
91
+
92
+ assert.equal(args[0], "--name");
93
+ assert.equal(args[1], "nova-sweep");
94
+ const sent = args[args.length - 1];
95
+ assert.ok(sent.startsWith(PARALLELISM_DIRECTIVE), "the peer's prompt is led by the directive");
96
+ assert.ok(sent.endsWith(prompt));
97
+ assert.equal(countParallelism(sent), 1);
98
+
99
+ // The composing case: a prompt that already carries it is not doubled.
100
+ const pre = withParallelism(prompt);
101
+ const again = buildSpawnArgs({ first: "nova", slug: "sweep", prompt: pre, env: {}, allowedTools: [] });
102
+ assert.equal(countParallelism(again[again.length - 1]), 1);
103
+ assert.equal(again[again.length - 1], pre);
104
+ });
105
+
106
+ test("the daemon's prompt-builder leads every sub-session prompt with the directive, exactly once", async (t) => {
107
+ const { mkdtempSync, mkdirSync, writeFileSync } = await import("node:fs");
108
+ const { join } = await import("node:path");
109
+ const { tmpdir } = await import("node:os");
110
+
111
+ const root = mkdtempSync(join(tmpdir(), "maestro-parallelism-prompt-"));
112
+ mkdirSync(join(root, "config"), { recursive: true });
113
+ writeFileSync(join(root, "config", "agent.json"), JSON.stringify({ firstName: "Nova" }));
114
+ const prevAgentDir = process.env.AGENT_DIR;
115
+ process.env.AGENT_DIR = root;
116
+ t.after(() => {
117
+ if (prevAgentDir === undefined) delete process.env.AGENT_DIR;
118
+ else process.env.AGENT_DIR = prevAgentDir;
119
+ });
120
+
121
+ const url = new URL("../../scripts/daemon/prompt-builder.mjs", import.meta.url);
122
+ const pb = await import(`${url.href}?parallelism=${Math.random()}`);
123
+ const prompt = await pb.buildPrompt(
124
+ { sender: "Ana", content: "Three unrelated things need doing.", channel: "slack" },
125
+ { action: "respond", priority: "normal", summary: "three things" },
126
+ { type: "inbox" },
127
+ );
128
+
129
+ assert.ok(prompt.startsWith(PARALLELISM_DIRECTIVE), "the directive leads the built prompt");
130
+ assert.equal(countParallelism(prompt), 1);
131
+ assert.match(prompt, /Three unrelated things need doing\./, "the item's own content is still there");
132
+ });
133
+
134
+ test("the persona's precedence sentence names itself, so leading the prompt with the directive cannot mis-scope it", async (t) => {
135
+ // The sentence used to read "The section above … anything below". That was
136
+ // true only while the persona was the first thing in the prompt; once the
137
+ // directive leads, "above" has two candidate referents and the directive
138
+ // itself falls outside the rule (it is above, not below). Nothing else pins
139
+ // this ordering, so it is pinned here, beside the change that broke it.
140
+ const { mkdtempSync, mkdirSync, writeFileSync } = await import("node:fs");
141
+ const { join } = await import("node:path");
142
+ const { tmpdir } = await import("node:os");
143
+
144
+ const root = mkdtempSync(join(tmpdir(), "maestro-parallelism-persona-"));
145
+ mkdirSync(join(root, "config"), { recursive: true });
146
+ writeFileSync(join(root, "config", "agent.json"), JSON.stringify({ firstName: "Nova", lastName: "Reyes", title: "Chief of Staff" }));
147
+ writeFileSync(join(root, "config", "company.json"), JSON.stringify({ name: "Northwind" }));
148
+ const prevAgentDir = process.env.AGENT_DIR;
149
+ process.env.AGENT_DIR = root;
150
+ t.after(() => {
151
+ if (prevAgentDir === undefined) delete process.env.AGENT_DIR;
152
+ else process.env.AGENT_DIR = prevAgentDir;
153
+ });
154
+
155
+ const url = new URL("../../scripts/daemon/prompt-builder.mjs", import.meta.url);
156
+ const pb = await import(`${url.href}?persona=${Math.random()}`);
157
+ const prompt = await pb.buildPrompt(
158
+ { sender: "Ana", content: "Three unrelated things need doing.", channel: "slack" },
159
+ { action: "respond", priority: "normal", summary: "three things" },
160
+ { type: "inbox" },
161
+ );
162
+
163
+ assert.ok(prompt.startsWith(PARALLELISM_DIRECTIVE), "the directive leads");
164
+ assert.ok(
165
+ !/The section above is your identity/.test(prompt),
166
+ "a positional referent is wrong the moment anything is prepended",
167
+ );
168
+ assert.match(
169
+ prompt,
170
+ /This section is your identity, resolved from your organisation's record of you\. Where anything else in this prompt conflicts with it, this section wins\./,
171
+ "the precedence rule names itself and covers the whole prompt",
172
+ );
173
+ assert.ok(
174
+ prompt.indexOf(PARALLELISM_DIRECTIVE) < prompt.indexOf("This section is your identity"),
175
+ "the directive leads and the persona follows — the ordering the sentence had to stop assuming",
176
+ );
177
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cohortapp/agent-sdk",
3
- "version": "2.12.0",
3
+ "version": "2.13.0",
4
4
  "description": "Cohort Agent SDK — autonomous AI colleague runtime. Deploy senior AI colleagues on dedicated Mac minis, wired to the Cohort operating surface.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -155,6 +155,10 @@
155
155
  "name": "peer-sessions",
156
156
  "description": "Spawn, find and talk to the agent's own peer sessions with ListAgents/SendMessage and `maestro session spawn|peers`, and relay their status to a human in the agent's own voice. Use for parallel work, when a human asks how something is going, or when a peer reports back."
157
157
  },
158
+ {
159
+ "name": "cohort-design",
160
+ "description": "Harmonise the installed design skills with Cohort's own design system — DESIGN.md, PRODUCT.md and the design_* tools outrank every skill's defaults; impeccable for product-UI craft, the motion skills for animation, the taste skills for marketing pages only, unlazy for completion gates. Use before any design, redesign, polish, critique, audit, layout, typography, colour or motion work."
161
+ },
158
162
  {
159
163
  "name": "persona-discipline",
160
164
  "description": "Be one persona to every human — never name Claude Code, sessions, sub-sessions, subagents, workflows or models in anything a person could read; how to rewrite when the pre-send audit blocks a message. Use before any outbound message or when the send hook blocks."
@@ -0,0 +1,153 @@
1
+ ---
2
+ name: cohort-design
3
+ description: Harmonise the installed design skills with Cohort's own design system for any interface work — design, redesign, layout, typography, colour, polish, critique, audit, accessibility, motion and animation, component and design-token work, landing and marketing pages, or making something feel less templated. Read this FIRST, before impeccable, the motion skills, design-taste-frontend, high-end-visual-design, minimalist-ui, redesign-existing-projects or unlazy, so the craft they carry lands on Cohort's tokens, typeface and voice rather than their own defaults.
4
+ ---
5
+
6
+ # Cohort design — which skill wins, and where the truth lives
7
+
8
+ Several strong design skills are installed on this machine. They are craft:
9
+ they know what good looks like, how to critique, what motion should feel like.
10
+ None of them knows what **Cohort** looks like. This skill is the join.
11
+
12
+ Read it before you open any of them, and keep its precedence in mind while you
13
+ work — the moment a skill's default and Cohort's system disagree, this is the
14
+ tie-break.
15
+
16
+ ## The source of truth is Cohort's own, always
17
+
18
+ **`DESIGN.md` and `PRODUCT.md` in the agent directory, and the `design_*` tools
19
+ on the `cohort` MCP server, outrank every installed skill on every question of
20
+ substance:** palette, typeface, type scale, spacing, radii, component grammar,
21
+ imagery, templates, and the voice the copy is written in.
22
+
23
+ - `DESIGN.md` lives at `$AGENT_ROOT/DESIGN.md` (the identity block at the top
24
+ of your context names the agent directory). It is generated from the
25
+ workspace's live brand foundation by `maestro design sync`, which also writes
26
+ `PRODUCT.md` and `state/design/foundation.json`. If the cwd is not the agent
27
+ directory — you are in a product repo, a site repo, a scratch directory —
28
+ read `$AGENT_ROOT/DESIGN.md` anyway. It is still the system of record.
29
+ - If `DESIGN.md` is missing or looks stale, run `maestro design sync` and read
30
+ it. Do not proceed on a skill's default palette because the file was not
31
+ there.
32
+ - The live foundation, the voice, the templates and the asset kit are reads on
33
+ the `cohort` MCP server: `design_foundation`, `design_voice`,
34
+ `design_list_templates`, `design_render_template`, `design_rewrite_in_voice`,
35
+ `design_export_kit`, `design_generate_image`. Prefer a rendered template and
36
+ an exported kit over hand-rolling an asset.
37
+ - **Foundation changes are human-gated.** Your lane is `design_propose_change`,
38
+ which stages a reviewable diff and writes nothing. Never edit tokens in
39
+ `DESIGN.md` to make a design work; propose the change and design against
40
+ what exists meanwhile. `maestro-brand-steward` carries the full mechanics of
41
+ that surface.
42
+
43
+ ## Precedence
44
+
45
+ 1. **Cohort's own system** — `DESIGN.md`, `PRODUCT.md`, the `design_*` tools.
46
+ Tokens, type, voice, templates, assets, and every mutation.
47
+ 2. **`impeccable`** — craft, critique, audit and polish of product UI. Its
48
+ modes (shape, audit, critique, layout, typeset, clarify, distill, harden,
49
+ polish, optimize) are the working vocabulary for interface quality. Use it
50
+ for hierarchy, information architecture, cognitive load, accessibility,
51
+ states, edge cases and the finish pass.
52
+ 3. **The motion skills** — `animate`, `improve-animations`,
53
+ `review-animations`, `find-animation-opportunities`,
54
+ `animation-vocabulary`, `apple-design`, `emil-design-eng`. Anything that
55
+ moves: whether it should animate at all, which property, which curve, how
56
+ long, how it interrupts, how it exits, and reduced-motion.
57
+ 4. **`design-taste-frontend`, `high-end-visual-design`, `minimalist-ui`,
58
+ `redesign-existing-projects`** — **marketing and site pages only.** They
59
+ self-declare out of scope for dashboards, data tables, forms and multi-step
60
+ product UI, and they are right about that: their instincts are editorial.
61
+ Do not apply them to product surfaces.
62
+ 5. **`unlazy`** — completion gates on substantial work. Write the acceptance
63
+ gates before you start a large or multi-part design change, and re-verify
64
+ the evidence before you report it done.
65
+
66
+ ## The overrides — read these before you follow a skill's rule
67
+
68
+ - **The em-dash ban does not apply to Cohort copy.** `design-taste-frontend`
69
+ and its siblings forbid em-dashes as an AI tell. Cohort's voice uses them.
70
+ `DESIGN.md` and `design_voice` decide punctuation, not a skill.
71
+ - **Typeface and palette come from `DESIGN.md`, never from a skill's default.**
72
+ Every one of these skills names fonts and colours it likes. Those are
73
+ examples of taste, not instructions. A design that ships a skill's default
74
+ typeface is wrong even if it looks good.
75
+ - **Never run `impeccable`'s launcher, its hooks, or its live browser mode on
76
+ this machine.** Only its markdown is installed here, deliberately: the
77
+ upstream launcher downloads and runs a binary on first use, and live mode
78
+ drives a browser. Read the skill, apply the judgement, do the work with the
79
+ tools you already have. The same rule covers its `hooks.md` guidance — no
80
+ hook from any of these packs is installed, and none should be.
81
+ - **`impeccable`'s Setup step 1 cannot run here, and that is intended.** It
82
+ says to run `<skill-base-dir>/scripts/impeccable context` once before working.
83
+ That launcher is not installed, so the command will not be found. **Skip the
84
+ step and read the skill directly.** Do not reach for the recovery the pack
85
+ documents: `npx impeccable` (`update`, `detect`, `ignores`) downloads and runs
86
+ the package from a registry, which is the exact thing the vendored copy exists
87
+ to avoid. The same goes for `npx shadcn` and any other `npx <package>` a skill
88
+ suggests.
89
+ - **Never install unlazy's Stop hook, and never reconstruct one by hand.**
90
+ `unlazy`'s prose describes a hook that blocks completion, and names the
91
+ settings files it would be written into. The scripts that install and
92
+ implement it are not on this machine at all. Its gate discipline is yours to
93
+ run deliberately; nothing from these packs may fire on its own, and no
94
+ settings file on this machine gains a hook because a skill suggested one.
95
+ - **Never fetch a design file at run time, and never ship a remote reference.**
96
+ Not a font, not a token file, not a reference page, not a skill update.
97
+ Everything you are allowed to rely on is already on disk: the vendored skills,
98
+ `DESIGN.md`, and what the `design_*` tools return. A design that needs a
99
+ remote file at build time needs that file committed first.
100
+ - **Nothing you generate may point at a third-party host** — no hotlinked
101
+ placeholder photography (`picsum.photos`), no remote icon service
102
+ (`cdn.simpleicons.org`), **never a remote script tag** to a vendor CDN, no
103
+ remote font. The marketing skills instruct all four. Cohort's imagery and
104
+ icons come from `design_export_kit` and `design_generate_image`; a placeholder
105
+ is a local file or a solid token-coloured block.
106
+ - **Do not install packages because a skill listed one.** The marketing skills
107
+ carry a shelf of `npm install` lines for other companies' design systems.
108
+ Adding a dependency is the product repo's decision, made in that repo with its
109
+ own review — not a side effect of reading a style guide.
110
+ - **When two skills disagree, `DESIGN.md` wins. When `DESIGN.md` is silent, the
111
+ more specific skill wins** — motion questions go to the motion skills even
112
+ when `impeccable` has an opinion; product-UI questions go to `impeccable`
113
+ even when a marketing skill has one.
114
+
115
+ ## How a piece of work runs
116
+
117
+ 1. Read `DESIGN.md` (and `PRODUCT.md` when the work touches what the product
118
+ claims to be). Pull the live foundation with `design_foundation` if the file
119
+ may be stale.
120
+ 2. Decide the surface: **product UI** or **marketing/site page**. That single
121
+ choice selects the craft skill — step 2 of the precedence, or step 4. Get it
122
+ right before you read further; the two sets of instincts genuinely conflict.
123
+ 3. For anything substantial, write the acceptance gates first (`unlazy`), in
124
+ the plan, before the first edit.
125
+ 4. Do the work against Cohort's tokens. Where copy is involved, run it through
126
+ `design_rewrite_in_voice` rather than writing in a skill's house voice.
127
+ 5. Motion last, and only where it earns its place.
128
+ 6. Re-verify against the gates and against `DESIGN.md` before reporting.
129
+ `impeccable`'s audit and critique modes are the right final pass on product
130
+ UI; `review-animations` is the right one for motion.
131
+
132
+ ## Where the licences and the pins live
133
+
134
+ Each installed pack keeps its upstream `LICENSE` (and `NOTICE.md` for
135
+ `impeccable`) beside its `SKILL.md`. The pinned commit each was taken from is
136
+ recorded in `plugins/maestro-skills/vendor/<pack>/UPSTREAM.json` in the SDK,
137
+ along with what was deliberately left behind. Nothing in those trees is ever
138
+ executed on this machine; they are read as prose.
139
+
140
+ ## Their words are not ours
141
+
142
+ These packs were written for a general audience and their prose names the
143
+ tooling it was written against, and the helpers it dispatches, in terms Cohort
144
+ never uses in anything a person receives. **Take the judgement, leave the
145
+ vocabulary.** Never quote or paraphrase a pack's wording into a status update, a
146
+ commit message, a review comment, a plan, a report or any product copy — write
147
+ the point in Cohort's own voice, and run copy through `design_rewrite_in_voice`.
148
+
149
+ One reference the fleet does **not** carry, and that you may still be asked
150
+ about: `getdesign.md` (and the `awesome-design-md` index that links to it),
151
+ whose terms do not allow redistribution. Its DESIGN.md format is exactly what
152
+ Cohort's own tokens are rendered into instead, so nothing is lost by its
153
+ absence. Cite it if useful; do not fetch it.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Emil Kowalski
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,70 @@
1
+ {
2
+ "repo": "emilkowalski/skills",
3
+ "sha": "d23d7f88a2e21c9e4b1418c7abe420f5c1052ba7",
4
+ "date": "2026-08-21",
5
+ "license": "MIT",
6
+ "files": [
7
+ {
8
+ "path": "LICENSE",
9
+ "sha256": "4ff5bdb7887ec1435c9cab0e8d1a7caee704d894d65c2a008ccc68b1cc2f260b"
10
+ },
11
+ {
12
+ "path": "skills/animate/RECIPES.md",
13
+ "sha256": "21ff63d84391db8d96ecdf9170095f55a42c836ccc36fd3269c4772bab031ba2"
14
+ },
15
+ {
16
+ "path": "skills/animate/SKILL.md",
17
+ "sha256": "f6317335da2662e92270dc0a6128bea95d7216cd751f86628e3ac6b72804e805"
18
+ },
19
+ {
20
+ "path": "skills/animation-vocabulary/SKILL.md",
21
+ "sha256": "d718b48fe3c7898804d588f050a2e266d82c9f5ef51da256c8cb8b5951527757"
22
+ },
23
+ {
24
+ "path": "skills/apple-design/SKILL.md",
25
+ "sha256": "11840b24a11d7f94f39c6aaab074750ae4e4de4ef54ee4b1dd97e16ebd485e61"
26
+ },
27
+ {
28
+ "path": "skills/emil-design-eng/SKILL.md",
29
+ "sha256": "e71de849347050c2c573c1cf24d742d5a13459557ecffa6e562f08006f46b5b7"
30
+ },
31
+ {
32
+ "path": "skills/find-animation-opportunities/SKILL.md",
33
+ "sha256": "91c1243164057fbf824088d12faea937878a757a7ac653e8288b775e8b27b882"
34
+ },
35
+ {
36
+ "path": "skills/improve-animations/AUDIT.md",
37
+ "sha256": "551c8473e20e5f4774680bc24d45e1c68e50992582720905c6b077756b7b5a55"
38
+ },
39
+ {
40
+ "path": "skills/improve-animations/PLAN-TEMPLATE.md",
41
+ "sha256": "0a08ac8e23fd2082d7ffb86aeed7b789de77328c3cf874b16f1a755f2ef0a6ad"
42
+ },
43
+ {
44
+ "path": "skills/improve-animations/SKILL.md",
45
+ "sha256": "68f17bbc4671593d2f43dba26a679243e2153ba5f26965fb7d59df52842534ff"
46
+ },
47
+ {
48
+ "path": "skills/prototype/PICKER.md",
49
+ "sha256": "31a55eec94715cc79942e91e172e539e3031dcd5e2e5ee7c1446cf2caee960a6"
50
+ },
51
+ {
52
+ "path": "skills/prototype/SKILL.md",
53
+ "sha256": "2ad8401c4deaddb54947fb65247f790e7b3d8784e35312bcbedbfb1d59cd89ce"
54
+ },
55
+ {
56
+ "path": "skills/review-animations/SKILL.md",
57
+ "sha256": "61cf8ac0c4c8e1f63385298c546b16c65ca9aec34abddcd04e821c16712d671d"
58
+ },
59
+ {
60
+ "path": "skills/review-animations/STANDARDS.md",
61
+ "sha256": "e7d3605034acda54ca13e43aec9e64d65b53de20f75b11b8d694e373012fbe07"
62
+ }
63
+ ],
64
+ "omitted": [
65
+ "skills/pick-ui-library — library choice is Cohort's, settled in the product repo",
66
+ "skills/ask-sonner — a single third-party toast library's API",
67
+ "skills/write-swift, skills/animate-expo — native platforms this fleet does not ship"
68
+ ],
69
+ "notes": "MIT. Motion and design-engineering craft. Precedence sits below Cohort's DESIGN.md for tokens and type; these govern easing, duration and restraint."
70
+ }