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.
Files changed (42) hide show
  1. package/README.md +6 -2
  2. package/bin/brief.mjs +89 -0
  3. package/bin/cli.mjs +19 -0
  4. package/bin/lib/scheduler.mjs +61 -0
  5. package/bin/nightwatch.mjs +102 -0
  6. package/bin/subscribe.mjs +76 -0
  7. package/commands/adopt-ai-properly.md +1 -1
  8. package/commands/brain.md +1 -1
  9. package/commands/close-the-quarter.md +1 -1
  10. package/commands/exec-summary.md +1 -1
  11. package/commands/firm.md +1 -1
  12. package/commands/grow-a-product.md +1 -1
  13. package/commands/health-scorecard.md +1 -1
  14. package/commands/land-a-job.md +1 -1
  15. package/commands/launch-a-product.md +1 -1
  16. package/commands/launch-an-ai-feature.md +1 -1
  17. package/commands/prd.md +1 -1
  18. package/commands/red-team.md +1 -1
  19. package/commands/repurpose.md +1 -1
  20. package/commands/rescue-an-account.md +1 -1
  21. package/commands/retro.md +1 -1
  22. package/commands/rice.md +1 -1
  23. package/commands/run-discovery.md +1 -1
  24. package/commands/setup-context.md +1 -1
  25. package/commands/setup-pm-skills.md +1 -1
  26. package/commands/ship-a-feature.md +1 -1
  27. package/commands/ship-an-mcp-server.md +1 -1
  28. package/commands/sprint-plan.md +1 -1
  29. package/exports/aider/pm-data/cohort-analysis/cohort-analysis.md +153 -100
  30. package/exports/chatgpt/pm-data/cohort-analysis/SYSTEM_PROMPT.md +153 -100
  31. package/exports/cline/pm-data/cohort-analysis/cohort-analysis.md +153 -100
  32. package/exports/continue/pm-data/cohort-analysis/cohort-analysis.md +153 -100
  33. package/exports/cursor/pm-data/cohort-analysis/cohort-analysis.mdc +153 -100
  34. package/exports/gemini/pm-data/cohort-analysis/GEM_INSTRUCTIONS.md +153 -100
  35. package/exports/kilocode/pm-data/cohort-analysis/cohort-analysis.md +153 -100
  36. package/exports/obsidian/pm-data/cohort-analysis/cohort-analysis.md +153 -100
  37. package/exports/roo/pm-data/cohort-analysis/cohort-analysis.md +153 -100
  38. package/exports/windsurf/pm-data/cohort-analysis/cohort-analysis.md +153 -100
  39. package/exports/zed/pm-data/cohort-analysis/cohort-analysis.md +153 -100
  40. package/package.json +9 -2
  41. package/skills/cohort-analysis/SKILL.md +153 -100
  42. package/skills/slide-deck/scripts/pptx_tool.py +3 -2
package/README.md CHANGED
@@ -13,6 +13,8 @@
13
13
  [![Free runs served](https://img.shields.io/endpoint?url=https%3A%2F%2Fpm-skills-mcp.pm-claude-skills.workers.dev%2Ftry%2Fstats&cacheSeconds=300)](https://mohitagw15856.github.io/pm-claude-skills/)
14
14
  [![Sponsor](https://img.shields.io/badge/๐Ÿ’›_sponsors_fund_the_free_runs-ea4aaa)](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
- **๐Ÿ†• v45.0.0 โ€” the spectacle release:** โš”๏ธ **Duels** โ€” challenge a friend to the *identical* Gym negotiation or Panel candidate (same hidden state, side-by-side scorecard), ๐ŸŽ“ **[The Charter](https://mohitagw15856.github.io/pm-claude-skills/charter.html)** โ€” the performance-based, cryptographically verifiable certification, and **the library in 3D**: ๐ŸŒŒ [Galaxy 3D](https://mohitagw15856.github.io/pm-claude-skills/galaxy3d.html) (fly a bloom-lit starfield where your used skills burn brighter), ๐Ÿ— **[the Tower of Claims](https://mohitagw15856.github.io/pm-claude-skills/tower.html)** (your document as a physics tower โ€” data is steel, assumptions are glass, watch it stand or **collapse**), ๐Ÿ› [the Stage](https://mohitagw15856.github.io/pm-claude-skills/stage.html) (Boardroom replays as cinema with a cracking hologram), โœจ holo persona cards, ๐Ÿ† [the Trophy Forge](https://mohitagw15856.github.io/pm-claude-skills/trophy.html), ๐ŸŒƒ [Skill City](https://mohitagw15856.github.io/pm-claude-skills/city.html), โ˜„๏ธ the Reckoning orrery. Plus the record going public: **first official [SkillBench results](skillbench/results.json)** (Haiku 4.5 vs Sonnet 4.6), evolution loop run #1 (all champions held under blind judging), 3 sha256-pinned [registry packs](packs/), and a live **free-runs-served badge**. *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).
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: v45.0.0 โ€” the spectacle release: โš”๏ธ Duels, ๐ŸŽ“ the verifiable Charter, and the library in 3D (Galaxy 3D, the collapsing Tower of Claims, the Stage, holo cards, the Trophy Forge, Skill City, the orrery) โ€” plus the first official SkillBench results and the first evolution-loop run (466 skills, 66 bundles)** ยท *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)**.
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
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Compress a document or update into a crisp executive summary.
3
- argument-hint: [text, decision, or document to summarise]
3
+ argument-hint: "[text, decision, or document to summarise]"
4
4
  ---
5
5
 
6
6
  Apply the **executive-summary** skill to: $ARGUMENTS
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
@@ -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
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Draft a product requirements document from a feature idea or brief.
3
- argument-hint: [feature or problem to spec]
3
+ argument-hint: "[feature or problem to spec]"
4
4
  ---
5
5
 
6
6
  Apply the **prd-template** skill to produce a complete PRD for: $ARGUMENTS
@@ -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
@@ -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: Score and rank initiatives with the RICE framework.
3
- argument-hint: [list of initiatives, or a file/path of them]
3
+ argument-hint: "[list of initiatives, or a file/path of them]"
4
4
  ---
5
5
 
6
6
  Apply the **rice-prioritisation** skill to: $ARGUMENTS
@@ -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