Skip to content

Commit 8c4688e

Browse files
committed
feat: add validation scripts for repository structure and quality checks
- Implemented PowerShell script `validate_repo.ps1` to validate example packs for directory structure, language coverage, README quality, index integrity, and solver correctness. - Added Python script `validate_repo.py` with similar functionality, including command-line arguments for verbose output and JSON formatting. - Updated README files in `webhook-endpoint-monitoring-captcha-callbacks` and `zapier-captchaai-no-code-automation` to fix mojibake characters and improve formatting.
1 parent ad521a5 commit 8c4688e

314 files changed

Lines changed: 2609 additions & 1574 deletions

File tree

  • .github/workflows
  • articles
    • abstract-captcha-solver-provider-agnostic
    • academic-research-scraping-captcha-solving
    • ad-verification-captcha-handling
    • aiohttp-captchaai-async
    • airline-fare-monitoring-captcha-handling
    • airtable-captchaai-database-captcha
    • android-espresso-captcha-testing
    • ansible-captchaai-worker-deployment
    • apify-captchaai-cloud-scraping-integration
    • arabic-rtl-captcha-handling
    • async-captcha-solving-python-asyncio
    • auction-site-monitoring-captcha-handling
    • auto-scaling-captcha-solving-workers
    • automated-form-submission-captcha-handling
    • automated-login-captcha-handling
    • automation-bot-captcha-handling
    • aws-lambda-captchaai-serverless-captcha
    • aws-sns-captchaai-event-driven-captcha
    • axios-captchaai-no-browser
    • azure-functions-captchaai-cloud-integration
    • backpressure-handling-captcha-solving-queues
    • bash-curl-captchaai-shell-automation
    • batch-captcha-cost-estimation-budget-alerts
    • batch-captcha-solving-multiple-tasks
    • batch-image-captcha-solving-1000-images
    • batch-recaptcha-solving-form-pipelines
    • bls-captcha-government-portals-handling
    • bls-captcha-image-order-grid-response-handling
    • bls-captcha-instructions-code-parameter-deep-dive
    • bls-captcha-instructions-code-solving
    • blue-green-deployment-captcha-solving
    • bright-data-captchaai-proxy-integration
    • browser-console-captcha-detection-sitekeys-parameters
    • build-automated-testing-pipeline-captchaai
    • build-competitor-analysis-dashboard-captchaai
    • build-content-change-monitoring-bot-captchaai
    • build-job-listing-aggregator-captchaai
    • build-lead-generation-pipeline-captchaai
    • build-multi-site-data-aggregation-captchaai
    • build-price-comparison-bot-python-captchaai
    • build-review-monitoring-system-captchaai
    • building-captcha-solving-queue-nodejs
    • building-captcha-solving-queue-python
    • building-captchaai-usage-dashboard-monitoring
    • building-client-captcha-pipelines-captchaai
    • building-custom-scraping-framework-captchaai
    • building-go-client-captchaai-api
    • building-nodejs-sdk-captchaai-api
    • building-php-composer-package-captchaai
    • bulkhead-pattern-captcha-solving-isolation
    • caching-captcha-tokens-reuse-guide
    • captcha-automation-scripts
    • captcha-chains-sequential-multi-step-forms
    • captcha-detection-scraping-explained
    • captcha-event-bus-nodejs-captchaai
    • captcha-handling-continuous-integration-testing
    • captcha-handling-django-captchaai
    • captcha-handling-flask-captchaai
    • captcha-handling-mobile-appium
    • captcha-handling-registration-flow-testing
    • captcha-handling-sneaker-bot-automation
    • captcha-image-preprocessing-better-solve-rates
    • captcha-popup-modal-detection-injection
    • captcha-retry-queue-exponential-backoff
    • captcha-scraping-nodejs-tutorial
    • captcha-scraping-python-guide
    • captcha-session-state-distributed-workers
    • captcha-solving-10000-tasks-per-hour
    • captcha-solving-api-endpoint-testing-web-forms
    • captcha-solving-audit-logs-compliance
    • captcha-solving-csharp
    • captcha-solving-fallback-chains
    • captcha-solving-go
    • captcha-solving-java
    • captcha-solving-php
    • captcha-solving-qa-authorized-testing
    • captcha-solving-ticket-purchase-automation
    • captchaai-alerts-pagerduty-integration
    • captchaai-api-key-rotation
    • captchaai-api-latency-optimization
    • captchaai-balance-check-auto-refill
    • captchaai-callback-error-handling-patterns
    • captchaai-callback-url-webhook-guide
    • captchaai-debug-logger-development
    • captchaai-health-check-monitoring-script
    • captchaai-ip-whitelisting-api-key-security
    • captchaai-load-balancer-architecture
    • captchaai-monitoring-datadog-metrics-alerts
    • captchaai-monitoring-new-relic-apm
    • captchaai-pingback-task-notification-patterns
    • captchaai-python-pydantic-validation
    • captchaai-scraping-stack-100-budget
    • captchaai-soft-id-referral-tracking
    • captchaai-webhook-security-callback-validation
    • case-sensitive-captcha-api-parameter-guide
    • chaos-engineering-captcha-solving-pipelines
    • chrome-devtools-network-captcha-debugging
    • circuit-breaker-pattern-captcha-api-calls
    • cloudflare-challenge-page-parameters-token-flow
    • cloudflare-turnstile-sitekey-extraction
    • colly-captchaai-go-scraping-captcha-solving
    • compensating-transactions-captcha-workflows
    • connection-keepalive-http2-captcha-api
    • connection-pool-sizing-captcha-api-clients
    • crawlee-captchaai-modern-scraping-integration
    • csharp-task-whenall-captchaai-async
    • csv-batch-captcha-solving-python
    • curl-captchaai-cli
    • custom-captcha-types-submit-unusual-challenges
    • custom-timeout-settings-captcha-types
    • cypress-captchaai-e2e-testing-captcha
    • cyrillic-text-captcha-solving
    • dead-letter-queue-failed-captcha-tasks
    • debugging-captcha-api-charles-proxy
    • deduplicating-captcha-solves-database-locking
    • dependency-injection-captcha-solving-services
    • disaster-recovery-captcha-solving-pipelines
    • discord-webhook-captcha-pipeline-alerts
    • docker-captchaai-containerized-captcha-solving
    • domain-whois-lookup-captcha-handling
    • dynamic-captcha-loading-lazy-loaded-detection
    • dynamodb-serverless-captcha-solve-tracking
    • ecommerce-price-monitoring
    • elk-stack-captcha-solving-log-analysis
    • encrypting-captcha-api-traffic-tls
    • error-budget-tracking-captcha-reliability
    • event-ticket-monitoring-captcha-handling
    • expressjs-captchaai-server-side-captcha
    • extracting-recaptcha-parameters-page-source
    • factory-pattern-multi-type-captcha-solving
    • fastapi-captchaai-microservice
    • fiddler-inspect-captchaai-api-traffic
    • financial-data-scraping-captcha-handling
    • flight-status-monitoring-captcha-handling
    • flutter-webview-captcha-handling
    • food-delivery-price-comparison-captcha-solving
    • geetest-slide-captcha-parameters-api-guide
    • geetest-token-injection-browser-automation
    • geetest-v3-slider-parameter-extraction
    • gis-mapping-data-captcha-extraction
    • github-actions-captchaai-cicd-captcha-testing
    • go-goroutines-captchaai-high-throughput
    • google-apps-script-captchaai-captcha
    • google-cloud-functions-captchaai-integration
    • government-portal-automation-captcha-solving
    • graceful-degradation-captcha-solving-fails
    • grafana-dashboard-templates-captchaai
    • grid-image-coordinate-mapping
    • handle-captcha-in-web-scraping-workflows
    • handling-multiple-captchas-single-page
    • headless-browser-captcha-issues
    • health-check-endpoints-captcha-workers
    • healthcare-data-collection-captcha-handling
    • high-availability-captcha-solving-failover
    • horizontal-scaling-captcha-solving-workers
    • http-replay-captcha-api-debugging
    • httpx-captchaai-integration
    • idempotent-captcha-solving-prevent-duplicates
    • iframe-captcha-extraction-nested-frames
    • image-captcha-base64-encoding-best-practices
    • image-captcha-confidence-scores-quality
    • image-captcha-preprocessing-contrast-rotation
    • implementing-retry-logic-captchaai-api
    • improving-ocr-captcha-accuracy-captchaai-settings
    • insurance-quote-comparison-captcha-automation
    • ios-xcuitest-captcha-handling
    • java-completablefuture-captchaai-async
    • job-board-scraping-captcha-handling
    • kafka-captchaai-streaming-captcha-processing
    • kubernetes-job-queues-captcha-solving-scale
    • legal-research-scraping-captcha-handling
    • load-testing-captcha-solving-pipeline
    • make-integromat-captchaai-captcha-automation
    • market-research-data-collection
    • math-captcha-solving-captchaai-calc-parameter
    • memory-cpu-optimization-captcha-workers
    • mobile-browser-automation-captcha-solving
    • mongodb-captcha-solve-history-analytics
    • monitoring-captcha-solve-rates-prometheus-grafana
    • multi-character-image-captcha-solving-strategies
    • multi-region-captcha-solving-architecture
    • multi-step-checkout-automation-captcha-solving
    • multi-step-workflow-automation-captchaai
    • n8n-captchaai-no-code-automation
    • nats-messaging-captchaai-task-distribution
    • news-media-aggregation-captcha-handling
    • nodejs-captcha-solving-retry-error-handling
    • nodejs-playwright-captchaai-complete-integration
    • nodejs-promise-allsettled-batch-captcha
    • nodejs-puppeteer-captchaai-advanced-patterns
    • nodejs-worker-threads-parallel-captcha-solving
    • notion-api-captchaai-data-entry
    • octoparse-captchaai-visual-scraping-captcha
    • opentelemetry-tracing-captcha-pipelines
    • oxylabs-captchaai-datacenter-proxy-integration
    • parsehub-captchaai-no-code-scraping
    • pharmacy-price-comparison-captcha-handling
    • phrase-min-max-length-parameters-image-captcha
    • playwright-captcha-handling
    • plugin-architecture-captcha-solving-pipelines
    • power-automate-captchaai-captcha-solving
    • powershell-captchaai-windows-automation
    • profiling-captcha-bottlenecks-python
    • proxy-authentication-methods-captchaai
    • proxy-rotation-captcha-scraping
    • public-records-search-captcha-handling
    • puppeteer-captcha-solving-nodejs
    • puppeteer-stealth-captchaai-browser-automation
    • pwa-captcha-handling-guide
    • pytest-captchaai-test-fixtures
    • python-asyncio-captchaai-concurrent-solving
    • python-beautifulsoup-captchaai-protected-pages
    • python-captcha-solving-retry-error-patterns
    • python-multiprocessing-parallel-captcha-solving
    • python-playwright-captchaai-complete-guide
    • python-selenium-captchaai-complete-guide
    • python-threadpool-captcha-parallelism
    • python-wrapper-library-captchaai-api
    • queue-batch-captcha-priority-processing
    • rabbitmq-captchaai-message-queue-integration
    • rate-limiting-own-captcha-requests
    • react-native-webview-captcha-solving
    • real-estate-data-scraping
    • recaptcha-data-s-parameter-explained
    • recaptcha-single-page-application-dynamic
    • recaptcha-v3-action-parameter-explained
    • redis-captcha-token-ttl-management
    • redis-queue-captchaai-distributed-processing
    • reduce-captcha-interruptions-in-web-scraping
    • retail-inventory-monitoring-captcha-handling
    • retail-site-captcha-handling
    • retool-captchaai-internal-tool-captcha
    • retry-storm-prevention-captcha-systems
    • reusable-captcha-modules-client-projects
    • rolling-updates-captcha-solving-workers
    • salary-compensation-data-captcha-handling
    • scheduled-captcha-solving-cron-jobs
    • scraping-automation-captcha-handling
    • scraping-protected-websites-captcha
    • scraping-reliability-captcha-handling
    • scrapy-captchaai-integration
    • scrapy-spider-middleware-captchaai-advanced
    • search-results-captcha-handling
    • securing-captchaai-credentials-env-vars
    • selenium-captcha-handling-python
    • selenium-grid-captchaai-distributed-solving
    • selenium-wire-captchaai-request-interception
    • semaphore-patterns-captcha-concurrency
    • shadow-dom-captcha-handling-web-components
    • shipping-logistics-rate-scraping-captcha
    • slack-bot-captcha-notifications
    • smartproxy-captchaai-residential-proxy-setup
    • social-media-research-captcha-handling
    • socks5-proxy-captchaai-setup-configuration
    • solve-bls-captcha-nodejs
    • solve-bls-captcha-python
    • solve-cloudflare-challenge-nodejs
    • solve-cloudflare-challenge-python
    • solve-geetest-v3-nodejs
    • solve-geetest-v3-php
    • solve-geetest-v3-python
    • solve-grid-image-captcha-nodejs
    • solve-grid-image-captcha-python
    • solve-image-captcha-base64-api
    • solve-image-captcha-nodejs
    • solve-image-captcha-python-ocr
    • solve-multiple-captcha-types-workflow
    • solve-recaptcha-invisible-nodejs
    • solve-recaptcha-invisible-python
    • solve-recaptcha-v2-enterprise-nodejs
    • solve-recaptcha-v2-enterprise-python
    • solve-recaptcha-v3-enterprise-php
    • solving-captchas-chinese-websites
    • solving-captchas-dart-flutter-captchaai
    • solving-captchas-japanese-korean-websites
    • solving-captchas-kotlin-captchaai-api
    • solving-captchas-perl-captchaai-api
    • solving-captchas-r-research-data-collection
    • solving-captchas-ruby-captchaai-api
    • solving-captchas-rust-captchaai-api
    • solving-captchas-scala-captchaai-api
    • solving-captchas-swift-captchaai-api
    • solving-cloudflare-turnstile-nodejs
    • solving-cloudflare-turnstile-python-requests
    • solving-geetest-v3-nodejs-captchaai
    • solving-geetest-v3-python-captchaai
    • solving-recaptcha-v2-nodejs-fetch
    • solving-recaptcha-v2-python-requests
    • sports-statistics-data-captcha-handling
    • sqlite-local-captcha-solve-caching
    • sse-realtime-captcha-solve-notifications
    • stock-market-data-captcha-handling
    • storing-captcha-results-postgresql
    • streaming-batch-captcha-results-processing
    • structured-logging-captcha-operations
    • supply-chain-monitoring-captcha-handling
    • terraform-captchaai-infrastructure-as-code
    • testing-captchaai-parallel-run-migration
    • token-bucket-rate-limited-captcha-concurrency
    • travel-fare-monitoring
    • type-safe-captchaai-client-typescript-generics
    • typescript-captchaai-type-safe-solving
    • undetected-chromedriver-captchaai
    • university-registration-captcha-testing
    • vault-integration-captchaai-api-key
    • webhook-endpoint-monitoring-captcha-callbacks
    • zapier-captchaai-no-code-automation
  • scripts

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 229 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,17 +51,138 @@ jobs:
5151
- name: Check PHP syntax
5252
run: find articles/*/php -name "*.php" -exec php -l {} \;
5353

54+
lint-go:
55+
name: Lint Go examples
56+
runs-on: ubuntu-latest
57+
steps:
58+
- uses: actions/checkout@v4
59+
60+
- uses: actions/setup-go@v5
61+
with:
62+
go-version: "1.22"
63+
64+
- name: Check Go syntax
65+
run: |
66+
errors=0
67+
for dir in articles/*/go; do
68+
if [ -f "$dir/solve.go" ]; then
69+
cd "$dir"
70+
if [ -f "go.mod" ]; then
71+
go vet ./... 2>&1 || errors=$((errors + 1))
72+
else
73+
gofmt -e solve.go > /dev/null 2>&1 || errors=$((errors + 1))
74+
fi
75+
cd - > /dev/null
76+
fi
77+
done
78+
if [ $errors -gt 0 ]; then
79+
echo "Found $errors Go errors"
80+
exit 1
81+
fi
82+
echo "All Go examples pass syntax check"
83+
84+
lint-ruby:
85+
name: Lint Ruby examples
86+
runs-on: ubuntu-latest
87+
steps:
88+
- uses: actions/checkout@v4
89+
90+
- uses: ruby/setup-ruby@v1
91+
with:
92+
ruby-version: "3.2"
93+
94+
- name: Check Ruby syntax
95+
run: find articles/*/ruby -name "*.rb" -exec ruby -c {} \;
96+
97+
lint-bash:
98+
name: Lint Bash examples
99+
runs-on: ubuntu-latest
100+
steps:
101+
- uses: actions/checkout@v4
102+
103+
- name: Install ShellCheck
104+
run: sudo apt-get install -y shellcheck
105+
106+
- name: Check Bash syntax
107+
run: |
108+
errors=0
109+
for f in articles/*/bash/solve.sh; do
110+
if [ -f "$f" ]; then
111+
bash -n "$f" 2>&1 || errors=$((errors + 1))
112+
shellcheck -S warning "$f" 2>&1 || true
113+
fi
114+
done
115+
if [ $errors -gt 0 ]; then
116+
echo "Found $errors Bash syntax errors"
117+
exit 1
118+
fi
119+
echo "All Bash examples pass syntax check"
120+
121+
lint-java:
122+
name: Lint Java examples
123+
runs-on: ubuntu-latest
124+
steps:
125+
- uses: actions/checkout@v4
126+
127+
- uses: actions/setup-java@v4
128+
with:
129+
distribution: "temurin"
130+
java-version: "17"
131+
132+
- name: Check Java syntax
133+
run: |
134+
errors=0
135+
for f in articles/*/java/Solve.java; do
136+
if [ -f "$f" ]; then
137+
javac -d /tmp/java_check "$f" 2>&1 || errors=$((errors + 1))
138+
rm -rf /tmp/java_check/*
139+
fi
140+
done
141+
if [ $errors -gt 0 ]; then
142+
echo "Found $errors Java compilation errors"
143+
exit 1
144+
fi
145+
echo "All Java examples compile"
146+
147+
lint-kotlin:
148+
name: Lint Kotlin examples
149+
runs-on: ubuntu-latest
150+
steps:
151+
- uses: actions/checkout@v4
152+
153+
- name: Install Kotlin
154+
run: |
155+
curl -sL https://github.com/JetBrains/kotlin/releases/download/v1.9.24/kotlin-compiler-1.9.24.zip -o kotlin.zip
156+
unzip -q kotlin.zip -d /opt/kotlin
157+
echo "/opt/kotlin/kotlinc/bin" >> $GITHUB_PATH
158+
159+
- name: Check Kotlin syntax
160+
run: |
161+
errors=0
162+
for f in articles/*/kotlin/solve.kt; do
163+
if [ -f "$f" ]; then
164+
/opt/kotlin/kotlinc/bin/kotlinc -script "$f" -nowarn 2>&1 | head -5 || errors=$((errors + 1))
165+
fi
166+
done
167+
if [ $errors -gt 0 ]; then
168+
echo "Found $errors Kotlin errors"
169+
fi
170+
echo "Kotlin syntax check complete"
171+
54172
validate-structure:
55173
name: Validate example pack structure
56174
runs-on: ubuntu-latest
57175
steps:
58176
- uses: actions/checkout@v4
59177

60-
- name: Check required files
178+
- name: Check required files and ALL 10 language directories
61179
run: |
62180
errors=0
181+
ALL_LANGS="python node php go java csharp ruby rust kotlin bash"
63182
for dir in articles/*/; do
64183
slug=$(basename "$dir")
184+
185+
# Required files
65186
if [ ! -f "$dir/README.md" ]; then
66187
echo "ERROR: $dir is missing README.md"
67188
errors=$((errors + 1))
@@ -70,23 +191,20 @@ jobs:
70191
echo "ERROR: $dir is missing .env.example"
71192
errors=$((errors + 1))
72193
fi
73-
# Check that at least one language directory exists
74-
has_lang=0
75-
for lang in python node php go; do
76-
if [ -d "$dir/$lang" ]; then
77-
has_lang=1
194+
195+
# ALL 10 language directories required
196+
for lang in $ALL_LANGS; do
197+
if [ ! -d "$dir/$lang" ]; then
198+
echo "ERROR: $dir is missing $lang/ directory"
199+
errors=$((errors + 1))
78200
fi
79201
done
80-
if [ $has_lang -eq 0 ]; then
81-
echo "ERROR: $dir has no language directory (python/node/php/go)"
82-
errors=$((errors + 1))
83-
fi
84202
done
85203
if [ $errors -gt 0 ]; then
86204
echo "Found $errors structural errors"
87205
exit 1
88206
fi
89-
echo "All example packs have valid structure"
207+
echo "All example packs have complete structure (10 languages)"
90208
91209
- name: Check no .env files committed
92210
run: |
@@ -105,7 +223,7 @@ jobs:
105223
readme="$dir/README.md"
106224
if [ -f "$readme" ]; then
107225
if ! grep -q "blog.captchaai.com" "$readme"; then
108-
echo "WARNING: $readme does not link to blog.captchaai.com"
226+
echo "ERROR: $readme does not link to blog.captchaai.com"
109227
errors=$((errors + 1))
110228
fi
111229
fi
@@ -115,3 +233,102 @@ jobs:
115233
exit 1
116234
fi
117235
echo "All READMEs link to the blog"
236+
237+
validate-quality:
238+
name: Validate content quality
239+
runs-on: ubuntu-latest
240+
steps:
241+
- uses: actions/checkout@v4
242+
243+
- name: Check for mojibake in markdown files
244+
run: |
245+
# Detect common UTF-8 double-encoding artifacts
246+
errors=0
247+
while IFS= read -r -d '' file; do
248+
if grep -Pq '\xC3\xA2\xC2\x80' "$file" 2>/dev/null; then
249+
echo "ERROR: $file contains mojibake (double-encoded UTF-8)"
250+
errors=$((errors + 1))
251+
fi
252+
done < <(find articles -name "*.md" -print0)
253+
if [ $errors -gt 0 ]; then
254+
echo "Found $errors files with encoding issues"
255+
exit 1
256+
fi
257+
echo "No mojibake detected"
258+
259+
- name: Check for null CAPTCHA type labels in README index
260+
run: |
261+
if grep -P '\|\s*null\s*\|' README.md; then
262+
echo "ERROR: README.md contains null CAPTCHA type labels"
263+
exit 1
264+
fi
265+
echo "No null labels in README index"
266+
267+
- name: Validate solver method matches CAPTCHA type
268+
run: |
269+
errors=0
270+
for dir in articles/*/; do
271+
slug=$(basename "$dir")
272+
solve_py="$dir/python/solve.py"
273+
if [ -f "$solve_py" ]; then
274+
method=$(grep -oP '"method"\s*:\s*"\K[^"]+' "$solve_py" 2>/dev/null || true)
275+
if [ -n "$method" ]; then
276+
# Check response field consistency
277+
case "$method" in
278+
userrecaptcha)
279+
if ! grep -q "g-recaptcha-response" "$solve_py" 2>/dev/null; then
280+
if grep -q "cf-turnstile-response\|h-captcha-response" "$solve_py" 2>/dev/null; then
281+
echo "ERROR: $slug uses method=userrecaptcha but wrong response field"
282+
errors=$((errors + 1))
283+
fi
284+
fi
285+
;;
286+
turnstile)
287+
if ! grep -q "cf-turnstile-response" "$solve_py" 2>/dev/null; then
288+
if grep -q "g-recaptcha-response\|h-captcha-response" "$solve_py" 2>/dev/null; then
289+
echo "ERROR: $slug uses method=turnstile but wrong response field"
290+
errors=$((errors + 1))
291+
fi
292+
fi
293+
;;
294+
hcaptcha)
295+
if ! grep -q "h-captcha-response" "$solve_py" 2>/dev/null; then
296+
if grep -q "g-recaptcha-response\|cf-turnstile-response" "$solve_py" 2>/dev/null; then
297+
echo "ERROR: $slug uses method=hcaptcha but wrong response field"
298+
errors=$((errors + 1))
299+
fi
300+
fi
301+
;;
302+
esac
303+
fi
304+
fi
305+
done
306+
if [ $errors -gt 0 ]; then
307+
echo "Found $errors solver/response-field mismatches"
308+
exit 1
309+
fi
310+
echo "All solver methods match their response fields"
311+
312+
- name: Validate index completeness
313+
run: |
314+
errors=0
315+
# Check every pack directory is listed in README
316+
for dir in articles/*/; do
317+
slug=$(basename "$dir")
318+
if ! grep -q "articles/$slug/" README.md; then
319+
echo "ERROR: $slug exists but is not in README.md index"
320+
errors=$((errors + 1))
321+
fi
322+
done
323+
# Check no phantom entries
324+
for slug in $(grep -oP 'articles/\K[^/]+(?=/)' README.md | sort -u); do
325+
if [ ! -d "articles/$slug" ]; then
326+
echo "ERROR: README references articles/$slug/ but directory does not exist"
327+
errors=$((errors + 1))
328+
fi
329+
done
330+
if [ $errors -gt 0 ]; then
331+
echo "Found $errors index integrity errors"
332+
exit 1
333+
fi
334+
echo "README index is complete and accurate"

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@ composer.lock
77
package-lock.json
88
.DS_Store
99
Thumbs.db
10+
11+
# Internal planning directory (excluded from git)
12+
.planning/

CONTRIBUTING.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,43 @@
44

55
This repository holds full working code examples that accompany [CaptchaAI blog articles](https://blog.captchaai.com). Each example is a complete, runnable project — not a snippet.
66

7+
## Support tiers
8+
9+
Every example pack is classified into a support tier:
10+
11+
| Tier | Badge | Criteria |
12+
|------|-------|----------|
13+
| **Verified** | 🟢 | All 10 languages CI-linted, solver-correct, manually reviewed |
14+
| **Standard** | 🟡 | All 10 languages present, scaffolded from verified templates, basic validation passes |
15+
| **Generated** || Scaffolded from template, may have known issues pending review |
16+
17+
### Promotion path
18+
19+
```
20+
Generated → Standard → Verified
21+
```
22+
23+
**Generated → Standard:** Fix any null labels, fix mojibake, ensure blog backlink, pass CI.
24+
25+
**Standard → Verified:** All 10 languages CI-linted, solver correctness validated (method + response field + params), manual code review completed.
26+
27+
### CI-validated languages
28+
29+
The following languages are checked in CI:
30+
31+
| Language | CI Check | Status |
32+
|----------|----------|--------|
33+
| Python | `ruff` (syntax + style) | Enforced |
34+
| Node.js | `acorn` (ECMAScript 2020) | Enforced |
35+
| PHP | `php -l` (syntax) | Enforced |
36+
| Go | `go vet` / `gofmt` | Enforced |
37+
| Ruby | `ruby -c` (syntax) | Enforced |
38+
| Bash | `bash -n` + `shellcheck` | Enforced |
39+
| Java | `javac` (compilation) | Enforced |
40+
| Kotlin | `kotlinc` (syntax) | Best-effort |
41+
| C# || Planned |
42+
| Rust || Planned |
43+
744
## When to add an example
845

946
An example pack should be created when:

0 commit comments

Comments
 (0)