Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions client/lib/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ export interface QuestionRequest {
}
export interface ReminderSummary {
id: string;
title: string;
description: string;
triggers: string[];
}
Expand Down
2 changes: 1 addition & 1 deletion client/pages/Conversation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -519,7 +519,7 @@ export function ConversationPage() {
<option value="">+ reminder</option>
{reminderCatalogue.map((reminder) => (
<option key={reminder.id} value={reminder.id} title={reminder.description}>
{reminder.id}{reminder.triggers.length ? " (triggers ignored)" : ""}
{reminder.title}{reminder.triggers.length ? " (triggers ignored)" : ""}
</option>
))}
</select>
Expand Down
17 changes: 17 additions & 0 deletions reminders/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Reminder catalogue

Each `reminders/<id>/SKILL.md` is a trusted, repository-owned instruction block that the BFF can attach to one message by ID. Frontmatter is parsed as metadata and is not included in the injected reminder body.

## Origins

The imported presets are concise adaptations of skills from <https://github.com/leoncheng57/agent-skills>. Each imported file records `source_repo`, `source_path`, and the audited `source_commit`. Existing local presets without those fields are maintained directly in this repository.

## Updating imports

1. Fetch the source repository and record the full commit SHA being reviewed.
2. Diff each recorded `source_path` from its current `source_commit` to the new SHA.
3. Adapt useful behavioral changes manually; do not copy large skills wholesale or import source trigger metadata.
4. Keep reminder bodies concise, standalone, and safe for one-message attachment. Do not interpolate user content, include secrets, add destructive defaults, or require automatic merge/push behavior.
5. Update all three provenance fields and run the reminder tests plus the full repository verification suite.

Audit upstream changes for altered tool assumptions, permission behavior, shell commands, remoting/worktree safety, prompt-injection risks, and overlap with an existing preset. If an upstream skill now duplicates or weakens an existing reminder, retain the stronger existing reminder instead of adding another ID.
18 changes: 18 additions & 0 deletions reminders/ascii-diagrams/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
name: ascii-diagrams
title: Draw an ASCII Diagram
description: Replace a prose wall with a compact annotated file tree, data flow, or UI sketch when structure matters.
source_repo: https://github.com/leoncheng57/agent-skills
source_path: skills/ascii-diagrams/SKILL.md
source_commit: 8b036a41f578dc6c6307ae0a8dd2857121afcabb
---

Use a fenced monospace diagram when spatial grouping, branch points, or changed-file status communicates more clearly than prose.

- Use an annotated file tree for a change set, a vertical flow for data movement and failure points, or a box mockup for UI layout.
- Keep it at most 100 columns wide and align columns and borders.
- Use realistic names and copy. Every annotation must add information the structure cannot show.
- Mark traps at the exact step where they occur, not in detached prose.
- Prefer a table for two-axis comparisons and a numbered list for a linear sequence.

Read the finished diagram in a monospace surface before presenting it.
1 change: 1 addition & 0 deletions reminders/ask-before-scope-creep/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
name: ask-before-scope-creep
title: Ask Before Scope Creep
description: Confirm before large refactors, new dependencies, or work beyond what was asked.
---

Expand Down
14 changes: 14 additions & 0 deletions reminders/background-subagent/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
name: background-subagent
title: Delegate in the Background
description: Launch the current request as one self-contained background task, report its task ID, and do not duplicate its work.
source_repo: https://github.com/leoncheng57/agent-skills
source_path: skills/background-subagent/SKILL.md
source_commit: 8b036a41f578dc6c6307ae0a8dd2857121afcabb
---

Delegate the current request to a background subagent only when background tasks are available and the work does not require immediate back-and-forth.

Write a cold-start prompt containing the absolute working directory, objective, constraints from prior turns, whether edits are allowed, exact verification commands, and the required deliverable. Choose an installed agent type rather than guessing one.

After launch, report the task type and task ID, then stop. Do not poll, duplicate the investigation, or edit the same files while it runs. Relay the result when completion is reported. If background execution is unavailable, say so instead of silently substituting a blocking foreground task.
14 changes: 14 additions & 0 deletions reminders/build-waves/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
name: build-waves
title: Build in Verified Waves
description: Execute a large build as durable sequential waves, overlap only disjoint research, and stop after final verification.
source_repo: https://github.com/leoncheng57/agent-skills
source_path: skills/build-waves/SKILL.md
source_commit: 8b036a41f578dc6c6307ae0a8dd2857121afcabb
---

Turn the work into a durable queue of sequential waves with explicit ownership, dependencies, outputs, and acceptance checks. Record the plan and decisions in files or the task list so compaction or a resumed session does not lose them.

Use background agents primarily for read-only research on the next wave while the parent implements the current wave. Never run tasks concurrently when they may edit the same file, regenerate the same artifact, bind the same port, or mutate shared state.

Plan verification as the final wave before implementation starts. Continue through queued waves without asking for routine approval. Stop only for a real user decision, a failure that requires a bounded fix wave, or completion of all required verification. Leave merge and push actions to explicit user requests.
1 change: 1 addition & 0 deletions reminders/cite-file-lines/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
name: cite-file-lines
title: Cite File Lines
description: Reference code as file_path:line_number so the user can jump straight to it.
---

Expand Down
1 change: 1 addition & 0 deletions reminders/conventional-commits/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
name: conventional-commits
title: Conventional Commits
description: Write conventional-commit subjects — feat:, fix:, docs:, ci: — matching the repo history.
---

Expand Down
14 changes: 14 additions & 0 deletions reminders/deep-research-subagents/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
name: deep-research-subagents
title: Deep Research with Subagents
description: Split one broad research question across non-overlapping read-only agents and synthesize a cited answer.
source_repo: https://github.com/leoncheng57/agent-skills
source_path: skills/deep-research-subagents/SKILL.md
source_commit: 8b036a41f578dc6c6307ae0a8dd2857121afcabb
---

Use 3-5 parallel read-only subagents only when one question spans several independent areas and would consume substantial main-session context. Split by artifact, repository, package, or evidence source so agents do not repeat the same search.

Give every agent a self-contained scope, numbered questions, explicit exclusions, a concise deliverable, and a requirement to cite file:line or source URLs. Require an UNVERIFIED section instead of guesses.

Synthesize rather than concatenate: answer the original question first, reconcile conflicts, preserve citations, merge verification gaps, and spot-check one load-bearing claim from each report. Do not delegate a small lookup, sequential investigation, or shared-state mutation.
17 changes: 17 additions & 0 deletions reminders/docs-and-diagram-tooling/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
name: docs-and-diagram-tooling
title: Choose Documentation Visuals
description: Choose prose, lists, tables, ASCII, Mermaid, or rendered images based on structure and where readers will view the document.
source_repo: https://github.com/leoncheng57/agent-skills
source_path: skills/docs-and-diagram-tooling/SKILL.md
source_commit: 8b036a41f578dc6c6307ae0a8dd2857121afcabb
---

Choose the documentation medium from both the information shape and the reader's surface.

- Use prose for reasoning, numbered lists for linear procedures, and tables for comparisons.
- Use ASCII for terminals, comments, prompts, and review surfaces where rendering is uncertain.
- Use Mermaid only where the target renders it; use SVG or another fixed image for external documents and slides.
- Do not maintain duplicate versions of one diagram.

Read a nearby document to match house style. Cite the code or source being described, state important limitations, and preview or render the result with available tooling before claiming it works.
4 changes: 4 additions & 0 deletions reminders/duck-mode/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
---
name: duck-mode
title: Duck Mode
description: Wrap every assistant reply in lines of duck emojis. Use when the user says "duck mode", "enable duck mode", "turn on the ducks", or asks for every response to be bracketed by 🦆🦆🦆. Also the repo's worked example of the smallest possible skill, and of when a skill is the wrong mechanism.
source_repo: https://github.com/leoncheng57/agent-skills
source_path: skills/duck-mode/SKILL.md
source_commit: 8b036a41f578dc6c6307ae0a8dd2857121afcabb
---

# Duck mode
Expand Down
14 changes: 14 additions & 0 deletions reminders/grill-me/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
name: grill-me
title: Grill the Design
description: Interview the user in rounds until every branch of a plan or design decision tree is settled.
source_repo: https://github.com/leoncheng57/agent-skills
source_path: skills/grill-me/SKILL.md
source_commit: 8b036a41f578dc6c6307ae0a8dd2857121afcabb
---

Map the plan or design as a decision tree. In each round, ask every currently answerable decision question, number the questions, state concrete options, and give a recommended answer with rationale. Stop and wait for the user's answers before asking questions that depend on them.

Look up environmental facts yourself; ask the user only for decisions. Challenge answers you believe are unsafe or inconsistent rather than accepting them silently.

Finish only when the decision frontier is empty. Summarize the agreed decisions and remaining tradeoffs, ask the user to confirm them, and do not begin implementation until they do.
14 changes: 14 additions & 0 deletions reminders/human-verification-steps/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
name: human-verification-steps
title: Write Human Verification Steps
description: Produce a short executable checklist that verifies completed behavior from a user's perspective.
source_repo: https://github.com/leoncheng57/agent-skills
source_path: skills/human-verification-steps/SKILL.md
source_commit: 8b036a41f578dc6c6307ae0a8dd2857121afcabb
---

Run the repository's relevant automated checks before asking a human to test. If required automation fails, report the failure and stop rather than sending someone to verify a red build.

Then write 5-12 high-information manual steps based on the actual diff, routes, commands, fixtures, and environment. Every step must specify the action, expected user-visible result, and observable failure signal. Include only relevant boundaries such as keyboard access, mobile width, empty/error states, invalid input, refresh, permissions, or deployment health.

Classify executed checks as VERIFIED, FAILED, or UNVERIFIED without treating screenshots or partial evidence as proof of interaction. End with one explicit disposition: ready to ship, fixes required, partially verified, or blocked on human access.
1 change: 1 addition & 0 deletions reminders/no-force-push/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
name: no-force-push
title: No Force Push
description: Never force-push, rewrite shared history, or amend a commit that has been pushed.
---

Expand Down
4 changes: 4 additions & 0 deletions reminders/parallel-research-handoff/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
---
name: parallel-research-handoff
title: Parallel Research Handoff
description: Research several independent feature ideas in parallel with read-only subagents, compile the findings into self-contained handoff prompts, and fire those prompts off as parallel agent sessions in fresh git worktrees. Use when the user drops a list of 2+ unrelated tasks and wants them researched and then handed to other agents, says "research these with subagents", "spin these up in parallel", "give me prompts I can paste into other agents", "use N worktrees", or asks whether many subagents are good for research.
source_repo: https://github.com/leoncheng57/agent-skills
source_path: skills/parallel-research-handoff/SKILL.md
source_commit: 8b036a41f578dc6c6307ae0a8dd2857121afcabb
---

# Parallel research → handoff prompts → multi-session fire-off
Expand Down
14 changes: 14 additions & 0 deletions reminders/red-team-this/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
name: red-team-this
title: Red-Team This
description: Switch sides and attack the preceding plan, design, or diff with evidence-ranked objections and a verdict.
source_repo: https://github.com/leoncheng57/agent-skills
source_path: skills/red-team-this/SKILL.md
source_commit: 8b036a41f578dc6c6307ae0a8dd2857121afcabb
---

Explicitly switch from author to adversarial reviewer. Test six objection classes: wrong problem, cheaper alternative, hidden coupling, operational cost, reversibility, and an unchecked load-bearing assumption.

Ground every main objection in file:line, command output, or a source URL. Put unsupported hypotheses in a separate SPECULATIVE section. Rank grounded objections by likelihood, cost if true, and how cheaply they can be checked now.

Do not pad the review with praise for the artifact. Close with the single cheapest experiment that could invalidate the approach and one verdict: proceed, proceed-with-change, or stop.
14 changes: 14 additions & 0 deletions reminders/session-handoff/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
name: session-handoff
title: Hand Off to a New Session
description: Launch one standalone session with an explicit cold-start packet, runtime settings, ownership, and stop condition.
source_repo: https://github.com/leoncheng57/agent-skills
source_path: skills/session-handoff/SKILL.md
source_commit: 8b036a41f578dc6c6307ae0a8dd2857121afcabb
---

A new session inherits nothing automatically. Create a self-contained handoff packet with the absolute repository and worktree path, branch, objective, completed progress, settled decisions and rationale, file ownership, requested agent/model, permission posture, exact verification, stop condition, and an UNVERIFIED list.

Verify the destination worktree and branch before allowing edits. Pass runtime settings explicitly; prose does not activate Plan mode or select a model. Never include secrets in prompt text or process arguments, never enable automatic permission approval unless the user requested it, and do not let parent and child edit overlapping files.

After launch, verify the requested working directory and settings, report the child session, then stop doing its assigned work.
1 change: 1 addition & 0 deletions reminders/verify-before-claiming/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
name: verify-before-claiming
title: Verify Before Claiming
description: Distinguish what was verified from what was inferred; never assert unread behaviour.
---

Expand Down
14 changes: 14 additions & 0 deletions reminders/worktree-up/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
name: worktree-up
title: Create a Safe Worktree
description: Create a sibling git worktree from the current remote default branch, install dependencies, and check shared resources.
source_repo: https://github.com/leoncheng57/agent-skills
source_path: skills/worktree-up/SKILL.md
source_commit: 8b036a41f578dc6c6307ae0a8dd2857121afcabb
---

Before writing code on a shared branch, fetch the remote and create a sibling worktree at `<repo>.worktrees/<topic>` on a dedicated `<type>/<topic>` branch cut from `origin/<default>`, never a stale local default branch. If the branch is already checked out elsewhere, use that worktree instead of bypassing Git's refusal.

Install dependencies and copy only required gitignored local configuration, reviewing relative paths. Run the repository's baseline checks before editing. Before starting servers or stacks, inspect fixed ports and shared state and verify which process owns an occupied port; only one worktree may use a conflicting resource.

Report the absolute worktree path, branch, source commit, dependency state, baseline result, and resource constraints. Never push the default branch or force-push.
39 changes: 35 additions & 4 deletions server/reminders/reminders.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,29 @@
/** OpenCode skill-name contract, reused so every preset is a valid skill directory. */
export const REMINDER_ID_RE = /^[a-z0-9]+(-[a-z0-9]+)*$/;
export const REMINDER_ID_MAX = 255;
export const REMINDER_TITLE_MAX = 100;
export const REMINDER_DESCRIPTION_MAX = 1_000;
export const REMINDER_BODY_MAX = 24_000;

export interface ReminderSource {
repo: string;
path: string;
commit: string;
}

export interface ReminderPreset {
id: string;
title: string;
description: string;
body: string;
source?: ReminderSource;
/** Parsed for visibility but deliberately ignored by per-message injection. */
triggers: string[];
}

export function parseReminderMarkdown(id: string, source: string): ReminderPreset | null {
export function parseReminderMarkdown(id: string, markdown: string): ReminderPreset | null {
if (!isValidReminderId(id)) return null;
const match = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/.exec(source.replace(/^\uFEFF/, ""));
const match = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/.exec(markdown.replace(/^\uFEFF/, ""));
if (!match) return null;

const [, frontmatter, rest] = match;
Expand All @@ -39,10 +50,30 @@ export function parseReminderMarkdown(id: string, source: string): ReminderPrese
}

const body = rest.trim();
const title = (scalars.title ?? id.split("-").map(capitalize).join(" ")).trim();
const description = (scalars.description ?? "").trim();
if (scalars.name !== undefined && scalars.name.trim() !== id) return null;
if (body === "" || description === "") return null;
return { id, description, body, triggers };
if (
body === "" || body.length > REMINDER_BODY_MAX
|| title === "" || title.length > REMINDER_TITLE_MAX
|| description === "" || description.length > REMINDER_DESCRIPTION_MAX
) return null;

const sourceFields = [scalars.source_repo, scalars.source_path, scalars.source_commit];
if (sourceFields.some((value) => value !== undefined) && sourceFields.some((value) => !value)) return null;
if (sourceFields[0] && (
!/^https:\/\/[^\s]+$/.test(sourceFields[0])
|| !/^skills\/[a-z0-9][a-z0-9-]*\/SKILL\.md$/.test(sourceFields[1]!)
|| !/^[0-9a-f]{40}$/.test(sourceFields[2]!)
)) return null;
const provenance = sourceFields[0]
? { repo: sourceFields[0], path: sourceFields[1]!, commit: sourceFields[2]! }
: undefined;
return { id, title, description, body, triggers, source: provenance };
}

function capitalize(value: string): string {
return value.length ? value[0].toUpperCase() + value.slice(1) : value;
}

function unquote(value: string): string {
Expand Down
3 changes: 2 additions & 1 deletion server/routes/reminders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ export function reminderRoutes(): Router {
const router = Router();
router.get("/reminders", (_req, res) => {
res.json({
reminders: reminderCatalogue().map(({ id, description, triggers }) => ({
reminders: reminderCatalogue().map(({ id, title, description, triggers }) => ({
id,
title,
description,
triggers,
})),
Expand Down
1 change: 1 addition & 0 deletions tests/e2e/smoke.api.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -571,6 +571,7 @@ test.describe("prompting", () => {
expect(payload.reminders.length).toBeGreaterThan(0);
expect(payload.reminders[0]).toEqual(expect.objectContaining({
id: expect.any(String),
title: expect.any(String),
description: expect.any(String),
triggers: expect.any(Array),
}));
Expand Down
Loading
Loading