.cursor/skills/add-traffic-sign/SKILL.md
# Add German Traffic Sign This skill teaches the agent how to research and implement a new German traffic sign into the OSM Traffic Sign Tools project, ensuring data accuracy and SVG optimization. ## When to use this skill - User provides a GitHub issue about a missing traffic sign. - User asks to add a specific German traffic sign (e.g., "add sign 1049-13"). - User mentions implementing a new Verkehrszeichen, Zusatzzeichen. - Keywords: "Verkehrszeichen", "Zusatzzeichen", "Gefahrzeichen", "Vo
npx skillsauth add osmberlin/osm-traffic-sign-tool .cursor/skills/add-traffic-signInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill teaches the agent how to research and implement a new German traffic sign into the OSM Traffic Sign Tools project, ensuring data accuracy and SVG optimization.
274, 1040-30).https://commons.wikimedia.org/wiki/File:Zeichen_274.svg), NOT a direct link to a rendered PNG.uniqueTags, accessTags, and highwayValues.Select the correct file in packages/traffic-sign-converter/src/data-definitions/DE/data/:
hazard.ts, infrastructure.ts, traffic_ban.ts, speed_*.ts, overtaking.ts, notice.ts, exceptions_*.ts, conditions_*.ts, surface.ts, numbers.ts.Reference packages/traffic-sign-converter/src/data-definitions/TrafficSignDataTypes.ts for schema.
{
osmValuePart: '274',
signId: '274',
name: 'Zeichen 274',
descriptiveName: 'Zulässige Höchstgeschwindigkeit',
kind: 'traffic_sign',
tagRecommendations: {
uniqueTags: [{ key: 'maxspeed', value: '$' }],
highwayValues: ['residential'],
},
valuePrompt: {
prompt: 'Geschwindigkeit',
defaultValue: '50',
format: 'integer'
},
catalogue: {
visibility: 'highlight', // See Visibility Decision Guide
signCategory: 'speed',
},
image: {
sourceUrl: 'https://...',
licence: 'Public Domain' // or 'CC-0'
},
}
Some signs use free text identifiers instead of official numeric IDs (e.g., "Gehwegschäden", "Kleinkrafträder frei", "Kfz-Verkehr frei"). These are typically non-standard or descriptive signs.
Rules for free text sign IDs:
osmValuePart and signId must include quotes around the text.DE:Kleinkrafträder frei instead of DE:"Kleinkrafträder frei"). Add a redirect to handle this:{
osmValuePart: '"Kleinkrafträder frei"',
signId: '"Kleinkrafträder frei"',
redirects: [{ from: 'Kleinkrafträder frei', to: '"Kleinkrafträder frei"' }],
// ...
}
Some signs exist in multiple variants with different values (e.g., speed zones, incline percentages). These use bracket notation [value] for flexibility combined with explicit IDs for common values.
Use when the sign has many possible values but only a few common explicit IDs exist. Add the most common values as explicit IDs and uncommon values with brackets. Add redirects for all official IDs so the tool redirects them to the bracket notation.
Example: Sign 110 (Steigung / Incline)
// 1. Bracket sign with valuePrompt (catch-all for any value)
{
osmValuePart: '110[10]',
signId: '110',
signValue: 10,
valuePrompt: {
prompt: 'Steigung in Prozent ohne Einheit',
defaultValue: '10',
format: 'integer',
},
redirects: [
{ from: '110-11', to: '110[11]' }, // Less common explicit IDs redirect to bracket
{ from: '110-12', to: '110[12]' },
// ... etc for uncommon values
],
// ... other fields
}
// 2. Common explicit ID signs (NO redirects on these)
{
osmValuePart: '110-10',
signId: '110-10',
// NO redirects property - stays as explicit ID
// ... other fields
}
Use when a specific bracket value should normalize to an explicit ID.
Example: Sign 274.1 (Tempo-Zone)
// 1. Bracket sign with valuePrompt (for non-30 values)
{
osmValuePart: '274.1[47]',
signId: '274.1',
signValue: 47,
valuePrompt: {
prompt: 'Geschwindigkeit in km/h ohne Einheit',
defaultValue: '47',
format: 'integer',
},
// NO redirects here
}
// 2. Explicit ID for common value (WITH redirect from bracket)
{
osmValuePart: '274.1',
signId: '274.1',
redirects: [{ from: '274.1[30]', to: '274.1' }], // Bracket value redirects to explicit
// ... other fields
}
If the research in Step 1 revealed special tagging logic when this sign is combined with others (e.g., specific access tag overrides or complex conditional tagging), add a test case in packages/traffic-sign-converter/src/signsToTags/signsToTags.test.ts.
test('Merged access tags for specific combination', () => {
const signs = signsStateByDescriptiveName('DE', data, ['Sign Name A', 'Sign Name B'])
const result = signsToTags(signs, 'DE')
expect(result.get('vehicle')).toBe('destination')
})
Analyze sign frequency:
'highlight': Common signs (speed limits, parking, bike lanes, stop signs).'search_only': Rare, specialized, deprecated, or object-marking signs (guide posts, lamp markers).bun script-new-svg.ts from root (uses incremental mode - only downloads new SVGs).packages/internal_svgs/src/download-errors/downloadErrors_DE.json.read_lints tool to check for TypeScript errors in the modified file.Note: For full refresh of all SVGs (re-downloads everything), use bun script-refresh-all-svg.ts manually when needed.
cd apps/traffic-sign-tool && pnpm run dev (runs on port 3001).http://localhost:3001/?signs=DE:<ID>.Output ONLY this format:
**Signs added:**
- [ ] **DE:<ID> - <Descriptive Name>**
Dev: http://localhost:3001/?signs=DE:<ID>
Prod: https://trafficsigns.osm-verkehrswende.org/?signs=DE:<ID>
**Relevant combinations:**
- [ ] **DE:<ID>,DE:<MODIFIER_ID>**
Dev: http://localhost:3001/?signs=DE:<ID>,DE:<MODIFIER_ID>
Prod: https://trafficsigns.osm-verkehrswende.org/?signs=DE:<ID>,DE:<MODIFIER_ID>
tagRecommendations is provided (use {} if empty).sourceUrl points to a Wikimedia File: page.packages/traffic-sign-converter/src/data-definitions/DE/trafficSignDataDE.ts.tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
A CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.