@uniqbit/mate-core 0.17.2-canary.3 → 0.18.0-canary.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/package.json +1 -1
- package/src/cli/commands/companion/update.ts +2 -1
- package/src/cli/commands/install.ts +3 -1
- package/src/cli/commands/plugin/plugin.ts +1 -1
- package/src/cli/commands/plugin/verify.ts +4 -8
- package/src/cli/commands/studio/terminal-launch.ts +1 -51
- package/src/cli/commands/studio/terminal.ts +2 -13
- package/src/lib/install.ts +3 -0
- package/src/lib/orchestrator/types.ts +0 -6
- package/src/templates/mate-skills/agents/mate-domain-modeling/SKILL.md +5 -2
- package/src/templates/mate-skills/agents/mate-grill-me/SKILL.md +5 -2
- package/src/templates/mate-skills/agents/mate-grill-with-docs/SKILL.md +5 -2
- package/src/templates/mate-skills/agents/mate-grilling/SKILL.md +5 -2
- package/src/templates/mate-skills/agents/mate-interview-me/SKILL.md +5 -2
- package/src/templates/mate-skills/agents/mate-show-me/SKILL.md +5 -2
- package/src/templates/mate-skills/agents/mate-simplify-code/SKILL.md +5 -2
- package/src/templates/mate-skills/claude/mate-domain-modeling/SKILL.md +5 -2
- package/src/templates/mate-skills/claude/mate-grill-me/SKILL.md +5 -2
- package/src/templates/mate-skills/claude/mate-grill-with-docs/SKILL.md +5 -2
- package/src/templates/mate-skills/claude/mate-grilling/SKILL.md +5 -2
- package/src/templates/mate-skills/claude/mate-interview-me/SKILL.md +5 -2
- package/src/templates/mate-skills/claude/mate-show-me/SKILL.md +5 -2
- package/src/templates/mate-skills/claude/mate-simplify-code/SKILL.md +5 -2
- package/src/tools/setup/__snapshots__/runtime-surface-golden.test.ts.snap +90 -63
- package/src/tools/setup/capabilities/openspec.ts +55 -27
- package/src/tools/setup/capabilities/react-doctor.ts +8 -16
- package/src/tools/setup/capabilities/tokensave.ts +1 -0
- package/src/tools/setup/dynamic-plugins/frozen.ts +24 -3
- package/src/tools/setup/dynamic-plugins/loader.ts +16 -0
- package/src/tools/setup/dynamic-plugins/policy.ts +55 -0
- package/src/tools/setup/dynamic-plugins/staging.ts +11 -5
- package/src/tools/setup/dynamic-plugins/verify.ts +22 -18
- package/src/tools/setup/engine.ts +6 -1
- package/src/tools/setup/install-contract.ts +2 -0
- package/src/tools/setup/mate.ts +3 -1
- package/src/tools/setup/plugin.ts +2 -0
- package/src/tools/setup/providers/agents-skill-root.ts +79 -0
- package/src/tools/setup/providers/opencode.ts +8 -9
package/package.json
CHANGED
|
@@ -29,7 +29,8 @@ const SKILLS_LOCKFILE = "skills-lock.json";
|
|
|
29
29
|
* pre-existing uncommitted edits there are stale output, never local work worth separating.
|
|
30
30
|
*/
|
|
31
31
|
const OPENSPEC_GENERATED = [
|
|
32
|
-
/^\.(claude|opencode)\/skills\/openspec-[^/]+(\/|$)/,
|
|
32
|
+
/^\.(claude|agents|opencode)\/skills\/openspec-[^/]+(\/|$)/,
|
|
33
|
+
/^\.agents\/skills\/\.openspec-target$/,
|
|
33
34
|
/^\.claude\/commands\/opsx(\/|$)/,
|
|
34
35
|
/^\.opencode\/commands\/opsx-[^/]+$/,
|
|
35
36
|
];
|
|
@@ -166,9 +166,11 @@ export async function runInstallCommand(argv: string[], cwd = process.cwd()): Pr
|
|
|
166
166
|
);
|
|
167
167
|
if (drift.length > 0) {
|
|
168
168
|
process.stderr.write(
|
|
169
|
-
`${FRAMEWORK_NAME}:
|
|
169
|
+
`${FRAMEWORK_NAME}: plugin-generated files differ from the committed checkout: ${drift.join(", ")}\n` +
|
|
170
170
|
`Prepare and commit them in the companion's authoring flow; the checkout was left unchanged.\n`,
|
|
171
171
|
);
|
|
172
|
+
process.exitCode = 1;
|
|
173
|
+
return false;
|
|
172
174
|
}
|
|
173
175
|
} else {
|
|
174
176
|
await reconcileInstalledCompanion(plan);
|
|
@@ -11,7 +11,7 @@ export async function runPluginCommand(
|
|
|
11
11
|
await runPluginInstallCommand(argv);
|
|
12
12
|
return;
|
|
13
13
|
case "verify":
|
|
14
|
-
await runPluginVerifyCommand(
|
|
14
|
+
await runPluginVerifyCommand();
|
|
15
15
|
return;
|
|
16
16
|
default:
|
|
17
17
|
console.error(`Unknown plugin command: ${subcommand ?? ""}`);
|
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
import { FRAMEWORK_NAME } from "../../../framework";
|
|
2
2
|
import { resolveInstallContext } from "../../../lib/install";
|
|
3
|
-
import {
|
|
3
|
+
import { verifyDeclaredPlugins } from "../../../tools/setup/dynamic-plugins/verify";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @command mate plugin verify
|
|
7
|
-
* @description Strict, installation-free check that every plugin declared by the companion is installed, and loadable with the current environment. Exits non-zero naming each failing package.
|
|
7
|
+
* @description Strict, installation-free check that every plugin declared by the companion is allowed by `MATE_ALLOWED_PLUGINS`, installed, and loadable with the current environment. Exits non-zero naming each failing package.
|
|
8
8
|
*/
|
|
9
|
-
export async function runPluginVerifyCommand(
|
|
10
|
-
argv: string[] = [],
|
|
11
|
-
cwd = process.cwd(),
|
|
12
|
-
): Promise<boolean> {
|
|
9
|
+
export async function runPluginVerifyCommand(cwd = process.cwd()): Promise<boolean> {
|
|
13
10
|
const context = await resolveInstallContext(cwd);
|
|
14
11
|
if ((context.kind !== "companion" && context.kind !== "hub") || !context.companionPath) {
|
|
15
12
|
process.stderr.write(`${FRAMEWORK_NAME}: \`plugin verify\` requires a companion context.\n`);
|
|
16
13
|
process.exitCode = 1;
|
|
17
14
|
return false;
|
|
18
15
|
}
|
|
19
|
-
const
|
|
16
|
+
const failures = await verifyDeclaredPlugins(context.companionPath);
|
|
20
17
|
for (const failure of failures) {
|
|
21
18
|
process.stderr.write(`${FRAMEWORK_NAME}: plugin ${failure.package}: ${failure.reason}\n`);
|
|
22
19
|
}
|
|
@@ -24,6 +21,5 @@ export async function runPluginVerifyCommand(
|
|
|
24
21
|
process.exitCode = 1;
|
|
25
22
|
return false;
|
|
26
23
|
}
|
|
27
|
-
if (argv.includes("--json")) process.stdout.write(`${JSON.stringify({ capabilities })}\n`);
|
|
28
24
|
return true;
|
|
29
25
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
1
|
import path from "node:path";
|
|
3
2
|
|
|
4
3
|
import { FRAMEWORK_NAME } from "../../../framework";
|
|
@@ -27,56 +26,11 @@ export async function launchableAgents(
|
|
|
27
26
|
return TERMINAL_AGENTS.filter((agent) => allowed.includes(agent) && installed(agent));
|
|
28
27
|
}
|
|
29
28
|
|
|
30
|
-
/** Lowercase letters, digits and hyphens, so a name can never carry shell syntax or a flag. */
|
|
31
|
-
export const AGENT_NAME_PATTERN = /^[a-z0-9][a-z0-9-]{0,63}$/;
|
|
32
|
-
|
|
33
|
-
const AGENT_DEFINITION_DIRS: Record<TerminalAgent, string> = {
|
|
34
|
-
claude: path.join(".claude", "agents"),
|
|
35
|
-
opencode: path.join(".opencode", "agents"),
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
export interface DefaultAgentOutcome {
|
|
39
|
-
agentArgs?: string[];
|
|
40
|
-
notice?: string;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* The companion's `studio.terminal.agent` for one provider. Never throws and
|
|
45
|
-
* never echoes the configured value into the notice.
|
|
46
|
-
*/
|
|
47
|
-
export async function defaultAgentFor(
|
|
48
|
-
companionPath: string,
|
|
49
|
-
agent: TerminalAgent,
|
|
50
|
-
): Promise<DefaultAgentOutcome> {
|
|
51
|
-
const configPath = path.join(companionPath, `.${FRAMEWORK_NAME}`, "config", "framework.yaml");
|
|
52
|
-
if (!fs.existsSync(configPath)) return {};
|
|
53
|
-
let name: unknown;
|
|
54
|
-
try {
|
|
55
|
-
name = (await new ConfigStore(configPath).load()).studio?.terminal?.agent;
|
|
56
|
-
} catch {
|
|
57
|
-
return {};
|
|
58
|
-
}
|
|
59
|
-
if (name === undefined || name === null) return {};
|
|
60
|
-
if (typeof name !== "string" || !AGENT_NAME_PATTERN.test(name)) {
|
|
61
|
-
return {
|
|
62
|
-
notice: "Default agent not applied: studio.terminal.agent is not a valid agent name.",
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
const definition = path.join(companionPath, AGENT_DEFINITION_DIRS[agent], `${name}.md`);
|
|
66
|
-
if (!fs.existsSync(definition)) {
|
|
67
|
-
return {
|
|
68
|
-
notice: `Default agent "${name}" not applied: this companion has no ${agent} definition for it.`,
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
return { agentArgs: ["--agent", name] };
|
|
72
|
-
}
|
|
73
|
-
|
|
74
29
|
export interface LaunchResolverOptions {
|
|
75
30
|
collectInventory: () => Promise<StudioInventory>;
|
|
76
31
|
/** Pinned by `serve --companion`; overrides the page selection. */
|
|
77
32
|
launchCompanion?: string | null;
|
|
78
33
|
launchableAgents?: (companionPath: string) => Promise<TerminalAgent[]>;
|
|
79
|
-
defaultAgent?: (companionPath: string, agent: TerminalAgent) => Promise<DefaultAgentOutcome>;
|
|
80
34
|
}
|
|
81
35
|
|
|
82
36
|
/** The companion a launch targets: the pinned one, else the page's, both read from the current inventory. */
|
|
@@ -96,7 +50,6 @@ export function createLaunchResolver(
|
|
|
96
50
|
options: LaunchResolverOptions,
|
|
97
51
|
): (agent: string, digest: string | null) => Promise<TerminalLaunchResolution> {
|
|
98
52
|
const agents = options.launchableAgents ?? launchableAgents;
|
|
99
|
-
const defaultAgent = options.defaultAgent ?? defaultAgentFor;
|
|
100
53
|
return async (agent, digest) => {
|
|
101
54
|
const companion = await effectiveLaunchCompanion(
|
|
102
55
|
await options.collectInventory(),
|
|
@@ -113,9 +66,6 @@ export function createLaunchResolver(
|
|
|
113
66
|
if (!(await agents(companion.path)).includes(agent as TerminalAgent)) {
|
|
114
67
|
return { reason: `${agent} is not allowed by this companion or is not installed` };
|
|
115
68
|
}
|
|
116
|
-
return {
|
|
117
|
-
companionPath: companion.path,
|
|
118
|
-
...(await defaultAgent(companion.path, agent as TerminalAgent)),
|
|
119
|
-
};
|
|
69
|
+
return { companionPath: companion.path };
|
|
120
70
|
};
|
|
121
71
|
}
|
|
@@ -177,15 +177,7 @@ export interface TerminalSessionInfo {
|
|
|
177
177
|
startedAt: number;
|
|
178
178
|
}
|
|
179
179
|
|
|
180
|
-
export type TerminalLaunchResolution =
|
|
181
|
-
| {
|
|
182
|
-
companionPath: string;
|
|
183
|
-
/** Extra argv entries for the managed launch; set only by companion configuration. */
|
|
184
|
-
agentArgs?: string[];
|
|
185
|
-
/** Written to the terminal before the agent starts. */
|
|
186
|
-
notice?: string;
|
|
187
|
-
}
|
|
188
|
-
| { reason: string };
|
|
180
|
+
export type TerminalLaunchResolution = { companionPath: string } | { reason: string };
|
|
189
181
|
|
|
190
182
|
export interface TerminalRegistryOptions {
|
|
191
183
|
detachMs: number;
|
|
@@ -396,7 +388,7 @@ export class TerminalRegistry {
|
|
|
396
388
|
void this.finish(detached, { type: "ended", reason: "evicted" });
|
|
397
389
|
}
|
|
398
390
|
|
|
399
|
-
const session = this.launch(agent, resolved.companionPath, size
|
|
391
|
+
const session = this.launch(agent, resolved.companionPath, size);
|
|
400
392
|
this.attachTo(connection, session, size);
|
|
401
393
|
}
|
|
402
394
|
|
|
@@ -404,7 +396,6 @@ export class TerminalRegistry {
|
|
|
404
396
|
agent: TerminalAgent,
|
|
405
397
|
companionPath: string,
|
|
406
398
|
size: { cols: number; rows: number },
|
|
407
|
-
extras: { agentArgs?: string[]; notice?: string } = {},
|
|
408
399
|
): Session {
|
|
409
400
|
const env: Record<string, string> = {};
|
|
410
401
|
for (const [key, value] of Object.entries(this.options.env ?? process.env)) {
|
|
@@ -422,7 +413,6 @@ export class TerminalRegistry {
|
|
|
422
413
|
"--companion",
|
|
423
414
|
"--yes",
|
|
424
415
|
...(this.options.noGit ? ["--no-git"] : []),
|
|
425
|
-
...(extras.agentArgs ?? []),
|
|
426
416
|
];
|
|
427
417
|
|
|
428
418
|
const session = {
|
|
@@ -437,7 +427,6 @@ export class TerminalRegistry {
|
|
|
437
427
|
ending: null,
|
|
438
428
|
exited: false,
|
|
439
429
|
} as Omit<Session, "process"> as Session;
|
|
440
|
-
if (extras.notice) session.ring.push(new TextEncoder().encode(`${extras.notice}\r\n`));
|
|
441
430
|
session.process = this.spawn({
|
|
442
431
|
argv,
|
|
443
432
|
cwd: companionPath,
|
package/src/lib/install.ts
CHANGED
|
@@ -228,6 +228,9 @@ export async function runInstallPlan(
|
|
|
228
228
|
): Promise<{ ok: boolean; results: InstallRequirementResult[] }> {
|
|
229
229
|
const results: InstallRequirementResult[] = [];
|
|
230
230
|
let ok = true;
|
|
231
|
+
await Promise.all(
|
|
232
|
+
plan.requirements.map((item) => (item.satisfied ? item.update?.().catch(() => {}) : undefined)),
|
|
233
|
+
);
|
|
231
234
|
for (const item of plan.requirements) {
|
|
232
235
|
options.onStart?.(item);
|
|
233
236
|
if (item.satisfied) {
|
|
@@ -120,11 +120,6 @@ export interface PluginDeclaration {
|
|
|
120
120
|
config?: unknown;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
export interface StudioTerminalConfig {
|
|
124
|
-
/** Persona selected with `--agent` when Studio's terminal starts a provider. */
|
|
125
|
-
agent?: string;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
123
|
export interface FrameworkConfig {
|
|
129
124
|
type?: FrameworkType;
|
|
130
125
|
git?: GitModeProfile;
|
|
@@ -136,7 +131,6 @@ export interface FrameworkConfig {
|
|
|
136
131
|
cliTools?: CliToolConfig[];
|
|
137
132
|
packageManagers?: string[];
|
|
138
133
|
engines?: EngineConstraints;
|
|
139
|
-
studio?: { terminal?: StudioTerminalConfig };
|
|
140
134
|
}
|
|
141
135
|
|
|
142
136
|
export interface CompanionRegistryConfig {
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
name: mate-domain-modeling
|
|
3
3
|
description: Build a project domain model using Mate context-map scope and Companion Repository artifacts.
|
|
4
4
|
disable-model-invocation: true
|
|
5
|
+
metadata:
|
|
6
|
+
credits:
|
|
7
|
+
skill: domain-modeling
|
|
8
|
+
author: Matt Pocock
|
|
9
|
+
url: "https://github.com/mattpocock/skills/blob/main/skills/engineering/domain-modeling/SKILL.md"
|
|
5
10
|
---
|
|
6
11
|
|
|
7
12
|
# Mate Domain Modeling
|
|
8
13
|
|
|
9
|
-
> Inspired by [Matt Pocock's domain-modeling skill](https://github.com/mattpocock/skills/tree/main/skills/engineering/domain-modeling) and adapted here as a Mate process-driven skill.
|
|
10
|
-
|
|
11
14
|
Actively sharpen project terminology and durable domain decisions. Reading a
|
|
12
15
|
context for vocabulary is not enough: challenge fuzzy terms, test boundaries
|
|
13
16
|
with concrete scenarios, and ask the user to confirm each proposed definition
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
name: mate-grill-me
|
|
3
3
|
description: Stress-test a plan or idea through dependency-ordered conversational design-tree rounds.
|
|
4
4
|
disable-model-invocation: true
|
|
5
|
+
metadata:
|
|
6
|
+
credits:
|
|
7
|
+
skill: grill-me
|
|
8
|
+
author: Matt Pocock
|
|
9
|
+
url: "https://github.com/mattpocock/skills/blob/main/skills/productivity/grill-me/SKILL.md"
|
|
5
10
|
---
|
|
6
11
|
|
|
7
12
|
# Mate Grill Me
|
|
8
13
|
|
|
9
|
-
> Inspired by [Matt Pocock's grill-me skill](https://github.com/mattpocock/skills/tree/main/skills/productivity/grill-me) and adapted here as a Mate process-driven skill.
|
|
10
|
-
|
|
11
14
|
Start `/mate-grilling`.
|
|
12
15
|
|
|
13
16
|
The session is conversational-only. It does not create or modify code, context
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
name: mate-grill-with-docs
|
|
3
3
|
description: Sharpen a design conversationally and record confirmed domain decisions on the Companion Repository artifact plane.
|
|
4
4
|
disable-model-invocation: true
|
|
5
|
+
metadata:
|
|
6
|
+
credits:
|
|
7
|
+
skill: grill-with-docs
|
|
8
|
+
author: Matt Pocock
|
|
9
|
+
url: "https://github.com/mattpocock/skills/blob/main/skills/engineering/grill-with-docs/SKILL.md"
|
|
5
10
|
---
|
|
6
11
|
|
|
7
12
|
# Mate Grill With Docs
|
|
8
13
|
|
|
9
|
-
> Inspired by [Matt Pocock's grill-with-docs skill](https://github.com/mattpocock/skills/tree/main/skills/engineering/grill-with-docs) and adapted here as a Mate process-driven skill.
|
|
10
|
-
|
|
11
14
|
First invoke `/mate-grilling` and wait for explicit decisions. Then invoke
|
|
12
15
|
`/mate-domain-modeling` only for confirmed project terminology or durable
|
|
13
16
|
decisions.
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
name: mate-grilling
|
|
3
3
|
description: Relentlessly sharpen a plan through dependency-ordered design-tree rounds.
|
|
4
4
|
disable-model-invocation: true
|
|
5
|
+
metadata:
|
|
6
|
+
credits:
|
|
7
|
+
skill: grilling
|
|
8
|
+
author: Matt Pocock
|
|
9
|
+
url: "https://github.com/mattpocock/skills/blob/main/skills/productivity/grilling/SKILL.md"
|
|
5
10
|
---
|
|
6
11
|
|
|
7
12
|
# Mate Grilling
|
|
8
13
|
|
|
9
|
-
> Inspired by [Matt Pocock's grilling skill](https://github.com/mattpocock/skills/tree/main/skills/productivity/grilling) and adapted here as a Mate process-driven skill.
|
|
10
|
-
|
|
11
14
|
Stress-test the current plan or idea as a design tree. This is a conversation,
|
|
12
15
|
not an implementation or documentation session: do not create or modify code,
|
|
13
16
|
context files, ADRs, OpenSpec artifacts, or other files.
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
name: mate-interview-me
|
|
3
3
|
description: Clarify intent through a focused, one-question-at-a-time conversation before planning.
|
|
4
4
|
disable-model-invocation: true
|
|
5
|
+
metadata:
|
|
6
|
+
credits:
|
|
7
|
+
skill: interview-me
|
|
8
|
+
author: Addy Osmani
|
|
9
|
+
url: "https://github.com/addyosmani/agent-skills/blob/main/skills/interview-me/SKILL.md"
|
|
5
10
|
---
|
|
6
11
|
|
|
7
12
|
# Mate Interview Me
|
|
8
13
|
|
|
9
|
-
> Inspired by [Addy Osmani's interview-me skill](https://github.com/addyosmani/agent-skills/tree/main/skills/interview-me) and adapted here as a Mate process-driven skill.
|
|
10
|
-
|
|
11
14
|
## Overview
|
|
12
15
|
|
|
13
16
|
What people ask for and what they actually want are different things. They ask
|
|
@@ -8,12 +8,15 @@ compatibility: Requires the mate CLI and the openspec capability enabled.
|
|
|
8
8
|
metadata:
|
|
9
9
|
author: mate
|
|
10
10
|
version: "1.0"
|
|
11
|
+
credits:
|
|
12
|
+
skill: show-me
|
|
13
|
+
author: Dex Horthy
|
|
14
|
+
organisation: Humanlayer
|
|
15
|
+
url: "https://github.com/humanlayer/skills/blob/main/plugins/show-me/skills/show-me/SKILL.md"
|
|
11
16
|
---
|
|
12
17
|
|
|
13
18
|
# Mate Show Me
|
|
14
19
|
|
|
15
|
-
> Inspired by [humanlayer's show-me skill](https://github.com/humanlayer/skills/tree/main/plugins/show-me/skills/show-me) and adapted here as a Mate process-driven skill.
|
|
16
|
-
|
|
17
20
|
Explain the current topic visually in a browser-rendered Mate report. Skip the preamble, keep prose brief, and pick the smallest report view that makes the key point clear.
|
|
18
21
|
|
|
19
22
|
## Mate Workflow
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
name: mate-simplify-code
|
|
3
3
|
description: Simplifies code for clarity. Use when refactoring code for clarity without changing behavior. Use when code works but is harder to read, maintain, or extend than it should be. Use when reviewing code that has accumulated unnecessary complexity.
|
|
4
4
|
disable-model-invocation: true
|
|
5
|
+
metadata:
|
|
6
|
+
credits:
|
|
7
|
+
skill: code-simplification
|
|
8
|
+
author: Addy Osmani
|
|
9
|
+
url: "https://github.com/addyosmani/agent-skills/blob/main/skills/code-simplification/SKILL.md"
|
|
5
10
|
---
|
|
6
11
|
|
|
7
12
|
# Mate Simplify Code
|
|
8
13
|
|
|
9
|
-
> Inspired by [Addy Osmani's code-simplification skill](https://github.com/addyosmani/agent-skills/tree/main/skills/code-simplification) and adapted here as a Mate process-driven skill.
|
|
10
|
-
|
|
11
14
|
## Overview
|
|
12
15
|
|
|
13
16
|
Simplify code by reducing complexity while preserving exact behavior. The goal is not fewer lines — it's code that is easier to read, understand, modify, and debug. Every simplification must pass a simple test: "Would a new team member understand this faster than the original?"
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
name: mate-domain-modeling
|
|
3
3
|
description: Build a project domain model using Mate context-map scope and Companion Repository artifacts.
|
|
4
4
|
disable-model-invocation: true
|
|
5
|
+
metadata:
|
|
6
|
+
credits:
|
|
7
|
+
skill: domain-modeling
|
|
8
|
+
author: Matt Pocock
|
|
9
|
+
url: "https://github.com/mattpocock/skills/blob/main/skills/engineering/domain-modeling/SKILL.md"
|
|
5
10
|
---
|
|
6
11
|
|
|
7
12
|
# Mate Domain Modeling
|
|
8
13
|
|
|
9
|
-
> Inspired by [Matt Pocock's domain-modeling skill](https://github.com/mattpocock/skills/tree/main/skills/engineering/domain-modeling) and adapted here as a Mate process-driven skill.
|
|
10
|
-
|
|
11
14
|
Actively sharpen project terminology and durable domain decisions. Reading a
|
|
12
15
|
context for vocabulary is not enough: challenge fuzzy terms, test boundaries
|
|
13
16
|
with concrete scenarios, and ask the user to confirm each proposed definition
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
name: mate-grill-me
|
|
3
3
|
description: Stress-test a plan or idea through dependency-ordered conversational design-tree rounds.
|
|
4
4
|
disable-model-invocation: true
|
|
5
|
+
metadata:
|
|
6
|
+
credits:
|
|
7
|
+
skill: grill-me
|
|
8
|
+
author: Matt Pocock
|
|
9
|
+
url: "https://github.com/mattpocock/skills/blob/main/skills/productivity/grill-me/SKILL.md"
|
|
5
10
|
---
|
|
6
11
|
|
|
7
12
|
# Mate Grill Me
|
|
8
13
|
|
|
9
|
-
> Inspired by [Matt Pocock's grill-me skill](https://github.com/mattpocock/skills/tree/main/skills/productivity/grill-me) and adapted here as a Mate process-driven skill.
|
|
10
|
-
|
|
11
14
|
Start `/mate-grilling`.
|
|
12
15
|
|
|
13
16
|
The session is conversational-only. It does not create or modify code, context
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
name: mate-grill-with-docs
|
|
3
3
|
description: Sharpen a design conversationally and record confirmed domain decisions on the Companion Repository artifact plane.
|
|
4
4
|
disable-model-invocation: true
|
|
5
|
+
metadata:
|
|
6
|
+
credits:
|
|
7
|
+
skill: grill-with-docs
|
|
8
|
+
author: Matt Pocock
|
|
9
|
+
url: "https://github.com/mattpocock/skills/blob/main/skills/engineering/grill-with-docs/SKILL.md"
|
|
5
10
|
---
|
|
6
11
|
|
|
7
12
|
# Mate Grill With Docs
|
|
8
13
|
|
|
9
|
-
> Inspired by [Matt Pocock's grill-with-docs skill](https://github.com/mattpocock/skills/tree/main/skills/engineering/grill-with-docs) and adapted here as a Mate process-driven skill.
|
|
10
|
-
|
|
11
14
|
First invoke `/mate-grilling` and wait for explicit decisions. Then invoke
|
|
12
15
|
`/mate-domain-modeling` only for confirmed project terminology or durable
|
|
13
16
|
decisions.
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
name: mate-grilling
|
|
3
3
|
description: Relentlessly sharpen a plan through dependency-ordered design-tree rounds.
|
|
4
4
|
disable-model-invocation: true
|
|
5
|
+
metadata:
|
|
6
|
+
credits:
|
|
7
|
+
skill: grilling
|
|
8
|
+
author: Matt Pocock
|
|
9
|
+
url: "https://github.com/mattpocock/skills/blob/main/skills/productivity/grilling/SKILL.md"
|
|
5
10
|
---
|
|
6
11
|
|
|
7
12
|
# Mate Grilling
|
|
8
13
|
|
|
9
|
-
> Inspired by [Matt Pocock's grilling skill](https://github.com/mattpocock/skills/tree/main/skills/productivity/grilling) and adapted here as a Mate process-driven skill.
|
|
10
|
-
|
|
11
14
|
Stress-test the current plan or idea as a design tree. This is a conversation,
|
|
12
15
|
not an implementation or documentation session: do not create or modify code,
|
|
13
16
|
context files, ADRs, OpenSpec artifacts, or other files.
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
name: mate-interview-me
|
|
3
3
|
description: Clarify intent through a focused, one-question-at-a-time conversation before planning.
|
|
4
4
|
disable-model-invocation: true
|
|
5
|
+
metadata:
|
|
6
|
+
credits:
|
|
7
|
+
skill: interview-me
|
|
8
|
+
author: Addy Osmani
|
|
9
|
+
url: "https://github.com/addyosmani/agent-skills/blob/main/skills/interview-me/SKILL.md"
|
|
5
10
|
---
|
|
6
11
|
|
|
7
12
|
# Mate Interview Me
|
|
8
13
|
|
|
9
|
-
> Inspired by [Addy Osmani's interview-me skill](https://github.com/addyosmani/agent-skills/tree/main/skills/interview-me) and adapted here as a Mate process-driven skill.
|
|
10
|
-
|
|
11
14
|
## Overview
|
|
12
15
|
|
|
13
16
|
What people ask for and what they actually want are different things. They ask
|
|
@@ -8,12 +8,15 @@ compatibility: Requires the mate CLI and the openspec capability enabled.
|
|
|
8
8
|
metadata:
|
|
9
9
|
author: mate
|
|
10
10
|
version: "1.0"
|
|
11
|
+
credits:
|
|
12
|
+
skill: show-me
|
|
13
|
+
author: Dex Horthy
|
|
14
|
+
organisation: Humanlayer
|
|
15
|
+
url: "https://github.com/humanlayer/skills/blob/main/plugins/show-me/skills/show-me/SKILL.md"
|
|
11
16
|
---
|
|
12
17
|
|
|
13
18
|
# Mate Show Me
|
|
14
19
|
|
|
15
|
-
> Inspired by [humanlayer's show-me skill](https://github.com/humanlayer/skills/tree/main/plugins/show-me/skills/show-me) and adapted here as a Mate process-driven skill.
|
|
16
|
-
|
|
17
20
|
Explain the current topic visually in a browser-rendered Mate report. Skip the preamble, keep prose brief, and pick the smallest report view that makes the key point clear.
|
|
18
21
|
|
|
19
22
|
## Mate Workflow
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
name: mate-simplify-code
|
|
3
3
|
description: Simplifies code for clarity. Use when refactoring code for clarity without changing behavior. Use when code works but is harder to read, maintain, or extend than it should be. Use when reviewing code that has accumulated unnecessary complexity.
|
|
4
4
|
disable-model-invocation: true
|
|
5
|
+
metadata:
|
|
6
|
+
credits:
|
|
7
|
+
skill: code-simplification
|
|
8
|
+
author: Addy Osmani
|
|
9
|
+
url: "https://github.com/addyosmani/agent-skills/blob/main/skills/code-simplification/SKILL.md"
|
|
5
10
|
---
|
|
6
11
|
|
|
7
12
|
# Mate Simplify Code
|
|
8
13
|
|
|
9
|
-
> Inspired by [Addy Osmani's code-simplification skill](https://github.com/addyosmani/agent-skills/tree/main/skills/code-simplification) and adapted here as a Mate process-driven skill.
|
|
10
|
-
|
|
11
14
|
## Overview
|
|
12
15
|
|
|
13
16
|
Simplify code by reducing complexity while preserving exact behavior. The goal is not fewer lines — it's code that is easier to read, understand, modify, and debug. Every simplification must pass a simple test: "Would a new team member understand this faster than the original?"
|