@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.
- package/bin/maestro.mjs +6 -2
- package/docs/guides/front-door-session.md +49 -0
- package/lib/cli/design.mjs +185 -0
- package/lib/cli/design.test.mjs +270 -0
- package/lib/cli/global-setup-extras.mjs +44 -0
- package/lib/cli/global-setup-extras.test.mjs +95 -0
- package/lib/cli/session.mjs +11 -1
- package/lib/cli/session.test.mjs +17 -6
- package/lib/collective/global-config.mjs +5 -0
- package/lib/collective/global-config.test.mjs +5 -0
- package/lib/collective/vendor-skills.mjs +305 -0
- package/lib/collective/vendor-skills.test.mjs +306 -0
- package/lib/design/design-md.mjs +793 -0
- package/lib/design/design-md.test.mjs +318 -0
- package/lib/design/fixtures/DESIGN.golden.md +238 -0
- package/lib/design/fixtures/PRODUCT.golden.md +67 -0
- package/lib/design/fixtures/foundation.json +133 -0
- package/lib/design/refresh-gate.mjs +154 -0
- package/lib/design/refresh-gate.test.mjs +144 -0
- package/lib/design/write.mjs +275 -0
- package/lib/design/write.test.mjs +241 -0
- package/lib/prompts/parallelism.mjs +79 -0
- package/lib/prompts/parallelism.test.mjs +177 -0
- package/package.json +1 -1
- package/plugins/maestro-skills/plugin.json +4 -0
- package/plugins/maestro-skills/skills/cohort-design.md +153 -0
- package/plugins/maestro-skills/vendor/emilkowalski/LICENSE +21 -0
- package/plugins/maestro-skills/vendor/emilkowalski/UPSTREAM.json +70 -0
- package/plugins/maestro-skills/vendor/emilkowalski/skills/animate/RECIPES.md +324 -0
- package/plugins/maestro-skills/vendor/emilkowalski/skills/animate/SKILL.md +199 -0
- package/plugins/maestro-skills/vendor/emilkowalski/skills/animation-vocabulary/SKILL.md +173 -0
- package/plugins/maestro-skills/vendor/emilkowalski/skills/apple-design/SKILL.md +282 -0
- package/plugins/maestro-skills/vendor/emilkowalski/skills/emil-design-eng/SKILL.md +674 -0
- package/plugins/maestro-skills/vendor/emilkowalski/skills/find-animation-opportunities/SKILL.md +132 -0
- package/plugins/maestro-skills/vendor/emilkowalski/skills/improve-animations/AUDIT.md +115 -0
- package/plugins/maestro-skills/vendor/emilkowalski/skills/improve-animations/PLAN-TEMPLATE.md +73 -0
- package/plugins/maestro-skills/vendor/emilkowalski/skills/improve-animations/SKILL.md +101 -0
- package/plugins/maestro-skills/vendor/emilkowalski/skills/prototype/PICKER.md +197 -0
- package/plugins/maestro-skills/vendor/emilkowalski/skills/prototype/SKILL.md +90 -0
- package/plugins/maestro-skills/vendor/emilkowalski/skills/review-animations/SKILL.md +112 -0
- package/plugins/maestro-skills/vendor/emilkowalski/skills/review-animations/STANDARDS.md +187 -0
- package/plugins/maestro-skills/vendor/impeccable/LICENSE +191 -0
- package/plugins/maestro-skills/vendor/impeccable/NOTICE.md +11 -0
- package/plugins/maestro-skills/vendor/impeccable/SKILL.md +86 -0
- package/plugins/maestro-skills/vendor/impeccable/UPSTREAM.json +201 -0
- package/plugins/maestro-skills/vendor/impeccable/agents/impeccable-asset-producer.md +42 -0
- package/plugins/maestro-skills/vendor/impeccable/agents/impeccable-documenter.md +29 -0
- package/plugins/maestro-skills/vendor/impeccable/agents/impeccable-finish-reviewer.md +43 -0
- package/plugins/maestro-skills/vendor/impeccable/agents/impeccable-manual-edit-applier.md +97 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/adapt.md +312 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/adapt.native.md +58 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/android.md +46 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/animate.md +89 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/audit.md +136 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/audit.native.md +139 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/bolder.md +33 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/clarify.md +94 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/colorize.md +86 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/craft-floor.md +44 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/craft.md +5 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/critique.md +806 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/degraded/asset-producer.md +37 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/degraded/documenter.md +24 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/degraded/finish-reviewer.md +38 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/degraded/manual-edit-applier.md +92 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/delight.md +70 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/distill.md +111 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/doctor.md +54 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/document.md +416 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/extract.md +69 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/harden.md +336 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/hooks.md +111 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/init.md +131 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/ios.md +51 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/layout.md +84 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/live-setup.md +104 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/live.md +325 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/new-work.md +147 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/onboard.md +234 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/operate.md +61 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/optimize.md +258 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/overdrive.md +127 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/polish.md +105 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/quieter.md +99 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/routing.md +24 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/shape.md +59 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/typeset.md +80 -0
- package/plugins/maestro-skills/vendor/impeccable/reference/visualize.md +46 -0
- package/plugins/maestro-skills/vendor/taste-skill/LICENSE +21 -0
- package/plugins/maestro-skills/vendor/taste-skill/UPSTREAM.json +37 -0
- package/plugins/maestro-skills/vendor/taste-skill/skills/minimalist-skill/SKILL.md +85 -0
- package/plugins/maestro-skills/vendor/taste-skill/skills/redesign-skill/SKILL.md +178 -0
- package/plugins/maestro-skills/vendor/taste-skill/skills/soft-skill/SKILL.md +98 -0
- package/plugins/maestro-skills/vendor/taste-skill/skills/taste-skill/SKILL.md +1206 -0
- package/plugins/maestro-skills/vendor/unlazy/LICENSE +21 -0
- package/plugins/maestro-skills/vendor/unlazy/SECURITY.md +72 -0
- package/plugins/maestro-skills/vendor/unlazy/SKILL.md +104 -0
- package/plugins/maestro-skills/vendor/unlazy/UPSTREAM.json +94 -0
- package/plugins/maestro-skills/vendor/unlazy/references/dispatch.md +82 -0
- package/plugins/maestro-skills/vendor/unlazy/references/gates.md +149 -0
- package/plugins/maestro-skills/vendor/unlazy/references/method.md +49 -0
- package/plugins/maestro-skills/vendor/unlazy/references/orchestration.md +107 -0
- package/plugins/maestro-skills/vendor/unlazy/references/parallel.md +133 -0
- package/plugins/maestro-skills/vendor/unlazy/references/token-economy.md +48 -0
- package/plugins/maestro-skills/vendor/unlazy/scripts/dispatch-check.mjs +139 -0
- package/plugins/maestro-skills/vendor/unlazy/scripts/gate-check.mjs +960 -0
- package/plugins/maestro-skills/vendor/unlazy/scripts/gate-lint.mjs +245 -0
- package/plugins/maestro-skills/vendor/unlazy/scripts/lib/check-supervisor.mjs +46 -0
- package/plugins/maestro-skills/vendor/unlazy/scripts/lib/dispatch.mjs +293 -0
- package/plugins/maestro-skills/vendor/unlazy/scripts/lib/gates.mjs +953 -0
- package/plugins/maestro-skills/vendor/unlazy/scripts/lib/process-tree.mjs +161 -0
- package/plugins/maestro-skills/vendor/unlazy/scripts/lib/regex-worker.mjs +9 -0
- package/plugins/maestro-skills/vendor/unlazy/templates/PLAN.md +116 -0
- package/plugins/maestro-skills/vendor/unlazy/templates/gates-leaf.md +51 -0
- package/plugins/maestro-skills/vendor/unlazy/templates/gates-node.md +51 -0
- package/scripts/ci/check-skill-packs.mjs +388 -0
- package/scripts/ci/check-skill-packs.test.mjs +495 -0
- package/scripts/ci/check.mjs +3 -0
- package/scripts/daemon/agent-daemon-design.test.mjs +238 -0
- package/scripts/daemon/agent-daemon.mjs +108 -0
- package/scripts/daemon/cadence-consumer-frontdoor.test.mjs +61 -2
- package/scripts/daemon/cadence-consumer.mjs +46 -22
- package/scripts/daemon/prompt-builder.mjs +19 -3
- package/scripts/local-triggers/autoupdate.test.mjs +33 -3
- package/scripts/vendor/skill-packs.mjs +354 -0
- package/scripts/vendor/sync-skill-packs.mjs +242 -0
- 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.
|
|
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
|
+
}
|