@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.
Files changed (38) hide show
  1. package/package.json +1 -1
  2. package/src/cli/commands/companion/update.ts +2 -1
  3. package/src/cli/commands/install.ts +3 -1
  4. package/src/cli/commands/plugin/plugin.ts +1 -1
  5. package/src/cli/commands/plugin/verify.ts +4 -8
  6. package/src/cli/commands/studio/terminal-launch.ts +1 -51
  7. package/src/cli/commands/studio/terminal.ts +2 -13
  8. package/src/lib/install.ts +3 -0
  9. package/src/lib/orchestrator/types.ts +0 -6
  10. package/src/templates/mate-skills/agents/mate-domain-modeling/SKILL.md +5 -2
  11. package/src/templates/mate-skills/agents/mate-grill-me/SKILL.md +5 -2
  12. package/src/templates/mate-skills/agents/mate-grill-with-docs/SKILL.md +5 -2
  13. package/src/templates/mate-skills/agents/mate-grilling/SKILL.md +5 -2
  14. package/src/templates/mate-skills/agents/mate-interview-me/SKILL.md +5 -2
  15. package/src/templates/mate-skills/agents/mate-show-me/SKILL.md +5 -2
  16. package/src/templates/mate-skills/agents/mate-simplify-code/SKILL.md +5 -2
  17. package/src/templates/mate-skills/claude/mate-domain-modeling/SKILL.md +5 -2
  18. package/src/templates/mate-skills/claude/mate-grill-me/SKILL.md +5 -2
  19. package/src/templates/mate-skills/claude/mate-grill-with-docs/SKILL.md +5 -2
  20. package/src/templates/mate-skills/claude/mate-grilling/SKILL.md +5 -2
  21. package/src/templates/mate-skills/claude/mate-interview-me/SKILL.md +5 -2
  22. package/src/templates/mate-skills/claude/mate-show-me/SKILL.md +5 -2
  23. package/src/templates/mate-skills/claude/mate-simplify-code/SKILL.md +5 -2
  24. package/src/tools/setup/__snapshots__/runtime-surface-golden.test.ts.snap +90 -63
  25. package/src/tools/setup/capabilities/openspec.ts +55 -27
  26. package/src/tools/setup/capabilities/react-doctor.ts +8 -16
  27. package/src/tools/setup/capabilities/tokensave.ts +1 -0
  28. package/src/tools/setup/dynamic-plugins/frozen.ts +24 -3
  29. package/src/tools/setup/dynamic-plugins/loader.ts +16 -0
  30. package/src/tools/setup/dynamic-plugins/policy.ts +55 -0
  31. package/src/tools/setup/dynamic-plugins/staging.ts +11 -5
  32. package/src/tools/setup/dynamic-plugins/verify.ts +22 -18
  33. package/src/tools/setup/engine.ts +6 -1
  34. package/src/tools/setup/install-contract.ts +2 -0
  35. package/src/tools/setup/mate.ts +3 -1
  36. package/src/tools/setup/plugin.ts +2 -0
  37. package/src/tools/setup/providers/agents-skill-root.ts +79 -0
  38. package/src/tools/setup/providers/opencode.ts +8 -9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uniqbit/mate-core",
3
- "version": "0.17.2-canary.3",
3
+ "version": "0.18.0-canary.0",
4
4
  "description": "Core framework and plugin APIs for Mate.",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -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}: warning: plugin-generated files differ from the committed checkout: ${drift.join(", ")}\n` +
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(argv);
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 { inspectDeclaredPlugins } from "../../../tools/setup/dynamic-plugins/verify";
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. With `--json`, prints `{"capabilities": [...]}` listing the capability IDs the verified plugins provide.
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 { failures, capabilities } = await inspectDeclaredPlugins(context.companionPath);
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, resolved);
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,
@@ -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?"