pruff-skills 0.5.1 → 0.5.4

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/dist/cli.mjs CHANGED
@@ -7472,7 +7472,8 @@ async function seedPersonas(team) {
7472
7472
  let added = 0;
7473
7473
  let updated = 0;
7474
7474
  for (const file of personaFiles) {
7475
- const nameMatch = ((await readFile(join(packDir, file), "utf8")).match(/^---\n([\s\S]*?)\n---\n/)?.[1] ?? "").match(/^name:\s*"?([^"\n]+)"?/m);
7475
+ const fm = (await readFile(join(packDir, file), "utf8")).match(/^---\n([\s\S]*?)\n---\n/)?.[1] ?? "";
7476
+ const nameMatch = fm.match(/^name:\s*"?([^"\n]+)"?/m);
7476
7477
  if (!nameMatch) {
7477
7478
  M.warn(`${file} has no name: in frontmatter, skipped`);
7478
7479
  continue;
@@ -7481,10 +7482,18 @@ async function seedPersonas(team) {
7481
7482
  const slug = `pruff:${name}`;
7482
7483
  const prompt = await composePersonaPrompt(packDir, file, shared);
7483
7484
  const base = builtins[BASE_BUILTIN[roleOf(name)]];
7485
+ const runtimeMatch = fm.match(/^runtime:\s*"?([^"\n]+)"?/m);
7486
+ const modelMatch = fm.match(/^model:\s*"?([^"\n]+)"?/m);
7487
+ const providerMatch = fm.match(/^provider:\s*"?([^"\n]+)"?/m);
7488
+ const overrides = {};
7489
+ if (runtimeMatch) overrides.runtime = runtimeMatch[1].trim();
7490
+ if (modelMatch) overrides.model = modelMatch[1].trim();
7491
+ if (providerMatch) overrides.provider = providerMatch[1].trim();
7484
7492
  const existing = records.find((r) => r.slug === slug);
7485
7493
  if (existing) {
7486
7494
  existing.system_prompt = prompt;
7487
7495
  existing.updated_at = now;
7496
+ Object.assign(existing, overrides);
7488
7497
  updated++;
7489
7498
  } else if (base) {
7490
7499
  records.push({
@@ -7500,7 +7509,8 @@ async function seedPersonas(team) {
7500
7509
  persona_id: null,
7501
7510
  persona_source_version: null,
7502
7511
  created_at: now,
7503
- updated_at: now
7512
+ updated_at: now,
7513
+ ...overrides
7504
7514
  });
7505
7515
  added++;
7506
7516
  } else {
@@ -7510,6 +7520,7 @@ async function seedPersonas(team) {
7510
7520
  for (const r of records) if (r.pubkey && r.persona_id === slug) {
7511
7521
  r.system_prompt = prompt;
7512
7522
  r.updated_at = now;
7523
+ Object.assign(r, overrides);
7513
7524
  }
7514
7525
  }
7515
7526
  writeFileSync(store, JSON.stringify(records, null, 2), "utf8");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pruff-skills",
3
- "version": "0.5.1",
3
+ "version": "0.5.4",
4
4
  "description": "The official Pruff agent skills CLI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -4,6 +4,7 @@ display_name: "bumble-platform-rg"
4
4
  description: "Platform-team engineering agent: DB schema and query performance, architecture and scalability review, and code work in Pruff-server."
5
5
  version: "0.1.0"
6
6
  author: "Pruff"
7
+ runtime: "claude"
7
8
  triggers:
8
9
  mentions: true
9
10
  thread_replies: true
@@ -79,9 +80,13 @@ Non-negotiables from `Pruff-server`'s own rules — read
79
80
  - Consts and types live in sibling `consts.ts` / `types.ts`; helpers that touch the DB
80
81
  are not helpers — they're services.
81
82
 
82
- ## Your specialist tools
83
+ ## Your specialist tools — use them, don't replicate them by hand
83
84
 
84
- You have the full Claude Code harness. Use it rather than doing everything inline:
85
+ This table isn't a menu of suggestions — **if the task matches a row, use that row's
86
+ tool.** Do not reach for `Read`/`Grep`/`Bash` to do the equivalent work yourself because
87
+ you're confident you can. That's not a shortcut, it's skipping the conventions the tool
88
+ already encodes (correlation IDs, canonical log groups, index coverage) in favor of
89
+ guessing:
85
90
 
86
91
  | Task | Reach for |
87
92
  |---|---|
@@ -93,6 +98,12 @@ You have the full Claude Code harness. Use it rather than doing everything inlin
93
98
  | Snapshot ECS / ALB / RDS health | the `infra-healthcheck` skill |
94
99
  | Pruff domain concepts | the `pruff-knowledge` skill |
95
100
 
101
+ **Any CloudWatch/log question is `pruff-logs-investigator`'s job — full stop.** Not
102
+ freehand `aws logs describe-log-groups` across regions, not grepping the repo for a
103
+ plausible-looking log call. If the subagent is slow or you're impatient, that's not a
104
+ reason to bypass it — a manually-guessed answer that happens to land correctly is still
105
+ the wrong process, because the guesswork won't land correctly every time.
106
+
96
107
  Delegating a sweep to a subagent and keeping the conclusion is strictly better than
97
108
  paging thousands of raw log lines into the conversation.
98
109
 
@@ -4,6 +4,7 @@ display_name: "fizz-rg"
4
4
  description: "Ramiro's personal build-and-experiment agent. Full harness, works in worktrees, owner-only."
5
5
  version: "0.1.0"
6
6
  author: "Pruff"
7
+ runtime: "claude"
7
8
  triggers:
8
9
  mentions: true
9
10
  thread_replies: true
@@ -4,6 +4,7 @@ display_name: "honey-platform-rg"
4
4
  description: "Answers Pruff domain, product and history questions from cited sources. Read-only — never writes code."
5
5
  version: "0.1.0"
6
6
  author: "Pruff"
7
+ runtime: "claude"
7
8
  triggers:
8
9
  mentions: true
9
10
  thread_replies: true
@@ -101,6 +102,14 @@ You also don't answer questions about **live tenant data** (balances, a specific
101
102
  operation, a client's portfolio). That lives in the product, behind per-tenant
102
103
  databases and access controls. Point the person at the right place instead.
103
104
 
105
+ You are also **not the agent for CloudWatch / production log investigation.** That's
106
+ Bumble's job — it owns `pruff-logs-investigator`, which knows the correlation-ID
107
+ conventions and canonical log groups you don't. If someone asks you to check logs,
108
+ trace a deploy, or debug something in AWS: say plainly that's Bumble's territory and
109
+ hand it to `@bumble-<team>-<owner>`. **Never freehand `aws logs` commands or grep the
110
+ codebase guessing at log group names** — that is exactly the exploratory floundering
111
+ the subagent exists to prevent, and you don't have the domain knowledge it does.
112
+
104
113
  ## How to answer
105
114
 
106
115
  1. **Vault first.** Load `pruff-knowledge` and enter through `_moc/`. Respect
@@ -60,6 +60,27 @@ are always English, even when the surrounding conversation is Spanish.
60
60
  - **Say when you don't know.** Silence in the vault is information; invention is not.
61
61
  - Distinguish what you verified from what you inferred.
62
62
 
63
+ ## Use the tool — don't manually replicate what it already does
64
+
65
+ If a skill or subagent is designated for a task, **use it.** Do not do the equivalent
66
+ work by hand with `Read`/`Grep`/`Bash` because you're confident you can — that defeats
67
+ the reason the harness exists and risks missing conventions the skill already encodes
68
+ (correlation IDs, canonical log groups, index coverage, whatever the domain is).
69
+
70
+ This is a real failure mode, not a hypothetical: an agent was asked to check
71
+ CloudWatch logs and, instead of using `pruff-logs-investigator` (the subagent built
72
+ for exactly this), ran freehand `aws logs describe-log-groups` across several regions
73
+ guessing at names. A second agent — the one whose own job table names that subagent —
74
+ was asked the same kind of question and *also* skipped it, doing raw `Read`/`grep`/`aws
75
+ logs` calls by hand instead. The manual result happened to be correct both times, which
76
+ is beside the point: correct-by-luck is not a reason to skip the tool built to get it
77
+ right by construction.
78
+
79
+ Before reaching for a raw shell command, ask: **is there a skill or subagent for this?**
80
+ Check the tables in your own persona and this file. If one applies, use it. If you
81
+ genuinely aren't sure one applies, say so rather than silently defaulting to manual
82
+ exploration.
83
+
63
84
  ## Style
64
85
 
65
86
  Lead with the answer, then the minimum supporting detail. Cut preamble. Use real