repowarden 4.9.3 → 4.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/bin/agents +103 -0
- package/bin/app +2 -2
- package/bin/bot +1 -1
- package/bin/bots +3 -3
- package/bin/code-mort +5 -3
- package/bin/commit +12 -15
- package/bin/garde +237 -0
- package/bin/migrer +4 -1
- package/bin/npm-publication +1 -1
- package/bin/pr-checks +2 -8
- package/bin/pr-label +6 -12
- package/bin/proteger +1 -1
- package/bin/repowarden +78 -5
- package/bin/run-list +2 -13
- package/bin/run-rerun +2 -15
- package/bin/statut +3 -2
- package/bin/ticket +26 -4
- package/bin/ticket-comment +7 -10
- package/bin/ticket-label +7 -14
- package/bin/tickets +3 -4
- package/hooks/agents/repowarden-garde.js +16 -0
- package/hooks/lang/node.sh +14 -2
- package/hooks/lang/python.sh +14 -2
- package/hooks/lib/common.sh +3 -1
- package/hooks/lib/deadcode.sh +46 -9
- package/hooks/lib/forge.sh +21 -0
- package/hooks/lib/i18n/en.sh +48 -0
- package/hooks/lib/i18n/fr.sh +49 -0
- package/hooks/pre-push +22 -0
- package/install.sh +2 -1
- package/package.json +1 -1
package/hooks/lib/i18n/fr.sh
CHANGED
|
@@ -63,6 +63,7 @@ _msg_fr() {
|
|
|
63
63
|
tk.cli.issue_created_branch) _M="Ticket #%s créé." ;;
|
|
64
64
|
tk.cli.title_required) _M="Titre du ticket obligatoire : repowarden ticket nouveau \"<titre>\"" ;;
|
|
65
65
|
tk.cli.current) _M="Branche %s : ticket #%s." ;;
|
|
66
|
+
tk.cli.no_ticket_here) _M="Aucun ticket pour cette branche." ;;
|
|
66
67
|
cc.ticket_offer) _M="Aucun ticket pour cette branche. En créer un maintenant (titre : la description) ? [o/N] : " ;;
|
|
67
68
|
cc.ticket_created) _M="Ticket #%s créé et cité dans le message." ;;
|
|
68
69
|
cc.preview) _M="Message" ;;
|
|
@@ -125,6 +126,7 @@ _msg_fr() {
|
|
|
125
126
|
hook.pre_push.5) _M="%s : aucun fichier modifié, rien à tester." ;;
|
|
126
127
|
hook.pre_push.6) _M="Rien à tester (suppression de branche uniquement)." ;;
|
|
127
128
|
hook.pre_push.7) _M="Pre-push OK" ;;
|
|
129
|
+
hook.pre_push.workflow_scope) _M="Jeton gh sans le scope « workflow » : GitHub refusera un push touchant .github/workflows/. L'autoriser (puis se reconnecter) : gh auth refresh -h github.com -s workflow" ;;
|
|
128
130
|
hook.pre_push.lint.missing) _M="%s absent, %s non vérifié (installation : %s)." ;;
|
|
129
131
|
hook.pre_push.lint.run) _M="%s : %s" ;;
|
|
130
132
|
hook.branch_hint.1) _M="Nom de branche « %s » non conforme : commits et push seront refusés. Renommer :" ;;
|
|
@@ -215,6 +217,26 @@ _msg_fr() {
|
|
|
215
217
|
lang.terraform.3) _M="Terraform : tflint" ;;
|
|
216
218
|
help.alias.feat) _M="(branche : feature/ accepté)" ;;
|
|
217
219
|
help.alias.fix) _M="(branche : bugfix/, hotfix/ acceptés)" ;;
|
|
220
|
+
# Aide des commandes (repowarden <commande> --help) : source unique,
|
|
221
|
+
# affichée par bin/repowarden avant toute action (printf '%b\n' → \n)
|
|
222
|
+
help.main) _M="Usage : repowarden <commande> [options] · aide détaillée : repowarden <commande> --help\n\n repowarden état du poste et étape suivante\n repowarden statut (idem)\n repowarden install [--global] [--lang fr|en] active les hooks (install.sh)\n repowarden uninstall [--global] [--purge] les retire (avant npm uninstall -g)\n repowarden bots bots du dépôt GitHub (CI, releases, tickets…)\n repowarden cc assistant de commit\n repowarden code-mort nouveau code mort de la branche\n repowarden ticket ticket de la branche courante\n repowarden ticket <n> branche du ticket (créée, liée, si besoin)\n repowarden ticket nouveau \"<titre>\" nouveau ticket\n repowarden ticket comment <n> \"<texte>\" commentaire sur un ticket\n repowarden ticket label <n> <label> [--remove] gère les labels d'un ticket\n repowarden pr label <n> <label> [--remove] gère les labels d'une PR\n repowarden pr checks <n> vérifie les checks d'une PR\n repowarden run rerun <id|--failed|--workflow> relance un workflow\n repowarden run list [--workflow <nom>] liste les runs récents\n repowarden tickets init suivi des tickets (GitHub)\n repowarden tickets sync mes tickets assignés → leurs branches locales\n repowarden proteger [options] protection des branches (GitHub)\n repowarden migrer [--pr] [--hooks] passage de repogarde à repowarden\n repowarden npm-publication publication npm automatique\n repowarden app init GitHub App des workflows (une fois)\n repowarden bot [init|rapport] bot d'organisation (dépôt de pilotage)\n repowarden agents init [--claude] [--opencode] garde-fou des agents IA (Claude Code, opencode)\n repowarden garde vérifie une action d'agent (appelé par son hook)\n repowarden --version version installée" ;;
|
|
223
|
+
help.statut) _M="Usage : repowarden statut (ou repowarden, sans argument)\n\nÉtat de repowarden sur ce poste et dans le dépôt courant, puis la commande\nsuivante à lancer (l'équivalent de « gh auth status » ou « brew doctor »).\nLecture seule : rien n'est modifié." ;;
|
|
224
|
+
help.install) _M="Usage : repowarden install [--global] [--lang fr|en] [--bots | --sans-bots]\n\nActive les hooks repowarden (install.sh).\n --global tous les dépôts (et l'assistant de commit : git cc)\n --lang fr|en langue des messages (demandée une fois sinon)\n --bots propose ensuite les bots du dépôt GitHub (repowarden bots)\n --sans-bots ne plus jamais les proposer" ;;
|
|
225
|
+
help.uninstall) _M="Usage : repowarden uninstall [--global] [--purge] [--scan DOSSIER]\n\nRetire les hooks repowarden (seulement s'ils sont les tiens), avant\nnpm uninstall -g.\n --global retire aussi l'installation globale\n --purge retire les caches et liste les dépôts encore branchés\n --scan DOSSIER dépôts de DOSSIER encore branchés sur repowarden (avec --purge)" ;;
|
|
226
|
+
help.bots) _M="Usage : repowarden bots\n\nBots du dépôt GitHub courant : une question globale, un accord par bot (CI,\nreleases, nettoyage, tickets, App, protection, npm), l'aperçu de ce qui sera\ncréé ou modifié, puis une confirmation finale. Rien sans accord, relançable\npour compléter. Aussi : repowarden install --bots, et --sans-bots pour ne\nplus les proposer. Demande un terminal, gh connecté et les droits\nd'administration du dépôt." ;;
|
|
227
|
+
help.bot) _M="Usage : repowarden bot [--repo o/r]… [--dry-run] [--rapport FICHIER]\n repowarden bot rapport FICHIER\n repowarden bot init\n\nBot d'organisation : chaque nuit (et à la demande) il applique chaque projet\nadopté (protection, migration) et publie son rapport dans l'issue « Rapport\ndu bot repowarden » ; --dry-run voit sans rien modifier. init : écrit le\nworkflow du dépôt de pilotage (.github/workflows/bot.yml). GH_TOKEN : jeton\nd'installation de l'App (repowarden app init --bot)." ;;
|
|
228
|
+
help.cc) _M="Usage : repowarden cc [options de git commit] (alias : git cc, installé par install.sh)\n repowarden cc -m \"description\" [--type T] [--scope S] [--breaking NOTE] [--body TEXTE] [--refs \"Ticket : #12\"]\n repowarden cc --dry-run\n\nAssistant de commit conventionnel : guide l'en-tête, le corps et le pied,\npuis commit via les hooks habituels. Sans question (-m : scripts, agents) :\nmêmes contrôles, type et scope déduits de la branche s'ils sont omis.\n --strict une réponse refusée arrête tout (rien n'est commité)\n --dry-run affiche le message sans commiter" ;;
|
|
229
|
+
help.code-mort) _M="Usage : repowarden code-mort [base]\n\nCode mort introduit par ta branche, comme en CI : seules les lignes ajoutées\nou modifiées depuis la base comptent (commits, modifications en cours,\nnouveaux fichiers). Défaut : point de départ de la branche depuis origin/main.\nVoir docs/code-mort.md : ce qui est prouvé (bloquant) et ce qui est candidat." ;;
|
|
230
|
+
help.ticket) _M="Usage : repowarden ticket <n> branche du ticket (créée, liée, si besoin)\n repowarden ticket ticket de la branche courante\n repowarden ticket nouveau \"<titre>\" [--type fix] [--description \"…\"]\n repowarden ticket comment <n> \"<texte>\" commentaire sur le ticket\n repowarden ticket label <n> <label> [--remove] labels du ticket\n\nLe ticket d'abord : prendre <n> l'assigne à toi et place sur sa branche\n(créée depuis develop au besoin) ; nouveau crée le ticket (« à valider » si\nle suivi est géré par repowarden). Demande gh connecté (https://cli.github.com)." ;;
|
|
231
|
+
help.tickets) _M="Usage : repowarden tickets init [--repo propriétaire/nom] [--sans-validation-auto]\n repowarden tickets sync\n\nPrépare le suivi des tickets d'un dépôt GitHub (relançable sans risque) :\nétiquettes (« validé », statuts et types, préfixe des branches), modèle de\nticket, workflow ; tickets existants rangés ; branches des PR inscrites sur\nleurs tickets. sync : branches locales des tickets qui me sont assignés\n(automatique avec ticketSync = auto, défaut manual)." ;;
|
|
232
|
+
help.pr) _M="Usage : repowarden pr label <n> <label> [--remove]\n repowarden pr checks <n>\n\nlabel ajoute ou retire un label sur la PR #<n> ; checks affiche l'état de\nses checks (nom, conclusion, statut, lien).\nExemples :\n repowarden pr label 123 \"ready-for-review\"\n repowarden pr label 123 \"needs-changes\" --remove\n repowarden pr checks 123" ;;
|
|
233
|
+
help.run) _M="Usage : repowarden run rerun <run-id|--failed|--workflow <nom>>\n repowarden run list [--workflow <nom>] [--limit N]\n\nrerun relance un workflow GitHub Actions : un run par son id, le dernier\néchoué (--failed) ou le dernier d'un workflow (--workflow) ; list affiche\nles runs récents (--limit, défaut 20).\nExemples :\n repowarden run rerun --failed\n repowarden run list --workflow \"CI\" --limit 10" ;;
|
|
234
|
+
help.proteger) _M="Usage : repowarden proteger [--repo propriétaire/nom] [--checks \"repowarden,tests (ubuntu-latest)\"]\n [--relecteurs N] [--codeowners] [--environnement NOM] [--approbateurs \"login …\"]\n [--sans-tags] [--dry-run] [--verifier]\n\nProtège le dépôt GitHub courant d'après .repowarden.conf (relançable sans\nrisque) : PR obligatoire, vérifications exigées, ni suppression ni push forcé\n(ruleset « repowarden »), merge squash, tags v* réservés aux workflows,\nvalidation humaine optionnelle. --verifier compare les règles en ligne sans\nrien modifier. Réglages équivalents dans .repowarden.conf. Demande gh et les\ndroits d'administration du dépôt." ;;
|
|
235
|
+
help.migrer) _M="Usage : repowarden migrer [--pr] [--hooks]\n\nPassage de repogarde à repowarden dans le projet courant\n(docs/migration-v4.md) : configuration (.repowarden.conf, .repowarden/),\nworkflows (uses: vers le dépôt repowarden et sa version majeure, anciens\nnoms), puis la liste de ce qui reste à faire à la main. Relançable : rien\nn'est fait deux fois.\n --pr sur la branche chore/migration-repowarden-vN : commit, push et PR\n --hooks déplace aussi les hooks lefthook résiduels dans .git/hooks-lefthook/" ;;
|
|
236
|
+
help.npm-publication) _M="Usage : repowarden npm-publication [--repo propriétaire/nom] [--workflow release.yml]\n [--environnement NOM] [--dry-run]\n\nPublication npm automatique mise en place en une commande : chaque release\npublie le paquet (workflow npm-publish.yml), sans jeton (publication de\nconfiance OIDC, provenance jointe) : connexion npm, paquet existant, puis\nrelation de confiance. Interrompue, la commande reprend où elle en était." ;;
|
|
237
|
+
help.garde) _M="Usage : repowarden garde [--format claude|opencode] (lit l'action sur l'entrée standard)\n\nGarde-fou des agents IA, appelé par leur hook avant chaque action\n(repowarden agents init le branche) : code 0 permis, code 2 refusé avec la\ncommande à lancer. Dans un dépôt repowarden : pas de modification en HEAD\ndétaché, sur une branche protégée, ni hors branche de ticket si le dépôt\nsuit ses tickets ; branche créée par repowarden ticket <n>, commit par\nrepowarden cc ; ni --no-verify ni git add . / -A / --all. Demande jq." ;;
|
|
238
|
+
help.agents) _M="Usage : repowarden agents init [--claude] [--opencode] [--projet | --global]\n\nBranche le garde-fou (repowarden garde) dans les agents IA : hook PreToolUse\nde Claude Code (.claude/settings.json), plugin opencode\n(.opencode/plugins/repowarden-garde.js). Sans --claude ni --opencode : les\ndeux. --projet (défaut) : fichiers du dépôt, à versionner ; --global :\nconfiguration de l'utilisateur. Relançable : fichiers existants complétés,\njamais écrasés." ;;
|
|
239
|
+
help.app) _M="Usage : repowarden app init [--repo propriétaire/nom] [--nom NOM] [--administration]\n repowarden app init --bot\n\nGitHub App du dépôt : identité d'automatisation des workflows repowarden (le\njeton des Actions ne déclenche aucun workflow, un jeton de l'App, si).\nCréation dans le navigateur (flux « manifest »), permissions minimales,\nidentifiants rangés sans être affichés, installation sur le dépôt. --bot :\nApp du bot d'organisation, dans le dépôt de pilotage. Relançable ; demande\ngh et node." ;;
|
|
218
240
|
# CI et protection
|
|
219
241
|
ci.check.2) _M="Pas de base : vérification ignorée." ;;
|
|
220
242
|
ci.check.3) _M="%s « %s » : commit à squasher avant le merge (git rebase -i --autosquash)." ;;
|
|
@@ -310,6 +332,7 @@ _msg_fr() {
|
|
|
310
332
|
ci.proteger.tags_none) _M="non protégés (--sans-tags)" ;;
|
|
311
333
|
ci.proteger.unknown_team) _M="Équipe inconnue ou inaccessible : %s (format @organisation/equipe)" ;;
|
|
312
334
|
ci.proteger.unknown_user) _M="Utilisateur inconnu : %s" ;;
|
|
335
|
+
mig.unknown_version) _M="Version de repowarden inconnue (clone sans tags) : git -C %s fetch --tags, ou REPOWARDEN_MAJEURE=4 repowarden migrer." ;;
|
|
313
336
|
mig.no_major) _M="Version majeure de repowarden introuvable (%s) : REPOWARDEN_MAJEURE=4 repowarden migrer." ;;
|
|
314
337
|
mig.dirty) _M="Modifications en cours : commiter ou remiser avant repowarden migrer --pr." ;;
|
|
315
338
|
mig.pr_open) _M="PR de migration déjà ouverte (%s) : rien à faire." ;;
|
|
@@ -376,6 +399,12 @@ _msg_fr() {
|
|
|
376
399
|
dc.candidate) _M="%s : %s (candidat : vérifier les usages dynamiques)" ;;
|
|
377
400
|
dc.nothing) _M="Aucun fichier d'un langage analysable parmi les modifications : rien à vérifier." ;;
|
|
378
401
|
dc.none) _M="Aucun nouveau code mort." ;;
|
|
402
|
+
dc.none_partial) _M="Aucun nouveau code mort dans ce qui a été analysé : analyse partielle, voir ci-dessus." ;;
|
|
403
|
+
dc.partial) _M="%s : %s absent : %s (%s)." ;;
|
|
404
|
+
dc.scope.functions) _M="fonctions et classes inutilisées non analysées" ;;
|
|
405
|
+
dc.scope.imports) _M="imports et variables inutilisés non analysés" ;;
|
|
406
|
+
dc.scope.locals) _M="variables, paramètres et imports inutilisés non analysés" ;;
|
|
407
|
+
dc.scope.files) _M="fichiers, exports et dépendances non référencés non analysés" ;;
|
|
379
408
|
dc.summary_candidates) _M="%s candidat(s) à vérifier : non bloquant (appel par réflexion, framework, API publique possibles)." ;;
|
|
380
409
|
dc.summary_proven) _M="%s élément(s) de code mort prouvé : à supprimer, ou à ignorer (deadcodeIgnore)." ;;
|
|
381
410
|
dc.summary_strict) _M="%s élément(s) de code mort (mode deadcode = strict)." ;;
|
|
@@ -397,6 +426,7 @@ _msg_fr() {
|
|
|
397
426
|
ci.notify.failure) _M="❌ %s : échec du workflow de release : %s" ;;
|
|
398
427
|
# GitHub CLI
|
|
399
428
|
bot.no_gh) _M="GitHub CLI (gh) requis : https://cli.github.com" ;;
|
|
429
|
+
gh.not_logged) _M="gh non connecté : gh auth login -s workflow" ;;
|
|
400
430
|
# Paquet npm
|
|
401
431
|
npm.npx_global) _M="npx utilise un dossier temporaire : des hooks globaux pointeraient vers un dossier effacé. Installe d'abord le paquet : npm install -g repowarden, puis repowarden install --global." ;;
|
|
402
432
|
npm.no_npm) _M="npm requis : https://nodejs.org" ;;
|
|
@@ -641,6 +671,25 @@ _msg_fr() {
|
|
|
641
671
|
run.listing.workflow) _M="Liste des runs du workflow « %s »..." ;;
|
|
642
672
|
# PR checks
|
|
643
673
|
pr.checks.checking) _M="Vérification des checks de la PR #%s..." ;;
|
|
674
|
+
# Garde-fou des agents IA (repowarden garde, repowarden agents)
|
|
675
|
+
garde.format) _M="Format inconnu « %s » : claude ou opencode." ;;
|
|
676
|
+
garde.no_jq) _M="repowarden garde : jq absent, action non vérifiée (installer jq : https://jqlang.org)." ;;
|
|
677
|
+
garde.json) _M="repowarden garde : entrée JSON illisible, action non vérifiée." ;;
|
|
678
|
+
garde.detache) _M="modification refusée : HEAD détaché dans %s.\n → Se placer sur la branche d'un ticket : repowarden ticket <n>" ;;
|
|
679
|
+
garde.protegee) _M="modification refusée : « %s » est une branche protégée.\n → Travailler sur la branche d'un ticket : repowarden ticket <n>" ;;
|
|
680
|
+
garde.protegee_libre) _M="modification refusée : « %s » est une branche protégée.\n → Créer une branche de travail : git switch -c <type>/<sujet>" ;;
|
|
681
|
+
garde.hors_ticket) _M="modification refusée : la branche « %s » n'est pas celle d'un ticket (<type>/<n>-<sujet>).\n → Prendre le ticket : repowarden ticket <n>" ;;
|
|
682
|
+
garde.branche) _M="commande refusée : « %s » crée une branche ; ici, la branche naît du ticket.\n → repowarden ticket <n>" ;;
|
|
683
|
+
garde.commit) _M="commande refusée : « %s » ; les commits passent par l'assistant (seul --amend --no-edit est permis).\n → repowarden cc -m \"<description>\" --refs \"Ticket : #<n>\"" ;;
|
|
684
|
+
garde.no_verify) _M="commande refusée : « %s » contourne les hooks repowarden.\n → Relancer sans --no-verify et corriger ce que les hooks signalent." ;;
|
|
685
|
+
garde.add_tout) _M="commande refusée : « %s » ajoute tout le dépôt.\n → Ajouter les fichiers un par un : git add <fichiers>" ;;
|
|
686
|
+
agents.added) _M="%s : garde-fou ajouté (%s)." ;;
|
|
687
|
+
agents.present) _M="%s : garde-fou déjà en place (%s)." ;;
|
|
688
|
+
agents.kept) _M="%s : %s existe et diffère du modèle ; gardé tel quel (modèle : %s)." ;;
|
|
689
|
+
agents.bad_json) _M="%s : %s n'est pas un JSON valide ; rien n'a été modifié." ;;
|
|
690
|
+
agents.no_jq) _M="jq est requis pour compléter %s (https://jqlang.org)." ;;
|
|
691
|
+
agents.versionner) _M="À versionner : git add %s" ;;
|
|
692
|
+
agents.no_repowarden) _M="Le garde-fou appelle « repowarden garde » : repowarden doit être dans le PATH (npm install -g repowarden)." ;;
|
|
644
693
|
*) _M="" ;;
|
|
645
694
|
esac
|
|
646
695
|
}
|
package/hooks/pre-push
CHANGED
|
@@ -153,6 +153,28 @@ if ! skipped lint; then
|
|
|
153
153
|
[ "$LINT_FAILED" -eq 0 ] || exit 1
|
|
154
154
|
fi
|
|
155
155
|
|
|
156
|
+
# Jeton gh sans le scope « workflow » : GitHub refuserait après le commit un
|
|
157
|
+
# push qui touche .github/workflows/ (OAuth App). Signalé avant, sans bloquer
|
|
158
|
+
# (un push par SSH passe). Le fichier poussé est regardé d'abord, sans gh :
|
|
159
|
+
# « gh auth status » (appel réseau) n'a lieu que si un workflow est poussé.
|
|
160
|
+
WORKFLOW_PUSHED=0
|
|
161
|
+
while read -r _ local_sha _ remote_sha; do
|
|
162
|
+
# suppression de branche : rien à pousser
|
|
163
|
+
if [ -z "$local_sha" ] || [[ "$local_sha" =~ ^0+$ ]]; then continue; fi
|
|
164
|
+
case "$(changed_files "$local_sha" "$remote_sha")" in
|
|
165
|
+
*".github/workflows/"*) WORKFLOW_PUSHED=1; break ;;
|
|
166
|
+
esac
|
|
167
|
+
done <<<"$REFS"
|
|
168
|
+
|
|
169
|
+
if [ "$WORKFLOW_PUSHED" -eq 1 ] && has gh; then
|
|
170
|
+
if GH_SCOPES="$(gh auth status 2>&1)"; then
|
|
171
|
+
case "$GH_SCOPES" in
|
|
172
|
+
*workflow*) ;;
|
|
173
|
+
*) attention_t hook.pre_push.workflow_scope ;;
|
|
174
|
+
esac
|
|
175
|
+
fi
|
|
176
|
+
fi
|
|
177
|
+
|
|
156
178
|
skipped tests && { info "Tests désactivés (repowarden.skip)."; exit 0; }
|
|
157
179
|
|
|
158
180
|
run_tests_for() { test_projects <"$1"; }
|
package/install.sh
CHANGED
package/package.json
CHANGED