Appends an ASD-STE100 reminder line to every third prompt you type

This repo holds our global agent instructions (AGENTS.md), our skills (.agents/skills/, first-party plus npx-vendored third-party with skills-lock.json pins), and sync-global.sh which symlinks both to every agent location. See MAPPINGS.md for where everything links.
Note: prompts/ is legacy and no longer synced. Three prompts moved into skills (gitlab-issue, orchestrator, read-only). Call them explicitly with /skill-name.
Add a third-party skill:
npx skills add <repo> --skill <name> -a universal
./sync-global.sh
Create a new first-party skill:
npx skills init .agents/skills/<skill-name>
Update all skills from the lockfile:
npx skills update
Commit the changed skill directories and skills-lock.json.
Pi packages (pi-packages.txt) are the global pi extension list. Install them:
./install-pi-packages.sh
Add or remove a package with pi install / pi remove, then update pi-packages.txt to match.
hooks/register.ts 22 lines1import type { Register } from 'claude-code'
2
3const EVERY = 3
4const REMINDER = 'reminder: respond in ASD-STE100'
5// The terminal sends 'composer'. An SDK host (stream-json stdin) sends 'sdk'. Automatic prompts do not get the reminder.
6const TYPED_ORIGINS = new Set(['composer', 'sdk'])
7
8// The reminder goes in a context block after the prompt. The model reads it, but the transcript keeps the prompt
9// as typed. The system prompt and earlier messages stay the same, so the prompt cache still matches.
10export const register: Register = on => {
11 on('prompt.submit', async ($, e, next) => {
12 if (!TYPED_ORIGINS.has(e.origin.kind)) return next(e)
13
14 // The engine reads the count from the transcript, so it stays correct after a reload or a --resume.
15 // The count does not include this prompt.
16 const prompt = (await $.session.turns()) + 1
17 if (prompt % EVERY !== 0) return next(e)
18
19 return next({ ...e, context: [...(e.context ?? []), REMINDER] })
20 })
21}
22