Skip to content

Instantly share code, notes, and snippets.

View johncmunson's full-sized avatar

John Munson johncmunson

View GitHub Profile

Background Context

This is the repo for the Vercel skills CLI.

Agent Skills are a lightweight, open format for extending AI agent capabilities with specialized knowledge and workflows. At its core, a skill is a folder containing a SKILL.md file. This file includes metadata (name and description, at minimum) and instructions that tell an agent how to perform a specific task. Skills can also bundle scripts, templates, and reference materials.

Agent harnesses that support the SKILL.md spec typically look for and load agent skills in two places: (1) the user's home folder (~), and (2) the repo in which the skills CLI was invoked. Harnesses load skills using the concept of "progressive disclosure", meaning that when an agent session is started, the harness loads skill metadata (name and description) into the context window up front.

When the agent sees this metadata, it can decide on it's own which skills are most relevant to the task at hand and load the full skill co

Skills Management One-Pager

What This Adds

The skills CLI gains a lightweight management layer for installed skills:

  • Enable and disable skills without uninstalling them
  • Organize skills into named groups
  • Designate one protected skills-manager skill per scope
  • Preserve management state across reinstall-like flows such as add, update, experimental_install, and experimental_sync

Skill Management Design for skills

Summary

This document proposes a first-class skill management layer for the skills CLI that adds:

  • Scope-aware enable/disable operations for installed skills
  • User-defined skill groups
  • A single protected skills-manager skill per scope
  • Management-aware listing and lifecycle behavior
@johncmunson
johncmunson / skills-management-one-pager.md
Last active April 8, 2026 01:39
Skills Management One Pager

Skills Management One-Pager

What This Adds

The skills CLI gains a lightweight management layer for installed skills:

  • Enable and disable skills without uninstalling them
  • Organize skills into named groups
  • Designate one protected skills-manager skill per scope
  • Preserve management state across reinstall-like flows such as add, update, experimental_install, and experimental_sync
@johncmunson
johncmunson / index.ts
Last active August 11, 2025 19:07
Unified Drizzle ORM + Postgres/Neon database pooling setup for consistent prod/dev/test behavior in Next.js with HMR-safe dev handling
import ws from "ws"
import { Pool as PgPool } from "pg"
import { drizzle as drizzlePg } from "drizzle-orm/node-postgres"
import { Pool as NeonPool, neonConfig } from "@neondatabase/serverless"
import { drizzle as drizzleNeon } from "drizzle-orm/neon-serverless"
import { getEnvVar } from "@/lib/utils"
import * as schema from "./schema"
import type { NodePgDatabase } from "drizzle-orm/node-postgres"
import type { NeonDatabase } from "drizzle-orm/neon-serverless"

Modeling Entity Relationships With Drizzle

https://orm.drizzle.team/docs/relations

Scenario 1: One-To-One Relationship

Use Case: Each employee has exactly one desk, and each desk is assigned to only one employee.

Table Definitions

@johncmunson
johncmunson / automate-expense-report.js
Created December 10, 2023 03:46
Automate Expensify Expense Report
// 1. Create new expense report and add items to it
// 2. Click on Details and set Workspace equal to Drive Social Media
// 3. Click on the first line item to open up the Edit Expense modal
// 4. Right click on the page and click on Inspect to open the browser devtools
// 5. In the devtools, open the Console tab
// 6. Paste the code below into the console and hit enter
// 7. Type the following and hit enter to start automating your report... automateReport()
const automateReport = async () => {
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))
@johncmunson
johncmunson / Setting Up a Python Development Environment for macOS.md
Last active March 17, 2025 06:28
Setting Up a Python Development Environment for macOS

UPDATE

I'm using uv now. I'm also still using pyenv, but uv may replace the need for this in the future.

Setting Up a Python Development Environment for macOS

Setting up a development environment for Python can be a bit confusing, mainly stemming from the fact that there are multiple competing standards for package management.

Compared with JavaScript and Node.js, which indeed have several different popular package managers such as npm, yarn, and pnpm, they at least all agree on a common manifest format (package.json) and they are largely all interoperable with each other. In addition, it's very clear to new JS developers that npm is where you ought to start.

@johncmunson
johncmunson / accumulatedDebounce.js
Created July 28, 2020 17:57
Debounce a function, with the option to accumulate args
export function debounce(delay, callback, accumulateData) {
let timeout = null
let data = []
return function () {
if (accumulateData) {
const arr = []
for (let i = 0; i < arguments.length; ++i) {
arr.push(arguments[i])
}
data.push(arr)
const getRandomBool = () => Math.random() >= 0.5
const getJitterMultiplier = (min: number, max: number): number => {
const percent = (Math.random() * (max - min) + min) / 100
return getRandomBool() ? 1 + percent : 1 - percent
}
const asyncRetry = async (fn, opts = {}) => {
const defaultOpts = { retries: 5, interval: 100, exponential: false, jitter: false }
opts = { ...defaultOpts, ...opts }