Skip to content

Commit b19b281

Browse files
docs(readme): ventidue badge, uno per uno provati
I badge passano da cinque a ventidue, su quattro righe tematiche: lo stato della repo, dove la skill gira, quello che la sostiene, l'attivita'. Un badge ufficiale per i plugin Claude Code non esiste: i repository di plugin di Anthropic non ne usano affatto. Quello del plugin e' quindi statico, con il logo Claude di Simple Icons, verificato disponibile. Ognuno e' stato provato scaricando l'immagine e leggendo il valore che mostra davvero: ventotto candidati, ventotto risposte valide, nessuno che dica "invalid" o "not found". Due candidati scartati per onesta', non per estetica. Il badge del linguaggio avrebbe detto "python 100%", vero per come GitHub conta il codice e falso per una skill fatta di testo. Quello degli osservatori avrebbe detto zero. Per lo stesso motivo il badge di Python dichiara 3.12 in continua, che e' la sola versione su cui le prove girano davvero, e quello di Cowork dice "stesso formato" invece di "compatibile": il formato e' documentato, l'esecuzione dentro Cowork no. Il badge della versione diventa dinamico e legge la release da GitHub, cosi' non puo' piu' restare indietro. La guardia in continua confronta di conseguenza il changelog invece del badge, e un passo nuovo verifica che i badge che dichiarano numeri dicano il vero: provato alterando il badge delle prove a 999, la guardia esce con codice 1.
1 parent ab415fe commit b19b281

3 files changed

Lines changed: 83 additions & 8 deletions

File tree

.github/workflows/prove.yml

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,15 @@ jobs:
7272
)
7373
trovate["profilo_voce.py"] = strumento.group(1) if strumento else None
7474
75-
badge = re.search(
76-
r"badge/versione-([0-9]+\.[0-9]+\.[0-9]+)-",
77-
pathlib.Path("README.md").read_text(encoding="utf-8"),
75+
# Il badge della versione è dinamico e legge la release da GitHub,
76+
# quindi la quarta fonte da confrontare è la voce più recente del
77+
# changelog, esclusa la sezione di ciò che non è ancora rilasciato.
78+
voce = re.search(
79+
r"^## \[([0-9]+\.[0-9]+\.[0-9]+)\]",
80+
pathlib.Path("CHANGELOG.md").read_text(encoding="utf-8"),
81+
re.MULTILINE,
7882
)
79-
trovate["badge del README"] = badge.group(1) if badge else None
83+
trovate["CHANGELOG.md"] = voce.group(1) if voce else None
8084
8185
for dove, valore in trovate.items():
8286
print(f"{dove}: {valore}")
@@ -85,3 +89,49 @@ jobs:
8589
sys.exit(1)
8690
print("Le quattro versioni coincidono.")
8791
PY
92+
93+
# I badge del README dichiarano dei numeri. Un badge che dice il falso è
94+
# peggio di un badge assente, quindi i numeri si confrontano con quelli
95+
# che le prove stampano davvero.
96+
- name: Numeri dei badge veri
97+
run: |
98+
python - <<'PY'
99+
import pathlib
100+
import re
101+
import subprocess
102+
import sys
103+
104+
readme = pathlib.Path("README.md").read_text(encoding="utf-8")
105+
106+
def dal_badge(etichetta):
107+
trovato = re.search(rf"badge/{etichetta}-([0-9]+)-", readme)
108+
return int(trovato.group(1)) if trovato else None
109+
110+
def dallo_script(comando, modello):
111+
uscita = subprocess.run(
112+
[sys.executable] + comando,
113+
capture_output=True, text=True,
114+
)
115+
trovato = re.search(modello, uscita.stdout)
116+
return int(trovato.group(1)) if trovato else None
117+
118+
controlli = [
119+
("prove", dal_badge("prove"),
120+
dallo_script(["scripts/prova_profilo_voce.py"],
121+
r"([0-9]+) prove, ")),
122+
("autoprova dell'hook", dal_badge("autoprova_hook"),
123+
dallo_script(
124+
["extras/hooks/consenti-solo-profilo-voce.py", "--prova"],
125+
r"([0-9]+) casi, ")),
126+
]
127+
128+
storto = False
129+
for nome, nel_badge, davvero in controlli:
130+
print(f"{nome}: badge {nel_badge}, eseguite {davvero}")
131+
if nel_badge is None or davvero is None or nel_badge != davvero:
132+
storto = True
133+
if storto:
134+
print("Un badge dichiara un numero che le prove non confermano.")
135+
sys.exit(1)
136+
print("I numeri dei badge corrispondono.")
137+
PY

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ Tutte le modifiche rilevanti alla skill sono annotate qui. Il formato segue la c
44

55
## [Non rilasciato]
66

7+
### Modificato
8+
9+
- `README.md`: i badge passano da cinque a ventidue, su quattro righe tematiche. La prima porta lo stato della repo, la seconda dice dove la skill gira, la terza quello che la sostiene, la quarta l'attività. Ognuno è stato provato scaricando l'immagine e leggendo il valore che mostra davvero, perché un badge che dice «invalid» o dichiara il falso vale meno di nessun badge. Per lo stesso motivo il badge di Python dichiara `3.12 in continua`, che è la sola versione su cui le prove girano davvero, e quello di Cowork dice `stesso formato` invece di `compatibile`, perché il formato è documentato mentre l'esecuzione dentro Cowork non è stata verificata. Il badge della versione diventa dinamico e legge la release da GitHub, così non può più restare indietro.
10+
- `.github/workflows/prove.yml`: i badge che dichiarano un numero vengono ora confrontati con quello che le prove stampano davvero, e la continua fallisce se non coincidono. La quarta fonte del controllo sulle versioni passa dal badge, ora dinamico, alla voce più recente del changelog.
11+
712
## [1.4.0] - 2026-07-27
813

914
La skill diventa anche un plugin, senza smettere di essere una skill. Chi la usa copiando la cartella in `.claude/skills/` non deve cambiare niente; chi preferisce installarla in un colpo solo trova ora un manifest, e con lui i due comandi già pronti invece che da copiare a mano. Il formato del plugin è quello che Claude Code e Claude Cowork condividono.

README.md

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,31 @@
22

33
![Suite per la lingua italiana e sistema avanzato anti AI: una macchina da scrivere meccanica con i tasti illuminati al neon, un foglio manoscritto nel rullo e pagine di scrittura a mano sullo sfondo.](assets/banner.png)
44

5-
[![Licenza MIT](https://img.shields.io/badge/licenza-MIT-green?style=for-the-badge)](LICENSE)
6-
[![Versione 1.4.0](https://img.shields.io/badge/versione-1.4.0-blue?style=for-the-badge)](CHANGELOG.md)
5+
[![Licenza MIT](https://img.shields.io/badge/licenza-MIT-4A5D23?style=for-the-badge)](LICENSE)
6+
[![Versione](https://img.shields.io/github/v/release/mario-montanari/italiano-scrittura-anti-ai?style=for-the-badge&label=versione&color=1C1A17)](CHANGELOG.md)
77
[![Prove](https://img.shields.io/github/actions/workflow/status/mario-montanari/italiano-scrittura-anti-ai/prove.yml?style=for-the-badge&label=prove)](.github/workflows/prove.yml)
8-
[![Lingua italiano](https://img.shields.io/badge/lingua-italiano-red?style=for-the-badge)](SKILL.md)
9-
[![Stelle](https://img.shields.io/github/stars/mario-montanari/italiano-scrittura-anti-ai?style=for-the-badge)](https://github.com/mario-montanari/italiano-scrittura-anti-ai/stargazers)
8+
[![CodeQL](https://img.shields.io/github/actions/workflow/status/mario-montanari/italiano-scrittura-anti-ai/codeql.yml?style=for-the-badge&label=CodeQL)](.github/workflows/codeql.yml)
9+
[![Stelle](https://img.shields.io/github/stars/mario-montanari/italiano-scrittura-anti-ai?style=for-the-badge&color=A4262C)](https://github.com/mario-montanari/italiano-scrittura-anti-ai/stargazers)
10+
11+
[![Claude Code](https://img.shields.io/badge/Claude_Code-plugin-D97757?style=flat-square&logo=claude&logoColor=white)](#come-plugin-in-claude-code)
12+
[![Claude Cowork](https://img.shields.io/badge/Claude_Cowork-stesso_formato-D97757?style=flat-square&logo=anthropic&logoColor=white)](#come-plugin-in-claude-cowork)
13+
[![Agent Skills](https://img.shields.io/badge/Agent_Skills-standard_aperto-6B7280?style=flat-square)](SKILL.md)
14+
[![Lingua italiano](https://img.shields.io/badge/lingua-italiano-A4262C?style=flat-square)](SKILL.md)
15+
[![Guide](https://img.shields.io/badge/guide-13-1C1A17?style=flat-square)](#che-cosa-contiene)
16+
17+
[![Prove automatiche](https://img.shields.io/badge/prove-242-4A5D23?style=flat-square)](scripts/prova_profilo_voce.py)
18+
[![Autoprova hook](https://img.shields.io/badge/autoprova_hook-43-4A5D23?style=flat-square)](extras/hooks/consenti-solo-profilo-voce.py)
19+
[![Dipendenze](https://img.shields.io/badge/dipendenze-nessuna-4A5D23?style=flat-square)](#prerequisiti)
20+
[![Python](https://img.shields.io/badge/Python-3.12_in_continua-3776AB?style=flat-square&logo=python&logoColor=white)](.github/workflows/prove.yml)
21+
[![Conventional Commits](https://img.shields.io/badge/Conventional_Commits-1.0.0-FE5196?style=flat-square)](CONTRIBUTING.md)
22+
[![Keep a Changelog](https://img.shields.io/badge/Keep_a_Changelog-1.1.0-E05735?style=flat-square)](CHANGELOG.md)
23+
[![SemVer](https://img.shields.io/badge/SemVer-2.0.0-3F4551?style=flat-square)](CHANGELOG.md)
24+
25+
[![Ultimo commit](https://img.shields.io/github/last-commit/mario-montanari/italiano-scrittura-anti-ai?style=flat-square&label=ultimo%20commit)](https://github.com/mario-montanari/italiano-scrittura-anti-ai/commits/main)
26+
[![Commit dal rilascio](https://img.shields.io/github/commits-since/mario-montanari/italiano-scrittura-anti-ai/latest?style=flat-square&label=commit%20dal%20rilascio)](https://github.com/mario-montanari/italiano-scrittura-anti-ai/compare)
27+
[![Issue aperte](https://img.shields.io/github/issues/mario-montanari/italiano-scrittura-anti-ai?style=flat-square&label=issue)](https://github.com/mario-montanari/italiano-scrittura-anti-ai/issues)
28+
[![Contributori](https://img.shields.io/github/contributors/mario-montanari/italiano-scrittura-anti-ai?style=flat-square&label=contributori)](https://github.com/mario-montanari/italiano-scrittura-anti-ai/graphs/contributors)
29+
[![Dimensione](https://img.shields.io/github/repo-size/mario-montanari/italiano-scrittura-anti-ai?style=flat-square&label=dimensione)](https://github.com/mario-montanari/italiano-scrittura-anti-ai)
1030

1131
**Suite per la lingua italiana e sistema avanzato anti AI, in Claude e non solo.** Scrive secondo la norma, corregge e rivede testi già scritti, traduce senza calchi, cattura la voce di un autore e la misura, riconosce e smonta la firma della prosa generata, difende un testo umano segnalato da un rilevatore automatico.
1232

0 commit comments

Comments
 (0)