feat: repeatable mechanical method for patterns mode
5 steps: Quantify → Extract one → Decision tree → Cross-refs → Hyperlinks. Delegation strategy (per-entry, not per-file). Discovery greps for Go, Elixir, Rust, Python. Hyperlink scripts per language.
This commit is contained in:
@@ -124,3 +124,166 @@ git config user.email "<your-email>"
|
||||
# ... add files ...
|
||||
git add -A && git commit -m "docs: initial conventions from <org>/<project>" && git push
|
||||
```
|
||||
|
||||
## Patterns Mode: Step 1 Discovery Greps
|
||||
|
||||
Run these per topic to get pattern names + counts. Adapt to your
|
||||
language. The goal is a numbered list of patterns to write entries for.
|
||||
|
||||
### Go
|
||||
|
||||
```bash
|
||||
# Error handling
|
||||
grep -rn "^var Err" --include="*.go" | grep -v test | grep -v vendor | grep -v internal | grep -v cmd | wc -l
|
||||
grep -rn "fmt.Errorf.*%w" --include="*.go" | grep -v test | grep -v vendor | wc -l
|
||||
grep -rn "errors\.Is\|errors\.As" --include="*.go" | grep -v test | grep -v vendor | wc -l
|
||||
grep -rn "errors\.Join" --include="*.go" | grep -v test | grep -v vendor | wc -l
|
||||
grep -rn "func.*Error() string" --include="*.go" | grep -v test | grep -v vendor | grep -v internal | wc -l
|
||||
|
||||
# Interfaces
|
||||
grep -rn "type.*interface {" --include="*.go" | grep -v test | grep -v vendor | grep -v internal | grep -v cmd | wc -l
|
||||
grep -rn "var _.*=" --include="*.go" | grep -v test | grep -v vendor | wc -l
|
||||
|
||||
# Testing
|
||||
grep -rn "t\.Run(" --include="*.go" | grep -v vendor | wc -l
|
||||
grep -rn "t\.Helper()" --include="*.go" | grep -v vendor | wc -l
|
||||
grep -rn "func Example" --include="*.go" | grep -v vendor | wc -l
|
||||
grep -rn "func TestMain" --include="*.go" | grep -v vendor | wc -l
|
||||
grep -rn "func Benchmark" --include="*.go" | grep -v vendor | wc -l
|
||||
find . -name "testdata" -type d | grep -v vendor | wc -l
|
||||
grep -rn "func Fuzz" --include="*.go" | grep -v vendor | wc -l
|
||||
|
||||
# Concurrency
|
||||
grep -rn "sync\.Mutex\|sync\.RWMutex" --include="*.go" | grep -v test | grep -v vendor | grep -v internal | wc -l
|
||||
grep -rn "sync\.Once" --include="*.go" | grep -v test | grep -v vendor | grep -v internal | wc -l
|
||||
grep -rn "sync\.Pool" --include="*.go" | grep -v test | grep -v vendor | grep -v internal | wc -l
|
||||
grep -rn "context\.Context" --include="*.go" | grep -v test | grep -v vendor | grep -v internal | wc -l
|
||||
grep -rn "sync\.WaitGroup" --include="*.go" | grep -v test | grep -v vendor | grep -v internal | wc -l
|
||||
|
||||
# Naming/Style
|
||||
grep -rn "^func New" --include="*.go" | grep -v test | grep -v vendor | grep -v internal | grep -v cmd | wc -l
|
||||
grep -rn "func.*) Get[A-Z]" --include="*.go" | grep -v test | grep -v vendor | grep -v internal | wc -l
|
||||
find . -name "doc.go" | grep -v vendor | grep -v internal | wc -l
|
||||
grep -rn "Deprecated:" --include="*.go" | grep -v test | grep -v vendor | wc -l
|
||||
|
||||
# Configuration
|
||||
grep -rn "^func With" --include="*.go" | grep -v test | grep -v vendor | grep -v internal | grep -v cmd | wc -l
|
||||
grep -rn "type.*Config struct\|type.*Options struct" --include="*.go" | grep -v test | grep -v vendor | wc -l
|
||||
grep -rn "^var Default\|^func Default" --include="*.go" | grep -v test | grep -v vendor | grep -v internal | wc -l
|
||||
grep -rn "^func Register" --include="*.go" | grep -v test | grep -v vendor | grep -v internal | wc -l
|
||||
|
||||
# Performance
|
||||
grep -rn "sync\.Pool" --include="*.go" | grep -v test | grep -v vendor | grep -v internal | wc -l
|
||||
grep -rn "func.*Append[A-Z]" --include="*.go" | grep -v test | grep -v vendor | grep -v internal | wc -l
|
||||
grep -rn "make(\[\].*,.*," --include="*.go" | grep -v test | grep -v vendor | grep -v internal | wc -l
|
||||
```
|
||||
|
||||
### Elixir
|
||||
|
||||
```bash
|
||||
# Error handling
|
||||
grep -rn "defexception" --include="*.ex" | wc -l
|
||||
grep -rn "{:ok,\|{:error," --include="*.ex" | grep -v test | wc -l
|
||||
grep -rn "raise\|reraise" --include="*.ex" | grep -v test | wc -l
|
||||
grep -rn "rescue" --include="*.ex" | grep -v test | wc -l
|
||||
|
||||
# Protocols/Behaviours
|
||||
grep -rn "defprotocol" --include="*.ex" | wc -l
|
||||
grep -rn "@callback" --include="*.ex" | wc -l
|
||||
grep -rn "@behaviour" --include="*.ex" | wc -l
|
||||
grep -rn "defimpl" --include="*.ex" | wc -l
|
||||
|
||||
# Testing
|
||||
grep -rn "describe\|test " --include="*.exs" | wc -l
|
||||
grep -rn "assert\|refute" --include="*.exs" | wc -l
|
||||
grep -rn "setup\|setup_all" --include="*.exs" | wc -l
|
||||
grep -rn "ExUnit.CaseTemplate" --include="*.ex" | wc -l
|
||||
grep -rn "doctest" --include="*.exs" | wc -l
|
||||
|
||||
# Process/OTP
|
||||
grep -rn "use GenServer\|use Agent\|use Supervisor" --include="*.ex" | wc -l
|
||||
grep -rn "GenServer.call\|GenServer.cast" --include="*.ex" | grep -v test | wc -l
|
||||
grep -rn "DynamicSupervisor\|Registry" --include="*.ex" | grep -v test | wc -l
|
||||
|
||||
# Documentation/Types
|
||||
grep -rn "@moduledoc" --include="*.ex" | wc -l
|
||||
grep -rn "@doc" --include="*.ex" | wc -l
|
||||
grep -rn "@spec" --include="*.ex" | wc -l
|
||||
grep -rn "@type\|@typep\|@opaque" --include="*.ex" | wc -l
|
||||
grep -rn "defguard" --include="*.ex" | wc -l
|
||||
|
||||
# Macros/Metaprogramming
|
||||
grep -rn "defmacro" --include="*.ex" | wc -l
|
||||
grep -rn "quote do" --include="*.ex" | wc -l
|
||||
grep -rn "__using__\|__before_compile__" --include="*.ex" | wc -l
|
||||
```
|
||||
|
||||
### Rust
|
||||
|
||||
```bash
|
||||
# Error handling
|
||||
grep -rn "Result<" --include="*.rs" | grep -v test | wc -l
|
||||
grep -rn "impl.*Error" --include="*.rs" | grep -v test | wc -l
|
||||
grep -rn "#\[derive.*thiserror" --include="*.rs" | wc -l
|
||||
grep -rn "anyhow\|eyre" --include="*.rs" | wc -l
|
||||
|
||||
# Traits
|
||||
grep -rn "pub trait" --include="*.rs" | grep -v test | wc -l
|
||||
grep -rn "impl.*for" --include="*.rs" | grep -v test | wc -l
|
||||
|
||||
# Testing
|
||||
grep -rn "#\[test\]" --include="*.rs" | wc -l
|
||||
grep -rn "#\[cfg(test)\]" --include="*.rs" | wc -l
|
||||
grep -rn "proptest\|quickcheck" --include="*.rs" | wc -l
|
||||
|
||||
# Async
|
||||
grep -rn "async fn" --include="*.rs" | grep -v test | wc -l
|
||||
grep -rn "\.await" --include="*.rs" | grep -v test | wc -l
|
||||
grep -rn "tokio\|async-std" --include="*.rs" | wc -l
|
||||
```
|
||||
|
||||
### Python
|
||||
|
||||
```bash
|
||||
# Error handling
|
||||
grep -rn "raise " --include="*.py" | grep -v test | wc -l
|
||||
grep -rn "class.*Exception\|class.*Error" --include="*.py" | wc -l
|
||||
grep -rn "except " --include="*.py" | grep -v test | wc -l
|
||||
|
||||
# Types
|
||||
grep -rn "def.*->" --include="*.py" | grep -v test | wc -l
|
||||
grep -rn "@dataclass\|@attrs" --include="*.py" | wc -l
|
||||
grep -rn "Protocol\|ABC" --include="*.py" | wc -l
|
||||
|
||||
# Testing
|
||||
grep -rn "def test_" --include="*.py" | wc -l
|
||||
grep -rn "@pytest.fixture" --include="*.py" | wc -l
|
||||
grep -rn "@pytest.mark.parametrize" --include="*.py" | wc -l
|
||||
```
|
||||
|
||||
## Patterns Mode: Step 5 Hyperlink Script
|
||||
|
||||
```bash
|
||||
# Generic hyperlink conversion script
|
||||
# Adapt OWNER, REPO, HEAD, and source path format to your language
|
||||
|
||||
HEAD=$(git rev-parse HEAD)
|
||||
BASE="https://github.com/OWNER/REPO/blob/${HEAD}"
|
||||
|
||||
# Go: `src/path/file.go:NN` or `src/path/file.go` lines NN
|
||||
for f in patterns/*.md; do
|
||||
sed -i -E "s|\`src/([^:\`]+):([0-9]+)(-[0-9]+)?\`|[src/\\1#L\\2](${BASE}/src/\\1#L\\2)|g" "$f"
|
||||
sed -i -E "s|\`src/([^\`]+)\` lines? ([0-9]+)[\x{2013}-]([0-9]+)|[src/\\1#L\\2](${BASE}/src/\\1#L\\2)|g" "$f"
|
||||
done
|
||||
|
||||
# Elixir: `lib/elixir/lib/something.ex` lines NN
|
||||
for f in patterns/*.md; do
|
||||
sed -i -E "s|\`(lib/[^:\`]+\\.ex[s]?):([0-9]+)(-[0-9]+)?\`|[\\1#L\\2](${BASE}/\\1#L\\2)|g" "$f"
|
||||
sed -i -E "s|\`(lib/[^\`]+\\.ex[s]?)\` lines? ([0-9]+)|[\\1#L\\2](${BASE}/\\1#L\\2)|g" "$f"
|
||||
done
|
||||
|
||||
# Rust: `src/path/file.rs:NN`
|
||||
for f in patterns/*.md; do
|
||||
sed -i -E "s|\`(src/[^:\`]+\\.rs):([0-9]+)(-[0-9]+)?\`|[\\1#L\\2](${BASE}/\\1#L\\2)|g" "$f"
|
||||
done
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user