Languages
spec-sync speaks
your stack.
12 languages, auto-detected from file extensions, one
*.spec.md format. Drop
specsync check into any CI
and it figures out the rest.
Native
4Rust
Regex🦀 Tracks every pub and pub(crate) declaration. Strips strings and comments first to kill false positives.
.rs Go
Regex🐹 Uppercase = exported. Catches functions, methods, types, vars, and consts at the top level.
.go Swift
Regex🦅 Catches public and open declarations. Collapses multiple public inits into a single init symbol per type.
.swift Dart
Regex🎯 Leading underscore = private; everything else is fair game. Catches classes, mixins, enums, and top-level fns.
.dart Managed
4TypeScript / JS
AST📘 Catches every TS/JS export including re-exports and barrel files. Skips .d.ts and tests automatically.
.ts.tsx.js.jsx Kotlin
Regex🟪 Everything public by default. Skips private, internal, and protected. Companion objects stay out.
.kt.kts Java
Regex☕ Detects public types and members across classes, interfaces, enums, and records. Generics included.
.java C#
Regex💎 Detects public types and members including nullable, async, and array signatures. XML doc-safe.
.cs Dynamic
3Python
Regex🐍 Respects __all__ when present; falls back to top-level defs and classes without underscore prefixes.
.py PHP
Regex🐘 Types always in; functions and constants unless private or protected. Magic methods always out.
.php Ruby
Regex🔴 Tracks public/private visibility as it scans. Methods before a private marker are public. initialize excluded.
.rb Markup
1One spec, any stack
Whatever the language, the contract is the same markdown. spec-sync detects the
public surface, matches it against the ## Public API
table, and fails CI on drift.
$ specsync check
✓ auth.spec.md rust · 4 symbols matched
✓ client.spec.md typescript · 7 symbols matched
✗ worker.spec.md python · `run_job` documented, missing from code
→ 1 error, 0 warnings
Don't see your stack?
The detection rules are open. Request a language, or read how each detector works in the docs.