pm-claude-skills 46.0.0 โ 48.0.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/README.md +6 -2
- package/bin/brief.mjs +89 -0
- package/bin/cli.mjs +19 -0
- package/bin/lib/scheduler.mjs +61 -0
- package/bin/nightwatch.mjs +102 -0
- package/bin/subscribe.mjs +76 -0
- package/commands/adopt-ai-properly.md +1 -1
- package/commands/brain.md +1 -1
- package/commands/close-the-quarter.md +1 -1
- package/commands/exec-summary.md +1 -1
- package/commands/firm.md +1 -1
- package/commands/grow-a-product.md +1 -1
- package/commands/health-scorecard.md +1 -1
- package/commands/land-a-job.md +1 -1
- package/commands/launch-a-product.md +1 -1
- package/commands/launch-an-ai-feature.md +1 -1
- package/commands/prd.md +1 -1
- package/commands/red-team.md +1 -1
- package/commands/repurpose.md +1 -1
- package/commands/rescue-an-account.md +1 -1
- package/commands/retro.md +1 -1
- package/commands/rice.md +1 -1
- package/commands/run-discovery.md +1 -1
- package/commands/setup-context.md +1 -1
- package/commands/setup-pm-skills.md +1 -1
- package/commands/ship-a-feature.md +1 -1
- package/commands/ship-an-mcp-server.md +1 -1
- package/commands/sprint-plan.md +1 -1
- package/exports/aider/pm-data/cohort-analysis/cohort-analysis.md +153 -100
- package/exports/chatgpt/pm-data/cohort-analysis/SYSTEM_PROMPT.md +153 -100
- package/exports/cline/pm-data/cohort-analysis/cohort-analysis.md +153 -100
- package/exports/continue/pm-data/cohort-analysis/cohort-analysis.md +153 -100
- package/exports/cursor/pm-data/cohort-analysis/cohort-analysis.mdc +153 -100
- package/exports/gemini/pm-data/cohort-analysis/GEM_INSTRUCTIONS.md +153 -100
- package/exports/kilocode/pm-data/cohort-analysis/cohort-analysis.md +153 -100
- package/exports/obsidian/pm-data/cohort-analysis/cohort-analysis.md +153 -100
- package/exports/roo/pm-data/cohort-analysis/cohort-analysis.md +153 -100
- package/exports/windsurf/pm-data/cohort-analysis/cohort-analysis.md +153 -100
- package/exports/zed/pm-data/cohort-analysis/cohort-analysis.md +153 -100
- package/package.json +9 -2
- package/skills/cohort-analysis/SKILL.md +153 -100
- package/skills/slide-deck/scripts/pptx_tool.py +3 -2
package/README.md
CHANGED
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
[](https://mohitagw15856.github.io/pm-claude-skills/)
|
|
14
14
|
[](https://github.com/sponsors/mohitagw15856)
|
|
15
15
|
|
|
16
|
+
> ๐ **This project grew into [The Open Institute for Professional Judgment](https://mohitagw15856.github.io/pm-claude-skills/institute.html)** โ the SkillSpec standard, the Operator's Exam, the SkillBench rankings, the ecosystem census, the global Season, and the [State of Professional AI](docs/reports/state-of-professional-ai-2026.md). Every instrument open, free, and verifiable. Also: run it inside your company with the [Org Edition](org/) (`docker compose up`).
|
|
17
|
+
|
|
16
18
|
> **Big repo?** It's a monorepo on purpose โ but you probably need one folder. **[REPO-MAP.md](REPO-MAP.md)** tells you which, and the skills-only clone is 10 seconds: `git clone --filter=blob:none --sparse <url> && git sparse-checkout set skills`
|
|
17
19
|
|
|
18
20
|
> ๐ **The free runs are sponsor-funded.** Every sponsor dollar visibly raises the daily cap on the counter above โ and sponsors get [naming rights, not influence](docs/SPONSORSHIP.md): your name in this README, your logo on the playground, or **a Boardroom bench carrying your company's name**. โ [Become a sponsor](https://github.com/sponsors/mohitagw15856)
|
|
@@ -84,7 +86,7 @@
|
|
|
84
86
|
|
|
85
87
|
A community-built library of professional skills for every field โ product management, engineering, customer success, marketing, social media, writers, design, legal, finance, HR, sales, operations, research, and more. Each skill is a structured `SKILL.md` file that teaches an AI assistant how to produce professional-grade outputs for your workflows. Skills run natively in **Claude Code** and **Hermes Agent** (same open `SKILL.md` standard), and ship as ready-to-paste exports for **ChatGPT** and **Gemini** โ see [Works With](#-works-with--cross-tool-compatibility).
|
|
86
88
|
|
|
87
|
-
**๐
|
|
89
|
+
**๐ v48.0.0 โ the institution release:** ๐ **[The Open Institute for Professional Judgment](https://mohitagw15856.github.io/pm-claude-skills/institute.html)** โ SkillSpec (+ its [foundation trajectory](docs/FOUNDATION.md)), the Operator's Exam, SkillBench rankings, the census, the Season (with the Hall + automated rollover), and **[The State of Professional AI 2026](docs/reports/state-of-professional-ai-2026.md)**; ๐ข the **[Org Edition](org/)** (`docker compose up` = your company's library on your infra), ๐ the **[6-week Syllabus](docs/syllabus/)** with SCORM export, ๐ **[Agent Conformance](conformance/)** certification, ๐ผ the **[creator economy](docs/CREATORS.md)** (0% take). Plus the frontier wave: ๐ the Season is OPEN, ๐ the Nightwatch, โฐ standing skills, ๐บ the Atlas, ๐ป the Morning Show, ๐ฅ multiplayer Boardroom, ๐ง the 7b pipeline. *Earlier โ v46, the arsenal release:* โ๏ธ **[`pm-warroom`](plugins/pm-warroom)** โ the adversarial bundle (Premortem Assassin's twelve failure vectors, Devil's Twin writes the opposition's best memo, Metric Gaslighting Detector's eleven distortions, Decision Autopsy, Assumption Bounty), ๐งฎ **three more skills that do real math** (Erlang-C staffing, schedule Monte Carlo over the task DAG, tornado sensitivity โ CI-pinned exact outputs), ๐ญ shareable singles (eulogy-writer, wedding-speech, fine-appeal-letter, skill-fusion), ๐จ **generative identities on every skill page and playground card** (five banner families seeded from the name, matching colours + monograms, โ links), ๐ฏ **466/466 SkillSpec L3 โ CI-enforced**, ๐งช the 76-assertion scripts harness, ๐ฑ the **PWA** (no-API core offline), ๐ [public vitals](https://mohitagw15856.github.io/pm-claude-skills/status.html) + self-operating crons, ๐บ [REPO-MAP](REPO-MAP.md). **466 skills ยท 66 bundles.** *Earlier โ v45, the spectacle release:* Duels, the Charter, Galaxy 3D, the collapsing Tower of Claims, the Stage, holo cards & Skill City. *Earlier โ v44, the legendary release:* Campaign mode, the Professional Work Handbook (2,297-rule Anti-Pattern Almanac), the Reckoning, the ecosystem package manager, zero-key MCP sampling, pm-skills-tools, the SkillSpec badge & the census. *Earlier โ v43, the local-first & learning wave:* the ๐ workspace bridge, Boardroom replay links & bench packs, ๐ค The Panel, ๐ The Academy, ๐ Wrapped, the evolution loop & pm-method. *Earlier โ v42:* depth (`references/` + `templates/`) on all Production-Ready skills, ๐ Theatre voices, Firm calibration & the CI smoke suite. *Earlier โ v41, the modern skills wave:* two new domains โ **๐ค [`pm-agentnative`](plugins/pm-agentnative)** (build for non-human users: [`mcp-server-spec`](skills/mcp-server-spec/SKILL.md), [`agent-readiness-audit`](skills/agent-readiness-audit/SKILL.md), [`agent-era-pricing`](skills/agent-era-pricing/SKILL.md), [`human-in-the-loop-design`](skills/human-in-the-loop-design/SKILL.md), [`voice-agent-design`](skills/voice-agent-design/SKILL.md)) and **๐งโ๐ผ [`pm-aiwork`](plugins/pm-aiwork)** (the questions every manager has this year: [`ai-roi-audit`](skills/ai-roi-audit/SKILL.md), [`role-redesign-for-ai`](skills/role-redesign-for-ai/SKILL.md), [`ai-usage-policy`](skills/ai-usage-policy/SKILL.md), [`ai-assisted-performance-review`](skills/ai-assisted-performance-review/SKILL.md), [`ai-content-audit`](skills/ai-content-audit/SKILL.md)) โ plus 5 singles ([`ai-code-review`](skills/ai-code-review/SKILL.md), [`synthetic-user-research`](skills/synthetic-user-research/SKILL.md), [`async-decision-memo`](skills/async-decision-memo/SKILL.md), [`brand-impersonation-response`](skills/brand-impersonation-response/SKILL.md), [`feature-sunset-plan`](skills/feature-sunset-plan/SKILL.md)). Also: ๐ Galaxy shooting stars + a ๐ฒ Warp button, ๐ frameable [certificates](web/export-doc.js) from the arena pages, and ๐ [MCP pairings](connectors/mcp-pairings.md) โ skills that act through your connected servers. *Earlier โ v40: [The Firm](https://mohitagw15856.github.io/pm-claude-skills/firm.html). v39 (three waves):* โก *Superpowers:* [SkillBench](skillbench/) (the professional-work benchmark for models) ยท the [community registry](community/) (npm-for-skills) ยท the [Interview Gauntlet](https://mohitagw15856.github.io/pm-claude-skills/gauntlet.html) ยท [CI recipes](action/examples/) + [ambient hooks](hooks/) ยท Hugging Face [dataset publishing](dataset/) ยท [localization to 8 languages](i18n/). ๐คฏ *Breathtaking:* [living artifacts](https://mohitagw15856.github.io/pm-claude-skills/), [Document X-ray](https://mohitagw15856.github.io/pm-claude-skills/xray.html), [The Gym](https://mohitagw15856.github.io/pm-claude-skills/gym.html), [`pm-vision`](plugins/pm-vision), [`style-fingerprint`](skills/style-fingerprint/SKILL.md), [`evidence-lock`](skills/evidence-lock/SKILL.md). โจ *Revamped:* the playground command bar + Galaxy 2.0 with a guided Sky tour. **466 skills ยท 66 bundles ยท 25 professions.** โ [CHANGELOG](CHANGELOG.md) ยท [all releases](https://github.com/mohitagw15856/pm-claude-skills/releases).
|
|
88
90
|
|
|
89
91
|
### โถ See it in action โ [try the live Skill Playground](https://mohitagw15856.github.io/pm-claude-skills/)
|
|
90
92
|
|
|
@@ -591,6 +593,8 @@ The same 451 skills reach you through every channel โ pick whatever fits your
|
|
|
591
593
|
| ๐ **Raycast / Alfred** | Search every skill from your launcher, then open, run, or install it โ [`integrations/raycast/`](integrations/raycast/) ยท [`integrations/alfred/`](integrations/alfred/) |
|
|
592
594
|
| ๐ค **Custom GPT / Gemini Gem** | Publish the library as a GPT (live Actions API) or a Gem โ copy-paste setup in [`integrations/custom-gpt/`](integrations/custom-gpt/) ยท [`integrations/gemini-gem/`](integrations/gemini-gem/) |
|
|
593
595
|
| ๐ฌ **Slack / Discord** | A `/pmskill` slash command in your team chat โ one signature-verified Worker for both โ [`integrations/chatops/`](integrations/chatops/) |
|
|
596
|
+
| ๐ฑ **Text a skill (SMS/WhatsApp)** | Text a task to a Twilio number, get the drafted artifact back โ no app, no browser โ [`integrations/twilio/`](integrations/twilio/) |
|
|
597
|
+
| ๐ง **Email operator** | Forward a thread to a routing address; the drafted artifact replies in-thread โ [`integrations/email/`](integrations/email/) |
|
|
594
598
|
| ๐ฅ๏ธ **IDE rules** | Generated exports for **Cursor, Windsurf, Aider, Cline, Continue, Zed, Roo, Kilo Code** โ [`exports/`](exports/) |
|
|
595
599
|
| ๐ค **Agents & answer engines** | [`llms.txt`](https://mohitagw15856.github.io/pm-claude-skills/llms.txt) makes the whole library discoverable & citable |
|
|
596
600
|
|
|
@@ -954,7 +958,7 @@ More templates will follow. If you want to contribute one, see the [template con
|
|
|
954
958
|
<details>
|
|
955
959
|
<summary>Read more โ</summary>
|
|
956
960
|
|
|
957
|
-
**Latest:
|
|
961
|
+
**Latest: v47.0.0 โ the off-web release: text or call a skill (signature-verified Twilio Worker), the email-native operator, the printable Operator's Deck with QR deep-links, Run the Firm tycoon game, the local-only Watch-me-work coach extension, and the auto morning-show newsletter โ plus a ๐ New nav group + scrollable dropdowns (466 skills, 66 bundles)** ยท *v46, the arsenal release:* the pm-warroom adversarial bundle, three more computed skills, the shareable singles, generative identities everywhere, 466/466 L3 CI-enforced, the PWA, public vitals & the self-operating crons ยท *v44:* Campaign mode, the Handbook, the Reckoning, the ecosystem package manager, zero-key MCP sampling, pm-skills-tools, the badge & the census ยท *v43:* the workspace bridge, replay links & bench packs, The Panel, The Academy, Wrapped, the evolution loop & pm-method ยท *v42:* depth on all Production-Ready skills, arena voices, Firm calibration & the web-tests safety net ยท *v41, modern skills:* [`pm-agentnative`](plugins/pm-agentnative) + [`pm-aiwork`](plugins/pm-aiwork) (15 skills for the agent era), Galaxy cosmic events, ๐ certificates & [MCP pairings](connectors/mcp-pairings.md) ยท *v40: [The Firm](https://mohitagw15856.github.io/pm-claude-skills/firm.html) ยท v39, three waves:* [SkillBench](skillbench/), the [community registry](community/), the [Interview Gauntlet](https://mohitagw15856.github.io/pm-claude-skills/gauntlet.html), [living artifacts](https://mohitagw15856.github.io/pm-claude-skills/), [Document X-ray](https://mohitagw15856.github.io/pm-claude-skills/xray.html), [The Gym](https://mohitagw15856.github.io/pm-claude-skills/gym.html), pm-vision, i18n, HF publishing, CI recipes & the Galaxy Sky tour. 466 skills across 66 bundles, 25 professions. Every tagged release has complete notes on the **[Releases page](https://github.com/mohitagw15856/pm-claude-skills/releases)**.
|
|
958
962
|
|
|
959
963
|
Full [Keep a Changelog](https://keepachangelog.com/)-format history โ every release back to the start โ is in **[CHANGELOG.md](CHANGELOG.md)**.
|
|
960
964
|
|
package/bin/brief.mjs
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// `pm-claude-skills brief` โ the chief-of-staff, on demand. The SessionStart
|
|
2
|
+
// hook's morning brief as a human command: predictions due, the latest arena
|
|
3
|
+
// verdicts, open hypotheses, and (with --stats) the project's public vitals.
|
|
4
|
+
// Pure file reads + two public GETs. No API key, no cost.
|
|
5
|
+
//
|
|
6
|
+
// pm-claude-skills brief # this directory's professional state
|
|
7
|
+
// pm-claude-skills stats # the public vitals (runs served, stars, bench)
|
|
8
|
+
import { readFileSync, readdirSync, existsSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
|
|
11
|
+
const cwd = process.cwd();
|
|
12
|
+
const today = () => new Date().toISOString().slice(0, 10);
|
|
13
|
+
const dim = (s) => `\x1b[2m${s}\x1b[0m`;
|
|
14
|
+
const bold = (s) => `\x1b[1m${s}\x1b[0m`;
|
|
15
|
+
|
|
16
|
+
function predictions() {
|
|
17
|
+
const dir = join(cwd, 'brain', 'predictions');
|
|
18
|
+
if (!existsSync(dir)) return { due: [], open: 0 };
|
|
19
|
+
const due = []; let open = 0;
|
|
20
|
+
for (const f of readdirSync(dir).filter((x) => x.endsWith('.md'))) {
|
|
21
|
+
const t = readFileSync(join(dir, f), 'utf8');
|
|
22
|
+
if (!/^status:\s*pending$/m.test(t)) continue;
|
|
23
|
+
open++;
|
|
24
|
+
const d = (t.match(/^due:\s*(\S+)/m) || [])[1];
|
|
25
|
+
if (d && d <= today()) {
|
|
26
|
+
const line = (t.split(/\n---\n/)[1] || '').trim().split('\n')[0];
|
|
27
|
+
due.push({ due: d, text: line, file: f });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return { due, open };
|
|
31
|
+
}
|
|
32
|
+
function latestIn(dir, skipDirs = true) {
|
|
33
|
+
const p = join(cwd, dir);
|
|
34
|
+
if (!existsSync(p)) return null;
|
|
35
|
+
const files = readdirSync(p).filter((f) => !skipDirs || f.includes('.'));
|
|
36
|
+
if (!files.length) return null;
|
|
37
|
+
return files.sort().pop();
|
|
38
|
+
}
|
|
39
|
+
function hypotheses() {
|
|
40
|
+
for (const c of ['brain/hypotheses.md', 'brain/hypotheses']) {
|
|
41
|
+
const p = join(cwd, c);
|
|
42
|
+
if (!existsSync(p)) continue;
|
|
43
|
+
try {
|
|
44
|
+
const text = c.endsWith('.md') ? readFileSync(p, 'utf8')
|
|
45
|
+
: readdirSync(p).map((f) => readFileSync(join(p, f), 'utf8')).join('\n');
|
|
46
|
+
return text.split('\n').filter((l) => l.trim().startsWith('- ')).slice(0, 5);
|
|
47
|
+
} catch { return []; }
|
|
48
|
+
}
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export async function brief() {
|
|
53
|
+
console.log(bold(`โ๏ธ Chief of Staff โ ${today()}`) + dim(` (${cwd})`) + '\n');
|
|
54
|
+
const { due, open } = predictions();
|
|
55
|
+
if (due.length) {
|
|
56
|
+
console.log(bold('๐ Predictions due โ settle them:'));
|
|
57
|
+
for (const d of due) console.log(` ${d.due} ${d.text} ${dim(d.file)}`);
|
|
58
|
+
console.log(dim(' pm-claude-skills reckoning score <file> hit|miss') + '\n');
|
|
59
|
+
} else if (open) console.log(`โณ ${open} prediction(s) open, none due today.\n`);
|
|
60
|
+
for (const [dir, label] of [['firm-minutes', '๐ข Latest Firm minutes'], ['boardroom', '๐ Latest Boardroom artifact']]) {
|
|
61
|
+
const f = latestIn(dir);
|
|
62
|
+
if (f) console.log(`${label}: ${f}${dim(' โ read before revising what it discusses')}`);
|
|
63
|
+
}
|
|
64
|
+
const hyp = hypotheses();
|
|
65
|
+
if (hyp.length) {
|
|
66
|
+
console.log('\n' + bold('๐งช Open hypotheses') + dim(' ([hunch] stays unsettled until tested):'));
|
|
67
|
+
hyp.forEach((h) => console.log(' ' + h.trim().slice(0, 100)));
|
|
68
|
+
}
|
|
69
|
+
if (!due.length && !open && !latestIn('firm-minutes') && !hyp.length) {
|
|
70
|
+
console.log(dim('Nothing on file here. Scaffold the workspace: pm-claude-skills init'));
|
|
71
|
+
}
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export async function stats() {
|
|
76
|
+
console.log(bold('๐ PM Skills โ public vitals\n'));
|
|
77
|
+
try {
|
|
78
|
+
const h = await (await fetch('https://raw.githubusercontent.com/mohitagw15856/pm-claude-skills/vitals-data/history.json')).json();
|
|
79
|
+
const last = h[h.length - 1] || {}, first = h[0] || {};
|
|
80
|
+
console.log(` ๐ฅ Free runs served: ${bold(String(last.runs ?? 'โ'))} (${h.length} days on the ledger, +${(last.runs ?? 0) - (first.runs ?? 0)} this period)`);
|
|
81
|
+
console.log(` โญ Stars: ${bold(String(last.stars ?? 'โ'))}`);
|
|
82
|
+
} catch { console.log(dim(' vitals ledger unreachable')); }
|
|
83
|
+
try {
|
|
84
|
+
const b = await (await fetch('https://raw.githubusercontent.com/mohitagw15856/pm-claude-skills/main/skillbench/results.json')).json();
|
|
85
|
+
for (const r of (b.runs || [])) console.log(` ๐ SkillBench: ${r.model} โ ${r.score} ${dim('(' + (r.date || '').slice(0, 10) + ')')}`);
|
|
86
|
+
} catch { /* fine */ }
|
|
87
|
+
console.log(dim('\n Live dashboard: https://mohitagw15856.github.io/pm-claude-skills/status.html'));
|
|
88
|
+
return 0;
|
|
89
|
+
}
|
package/bin/cli.mjs
CHANGED
|
@@ -252,6 +252,10 @@ Usage:
|
|
|
252
252
|
npx pm-claude-skills council <skill> # author -> cross-vendor critique -> arbiter (2+ provider keys)
|
|
253
253
|
npx pm-claude-skills migrate <dir> # convert a folder of prompts/SOPs into SkillSpec skills
|
|
254
254
|
npx pm-claude-skills init # scaffold the professional workspace here (brain/, context, arena folders)
|
|
255
|
+
npx pm-claude-skills nightwatch # AI staff work this directory while you sleep (install | --once | --dry-run)
|
|
256
|
+
npx pm-claude-skills subscribe # standing skills: scheduled runs that report what CHANGED
|
|
257
|
+
npx pm-claude-skills brief # the chief-of-staff: predictions due, latest verdicts, open hypotheses
|
|
258
|
+
npx pm-claude-skills stats # the project's public vitals (runs served, stars, benchmark)
|
|
255
259
|
npx pm-claude-skills reckoning # your prediction ledger: due calls, hit rate, calibration curve, Brier score
|
|
256
260
|
npx pm-claude-skills doctor # checkup: what's installed, what's stale, what to fix (read-only)
|
|
257
261
|
npx pm-claude-skills list
|
|
@@ -297,6 +301,21 @@ else if (cmd === 'verify') {
|
|
|
297
301
|
try { process.exit(await run(process.argv.slice(3))); }
|
|
298
302
|
catch (e) { console.error(`Error: ${e.message}`); process.exit(1); }
|
|
299
303
|
}
|
|
304
|
+
else if (cmd === 'nightwatch') {
|
|
305
|
+
const { run } = await import('./nightwatch.mjs');
|
|
306
|
+
try { process.exit(await run(process.argv.slice(3))); }
|
|
307
|
+
catch (e) { console.error(`Error: ${e.message}`); process.exit(1); }
|
|
308
|
+
}
|
|
309
|
+
else if (cmd === 'subscribe') {
|
|
310
|
+
const { run } = await import('./subscribe.mjs');
|
|
311
|
+
try { process.exit(await run(process.argv.slice(3))); }
|
|
312
|
+
catch (e) { console.error(`Error: ${e.message}`); process.exit(1); }
|
|
313
|
+
}
|
|
314
|
+
else if (cmd === 'brief' || cmd === 'stats') {
|
|
315
|
+
const m = await import('./brief.mjs');
|
|
316
|
+
try { process.exit(await (cmd === 'brief' ? m.brief() : m.stats())); }
|
|
317
|
+
catch (e) { console.error(`Error: ${e.message}`); process.exit(1); }
|
|
318
|
+
}
|
|
300
319
|
else if (cmd === 'reckoning') {
|
|
301
320
|
const { run } = await import('./reckoning.mjs');
|
|
302
321
|
try { process.exit(await run(process.argv.slice(3))); }
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Local job scheduling for the Nightwatch and standing-skill subscriptions.
|
|
2
|
+
// macOS: launchd plists in ~/Library/LaunchAgents; Linux: user crontab lines.
|
|
3
|
+
// Everything is inspectable, labeled, and uninstallable by name.
|
|
4
|
+
import { writeFileSync, existsSync, unlinkSync, readdirSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { homedir, platform } from 'node:os';
|
|
7
|
+
import { execSync } from 'node:child_process';
|
|
8
|
+
|
|
9
|
+
const PREFIX = 'com.pm-skills.';
|
|
10
|
+
|
|
11
|
+
export function install(name, argvArray, { hour = 5, minute = 30, cron = null } = {}) {
|
|
12
|
+
if (platform() === 'darwin') {
|
|
13
|
+
const label = PREFIX + name;
|
|
14
|
+
const plist = `<?xml version="1.0" encoding="UTF-8"?>
|
|
15
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
16
|
+
<plist version="1.0"><dict>
|
|
17
|
+
<key>Label</key><string>${label}</string>
|
|
18
|
+
<key>ProgramArguments</key><array>${argvArray.map((a) => `<string>${a}</string>`).join('')}</array>
|
|
19
|
+
<key>StartCalendarInterval</key><dict><key>Hour</key><integer>${hour}</integer><key>Minute</key><integer>${minute}</integer></dict>
|
|
20
|
+
<key>WorkingDirectory</key><string>${process.cwd()}</string>
|
|
21
|
+
<key>StandardOutPath</key><string>${join(process.cwd(), '.pm-skills', name + '.log')}</string>
|
|
22
|
+
<key>StandardErrorPath</key><string>${join(process.cwd(), '.pm-skills', name + '.log')}</string>
|
|
23
|
+
</dict></plist>`;
|
|
24
|
+
const p = join(homedir(), 'Library', 'LaunchAgents', label + '.plist');
|
|
25
|
+
writeFileSync(p, plist);
|
|
26
|
+
try { execSync(`launchctl unload ${JSON.stringify(p)} 2>/dev/null`); } catch { /* not loaded */ }
|
|
27
|
+
execSync(`launchctl load ${JSON.stringify(p)}`);
|
|
28
|
+
return { kind: 'launchd', path: p, when: `daily ${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}` };
|
|
29
|
+
}
|
|
30
|
+
// Linux: append a labeled crontab line.
|
|
31
|
+
const line = `${cron || `${minute} ${hour} * * *`} cd ${process.cwd()} && ${argvArray.map((a) => JSON.stringify(a)).join(' ')} >> .pm-skills/${name}.log 2>&1 # ${PREFIX}${name}`;
|
|
32
|
+
const current = (() => { try { return execSync('crontab -l').toString(); } catch { return ''; } })();
|
|
33
|
+
const cleaned = current.split('\n').filter((l) => !l.includes(`# ${PREFIX}${name}`)).join('\n').trim();
|
|
34
|
+
execSync('crontab -', { input: cleaned + '\n' + line + '\n' });
|
|
35
|
+
return { kind: 'cron', path: 'crontab', when: cron || `daily ${hour}:${minute}` };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function uninstall(name) {
|
|
39
|
+
if (platform() === 'darwin') {
|
|
40
|
+
const p = join(homedir(), 'Library', 'LaunchAgents', PREFIX + name + '.plist');
|
|
41
|
+
if (!existsSync(p)) return false;
|
|
42
|
+
try { execSync(`launchctl unload ${JSON.stringify(p)}`); } catch { /* fine */ }
|
|
43
|
+
unlinkSync(p);
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
const current = (() => { try { return execSync('crontab -l').toString(); } catch { return ''; } })();
|
|
47
|
+
const cleaned = current.split('\n').filter((l) => !l.includes(`# ${PREFIX}${name}`)).join('\n');
|
|
48
|
+
if (cleaned === current) return false;
|
|
49
|
+
execSync('crontab -', { input: cleaned });
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function list() {
|
|
54
|
+
if (platform() === 'darwin') {
|
|
55
|
+
const dir = join(homedir(), 'Library', 'LaunchAgents');
|
|
56
|
+
if (!existsSync(dir)) return [];
|
|
57
|
+
return readdirSync(dir).filter((f) => f.startsWith(PREFIX)).map((f) => f.slice(PREFIX.length).replace(/\.plist$/, ''));
|
|
58
|
+
}
|
|
59
|
+
try { return execSync('crontab -l').toString().split('\n').filter((l) => l.includes('# ' + PREFIX)).map((l) => l.split('# ' + PREFIX)[1]); }
|
|
60
|
+
catch { return []; }
|
|
61
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// `pm-claude-skills nightwatch` โ your AI staff work while you sleep.
|
|
2
|
+
// A scheduled Agent SDK run (YOUR key, YOUR machine, this directory) where the
|
|
3
|
+
// Firm's discipline meets real files: triage the brain, draft what the open
|
|
4
|
+
// hypotheses and due predictions imply, file memos to firm-minutes/, and leave
|
|
5
|
+
// a morning brief of WORK DONE, not work suggested.
|
|
6
|
+
//
|
|
7
|
+
// pm-claude-skills nightwatch --once # run right now, watch it work
|
|
8
|
+
// pm-claude-skills nightwatch --once --dry-run # show the shift plan, no API calls
|
|
9
|
+
// pm-claude-skills nightwatch install [--hour 5 --minute 30] # schedule nightly
|
|
10
|
+
// pm-claude-skills nightwatch uninstall | status
|
|
11
|
+
//
|
|
12
|
+
// Requires: ANTHROPIC_API_KEY in the environment (for scheduled runs, launchd/cron
|
|
13
|
+
// must see it โ the installer checks and tells you). Spend is bounded by
|
|
14
|
+
// --max-turns (default 30) and the model (default Sonnet). All writes stay in
|
|
15
|
+
// this directory: artifacts/, firm-minutes/, brain/.
|
|
16
|
+
import { readFileSync, readdirSync, existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
17
|
+
import { join } from 'node:path';
|
|
18
|
+
import { install, uninstall, list } from './lib/scheduler.mjs';
|
|
19
|
+
|
|
20
|
+
const getArg = (argv, n, d) => { const i = argv.indexOf('--' + n); return i >= 0 && argv[i + 1] ? argv[i + 1] : d; };
|
|
21
|
+
const today = () => new Date().toISOString().slice(0, 10);
|
|
22
|
+
|
|
23
|
+
function shiftPlan(cwd) {
|
|
24
|
+
// The night shift's standing orders, grounded in what's actually on file.
|
|
25
|
+
const read = (p) => { try { return readFileSync(join(cwd, p), 'utf8'); } catch { return ''; } };
|
|
26
|
+
const ctx = read('brain/context.md') || read('pm-context.md');
|
|
27
|
+
const duties = [];
|
|
28
|
+
const predDir = join(cwd, 'brain', 'predictions');
|
|
29
|
+
if (existsSync(predDir)) {
|
|
30
|
+
const due = readdirSync(predDir).filter((f) => {
|
|
31
|
+
const t = read('brain/predictions/' + f);
|
|
32
|
+
const d = (t.match(/^due:\s*(\S+)/m) || [])[1];
|
|
33
|
+
return /^status:\s*pending$/m.test(t) && d && d <= today();
|
|
34
|
+
});
|
|
35
|
+
if (due.length) duties.push(`RECKON: ${due.length} prediction(s) are due (${due.join(', ')}). For each: search this directory's files for evidence, then either settle it by editing its status to hit/miss with a one-line justification appended, or write why it cannot be settled from available evidence.`);
|
|
36
|
+
}
|
|
37
|
+
const hyp = read('brain/hypotheses.md');
|
|
38
|
+
const hunches = (hyp.match(/^- \[hunch\].*$/gm) || []).slice(0, 2);
|
|
39
|
+
if (hunches.length) duties.push(`INVESTIGATE: for each open hunch (${hunches.map((h) => '"' + h.slice(0, 60) + '"').join('; ')}), gather whatever evidence exists in this directory's files and append a dated [data]/[external] line to brain/ if anything upgrades or kills it.`);
|
|
40
|
+
duties.push('DRAFT: pick the ONE most useful artifact this workspace obviously needs next (an overdue update, the doc a settled prediction implies, the summary firm-minutes/ has been circling) and draft it properly to artifacts/' + today() + '-<slug>.md using the matching installed skill\'s structure โ its Quality Checks are your acceptance test.');
|
|
41
|
+
duties.push('REPORT: write firm-minutes/nightwatch-' + today() + '.md โ the morning brief: what was DONE (with file paths), what was settled, what needs a human decision (max 3 items), each with your recommendation.');
|
|
42
|
+
return { ctx, duties };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export async function run(argv) {
|
|
46
|
+
const cmd = argv.find((a) => !a.startsWith('--')) || (argv.includes('--once') ? 'once' : 'help');
|
|
47
|
+
const cwd = process.cwd();
|
|
48
|
+
|
|
49
|
+
if (cmd === 'install') {
|
|
50
|
+
if (!process.env.ANTHROPIC_API_KEY) console.error('โ ANTHROPIC_API_KEY is not in this shell โ the scheduled job needs it. Add it to the plist/cron environment or a .env this directory loads.');
|
|
51
|
+
const r = install('nightwatch', [process.execPath, join(new URL('.', import.meta.url).pathname, 'cli.mjs'), 'nightwatch', '--once'],
|
|
52
|
+
{ hour: +getArg(argv, 'hour', 5), minute: +getArg(argv, 'minute', 30) });
|
|
53
|
+
mkdirSync(join(cwd, '.pm-skills'), { recursive: true });
|
|
54
|
+
console.log(`๐ Nightwatch scheduled (${r.kind}, ${r.when}) for ${cwd}\n Logs: .pm-skills/nightwatch.log ยท remove: pm-claude-skills nightwatch uninstall`);
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
if (cmd === 'uninstall') { console.log(uninstall('nightwatch') ? '๐ Nightwatch unscheduled.' : 'Nothing scheduled.'); return 0; }
|
|
58
|
+
if (cmd === 'status') { const l = list(); console.log(l.length ? 'Scheduled: ' + l.join(', ') : 'Nothing scheduled.'); return 0; }
|
|
59
|
+
|
|
60
|
+
if (cmd === 'once' || argv.includes('--once')) {
|
|
61
|
+
const { ctx, duties } = shiftPlan(cwd);
|
|
62
|
+
if (argv.includes('--dry-run')) {
|
|
63
|
+
console.log(`๐ Nightwatch shift plan for ${cwd} (dry run โ no API calls):\n`);
|
|
64
|
+
duties.forEach((d, i) => console.log(` ${i + 1}. ${d.split(':')[0]}: ${d.split(': ').slice(1).join(': ').slice(0, 140)}โฆ\n`));
|
|
65
|
+
console.log(`Context loaded: ${ctx ? 'brain/context.md (' + ctx.length + ' chars)' : 'NONE โ run pm-claude-skills init'}`);
|
|
66
|
+
return 0;
|
|
67
|
+
}
|
|
68
|
+
if (!process.env.ANTHROPIC_API_KEY) { console.error('ANTHROPIC_API_KEY not set. (--dry-run shows the shift plan for free.)'); return 1; }
|
|
69
|
+
let query;
|
|
70
|
+
try { ({ query } = await import('@anthropic-ai/claude-agent-sdk')); }
|
|
71
|
+
catch { console.error('The Nightwatch needs the Agent SDK: npm install -g @anthropic-ai/claude-agent-sdk (or run from a directory that has it)'); return 1; }
|
|
72
|
+
mkdirSync(join(cwd, 'artifacts'), { recursive: true });
|
|
73
|
+
console.error(`๐ Nightwatch shift starting in ${cwd} โ ${duties.length} standing ordersโฆ`);
|
|
74
|
+
const prompt = `You are the Nightwatch โ the professional staff working this workspace overnight. Complete these standing orders IN ORDER, doing real file work (read, then write), never inventing facts not found in the files:\n\n${duties.map((d, i) => `${i + 1}. ${d}`).join('\n\n')}`;
|
|
75
|
+
const append = `\nSTANDING CONTEXT:\n${(ctx || '(none)').slice(0, 4000)}\n\nHOUSE RULES: honour brain/ provenance tags; artifacts follow installed skill structures where one matches; every claim in the morning brief cites the file it came from; if evidence is insufficient, say so rather than padding.`;
|
|
76
|
+
let cost = 0, turns = 0;
|
|
77
|
+
for await (const message of query({ prompt, options: {
|
|
78
|
+
systemPrompt: { type: 'preset', preset: 'claude_code', append },
|
|
79
|
+
allowedTools: ['Read', 'Write', 'Edit', 'Glob', 'Grep'],
|
|
80
|
+
permissionMode: 'acceptEdits',
|
|
81
|
+
maxTurns: +getArg(argv, 'max-turns', 30),
|
|
82
|
+
model: getArg(argv, 'model', undefined),
|
|
83
|
+
} })) {
|
|
84
|
+
if (message.type === 'result') { cost = message.total_cost_usd ?? 0; turns = message.num_turns; }
|
|
85
|
+
}
|
|
86
|
+
const brief = join(cwd, 'firm-minutes', `nightwatch-${today()}.md`);
|
|
87
|
+
console.error(`๐ Shift complete โ ${turns} turns, $${cost.toFixed(4)}. Morning brief: ${existsSync(brief) ? brief : '(not filed โ check the log)'}`);
|
|
88
|
+
return 0;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
console.log(`The Nightwatch โ AI staff that work this directory while you sleep.
|
|
92
|
+
|
|
93
|
+
pm-claude-skills nightwatch --once run a shift now
|
|
94
|
+
pm-claude-skills nightwatch --once --dry-run see the shift plan, no API calls
|
|
95
|
+
pm-claude-skills nightwatch install schedule nightly (5:30am default; --hour/--minute)
|
|
96
|
+
pm-claude-skills nightwatch uninstall | status
|
|
97
|
+
|
|
98
|
+
A shift: settle due predictions against file evidence ยท investigate open hunches ยท
|
|
99
|
+
draft the one artifact the workspace needs ยท file the morning brief of work DONE.
|
|
100
|
+
Writes only inside this directory. Your key, bounded turns.`);
|
|
101
|
+
return 0;
|
|
102
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// `pm-claude-skills subscribe` โ skills as standing subscriptions. A skill that
|
|
2
|
+
// runs on a schedule against a living input (a CSV export, a notes file), files
|
|
3
|
+
// dated artifacts into brain/artifacts, and DIFFS against last time: the run's
|
|
4
|
+
// headline is what CHANGED, not what is.
|
|
5
|
+
//
|
|
6
|
+
// pm-claude-skills subscribe churn-analysis --input ./exports/latest.csv --weekly monday
|
|
7
|
+
// pm-claude-skills subscribe run churn-analysis --input ./exports/latest.csv # run one cycle now
|
|
8
|
+
// pm-claude-skills subscribe list | unsubscribe <skill>
|
|
9
|
+
//
|
|
10
|
+
// Scheduled runs need ANTHROPIC_API_KEY visible to launchd/cron. Artifacts:
|
|
11
|
+
// brain/subscriptions/<skill>/<date>.md (+ latest.md symlink-copy + CHANGES.md).
|
|
12
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, copyFileSync } from 'node:fs';
|
|
13
|
+
import { join, dirname } from 'node:path';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
import { install, uninstall, list } from './lib/scheduler.mjs';
|
|
16
|
+
import { complete, parseSkill } from './lib/anthropic.mjs';
|
|
17
|
+
|
|
18
|
+
const PKG_ROOT = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
19
|
+
const getArg = (argv, n, d) => { const i = argv.indexOf('--' + n); return i >= 0 && argv[i + 1] ? argv[i + 1] : d; };
|
|
20
|
+
const DAYS = { sunday: 0, monday: 1, tuesday: 2, wednesday: 3, thursday: 4, friday: 5, saturday: 6 };
|
|
21
|
+
const today = () => new Date().toISOString().slice(0, 10);
|
|
22
|
+
|
|
23
|
+
async function runCycle(skill, inputPath, model) {
|
|
24
|
+
const file = join(PKG_ROOT, 'skills', skill, 'SKILL.md');
|
|
25
|
+
if (!existsSync(file)) { console.error(`Unknown skill "${skill}".`); return 1; }
|
|
26
|
+
if (!existsSync(inputPath)) { console.error(`Input not found: ${inputPath}`); return 1; }
|
|
27
|
+
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
28
|
+
if (!apiKey) { console.error('ANTHROPIC_API_KEY not set.'); return 1; }
|
|
29
|
+
const dir = join(process.cwd(), 'brain', 'subscriptions', skill);
|
|
30
|
+
mkdirSync(dir, { recursive: true });
|
|
31
|
+
const prev = existsSync(join(dir, 'latest.md')) ? readFileSync(join(dir, 'latest.md'), 'utf8') : null;
|
|
32
|
+
const { body } = parseSkill(readFileSync(file, 'utf8'));
|
|
33
|
+
const input = readFileSync(inputPath, 'utf8').slice(0, 60000);
|
|
34
|
+
console.error(`โฐ ${skill} โ ${inputPath}${prev ? ' (diffing vs last run)' : ' (first run)'}`);
|
|
35
|
+
const out = await complete({ apiKey, model: model || 'claude-sonnet-4-6', maxTokens: 8192,
|
|
36
|
+
system: body + '\n\n---\nExecute this skill on the input below. This is a RECURRING run.' +
|
|
37
|
+
(prev ? ' The previous run\'s output is provided โ begin your output with a "## What changed since last run" section (3-6 bullets, most decision-relevant first, honest "nothing material" if true), THEN the full artifact.' : ''),
|
|
38
|
+
messages: [{ role: 'user', content: 'INPUT:\n' + input + (prev ? '\n\nPREVIOUS RUN OUTPUT:\n' + prev.slice(0, 20000) : '') }] });
|
|
39
|
+
const dated = join(dir, today() + '.md');
|
|
40
|
+
writeFileSync(dated, out + '\n');
|
|
41
|
+
copyFileSync(dated, join(dir, 'latest.md'));
|
|
42
|
+
const changes = (out.match(/## What changed[\s\S]*?(?=\n## |$)/) || [''])[0];
|
|
43
|
+
if (changes) writeFileSync(join(dir, 'CHANGES.md'), `# ${skill} โ last delta (${today()})\n\n${changes}\n`);
|
|
44
|
+
console.error(`โ
${dated}${changes ? ' ยท delta โ CHANGES.md' : ''}`);
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export async function run(argv) {
|
|
49
|
+
const a0 = argv[0];
|
|
50
|
+
if (a0 === 'list') { const l = list().filter((n) => n.startsWith('sub-')); console.log(l.length ? l.map((x) => ' โฐ ' + x.slice(4)).join('\n') : 'No subscriptions.'); return 0; }
|
|
51
|
+
if (a0 === 'unsubscribe') { console.log(uninstall('sub-' + argv[1]) ? 'โฐ Unsubscribed ' + argv[1] : 'No such subscription.'); return 0; }
|
|
52
|
+
if (a0 === 'run') return runCycle(argv[1], getArg(argv, 'input'), getArg(argv, 'model'));
|
|
53
|
+
|
|
54
|
+
const skill = a0 && !a0.startsWith('--') ? a0 : null;
|
|
55
|
+
const input = getArg(argv, 'input');
|
|
56
|
+
if (!skill || !input) {
|
|
57
|
+
console.log(`Standing skills โ a skill that runs on a schedule and reports what CHANGED.
|
|
58
|
+
|
|
59
|
+
pm-claude-skills subscribe <skill> --input <file> [--weekly monday | --daily] [--hour 6]
|
|
60
|
+
pm-claude-skills subscribe run <skill> --input <file> # one cycle now
|
|
61
|
+
pm-claude-skills subscribe list | unsubscribe <skill>
|
|
62
|
+
|
|
63
|
+
Artifacts land in brain/subscriptions/<skill>/ โ dated runs, latest.md, and
|
|
64
|
+
CHANGES.md (the delta since last run, which is the part worth reading).`);
|
|
65
|
+
return skill ? 0 : 1;
|
|
66
|
+
}
|
|
67
|
+
const weekly = getArg(argv, 'weekly', null);
|
|
68
|
+
const hour = +getArg(argv, 'hour', 6);
|
|
69
|
+
const cron = weekly ? `0 ${hour} * * ${DAYS[weekly.toLowerCase()] ?? 1}` : null;
|
|
70
|
+
const r = install('sub-' + skill,
|
|
71
|
+
[process.execPath, join(dirname(fileURLToPath(import.meta.url)), 'cli.mjs'), 'subscribe', 'run', skill, '--input', input],
|
|
72
|
+
{ hour, minute: 0, cron });
|
|
73
|
+
mkdirSync(join(process.cwd(), '.pm-skills'), { recursive: true });
|
|
74
|
+
console.log(`โฐ Subscribed: ${skill} โ ${input} (${r.kind}, ${weekly ? 'weekly ' + weekly : r.when})\n First cycle now: pm-claude-skills subscribe run ${skill} --input ${input}`);
|
|
75
|
+
return 0;
|
|
76
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Workflow recipe โ the org-side AI adoption arc, policy to proof, by chaining 4 skills.
|
|
3
|
-
argument-hint: [the org: size, industry, what AI tools are in use (officially and not), what's worrying leadership]
|
|
3
|
+
argument-hint: "[the org: size, industry, what AI tools are in use (officially and not), what's worrying leadership]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Run the **Adopt AI Properly** workflow recipe for: $ARGUMENTS
|
package/commands/brain.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Set up or use your Professional Brain โ init, ingest, recall, or review.
|
|
3
|
-
argument-hint: [init | ingest <thing> | recall <query> | review]
|
|
3
|
+
argument-hint: "[init | ingest <thing> | recall <query> | review]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Apply the **professional-brain** skill to: $ARGUMENTS
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Workflow recipe โ turn the quarter's raw numbers into a leadership story and board deck by chaining 4 skills.
|
|
3
|
-
argument-hint: [the quarter's metrics, wins, and misses]
|
|
3
|
+
argument-hint: "[the quarter's metrics, wins, and misses]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Run the **Close the Quarter** workflow recipe for: $ARGUMENTS
|
package/commands/exec-summary.md
CHANGED
package/commands/firm.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Convene your standing AI staff โ memos on every beat, a board session without you, minutes with dissent preserved.
|
|
3
|
-
argument-hint: [optional board agenda โ otherwise the staff pick the sharpest open question]
|
|
3
|
+
argument-hint: "[optional board agenda โ otherwise the staff pick the sharpest open question]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
You are the **chief of staff** running a session of the user's standing Firm โ a staffed team, not a chatbot. Full concept: the repo's `web/firm.html`; this command is its Claude Code native form, grounded in real files instead of a pasted charter.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Workflow recipe โ turn a growth goal into a funnel diagnosis, experiment backlog, retention loop, and lifecycle journeys by chaining 4 skills.
|
|
3
|
-
argument-hint: [the growth goal โ e.g. "lift D30 retention for B2B teams"]
|
|
3
|
+
argument-hint: '[the growth goal โ e.g. "lift D30 retention for B2B teams"]'
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Run the **Grow a Product** workflow recipe for: $ARGUMENTS
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Build a weighted customer health scorecard for an account.
|
|
3
|
-
argument-hint: [account name + usage/support/commercial signals]
|
|
3
|
+
argument-hint: "[account name + usage/support/commercial signals]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Apply the **cs-health-scorecard** skill to: $ARGUMENTS
|
package/commands/land-a-job.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Workflow recipe โ go after a specific role end to end by chaining 4 skills: decode the JD, research the company, tailor your application, and prep the interview.
|
|
3
|
-
argument-hint: [the role + company, or paste the job description]
|
|
3
|
+
argument-hint: "[the role + company, or paste the job description]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Run the **Land a Job** workflow recipe for: $ARGUMENTS
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Workflow recipe โ go from competitive landscape to a fully checklisted launch and press release by chaining 5 skills.
|
|
3
|
-
argument-hint: [the product and who it's for]
|
|
3
|
+
argument-hint: "[the product and who it's for]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Run the **Launch a Product** workflow recipe for: $ARGUMENTS
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Workflow recipe โ take an AI/LLM feature from a probabilistic-aware PRD to a launch-ready model card by chaining 5 skills.
|
|
3
|
-
argument-hint: [the AI feature idea]
|
|
3
|
+
argument-hint: "[the AI feature idea]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Run the **Launch an AI Feature** workflow recipe for: $ARGUMENTS
|
package/commands/prd.md
CHANGED
package/commands/red-team.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Stress-test a plan, strategy, PRD, or launch with a room of hostile expert personas before you commit.
|
|
3
|
-
argument-hint: [the plan / doc to pressure-test]
|
|
3
|
+
argument-hint: "[the plan / doc to pressure-test]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Apply the **red-team-review** skill to pressure-test: $ARGUMENTS
|
package/commands/repurpose.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Workflow recipe โ turn one blog post, video, or idea into a full platform-native content pack (thread, LinkedIn, newsletter, carousel, short-form script) with sharp hooks and a thumbnail concept.
|
|
3
|
-
argument-hint: [a URL, a transcript/blog paste, or the core idea]
|
|
3
|
+
argument-hint: "[a URL, a transcript/blog paste, or the core idea]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Run the **Repurpose Content** workflow recipe for: $ARGUMENTS
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Workflow recipe โ diagnose an at-risk customer and build the full save play through to renewal by chaining 4 skills.
|
|
3
|
-
argument-hint: [the account and what's going wrong]
|
|
3
|
+
argument-hint: "[the account and what's going wrong]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Run the **Rescue an Account** workflow recipe for: $ARGUMENTS
|
package/commands/retro.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Run a structured sprint retrospective from notes.
|
|
3
|
-
argument-hint: [what happened this sprint โ wins, misses, blockers]
|
|
3
|
+
argument-hint: "[what happened this sprint โ wins, misses, blockers]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Apply the **retro-analysis** skill to: $ARGUMENTS
|
package/commands/rice.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Workflow recipe โ go from a vague opportunity to validated insight and a prioritised next step by chaining 4 skills.
|
|
3
|
-
argument-hint: [the opportunity or fuzzy question]
|
|
3
|
+
argument-hint: "[the opportunity or fuzzy question]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Run the **Run Discovery** workflow recipe for: $ARGUMENTS
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Set up your Skill Memory โ a pm-context.md every skill reads so outputs come back tailored to you.
|
|
3
|
-
argument-hint: [optional notes about you/your company to seed it]
|
|
3
|
+
argument-hint: "[optional notes about you/your company to seed it]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Set up the user's **Skill Memory** (`pm-context.md`).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Onboard a new user โ find out what they do, recommend the right bundles & top skills, and set up a project CONTEXT.md so every skill is tailored to them.
|
|
3
|
-
argument-hint: [optional โ your role / what you're working on]
|
|
3
|
+
argument-hint: "[optional โ your role / what you're working on]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
You are onboarding someone to the **PM Skills** library (198 professional Agent Skills across 27 bundles). Goal: get them from "installed" to "got real value" in under two minutes. Context they gave: $ARGUMENTS
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Workflow recipe โ take a feature idea from fuzzy brief to launch plan by chaining 5 skills.
|
|
3
|
-
argument-hint: [the feature idea or problem]
|
|
3
|
+
argument-hint: "[the feature idea or problem]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Run the **Ship a Feature** workflow recipe for: $ARGUMENTS
|