diff --git a/.agents/skills/agent-slack/SKILL.md b/.agents/skills/agent-slack/SKILL.md deleted file mode 100644 index 082fa281..00000000 --- a/.agents/skills/agent-slack/SKILL.md +++ /dev/null @@ -1,253 +0,0 @@ ---- -name: agent-slack -description: | - Slack automation CLI for AI agents. Use when: - - Reading a Slack message or thread (given a URL or channel+ts) - - Browsing recent channel messages / channel history - - Downloading Slack attachments (snippets, images, files) to local paths - - Searching Slack messages or files - - Sending, editing, or deleting a message; adding/removing reactions - - Listing channels/conversations; creating channels and inviting users - - Fetching a Slack canvas as markdown - - Looking up Slack users - - Marking channels/DMs as read - - Opening DM or group DM channels - - Discovering and running Slack workflows - Triggers: "slack message", "slack thread", "slack URL", "slack link", "read slack", "reply on slack", "search slack", "channel history", "recent messages", "channel messages", "latest messages", "mark as read", "mark read" ---- - -# Slack automation with `agent-slack` - -`agent-slack` is a CLI binary on `$PATH`. Invoke directly (e.g. `agent-slack user list`). - -## Installation - -If `agent-slack` is not found on `$PATH`, install it: - -- `curl -fsSL https://raw.githubusercontent.com/stablyai/agent-slack/main/install.sh | sh` (recommended) -- `npm i -g agent-slack` (requires Node >= 22.5) -- `nix run github:stablyai/agent-slack -- ` (no install needed, prefix all commands) - -## CRITICAL: Bash command formatting rules - -Claude Code's permission checker has security heuristics that force manual approval prompts. Avoid these patterns to keep commands auto-allowed. See: https://github.com/anthropics/claude-code/issues/34379 - -1. **No `#` anywhere in the command string.** Treated as a comment delimiter even inside quotes. Use bare channel names (`general` not `#general`). No `#` comments in inline scripts — use the Bash tool's `description` parameter instead. -2. **No `''` (consecutive single quotes) or `""` (consecutive double quotes).** Triggers "potential obfuscation" check. Avoid Python empty string literals like `d.get('key', '')` — use `d.get('key')` instead. -3. **Only `| jq` for filtering — no python3, no other commands.** `python3 -c` is not in the allow list and triggers prompts. `jq` with single-quote-only expressions (no `"` inside) is safe: - - WRONG: `agent-slack search ... | python3 -c "..."` (not allowed) - - WRONG: `agent-slack search ... | jq '.a + "x"'` (mixed quotes) - - RIGHT: `agent-slack search ... | jq '.a'` - - RIGHT: `agent-slack search ... | jq '.messages[] | .ts'` -4. **No `||` or `&&` chains.** Run multiple agent-slack commands as separate Bash tool calls. -5. **No file redirects (`>`, `>>`).** Process JSON output directly, don't write to files. - -## Quick start (auth) - -Authentication is automatic on macOS and Windows (Slack Desktop first, then Chrome/Firefox fallbacks on macOS). - -If credentials aren’t available, run one of: - -- Slack Desktop import (macOS/Windows): - -```bash -agent-slack auth import-desktop -agent-slack auth test -``` - -- Chrome fallback: - -```bash -agent-slack auth import-chrome -agent-slack auth test -``` - -- Firefox fallback: - -```bash -agent-slack auth import-firefox -agent-slack auth test -``` - -- Or set env vars (browser tokens; avoid pasting these into chat logs): - -```bash -export SLACK_TOKEN="xoxc-..." -export SLACK_COOKIE_D="xoxd-..." -agent-slack auth test -``` - -- Or set a standard token: - -```bash -export SLACK_TOKEN="xoxb-..." # or xoxp-... -agent-slack auth test -``` - -Check configured workspaces: - -```bash -agent-slack auth whoami -``` - -## Canonical workflow (given a Slack message URL) - -1. Fetch a single message (plus thread summary, if any): - -```bash -agent-slack message get "https://workspace.slack.com/archives/C123/p1700000000000000" -``` - -2. If you need the full thread: - -```bash -agent-slack message list "https://workspace.slack.com/archives/C123/p1700000000000000" -``` - -## Browse recent channel messages - -To see what's been posted recently in a channel (channel history): - -```bash -agent-slack message list "general" --limit 20 -agent-slack message list "C0123ABC" --limit 10 -agent-slack message list "general" --with-reaction eyes --oldest "1770165109.000000" --limit 20 -agent-slack message list "general" --without-reaction dart --oldest "1770165109.000000" --limit 20 -``` - -This returns the most recent messages in chronological order. Use `--limit` to control how many (default 25). -When using `--with-reaction` or `--without-reaction`, you must also pass `--oldest` to bound scanning. - -## Attachments (snippets/images/files) - -`message get/list` and `search` auto-download attachments and include file metadata in JSON output (typically under `message.files[]` / `files[]`), including `name` when available and `path` for the local download. Failed message attachment downloads keep the attachment entry, preserve a local `.download-error.txt` path, and include `message.files[].error` for `message get/list` or `messages[].files[].error` for `search messages|all`; `search files` skips files whose download fails. - -## Draft a message (browser editor) - -Opens a Slack-like rich-text editor in the browser for composing messages with formatting toolbar (bold, italic, strikethrough, links, lists, quotes, code, code blocks). After sending, shows a "View in Slack" link. - -```bash -agent-slack message draft "general" -agent-slack message draft "general" "initial text" -agent-slack message draft "https://workspace.slack.com/archives/C123/p1700000000000000" -``` - -## Send, edit, delete, or react - -```bash -agent-slack message send "https://workspace.slack.com/archives/C123/p1700000000000000" "I can take this." -agent-slack message send "alerts-staging" "here's the report" --attach ./report.md -agent-slack message edit "https://workspace.slack.com/archives/C123/p1700000000000000" "I can take this today." -agent-slack message delete "https://workspace.slack.com/archives/C123/p1700000000000000" - -agent-slack message send "general" "Here's the plan: -- Step 1: do the thing -- Step 2: verify it worked - - Sub-step: check logs" -agent-slack message react add "https://workspace.slack.com/archives/C123/p1700000000000000" "eyes" -agent-slack message react remove "https://workspace.slack.com/archives/C123/p1700000000000000" "eyes" -``` - -Channel mode for edit/delete requires `--ts`: - -```bash -agent-slack message edit "general" "Updated text" --workspace "myteam" --ts "1770165109.628379" -agent-slack message delete "general" --workspace "myteam" --ts "1770165109.628379" -``` - -Attach options for `message send`: - -- `--attach ` upload a local file (repeatable) - -## List channels + create/invite users - -```bash -agent-slack channel list -agent-slack channel list --user "@alice" --limit 50 -agent-slack channel list --all --limit 100 -agent-slack channel new --name "incident-war-room" -agent-slack channel new --name "incident-leads" --private -agent-slack channel invite --channel "incident-war-room" --users "U01AAAA,@alice,bob@example.com" -agent-slack channel invite --channel "incident-war-room" --users "partner@vendor.com" --external -agent-slack channel invite --channel "incident-war-room" --users "partner@vendor.com" --external --allow-external-user-invites -``` - -For `--external`, invite targets must be emails. By default, invitees are external-limited; add -`--allow-external-user-invites` to allow them to invite other users. - -## Search (messages + files) - -Prefer channel-scoped search for reliability: - -```bash -agent-slack search all "smoke tests failed" --channel "alerts" --after 2026-01-01 --before 2026-02-01 -agent-slack search messages "stably test" --user "@alice" --channel general -agent-slack search files "testing" --content-type snippet --limit 10 -``` - -## Multi-workspace guardrail (important) - -If you have multiple workspaces configured and you use a channel **name** (e.g. `general`), pass `--workspace` (or set `SLACK_WORKSPACE_URL`) to avoid ambiguity: - -```bash -agent-slack message get "general" --workspace "https://myteam.slack.com" --ts "1770165109.628379" -agent-slack message get "general" --workspace "myteam" --ts "1770165109.628379" -``` - -## DM / group DM channels - -Get the channel ID for a DM or group DM, useful for sending messages to a group of users: - -```bash -agent-slack user dm-open @alice @bob -agent-slack user dm-open U01AAAA U02BBBB U03CCCC -``` - -## Mark as read - -Mark a channel, DM, or group DM as read up to a given message: - -```bash -agent-slack channel mark "https://workspace.slack.com/archives/C123/p1700000000000000" -agent-slack channel mark "general" --workspace "myteam" --ts "1770165109.628379" -agent-slack channel mark "D0A04PB2QBW" --workspace "myteam" --ts "1770165109.628379" -``` - -To make a specific message appear unread, set `--ts` to just before it (subtract `0.000001`). This moves the read cursor so that message and everything after it appear as new: - -```bash -agent-slack channel mark "general" --workspace "myteam" --ts "1770165109.628378" -``` - -## Workflows - -Discover and run Slack workflows bookmarked in channels: - -```bash -# List workflows in a channel -agent-slack workflow list "#ops" - -# Preview trigger metadata (no side effects) -agent-slack workflow preview "Ft123ABC" - -# Get workflow definition including form fields and steps -agent-slack workflow get "Ft123ABC" -agent-slack workflow get "Wf456DEF" - -# Trip a workflow trigger -agent-slack workflow run "Ft123ABC" --channel "#ops" -``` - -## Canvas + Users - -```bash -agent-slack canvas get "https://workspace.slack.com/docs/T123/F456" -agent-slack user list --workspace "https://workspace.slack.com" --limit 100 -agent-slack user get "@alice" --workspace "https://workspace.slack.com" -``` - -## References - -- [references/commands.md](references/commands.md): full command map + all flags -- [references/targets.md](references/targets.md): URL vs `#channel` targeting rules -- [references/output.md](references/output.md): JSON output shapes + download paths diff --git a/.agents/skills/agent-slack/references/commands.md b/.agents/skills/agent-slack/references/commands.md deleted file mode 100644 index 289eb3d9..00000000 --- a/.agents/skills/agent-slack/references/commands.md +++ /dev/null @@ -1,139 +0,0 @@ -# `agent-slack` command map (reference) - -Run `agent-slack --help` (or `agent-slack --help`) for the full option list. - -## Auth - -- `agent-slack auth whoami` — show configured workspaces + token sources (secrets redacted) -- `agent-slack auth test [--workspace ]` — verify credentials (`auth.test`) -- `agent-slack auth import-desktop` — import browser-style creds from Slack Desktop (macOS/Windows) -- `agent-slack auth import-chrome` — import creds from Chrome (macOS) -- `agent-slack auth import-firefox` — import creds from Firefox profile storage (macOS/Linux) -- `agent-slack auth parse-curl` — read a copied Slack cURL command from stdin and save creds -- `agent-slack auth add --workspace-url [--token | --xoxc --xoxd ]` -- `agent-slack auth set-default ` -- `agent-slack auth remove ` - -## Messages / threads - -- `agent-slack message get ` - - ``: Slack message URL OR `#channel`/`channel`/channel id (`C...`) (see `targets.md`) - - Options: - - `--workspace ` (required when using a channel _name_ across multiple workspaces) - - `--ts .` (required when targeting a channel) - - `--thread-ts .` (optional hint for thread permalinks) - - `--max-body-chars ` (default `8000`, `-1` unlimited) - - `--include-reactions` - -- `agent-slack message list ` - - Lists recent channel messages (channel history), or fetches all thread replies - - **Channel history** (default when targeting a channel without `--thread-ts`): - - `agent-slack message list "general"` — latest 25 messages - - `agent-slack message list "general" --limit 50` — latest 50 messages - - **Thread mode** (when `--thread-ts` or `--ts` is provided, or target is a message URL): - - `agent-slack message list ""` — all replies in that thread - - `agent-slack message list "general" --thread-ts "1770165109.000001"` — thread replies - - Options: - - `--workspace ` (same rules as above) - - `--thread-ts .` (switches to thread mode; fetches replies) - - `--ts .` (resolve a message to its thread) - - `--limit ` (default `25`, max `200`; channel history mode only) - - `--oldest ` (only messages after this ts; channel history mode) - - `--latest ` (only messages before this ts; channel history mode) - - `--with-reaction ` (repeatable; include only messages that have this reaction; channel history mode; requires `--oldest`) - - `--without-reaction ` (repeatable; include only messages that do not have this reaction; channel history mode; requires `--oldest`) - - `--max-body-chars ` (default `8000`, `-1` unlimited) - - `--include-reactions` - -- `agent-slack message draft [text]` - - Opens a Slack-like WYSIWYG editor in the browser for composing and sending a message. - - Formatting toolbar: bold, italic, strikethrough, links, numbered/bulleted lists, quotes, inline code, code blocks. - - Toggle between rich-text editing and raw mrkdwn source view. - - After sending, shows a "View in Slack" permalink to the posted message. - - If `` is a Slack message URL, the draft will reply in that thread. - - Options: - - `--workspace ` (needed for channel _names_ across multiple workspaces) - - `--thread-ts .` (optional, channel mode only) - -- `agent-slack message send ` - - If `` is a Slack message URL, replies in that message’s thread. - - Otherwise posts to the channel/DM. - - Bullet lists (`- `, `* `, `• `, `1. `, etc.) are automatically converted to Slack’s native rich text format, so recipients see real editable bullets instead of plain-text dashes. - - Options: - - `--workspace ` (needed for channel _names_ across multiple workspaces) - - `--thread-ts .` (optional, channel mode only) - - `--attach ` (repeatable; upload local files as attachments) - -- `agent-slack message edit ` - - URL target edits that exact message. - - Channel target requires `--ts`. - - Options: - - `--workspace ` (needed for channel _names_ across multiple workspaces) - - `--ts .` (required for channel targets) - -- `agent-slack message delete ` - - URL target deletes that exact message. - - Channel target requires `--ts`. - - Options: - - `--workspace ` (needed for channel _names_ across multiple workspaces) - - `--ts .` (required for channel targets) - -- `agent-slack message react add ` -- `agent-slack message react remove ` - - Options (channel mode): - - `--workspace ` (needed for channel _names_ across multiple workspaces) - - `--ts .` (required for channel targets) - -## Channels - -- `agent-slack channel list [--workspace ] [--user | --all] [--limit ] [--cursor ]` - - Default mode calls `users.conversations` for the current user. - - `--user` resolves handles/ids and lists conversations for that user. - - `--all` switches to `conversations.list` (mutually exclusive with `--user`). - - Returns one page and optional `next_cursor`; pass `--cursor` to continue. -- `agent-slack channel new --name [--private] [--workspace ]` -- `agent-slack channel invite --channel --users "" [--workspace ]` - - Internal invite (default): resolves users (`U...`, `@handle`, `handle`, `email`) and uses `conversations.invite` - - External invite: add `--external` (email targets only) to use `conversations.inviteShared` - - Optional: `--allow-external-user-invites` sets `external_limited=false` for external invites -- `agent-slack channel mark [--ts .] [--workspace ]` - - Marks a channel/DM as read up to the given message timestamp (`conversations.mark`) - - URL target extracts channel, ts, and workspace automatically; `--ts` optionally overrides the URL timestamp; `--workspace` is rejected - - Channel name/ID target requires `--ts` - -## Search - -- `agent-slack search all ` — messages + files (default) -- `agent-slack search messages ` -- `agent-slack search files ` - -Common options: - -- `--workspace ` (recommended when using channel names across multiple workspaces) -- `--channel ` repeatable (`#name`, `name`, or id) -- `--user <@name|name|U...>` -- `--after YYYY-MM-DD` -- `--before YYYY-MM-DD` -- `--content-type any|text|image|snippet|file` -- `--limit ` (default `20`) -- `--max-content-chars ` (default `4000`, `-1` unlimited; messages only) - -## Canvas - -- `agent-slack canvas get ` - - Options: - - `--workspace ` (required when passing an id and multiple workspaces) - - `--max-chars ` (default `20000`, `-1` unlimited) - -## Workflows - -- `agent-slack workflow list [--workspace ]` — list workflows bookmarked or featured in a channel -- `agent-slack workflow preview [--workspace ]` — get workflow metadata from a trigger ID (no side effects) -- `agent-slack workflow get [--workspace ]` — get workflow definition including form fields and steps (accepts `Ft...` or `Wf...`) -- `agent-slack workflow run --channel [--workspace ]` — trip a workflow trigger - -## Users - -- `agent-slack user list [--workspace ] [--limit ] [--cursor ] [--include-bots]` -- `agent-slack user get [--workspace ]` -- `agent-slack user dm-open [--workspace ]` — get DM or group DM channel ID for one or more users (max 8) diff --git a/.agents/skills/agent-slack/references/output.md b/.agents/skills/agent-slack/references/output.md deleted file mode 100644 index 72e5c84a..00000000 --- a/.agents/skills/agent-slack/references/output.md +++ /dev/null @@ -1,83 +0,0 @@ -# Output + downloads (reference) - -## Output format - -All commands print JSON to stdout. - -- Empty values are pruned (`null`, `[]`, `{}` are removed where possible). -- `auth whoami` redacts secrets in its output. - -## Message shapes (high-level) - -- `message get` returns: - - `message: { ... }` - - `thread?: { ts, length }` (summary only; present when threaded) - -- `message list` returns: - - `messages: [ ... ]` (the full thread) - - Messages are compact and omit redundant fields on each item where possible. - -Use `--max-body-chars` to cap message bodies for token budget control. - -## Search shapes (high-level) - -- `search messages|all` returns `messages: [ ... ]` -- `search files|all` returns `files: [ ... ]` - -Use `--max-content-chars` (messages) and `--limit` to control size. - -## Channel shapes (high-level) - -- `channel list` returns: - - `channels: [ ... ]` - - `next_cursor?: string` (present when more pages are available) - -- `channel new` returns: - - `channel: { id, name, is_private }` - -- `channel invite` returns: - - Internal invite mode: - - `channel_id` - - `invited_user_ids: [ ... ]` - - `already_in_channel_user_ids?: [ ... ]` - - `unresolved_users?: [ ... ]` - - External invite mode (`--external`): - - `channel_id` - - `external: true` - - `external_limited: boolean` - - `invited_emails: [ ... ]` - - `already_invited_emails?: [ ... ]` - - `invalid_external_targets?: [ ... ]` - -- `channel mark` returns: - - `ok: boolean` - - `channel: string` (resolved channel ID) - - `ts: string` - -## File fields in compact messages - -When messages include file attachments, each file object contains: - -- `name` — the original filename (e.g. `"report.pdf"`), omitted if unavailable -- `mimetype` — MIME type (e.g. `"application/pdf"`) -- `mode` — Slack file mode (e.g. `"hosted"`, `"snippet"`) -- `path` — absolute local path to the downloaded file - -Only files with a successful download are included. - -## Attachment downloads - -Attachments are downloaded to an agent-friendly temp directory. - -- Successful downloads are returned as absolute paths in output. -- `message get/list` preserves failed attachment downloads with `message.files[].error` and keeps `message.files[].path` pointing to a local `.download-error.txt` file. -- Message results from `search messages|all` preserve failed attachment downloads with `messages[].files[].error` and keep `messages[].files[].path` pointing to a local `.download-error.txt` file. -- `search files` skips files whose download fails and continues returning the remaining matches. - -Default download root: - -- `~/.agent-slack/tmp/downloads/` - -If `XDG_RUNTIME_DIR` is set, downloads live under: - -- `$XDG_RUNTIME_DIR/agent-slack/tmp/downloads/` diff --git a/.agents/skills/agent-slack/references/targets.md b/.agents/skills/agent-slack/references/targets.md deleted file mode 100644 index ca38a17d..00000000 --- a/.agents/skills/agent-slack/references/targets.md +++ /dev/null @@ -1,80 +0,0 @@ -# Targets: URL vs channel (reference) - -`agent-slack` accepts either a **Slack message URL** (preferred) or a **channel reference**. - -## Preferred: Slack message URL - -Use the message permalink whenever you have it: - -```text -https://.slack.com/archives//p[?thread_ts=...] -``` - -Examples: - -- `agent-slack message get ""` -- `agent-slack message list ""` -- `agent-slack message send "" "reply text"` -- `agent-slack message edit "" "updated text"` -- `agent-slack message delete ""` -- `agent-slack message react add "" "eyes"` -- `agent-slack channel mark ""` - -## Channel targets (when you don’t have a URL) - -Channel references can be: - -- channel name: `general` (bare name, without `#` prefix) -- channel id: `C...` (or `G...`/`D...`) - -### `message get` by channel + `--ts` - -```bash -agent-slack message get "general" --ts "1770165109.628379" -``` - -### `message list` by channel + `--thread-ts` (or `--ts` to resolve) - -```bash -agent-slack message list "general" --thread-ts "1770165109.000001" -agent-slack message list "general" --ts "1770165109.628379" -agent-slack message list "general" --without-reaction dart --limit 20 -``` - -### Reactions by channel + `--ts` - -```bash -agent-slack message react add "general" "eyes" --ts "1770165109.628379" -``` - -### Edit/delete by channel + `--ts` - -```bash -agent-slack message edit "general" "updated text" --ts "1770165109.628379" -agent-slack message delete "general" --ts "1770165109.628379" -``` - -### Mark as read by channel + `--ts` - -```bash -agent-slack channel mark "general" --ts "1770165109.628379" -agent-slack channel mark "D0A04PB2QBW" --ts "1770165109.628379" -``` - -### Channel admin by id/name - -```bash -agent-slack channel invite --channel "general" --users "@alice,bob@example.com" -agent-slack channel invite --channel "C0123ABCDEF" --users "U01234567" -agent-slack channel invite --channel "shared-room" --users "partner@vendor.com" --external -agent-slack channel invite --channel "shared-room" --users "partner@vendor.com" --external --allow-external-user-invites -``` - -## Multi-workspace ambiguity (channel names only) - -If you have multiple workspaces configured and your target is a channel **name** (e.g. `general`), you must disambiguate: - -- pass `--workspace "https://myteam.slack.com"` (or a unique substring like `--workspace "myteam"`), or -- set `SLACK_WORKSPACE_URL` to the same selector format - -Channel IDs (`C...`/`G...`/`D...`) do not require `--workspace`. diff --git a/.claude/skills/generate-article/SKILL.md b/.agents/skills/generate-article/SKILL.md similarity index 96% rename from .claude/skills/generate-article/SKILL.md rename to .agents/skills/generate-article/SKILL.md index 93e63b40..6187cc83 100644 --- a/.claude/skills/generate-article/SKILL.md +++ b/.agents/skills/generate-article/SKILL.md @@ -10,6 +10,11 @@ description: | Even if the user just says something like "pick a keyword and write an article" or "run the content pipeline", use this skill. --- +## Repository Context + +Use this skill from the `Promptless/promptless.ai` repository. If the current checkout is different, first locate the website/docs repo, usually `~/promptless/promptless.ai`, and run commands there. If that repo is unavailable, explain that this skill requires the Promptless website repo. + + # Generate Article (Edu Campaign) Automated content pipeline for the Promptless blog. This skill replaces the `generate-article.ts` script by using Claude Code's native tools (web search, file writing, git, gh CLI, agent-slack) instead of calling the Anthropic API programmatically. diff --git a/.claude/skills/generate-article/references/style-guide.md b/.agents/skills/generate-article/references/style-guide.md similarity index 100% rename from .claude/skills/generate-article/references/style-guide.md rename to .agents/skills/generate-article/references/style-guide.md diff --git a/.claude/skills/launch-post/SKILL.md b/.agents/skills/launch-post/SKILL.md similarity index 96% rename from .claude/skills/launch-post/SKILL.md rename to .agents/skills/launch-post/SKILL.md index 42e16bfa..d1c9feb3 100644 --- a/.claude/skills/launch-post/SKILL.md +++ b/.agents/skills/launch-post/SKILL.md @@ -22,6 +22,11 @@ description: | A typical week produces zero or one post; a typical month produces 2–4. --- +## Repository Context + +Use this skill from the `Promptless/promptless.ai` repository. If the current checkout is different, first locate the website/docs repo, usually `~/promptless/promptless.ai`, and run commands there. If that repo is unavailable, explain that this skill requires the Promptless website repo. + + # Launch Post Triages recent Promptless changelog entries, picks out the ones that genuinely warrant a launch article, and writes one focused single-feature article per qualifier. @@ -48,7 +53,7 @@ There are four invocation modes. Pick the one that matches the user's request. Scan commits on the changelog directory from the last 7 days: ```bash -cd ~/dev/docs +cd ~/promptless/promptless.ai git fetch origin main git log --since="7 days ago" origin/main -- src/content/changelog/changelogs/ \ --pretty=format:'%H%x09%ai%x09%s' @@ -75,7 +80,7 @@ The user names a specific feature ("write a post for the AGENTS.md support"). Tr The user asks to backfill a specific month ("backfill March 2026", "generate launch posts for February 2026"). Scan all commits that touched the changelog directory within that calendar month: ```bash -cd ~/dev/docs +cd ~/promptless/promptless.ai git fetch origin main # Example: March 2026 git log --since="2026-03-01" --until="2026-04-01" origin/main \ @@ -224,7 +229,7 @@ For each feature, extract: - **Who benefits most** — which team type or workflow - **Any setup required** — configuration, opt-in, caveats -If a PR description is thin, check linked issues: `gh issue view {number} --repo Promptless/promptless`. The local repo at `~/dev/promptless` is available too, but `gh` on the remote is usually faster. +If a PR description is thin, check linked issues: `gh issue view {number} --repo Promptless/promptless`. The local repo at `~/promptless/promptless` is available too, but `gh` on the remote is usually faster. Don't over-research. 2–3 concrete facts is enough. diff --git a/.claude/skills/launch-post/references/launch-article-guide.md b/.agents/skills/launch-post/references/launch-article-guide.md similarity index 100% rename from .claude/skills/launch-post/references/launch-article-guide.md rename to .agents/skills/launch-post/references/launch-article-guide.md diff --git a/.claude/skills/agent-slack b/.claude/skills/agent-slack deleted file mode 120000 index 55119080..00000000 --- a/.claude/skills/agent-slack +++ /dev/null @@ -1 +0,0 @@ -../../.agents/skills/agent-slack \ No newline at end of file diff --git a/.claude/skills/generate-article b/.claude/skills/generate-article new file mode 120000 index 00000000..79518ecf --- /dev/null +++ b/.claude/skills/generate-article @@ -0,0 +1 @@ +../../.agents/skills/generate-article \ No newline at end of file diff --git a/.claude/skills/launch-post b/.claude/skills/launch-post new file mode 120000 index 00000000..3beed041 --- /dev/null +++ b/.claude/skills/launch-post @@ -0,0 +1 @@ +../../.agents/skills/launch-post \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md index bb3ab22d..86c71294 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,6 +2,10 @@ Astro + Starlight site. Deployed to Vercel. +Shared Promptless agent safety rules and reusable skills live in +`Promptless/agent-instructions` via the `promptless-internal` plugin. Keep this +file focused on website/docs repo facts. + ## Documentation Map Maintain a map of every file in `docs/` here. When you add, remove, or rename @@ -59,6 +63,15 @@ npm run test:smoke # smoke tests npm run build:diagrams # compile src/diagrams/*.mmd → public/mermaid/*.svg ``` +## Shared Agent Tools + +- Use the shared `promptless-internal` plugin for Slack, PR review, and generic + Promptless workflows. +- Website-owned content skills live in `.agents/skills/` in this repo. Use + `generate-article` and `launch-post` for the edu campaign/blog pipeline. +- Keep new repo-local skills limited to workflows that depend on this checkout's + content collections, scripts, or file layout. + ## Diagrams Mermaid diagram sources live in `src/diagrams/*.mmd`. The compiled SVGs in diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..43c994c2 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md